2015-02-06 2 views
0

내 UART Rx 및 Tx 용 DMA를 사용하려고합니다. 지금까지 프리랜서 버전의 시리얼 데모가 정상적으로 작동했습니다. 여전히 잘 작동합니다. 그러나 예제 프로젝트의 UART DMA 예제를 통합했습니다. 코드는 조건부로 컴파일되므로 스위치가 _HAS_DMA == 1 일 때만 DMA 엔진이 구성되고 RAM 버퍼가 구성되며 FreeRTOS 데모에서 요구하는대로 기본 UART ISR이 제거됩니다.DSPIC33F UART DMA 작동하지 않는 예제

이 시점에서 직렬 바이트 스트림을 보낼 때마다 실행중인 프로젝트가 단순히 재설정됩니다.

저는 MPLAB IDE 8.92, XC16 v1.20, Explorer-16 플랫폼, dspic33fj256gp710 부분을 사용하고 있습니다.

포함 된 DMA 코드는 FreeRTOS API 호출을 사용하지 않습니다. FreeRTOS 구성 옵션을 사용하여 StackOverflow가 감지되도록 프로젝트를 설정했습니다. 그러나 코드는 Stackoverflow 후크 기능에 도달하지 않습니다. 또한 들어오는 바이트가 잘 들어오는 지 확인하기 위해 U2ErrInterrupt ISR을 포함 시켰지만 그 인터럽트에도 도달하지는 않습니다.

이전에 직면 한 사람이 있습니까? 흥미롭게도 MPLAB C30 컴파일러를 사용하는 마이크로 칩 웹 사이트의 UART DMA 루프백 예제는 제 보드에서 잘 작동합니다.

이 포인터에 대한 포인터가 있습니까? FreeRTOS 포럼에서 UART 용 DMA를 사용하는 방법에 대한 코드 예제를 찾을 수는 없었지만 효율성을 위해 프로덕션 코드에서이 방법을 사용하는 것이 좋습니다.

도움이 필요하십니까?

감사와 안부, 이씨

답변

0

확인을 클릭합니다. 내가 범인을 찾았 어. 나야. :)). UART 인터럽트를 수신하도록 DMA를 설정할 때 소프트웨어에서 UART 인터럽트를 개별적으로 활성화하지 않아야합니다. 내가 뭘하고 있었는지. 또한 조건부로 UART ISR을 코드에서 un-compiled했습니다 !!!. 따라서 실제로 UART 엔진에서 바이트가 수신 될 때마다 프로세서는 누가이 인터럽트, DMA 또는 응용 프로그램 코드를 제공할지 혼란스러워합니다. PC가 지정된 UART RX ISR 벡터 위치를 가리키고 있는데 프로세서가 아무 것도 찾지 못하고 리셋이 발생했습니다. 또는이 인터럽트를 처리하기 위해 DMA와 프로세서간에 경쟁 조건 설정이 있었을 수 있습니다.

이제 DMA가 UART RX를 제공 할 때 인터럽트가 응용 프로그램별로 별도로 활성화되지 않도록 설치 UART를 설정 했으므로 코드가 정상적으로 작동합니다. 나는 바이너리 세마포어를 사용하여 FreeRTOS 지연된 인터럽트 처리와 모든 것을 아직 통합하고 있지는 않지만, 나는 거기에 어떠한 문제도 보지 않기를 바란다.

마이크로 칩 매뉴얼이나 FreeRTOS 예제에는이 내용에 대해 많은 문서가 없습니다.

또한 UART와 함께 DMA를 사용할 때 매뉴얼에 따라 DMA가 UART RX 엔진에서 워드를 수신하고 데이터의 하위 바이트에는 상태가 있고 상위 바이트에는 상태가 있음을 발견했습니다. DMA가 UART Tx에도 사용되며 WORD를 UART TXREG로 전송하도록 설정된 경우 두 개는 지능적으로 낮은 데이터 바이트 만 전송합니다. 수신 측에서는 여전히 예상 바이트를 얻습니다. 이것은 또한 잘 문서화되지 않았습니다.

나는 다음 세대를 위해 여기에 내 코드를 게시하려고합니다 :)).