使用DMA同步接收缓冲区到SRAM处理区
测试芯片:APM32E030测试方案:把从SPI接收缓存区的数据搬到SRAM的指定位置。使用DMA的Memory2Memory方案。DMA_Config_T memory_dma_inst;static void memory_sync(uint16_t cnt)
{
DMA_Disable(DMA1_CHANNEL_1);
DMA_SetDataNumber(cnt);
DMA_Enable(DMA1_CHANNEL_1);
}
static void memory_dma_init(const uint32_t src_addr, const uint32_t dst_addr)
{
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1);
NVIC_EnableIRQRequest(DMA1_CH1_IRQn, 7);
DMA_Reset(DMA1_CHANNEL_1);
DMA_ConfigStructInit(&memory_dma_inst);
memory_dma_inst.peripheralAddress = src_addr;
memory_dma_inst.memoryAddress = dst_addr;
memory_dma_inst.direction = DMA_DIR_PERIPHERAL;
memory_dma_inst.bufferSize = 0;
memory_dma_inst.peripheralInc = DMA_PERIPHERAL_INC_ENABLE;
memory_dma_inst.memoryInc = DMA_MEMORY_INC_ENABLE;
memory_dma_inst.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_WORD;
memory_dma_inst.memoryDataSize = DMA_MEMORY_DATASIZE_WORD;
memory_dma_inst.circular = DMA_CIRCULAR_DISABLE;
memory_dma_inst.priority = DMA_PRIORITY_LEVEL_HIGHT;
memory_dma_inst.memoryTomemory = DMA_M2M_ENABLE;
DMA_Config(DMA1_CHANNEL_1, &memory_dma_inst);
DMA_EnableInterrupt(DMA1_CHANNEL_1, DMA_INT_TFIE);
}
我的测试代码里要注意接收缓存区是按4字节对齐,并且传输的长度也是4字节对齐。这样做对于32位MCU来说应该是性能最高的方式。还有,需要查看DMA是否搬运完成标志,而这个标志位我放在了DMA完成中断中置位。
楼主 是不是设计一个双缓存区的效果会更好 使用DMA搬运 还需要验证数据的完整性吗? 典型应用呗 还是使用DMA的方式程序更紧凑。性能也是最好的 DMA可是一个好东西。用好了对性能提升帮助很大 我们不仅用来同步SRAM,其实,同步外部存储到SRAM也是使用同样的思路。
页:
[1]