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

 
 
> 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
 
Start new topic
Ответов
Falkon_99
сообщение Dec 20 2013, 13:12
Сообщение #2


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

Группа: Участник
Сообщений: 169
Регистрация: 26-03-12
Из: Харьков
Пользователь №: 71 010



прочитайте тут, большинство вопросов отсеится

Сообщение отредактировал Falkon_99 - Dec 20 2013, 13:13
Go to the top of the page
 
+Quote Post
Haamu
сообщение Dec 20 2013, 17:00
Сообщение #3


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

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



Цитата(Falkon_99 @ Dec 20 2013, 17:12) *
прочитайте тут, большинство вопросов отсеится

В том то и дело, что уже читал, но осталось непонимание. Хороший сайт, спасибо автору. Но в этой статье, как и в большинстве других есть указания, что и как настраивается, но не объясняется почему именно так.

Кстати, по поводу моего кода. Когда проверил работу уже на железе, а не в дебагере, оказалось что всё работает. Видимо как-то не туда смотрел в дебагере. Единственный момент, который следует исправить - это размер буфера. Так как я отправляю 30000 HalfWord'ов по одному байту, то таких байт, а соответсвенно и запросов к DMA должно быть в два раза больше.

Сообщение отредактировал Haamu - Dec 20 2013, 17:03
Go to the top of the page
 
+Quote Post
Haamu
сообщение Dec 21 2013, 12:15
Сообщение #4


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

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



И все-же...
Код
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStruct.DMA_MemoryBurst = ???????
DMA_InitStruct.DMA_PeripheralBurst = ???????

Какими доолжны быть последние два параметра при таких вот настройках DMA? Есть кто-нибудь, кто разобрался в параметрах Burst?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Dec 21 2013, 16:09
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Haamu @ Dec 21 2013, 19:15) *
DMA_InitStruct.DMA_MemoryBurst = ???????
DMA_InitStruct.DMA_PeripheralBurst = ???????[/code]
Какими доолжны быть последние два параметра при таких вот настройках DMA? Есть кто-нибудь, кто разобрался в параметрах Burst?

Эхх... кто-бы знал, у меня для STM32F105 в настройках таких параметрок к сожалению нет.
Вы бы уж написали какой конкретно процессор используете.
Go to the top of the page
 
+Quote Post



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

 


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


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