Преднамеренное получение полного прерывания UART DMA после указанного времени ожидания - PullRequest
0 голосов
/ 04 октября 2018

Я настроил UART для приема в режиме DMA, где размер буфера составляет около 64 байтов.Таким образом, в основном, полное прерывание получения DMA HAL_UART_RxCpltCallback () будет срабатывать только при получении 64 символов.

Есть ли в STM32 способ, с помощью которого я могу настроить время ожидания для DMA Rx, когда буфер является только частичнозаполнено (то есть получено менее 64 символов), и мы больше не получаем символы в течение указанного времени, затем DMA вызовет то же самое прерывание на основе HAL_UART_RxCpltCallback (), чтобы позволить потребителю использовать любые частичные данные, которые в настоящее время принимаются в UART?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы можете использовать прерывание обнаружения простоя UART параллельно с прерыванием DMA.Я использовал это несколько раз с процессорами ST32F0xx, и он работает отлично.Там обнаружение простоя должно быть доступно и на процессорах F4 и F7.

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

0 голосов
/ 25 октября 2018

чтобы получить количество переданных байтов, вы можете использовать регистр DMA_CNDTRx или DMA_SxNDTR (имя отличается для семейства STM, где x - номер канала).

Этот регистр уменьшается после каждой передачи DMA.После завершения передачи этот регистр может оставаться на нуле или автоматически перезагружаться по ранее запрограммированному значению, если канал настроен в режиме автозагрузки.

К сожалению, STM HAL не предоставляет API,Вы должны реализовать это самостоятельно.

0 голосов
/ 05 октября 2018

Это просто, но вместо этого вы должны использовать прерывание по таймеру приёмника USART.enter image description here

...