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

 
 
> STM32F4+HAL+FIFO_DMA+UART_TX
vitmeat
сообщение Aug 26 2015, 14:26
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 22-01-11
Пользователь №: 62 402



Доброго времени суток.

Я пытаюсь настроить передачу по UART при помощи кольцевого FIFO буфера с использованием соответствующего режима DMA.
Но как то не получилось у меня приостанавливать передачу, и стартовать ее заново с того же места, всегда получается с начала.
Функции HAL_UART_DMAPause и HAL_UART_DMAResume не работают, по крайней мере так, как я ожидаю.
__HAL_DMA_GET_COUNTER - возвращает количество еще не переданных данных.
__HAL_DMA_SET_COUNTER - устанавливает количество еще не переданных данных, но она опять же не работает.

Настройки DMA
Код
    hdma_tx.Init.Channel             = USARTx_TX_DMA_CHANNEL;
    hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;
    hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;
    hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;
    hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;
    hdma_tx.Init.Mode                = DMA_CIRCULAR;
    hdma_tx.Init.Priority            = DMA_PRIORITY_LOW;
    hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;
    hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
    hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;
    hdma_tx.Init.PeriphBurst         = DMA_MBURST_SINGLE;


В итоге сейчас остановился на реализации отдельного кольцевого FIFO буфера и обычной передаче по DMA, а в прерывании DMA дописываю в буфер то, что еще пришло за время передачи. Но получается что у меня два буфера, один FIFO другой DMA.

Подскажите пожалуйста, как правильно работать с кольцевым режимом DMA.
То есть, хочется докладывать в кольцевой буфер пока DMA передает, и не блокировать процесс, и чтобы это был всего один буфер.
Или этого нельзя делать пока DMA не отработал?

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vitmeat
сообщение Aug 26 2015, 16:51
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 22-01-11
Пользователь №: 62 402



Ну в общем суть такая:

* Послали данных, настроили ДМА и он начал их отправлять в юарт
* Дослали еще данных, предыдущая передача ДМА еще не завершена:
- приостанавливаем ДМА HAL_UART_DMAPause
- дописываем данные в буфер
- берем из __HAL_DMA_GET_COUNTER сколько было не отправлено
- плюсуем с количеством новых данных и устанавливаем __HAL_DMA_SET_COUNTER
- обратно запускаем HAL_UART_DMAResume
- в прерывании делаем HAL_UART_DMAStop
Так по идее должно работать.

Как у меня сейчас
* Послали данных, закинули их в фифо, вынули из фифо в буфер ДМА, настроили ДМА и он начал их отправлять в юарт
* Дослали еще данных, предыдущая передача ДМА еще не завершена:
- закинули их в фифо, установили флаг что есть еще данные
- в прерывании окончания передачи, смотрим на флаг, если он установлен, копируем из фифо в буфер ДМА данные и опять запускаем передачу
Дело в том, что так тратится ДВА буфера одинакового размера.

Сообщение отредактировал vitmeat - Aug 26 2015, 16:54
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 26 2015, 17:33
Сообщение #3


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(vitmeat @ Aug 26 2015, 23:51) *
Как у меня сейчас
* Послали данных, закинули их в фифо, вынули из фифо в буфер ДМА, настроили ДМА и он начал их отправлять в юарт

А зачем копировать из одного буфера в другой? Натравливайте DMA сразу на буфер фифо.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
vitmeat
сообщение Aug 26 2015, 17:39
Сообщение #4





Группа: Участник
Сообщений: 13
Регистрация: 22-01-11
Пользователь №: 62 402



Цитата(SSerge @ Aug 26 2015, 20:33) *
А зачем копировать из одного буфера в другой? Натравливайте DMA сразу на буфер фифо.

Я так и хочу! Но не понимаю как это настроить.
Либо ДМА начинает все с начала не обращая внимания на мои HAL_UART_DMAPause и __HAL_DMA_SET_COUNTER
Либо выходит за пределы памяти, либо по кругу просто все выдает.

Я просто думал есть какая то последовательность мне неизвестная.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- vitmeat   STM32F4+HAL+FIFO_DMA+UART_TX   Aug 26 2015, 14:26
- - DrGluck   Этимологию и топонимику DMA в студию ... ( дубль 2...   Aug 26 2015, 14:41
- - Golikov A.   да ничего они не индифферентны.... они шаряться по...   Aug 26 2015, 16:22
- - Golikov A.   __HAL_DMA_SET_COUNTER __HAL_DMA_GET_COUNTER как ...   Aug 26 2015, 17:03
- - vitmeat   Ну, в общем, один и тот же: #define __HAL_DMA_SET_...   Aug 26 2015, 17:11
- - DrGluck   "... да ничего они не индифферентны.... они ш...   Aug 26 2015, 17:18
- - SSerge   Настроить в регистрах DMA начальный адрес и количе...   Aug 26 2015, 18:04
- - Golikov A.   Цитата- записал на скрижали ... sm.gif копирайт не...   Aug 26 2015, 19:48
|- - king2   Можно еще настроить DMA в режим curcular? чтобы он...   Aug 26 2015, 22:05
- - SasaVitebsk   Работаешь - работаешь. Читаешь доки - читаешь. А п...   Aug 27 2015, 05:14
|- - SSerge   Цитата(SasaVitebsk @ Aug 27 2015, 12:14) ...   Aug 27 2015, 07:30
|- - SasaVitebsk   Цитата(SSerge @ Aug 27 2015, 10:30) Буфер...   Aug 27 2015, 09:02
- - SSerge   Ну так модбасу больше одного пакета за раз передав...   Aug 27 2015, 09:21


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

 


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


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