2015-06-10 10 views
5

Я пытаюсь установить связь с периферийным устройством UART с использованием DMA для RX и TX. Я использую библиотеку HAL, которая поставляется ST (сгенерирована STCubeMX).STM32F4 Обработка периферийной ошибки при передаче DMA (RX)

Я обрабатываю канал UART с 1.5MBaud - поэтому, чтобы не потерять какие-либо данные, я настроил DMA в прямом режиме с круговым буфером и обработал прерывания с половинной передачей, чтобы позаботиться о данных , и держите DMA онлайн для получения дополнительных данных.

Проблема в том, что иногда я вижу в Регистре состояния UART, что бит ошибки Frame включен, а иногда также включен флаг ошибки переполнения.

Я могу обработать потерянные байты (используя crc на структурированных пакетах), но проблема в том, что периферийное устройство перестает получать данные - но DMA не вызывает ошибку или останавливает передачу.

Так что если я пытаюсь получить данные, и флаг на системе висит.

Я видел, что HAL предоставляет функцию __weak, которая должна обрабатывать UART_Error, но она никогда не вызывается - и статус в дескрипторе HAL остается нормальным. только взгляд на регистр может сказать, что есть проблема.

Как определить/устранить эти ошибки?

Благодаря

ответ

2

Я не использую HAL соображения производительности, так как это очень неуклюжее и - имо также не дает много абстракции, чтобы оправдать это. Обработка аппаратного обеспечения не намного сложнее; тем более, что вы все еще должны хорошо понимать, что происходит. И, как вы уже обнаружили, HAL поддерживает только определенный подход; как только вы будете следовать своему собственному пути, вы потеряетесь.

У вас, похоже, есть аналогичные проблемы, так как установлен флаг переполнения. После такой ошибки вы должны повторно синхронизировать приемник с передатчиком по потоку после ошибки в целом. Это потребовало бы внеполосной сигнализации с использованием символа или условия линии, не возникающих в пакете. Ошибки кадрирования являются хорошим индикатором, поэтому есть проблемы с синхронизацией с началом символа (начальный бит) должным образом.

Если линия чистая (а не проблемы с ЭМС), не должно быть ошибок кадрирования или искажения данных (если параметры синхронизации не совпадают).

При использовании простого пинг-понга может быть достаточно таймаута. Однако правильное решение зависит от протокола. Хороший дизайн протокола требует ошибок передачи и переполнения.

Обратите внимание, что вам необходимо включить прерывания при получении ошибок в дополнение к передачам DMA для получения информации. Однако, если вы используете тайм-аут (и протокол пинг-понга), вы можете просто стереть флаги, поскольку данные, по-видимому, не были достигнуты вовремя. Если на самом деле использование прерываний ошибок также должно быть известно о гоночных условиях.

 Смежные вопросы

  • Нет связанных вопросов^_^