Перейти к содержанию
    

Stm32f407 uart+dma+отслеживание ошибок линии

Возникла задача использовать dma для передачи данных по uart, но параллельно необходимо отслеживать ошибки ne, fe, так как линия сильно зашумлена. Это необходимо для дальнейшей подстройки некоторых параметров самой линии аналитически. Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr и читает регистр dr, что приводит к сбросу флагов ошибок. Можно конечно поставить высокий приоритет прерывания uart контроллера, но как тогда в нем очистить флаги ошибок? Если прочитать sr->dr тогда контроллер dma не примет текущий байт (который может быть вовсе не спорченным) или передача вовсе прекратится так как у контроллера dma из под носа очистять флаг в регистре sr. Какие есть варианты отследить ошибки линии ?

Изменено пользователем Neo_Matrix

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 минут назад, Neo_Matrix сказал:

Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr...

С чего бы? DMA не читает SR. А прерывание по любой из ошибок сформируется вне зависимости от приоритета UART. По возникновению ошибок можно просто сбросить FIFO, в который Вы принимаете символы, и парсер вышестоящего протокола, что ходит поверх UART.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам не проверял, но буквально позавчера попался на глаза такой абзац из документации:

image.thumb.png.3cf2484a2509341d3800b0be08c69599.png

Если я понимаю его правильно - прерывание об ошибке сработает, вы просто не сможете точно сказать, в каком именно байте эта ошибка была.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда не понятно как сбросить флаг ошибки и обязательно ли применять двойной буфер для этих целей? Думал использовать кольцевой без фифо.

ПС. В каком байте произошла ошибка абсолютно не важно, важно знать их кол-во за промежуток времени.

14 минут назад, Arlleex сказал:

С чего бы? DMA не читает SR. А прерывание по любой из ошибок сформируется вне зависимости от приоритета UART. По возникновению ошибок можно просто сбросить FIFO, в который Вы принимаете символы, и парсер вышестоящего протокола, что ходит поверх UART.

Как тогда dma сбрасывает флаги готовности? Записью 0 в sr? И если сбросить этот флаг заранее что будет с dma?

Как сбросить в режиме мультибуфера нашел, записью 0  в rxne.

Остается вопрос обязательно ли использовать мультибуфер?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, Neo_Matrix сказал:

Как тогда dma сбрасывает флаги готовности?

Чтением DR? Да нет, это для слабых...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по всему, флаг Overrun получить будет довольно сложно. А вот Framing Error - вполне возможно словить, если помеха продавит STOP-бит в ноль. В этом случае по даташиту будет взведён флаг USART_SR_FE, который сбрасывается чтением UASRT_SR с последующим чтением USART_DR. Значит DMA его не сбросит.

Ну и этот же бит может генерировать прерывание. Сразу после полученного таким образом битого байта. Вроди бы даже приём будет продолжен. В секции DMA не нашёл явных указаний на остановку из-за приёма битого байта UART'ом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В rm сказано не двузначно, последовательным чтением sr  -> dr или  записью в rxne нуля. Так что если dma не вычитывает sr как утверждает arlleex тогда пишит 0 в rxne

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

26 минут назад, Neo_Matrix сказал:

Остается вопрос обязательно ли использовать мультибуфер?

Что за мультибуфер? Не путайте multibuffer communication в терминах UART-модуля конкретно в STM32 (я хз почему они так называют транзакции с DMA) с double buffer mode в самом DMA - это вещи абсолютно независимые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В целом понятно. Нужно просто попробовать включить прерывания, сделать ошибки каким либо образом и посмотреть что будет происходить, тогда будет точно ясно, как оно работает :)

1 минуту назад, Arlleex сказал:

Что за мультибуфер? Не путайте multibuffer communication в терминах UART-модуля конкретно в STM32 (я хз почему они так называют транзакции с DMA) с double buffer mode в самом DMA - это вещи абсолютно независимые.

Ого, даже так. А я то думал, что мультибуфер это и есть двойная буферизация для uart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Neo_Matrix сказал:

В rm сказано не двузначно, последовательным чтением sr  -> dr или  записью в rxne нуля. Так что если dma не вычитывает sr как утверждает arlleex тогда пишит 0 в rxne

Вам говорят про флаги ошибок, а не про RXNE. Про RXNE вам также ранее сказали: "сбрасывается чтением регистра DR".

Очевидно если DMA читает DR, то он и сбрасывает RXNE.

Флаги же ошибок сбрасываются последовательным чтением SR затем DR. Очевидно, что DMA их не сбрасывает.

Неужто до сих пор не понятно?

9 часов назад, Arlleex сказал:

Что за мультибуфер?

В мануале, при описании RXNE, говорится о некоей "multibuffer communication". Скорей всего, что к случаю ТС это никак не относится, но у него похоже в голове всё перемешалось...  :crazy:

Теперь в эту кашу у него добавилась ещё и "двойная буферазация".  :sarcastic:

 

 

11 часов назад, Neo_Matrix сказал:

Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr и читает регистр dr, что приводит к сбросу флагов ошибок.

Откуда вы это взяли? (про сброс флагов ошибок DMA).

 

Совет ТС: Ещё раз перечитайте мануал. Там всего-то ~5 регистров - это ни о чём. Разберитесь какие флаги есть в UART и как они работают и как взаимодействуют с регистром данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Jcxz успокойтесь, уже разобрался благодаря arlleex, который подсказал, что multibuffer и double buffer не одно и то же.

Тему можно закрывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...