DSPIC33F UART DMA Пример не работает
Я пытаюсь использовать DMA для моих UART Rx и Tx. До сих пор у меня была бесплатная серийная демоверсия ROTOS, работающая нормально. Это все еще работает отлично. Однако теперь я включил пример UART DMA из примеров проектов. код условно компилируется, поэтому, когда переключатель _HAS_DMA == 1 настроен только тогда, будет настроен механизм DMA, настроены оперативные буферы и удаленные ISR UART в соответствии с требованиями демонстрации FreeRTOS.
На этом этапе всякий раз, когда я посылаю последовательный поток байтов, запущенный проект просто сбрасывается.
Я использую MPLAB IDE 8.92, XC16 v1.20, платформу Explorer-16, часть dspic33fj256gp710.
Включенный код DMA не использует вызовы FreeRTOS API. Я настроил проект так, чтобы Stackru обнаруживался с помощью опции конфигурации FreeRTOS. Но код не достигает функции ловушки Stackru. Я также включил ISR U2ErrInterrupt, чтобы видеть, поступают ли входящие байты в порядке, однако даже это прерывание не достигнуто.
Кто-нибудь сталкивался с этим раньше?
Интересно, что пример UART DMA Loopback с веб-сайта Microchip, который использует компилятор MPLAB C30, отлично работает на моей плате.
какие-нибудь указатели на этот? Я не смог найти примеры кода на форуме FreeRTOS о том, как использовать DMA для UART, но для эффективности предлагается использовать этот метод в рабочем коде.
Нужна помощь здесь.
Спасибо и всего наилучшего, Вишал
1 ответ
ХОРОШО. Я нашел виновника. Это я.:)). При настройке прямого доступа к памяти для получения прерываний UART не следует включать прерывание UART отдельно в программном обеспечении. Что я и делал. Кроме того, я условно распаковал ISR UART из моего кода!!!. Таким образом, фактически, всякий раз, когда байт был получен механизмом UART, процессор запутывается в том, кто будет обслуживать это прерывание, код DMA или код приложения. Я думаю, что ПК будет указывать на обозначенное векторное местоположение UART RX ISR, где процессор ничего не найдет, и это вызывает сброс. Или, может быть, была настроена ситуация состязания между DMA и процессором для обслуживания этого прерывания, которое вызывало сброс.
Теперь, когда я настроил UART так, чтобы прерывания не включались отдельно приложением, когда DMA будет обслуживать UART RX, мой код работает нормально. Мне еще предстоит интегрировать все это с отложенной обработкой прерываний FreeRTOS с использованием двоичных семафоров, но я надеюсь, что я не увижу там никаких проблем.
Хотя об этом не так много задокументировано... ни в руководствах по микрочипам, ни в примерах FreeRTOS.
Кроме того, я обнаружил, что при использовании DMA с UART, согласно инструкции, DMA получает СЛОВА от механизма UART RX, причем младший байт имеет данные, а старший байт имеет статус. Если DMA также используется для передачи UART и настроен на передачу СЛОВ в UART TXREG, двум интеллектуально удается отправить только младший байт данных. Таким образом, принимающая сторона все еще получает ожидаемые байты. Это также плохо документировано.
Я постараюсь опубликовать свой код здесь для будущих поколений, хотя:)).