[APM32E0] 使用DMA同步接收缓冲区到SRAM处理区

[复制链接]
397|1
天鹅绒之夜 发表于 2025-10-29 23:15 | 显示全部楼层 |阅读模式
测试芯片:APM32E030
测试方案:把从SPI接收缓存区的数据搬到SRAM的指定位置。使用DMA的Memory2Memory方案。
  1. DMA_Config_T memory_dma_inst;

  2. static void memory_sync(uint16_t cnt)
  3. {
  4.   DMA_Disable(DMA1_CHANNEL_1);
  5.   DMA_SetDataNumber(cnt);
  6.   DMA_Enable(DMA1_CHANNEL_1);
  7. }

  8. static void memory_dma_init(const uint32_t src_addr, const uint32_t dst_addr)
  9. {
  10.   RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_DMA1);
  11.   NVIC_EnableIRQRequest(DMA1_CH1_IRQn, 7);

  12.   DMA_Reset(DMA1_CHANNEL_1);
  13.   DMA_ConfigStructInit(&memory_dma_inst);
  14.   memory_dma_inst.peripheralAddress = src_addr;
  15.   memory_dma_inst.memoryAddress = dst_addr;
  16.   memory_dma_inst.direction = DMA_DIR_PERIPHERAL;
  17.   memory_dma_inst.bufferSize = 0;
  18.   memory_dma_inst.peripheralInc = DMA_PERIPHERAL_INC_ENABLE;
  19.   memory_dma_inst.memoryInc = DMA_MEMORY_INC_ENABLE;
  20.   memory_dma_inst.peripheralDataSize = DMA_PERIPHERAL_DATASIZE_WORD;
  21.   memory_dma_inst.memoryDataSize = DMA_MEMORY_DATASIZE_WORD;
  22.   memory_dma_inst.circular = DMA_CIRCULAR_DISABLE;
  23.   memory_dma_inst.priority = DMA_PRIORITY_LEVEL_HIGHT;
  24.   memory_dma_inst.memoryTomemory = DMA_M2M_ENABLE;

  25.   DMA_Config(DMA1_CHANNEL_1, &memory_dma_inst);

  26.   DMA_EnableInterrupt(DMA1_CHANNEL_1, DMA_INT_TFIE);
  27. }

我的测试代码里要注意接收缓存区是按4字节对齐,并且传输的长度也是4字节对齐。这样做对于32位MCU来说应该是性能最高的方式。
还有,需要查看DMA是否搬运完成标志,而这个标志位我放在了DMA完成中断中置位。



天鹅绒星星 发表于 2025-11-2 17:37 | 显示全部楼层
楼主 是不是设计一个双缓存区的效果会更好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部