一、前言
笔者需要将高速采集的ADC数据存储到SD卡中,对速率有要求。这里希望可以采用速度最快的DMA传输方式。经过翻阅数据手册查询,stm32支持设备到设备的DMA传输方式。
注:DMA的本质是地址到地址,至于两个地址的功能是什么,由该地址上的具体外设决定。所以支不支持DMA传输,不仅取决于DMA,还和外设相关。
二、STM32的DMA说明
2.1 DMA传输方向说明
- SRAM<————>DEV(内存到设备,例如DA输出)
- SRAM<————>SRAM(内存到内存,例如前后缓存区数据搬移)
- DEV <————>SRAM(设备到内存,例如AD采集)
- DEV <————>DEV(设备到设备,本帖主要讨论内容)
2.2 DMA内部寄存器配置说明
1 | DMA_DeInit(DMA_Channel2); //初始化DMA通道,根据用到的不同功能初始化对应通道。 |
DMA初始化结束,只能说明,连接外设和外设(内存)的桥已经搭建好了,外设自己还没有同意通过DMA呢,还需要在每个外设设置启用DMA传输方式,如下:
1 | ADC_DMACmd(ADC1,Enable); // 启用ADC1的DMA使能 |
当然两个外设还需要配置,不予介绍。
2.3 对设备的要求
只能是ADC到ADC这样的简单的设备
很多在传输数据之前需要有很多寄存器操作的,不适合使用设备到设备的传输方式。
注:比如ADC到SD卡就不行,因为SD卡存储之前需要有很多的操作。
3 总结
经过一系列探索,查找资料,DMA的本质是传输数据,并不带有控制。所以虽然设备到设备传输理论上是可行的,但是由于实际上很多设备在传输之前都需要进行一些寄存器的配置,使得大部分情况下设备到设备的传输步骤如下:
- 设备1->SRAM
- 触发中断
- SRAM->设备2
在最初我是希望AD7764采集的数据直达SD卡,想法很好,现实骨感,失败告终。