Ситуация такая... Оцифровываю несколько датчиков и через 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, но на следуещем же такте он сбрасывается. Почему?