|
测试芯片: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完成中断中置位。
|