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

 
 
> DMA STM32
Метценгерштейн
сообщение Jun 4 2015, 17:47
Сообщение #1


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



Допустим, хочу передать данные из МК в UART через DMA.

Я просто настраиваю DMA, UART, запускаю работу DMA по прерываниям.
Делаю обычную инициализацию UART.
Дальше- оно само в UART все передаст, или нужны подобные ф-ии
Код
//Функция передачи символа
void Usart1_Send_symbol(uint8_t data)
{
  while(!(USART1->SR & USART_SR_TC)); //Проверяем установку флага TC - завершения предыдущей передачи
  USART1->DR = data; //Записываем значение в регистр данных - передаем символ
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
Spider
сообщение Jun 4 2015, 17:59
Сообщение #2


В поисках истины
***

Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923



в общем случае не нужны. В том и фиша, что оено само буфер выпулит в UART по указанной длине. Можно ещё в конце прерывание получить или флаг, что всё готово.
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 4 2015, 18:02
Сообщение #3


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



спасибо. А еще вопрос- я все настроил, а где команда старта, что данные пора в DMA выгрузить? Допустим, у меня массив, а как сказать, что там в массиве новые данные и снова их бы отправить надо?

Этим?
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
Активируем передачу в последовательный порт по запросу DMA
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 5 2015, 10:27
Сообщение #4


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

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



ЭТО надо забыть и внимательно изучить reference manual.
Там английским языком сказано, что после того, как DMA передаст запрограммированное количество байт, оно останавливается.
Потом снова надо записать требуемое количество в регистры и снова запустить передачу.

Термин "выгрузить в DMA" некорректный.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Метценгерштейн
сообщение Jun 5 2015, 19:31
Сообщение #5


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

Группа: Свой
Сообщений: 1 357
Регистрация: 12-04-05
Из: Петербург
Пользователь №: 4 079



вроде так корректно каждый раз инициализировать передачу снова
DMA_Cmd (DMA1_Channel4, ENABLE); // однократно передаем данные по DMA
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 8 2015, 05:45
Сообщение #6


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

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



Ещё раз предлагаю ознакомиться с reference manual.
И сравнить раздел "Channel configuration procedure" и код DMA_Cmd().


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
UDmitry
сообщение Jun 12 2015, 19:55
Сообщение #7





Группа: Участник
Сообщений: 13
Регистрация: 28-01-14
Из: Таганрог
Пользователь №: 80 225



Цитата(Метценгерштейн @ Jun 5 2015, 22:31) *
вроде так корректно каждый раз инициализировать передачу снова
DMA_Cmd (DMA1_Channel4, ENABLE); // однократно передаем данные по DMA

Одной командой второй запуск не активировать, необходимо заново провести процедуру переинициализации dma. Самый простой способ вызывать тот же алгоритм, который уже вызвался в программе.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 23:15
Рейтинг@Mail.ru


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