Перейти к содержанию
    

DMA STM32

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

 

Я просто настраиваю DMA, UART, запускаю работу DMA по прерываниям.

Делаю обычную инициализацию UART.

Дальше- оно само в UART все передаст, или нужны подобные ф-ии

//Функция передачи символа
void Usart1_Send_symbol(uint8_t data)
{
  while(!(USART1->SR & USART_SR_TC)); //Проверяем установку флага TC - завершения предыдущей передачи 
  USART1->DR = data; //Записываем значение в регистр данных - передаем символ
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в общем случае не нужны. В том и фиша, что оено само буфер выпулит в UART по указанной длине. Можно ещё в конце прерывание получить или флаг, что всё готово.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Этим?

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

Активируем передачу в последовательный порт по запросу DMA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЭТО надо забыть и внимательно изучить reference manual.

Там английским языком сказано, что после того, как DMA передаст запрограммированное количество байт, оно останавливается.

Потом снова надо записать требуемое количество в регистры и снова запустить передачу.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде так корректно каждый раз инициализировать передачу снова

DMA_Cmd (DMA1_Channel4, ENABLE); // однократно передаем данные по DMA

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ещё раз предлагаю ознакомиться с reference manual.

И сравнить раздел "Channel configuration procedure" и код DMA_Cmd().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вроде так корректно каждый раз инициализировать передачу снова

DMA_Cmd (DMA1_Channel4, ENABLE); // однократно передаем данные по DMA

Одной командой второй запуск не активировать, необходимо заново провести процедуру переинициализации dma. Самый простой способ вызывать тот же алгоритм, который уже вызвался в программе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...