реклама на сайте
подробности

 
 
> STM32, работа с UART и DMA, как правильно передавать?
esaulenka
сообщение Jul 8 2014, 16:24
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Доброго дня.

Нужен совет по архитектуре типичнейшей задачи, как правильно соорудить передачу по UART.

Мы используем кучу уартов, работая через прерывания. Далее - копипаста по нескольким uart'ам, различающаяся только указателями на uart, и на буфер: обработчик прерывания, который перекладывает байты из софт-буфера (ну и наоборот, в буфер); API - функции "получить 1 байт", "передать 1 байт", "передать N байт".
Типичное использование на передачу - функция формирует пакет и налету скидывает его порциями в буфер.

Так вот, все примеры общения с DMA, что я видел - сформировать большой буфер, настроить DMA на его передачу, курить бамбук, пока всё не отработает.
С нашим API как-то не очень совместимо - постоянно останавливать-запускать DMA при добавлении в очередь ещё одного байта совсем плохо.

Я что-то пропустил, или передача по DMA на мою задачу никак не ложится?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Jul 9 2014, 01:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



На Вашу задачу STM32 - никак не ложится, ибо очень неудобно в нём использовать UART, а тем более если нужна куча их. Нужно было выбирать что-то другое, где есть нормальное FIFO в UART.
А так - на каждый UART Вам придётся выделить в худшем случае по два DMA-канала. Может и не хватить их.

А использовать DMA совместно с кольцевым буфером никакой проблемы нет.
Зачем там что-то останавливать и перезапускать? Почитайте описание работы DMA.
Накопилось у Вас в Вашем кольцевом буфере сколько-то данных - программируете DMA-канал на передачу этого блока.
Закончилась DMA-передача блока - программируете на след. блок (если уже накопился).
Что тут сложного?

С приёмом сложнее. Так как размер входящих данных заранее не известен, то нужно будет программировать на какой-то размер блока,
а потом возможно - контролировать кол-во поступивших на данный момент данных и останавливать DMA-приём.
Я на STM32 связку UART.RX+DMA не использовал, так что сказать точно про приём не могу.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th August 2025 - 09:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01343 секунд с 7
ELECTRONIX ©2004-2016