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

 
 
> STM32F4 ACD->DMA->USART, Как правильно настроить DMA?
Haamu
сообщение Dec 20 2013, 10:31
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 12-12-13
Пользователь №: 79 587



Ситуация такая... Оцифровываю несколько датчиков и через DMA сохраняю их показания в памяти. После записи энного количества показаний хочу передать их опять же через DMA по USART на компьютер, для дальнейшей обработки. Первую половину цепочки настроил, данный записываются в память. А вот передать их не получается. Подозреваю, что проблема где-то в настройках DMA.
Вот так я настраиваю DMA на передачу данных:
Код
    DMA_InitTypeDef DMA_InitStruct;
    DMA_InitStruct.DMA_Channel = DMA_Channel_4;
    DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);
    DMA_InitStruct.DMA_Memory0BaseAddr = (uint32_t)&sensors_data;
    DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripheral;
    DMA_InitStruct.DMA_BufferSize = 30000;    //Size of data in uint32_t sencors_data[]
    DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
    DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
    DMA_InitStruct.DMA_Priority = DMA_Priority_High;
    DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Enable;
    DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream7, &DMA_InitStruct);
    USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
    USART_Cmd(USART1, ENABLE);


Сомневаюсь в парвильности этих параметров:
Код
DMA_InitStruct.DMA_BufferSize = 30000;
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStruct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStruct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;

Если у меня передаваемый массив состоит из 30000 16-битных значений, а передаю я его по одному байту, правильно ли я указал размер буфера?
Я так понимаю, что при передаче HalfWord -> Byte без FIFO не обойтись. На что влияет его размер (FIFOThreshold)?
Как правильно выбрать DMA_Mode? Что значат режим Circular и режим Normal?
И что такое MemoryBurst и PeripheralBurst?

И еще один момент. Как я понимаю, после команды
Код
DMA_Cmd(DMA2_Stream7, ENABLE);

DMA сразу начинает передачу. Это так?
В дебагере заметил, что при запуске этой команды в регистре DMA_S7CR устанавливается бит EN, но на следуещем же такте он сбрасывается. Почему?
Go to the top of the page
 
+Quote Post



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

 


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


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