Jump to content

    

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; //Записываем значение в регистр данных - передаем символ
}

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

Этим?

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
вроде так корректно каждый раз инициализировать передачу снова

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this