Jump to content
    

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

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

Edited by Neo_Matrix

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

image.thumb.png.3cf2484a2509341d3800b0be08c69599.png

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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 и как они работают и как взаимодействуют с регистром данных.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...