Neo_Matrix 0 November 15, 2021 Posted November 15, 2021 (edited) · Report post Возникла задача использовать dma для передачи данных по uart, но параллельно необходимо отслеживать ошибки ne, fe, так как линия сильно зашумлена. Это необходимо для дальнейшей подстройки некоторых параметров самой линии аналитически. Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr и читает регистр dr, что приводит к сбросу флагов ошибок. Можно конечно поставить высокий приоритет прерывания uart контроллера, но как тогда в нем очистить флаги ошибок? Если прочитать sr->dr тогда контроллер dma не примет текущий байт (который может быть вовсе не спорченным) или передача вовсе прекратится так как у контроллера dma из под носа очистять флаг в регистре sr. Какие есть варианты отследить ошибки линии ? Edited November 15, 2021 by Neo_Matrix Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 November 15, 2021 Posted November 15, 2021 · Report post 39 минут назад, Neo_Matrix сказал: Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr... С чего бы? DMA не читает SR. А прерывание по любой из ошибок сформируется вне зависимости от приоритета UART. По возникновению ошибок можно просто сбросить FIFO, в который Вы принимаете символы, и парсер вышестоящего протокола, что ходит поверх UART. Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 60 November 15, 2021 Posted November 15, 2021 · Report post Сам не проверял, но буквально позавчера попался на глаза такой абзац из документации: Если я понимаю его правильно - прерывание об ошибке сработает, вы просто не сможете точно сказать, в каком именно байте эта ошибка была. Quote Share this post Link to post Share on other sites More sharing options...
Neo_Matrix 0 November 15, 2021 Posted November 15, 2021 · Report post Тогда не понятно как сбросить флаг ошибки и обязательно ли применять двойной буфер для этих целей? Думал использовать кольцевой без фифо. ПС. В каком байте произошла ошибка абсолютно не важно, важно знать их кол-во за промежуток времени. 14 минут назад, Arlleex сказал: С чего бы? DMA не читает SR. А прерывание по любой из ошибок сформируется вне зависимости от приоритета UART. По возникновению ошибок можно просто сбросить FIFO, в который Вы принимаете символы, и парсер вышестоящего протокола, что ходит поверх UART. Как тогда dma сбрасывает флаги готовности? Записью 0 в sr? И если сбросить этот флаг заранее что будет с dma? Как сбросить в режиме мультибуфера нашел, записью 0 в rxne. Остается вопрос обязательно ли использовать мультибуфер? Quote Share this post Link to post Share on other sites More sharing options...
Сергей Борщ 60 November 15, 2021 Posted November 15, 2021 · Report post 16 минут назад, Neo_Matrix сказал: Как тогда dma сбрасывает флаги готовности? Чтением DR? Да нет, это для слабых... Quote Share this post Link to post Share on other sites More sharing options...
AlanDrakes 0 November 15, 2021 Posted November 15, 2021 · Report post Судя по всему, флаг Overrun получить будет довольно сложно. А вот Framing Error - вполне возможно словить, если помеха продавит STOP-бит в ноль. В этом случае по даташиту будет взведён флаг USART_SR_FE, который сбрасывается чтением UASRT_SR с последующим чтением USART_DR. Значит DMA его не сбросит. Ну и этот же бит может генерировать прерывание. Сразу после полученного таким образом битого байта. Вроди бы даже приём будет продолжен. В секции DMA не нашёл явных указаний на остановку из-за приёма битого байта UART'ом. Quote Share this post Link to post Share on other sites More sharing options...
Neo_Matrix 0 November 15, 2021 Posted November 15, 2021 · Report post В rm сказано не двузначно, последовательным чтением sr -> dr или записью в rxne нуля. Так что если dma не вычитывает sr как утверждает arlleex тогда пишит 0 в rxne Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 56 November 15, 2021 Posted November 15, 2021 · Report post 26 минут назад, Neo_Matrix сказал: Остается вопрос обязательно ли использовать мультибуфер? Что за мультибуфер? Не путайте multibuffer communication в терминах UART-модуля конкретно в STM32 (я хз почему они так называют транзакции с DMA) с double buffer mode в самом DMA - это вещи абсолютно независимые. Quote Share this post Link to post Share on other sites More sharing options...
Neo_Matrix 0 November 15, 2021 Posted November 15, 2021 · Report post В целом понятно. Нужно просто попробовать включить прерывания, сделать ошибки каким либо образом и посмотреть что будет происходить, тогда будет точно ясно, как оно работает :) 1 минуту назад, Arlleex сказал: Что за мультибуфер? Не путайте multibuffer communication в терминах UART-модуля конкретно в STM32 (я хз почему они так называют транзакции с DMA) с double buffer mode в самом DMA - это вещи абсолютно независимые. Ого, даже так. А я то думал, что мультибуфер это и есть двойная буферизация для uart Quote Share this post Link to post Share on other sites More sharing options...
jcxz 83 November 15, 2021 Posted November 15, 2021 · Report post 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". Скорей всего, что к случаю ТС это никак не относится, но у него похоже в голове всё перемешалось... Теперь в эту кашу у него добавилась ещё и "двойная буферазация". 11 часов назад, Neo_Matrix сказал: Но если используется dma, тогда контроллер сам проверяет флаг статуса байта в регистре sr и читает регистр dr, что приводит к сбросу флагов ошибок. Откуда вы это взяли? (про сброс флагов ошибок DMA). Совет ТС: Ещё раз перечитайте мануал. Там всего-то ~5 регистров - это ни о чём. Разберитесь какие флаги есть в UART и как они работают и как взаимодействуют с регистром данных. Quote Share this post Link to post Share on other sites More sharing options...
Neo_Matrix 0 November 15, 2021 Posted November 15, 2021 · Report post Jcxz успокойтесь, уже разобрался благодаря arlleex, который подсказал, что multibuffer и double buffer не одно и то же. Тему можно закрывать. Quote Share this post Link to post Share on other sites More sharing options...