简单记录一下stm32f103zet6中DMA开发过程的一些理解
目录
实际上DMA并不是一个存储器,而是一个控制器,控制两个数据存储区域之间的数据传输,这个“数据存储区”可以是Flash或DRAM中的一大片存储区,也可以是SRAM中的某个存储变量,也可以是外设中的某个数据寄存器,具体是什么可以通过配置DMA的源地址和目标地址来确定。
比如在ADC数据采集方案中,可以采用中断或DMA的方式读取采集到的数据。ADC在采集过程中,会在一个转换时间后(一般是数个时钟周期)将采集到的一次模拟数据转换成离散数据存到数据寄存器中,即ADCx->DR,随后有两种方法读取这个DR,分别是:
1. 中断读取
在经过一次转换时间后(采样时间+n个时钟周期),采集到的数据将会存入ADC的数据寄存器DR中,并同时发生转换完成中断,此时会进入中断服务函数,将DR的值赋给main.c定义好的extern变量,完成ADC数据读取;
2. DMA读取
在经过一次转换时间后(采样时间+n个时钟周期),采集到的数据将会存入ADC的数据寄存器DR中,我们将DMA的源地址配置为DR的地址,将目的地址配置为main.c中的extern变量的地址(这个是存在SRAM中的),将DMA配置为循环模式,DMA控制器会自动将源地址数据传给目标地址,完成ADC数据读取,应当注意,循环模式是存在读取速度的,若DMA循环读取速率低于ADC转换速率,可能会导致有些ADC的转换值未被读取。
3. 结尾总结
注意在ADC采集中,DMA需要配置为循环模式,以下是普通模式和循环模式的区别:
3.1 Circle(循环)模式
在Circle模式下,DMA传输可以循环执行,即在完成一次传输后会自动重新开始下一次传输,形成一个循环。这种模式适用于需要连续、循环传输数据的场景。在循环模式下,DMA传输会持续不断地从源地址读取数据,并将数据写入目标地址,直到达到设定的传输长度或触发停止条件。
循环模式下的DMA传输通常用于周期性的数据传输,如音频、视频流等连续数据流的传输。
3.2 Normal(普通)模式
在Normal模式下,DMA传输只会执行一次,传输完毕后就会停止。这种模式适用于单次数据传输的场景。在普通模式下,DMA传输会从源地址读取数据,并将数据写入目标地址,直到达到设定的传输长度或触发停止条件,然后传输停止。
普通模式下的DMA传输适用于需要一次性传输数据的情况,如初始化数据、配置信息等。
需要注意的是,循环模式和普通模式都可以设置传输长度、源地址和目标地址等参数,区别主要在于传输的执行方式和传输结束后是否重新开始。
在使用DMA时,需要根据具体的应用需求选择适合的模式。如果需要连续、循环传输数据,可以选择循环模式;如果只需进行单次传输,可以选择普通模式。同时,还需要注意设置适当的传输长度和停止条件,以确保传输的准确性和可靠性。