? ? ? ?简介?
?
DMA
(
Direct Memory Access
)直接存储器存取
?
DMA
可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须
CPU
干预,节省了
CPU
的资源
?
12
个独立可配置的通道:
DMA1
(
7
个通道),
DMA2
(
5
个通道)
?
每个通道都支持软件触发和特定的硬件触发
?
?
STM32F103C8T6
DMA
资源:
DMA1
(
7
个通道)
软件触发: 如把FLASH里面的数据, 转运到SRAM里面中, DMA会最快速度全部数据转运完成.
硬件触发: 如果是外设到存储器中转运. 就需要考虑一些时机, 如转运ADC数据, 就需要每个通道转换完成之后, 进行一次硬件触发DMA, 之后DMA会开始转运. 触发一次转运一次, 这样不会干预其他外设的工作.
存储器到存储器的转运, 使用软件触发, 外设到存储器的转运, 使用硬件触发.
?
存储器
ROM掉电不丢失, RAM掉电丢失数据.
DMA逻辑框图
起始地址: 数据从哪里来? 从外设, 还是存储器. 到哪里去? 数据转运到哪个地址?
数据宽度: 指定一次转运, 要按多大的数据宽度来进行. (字节Byte/ 半字HalfWord/ 字Word).
地址是否自增: 数据转运完之后, 要不要将地址移动到下一个位置中去.
传输计数器: 我要传几次?自减计数器. 减到0之后, DMA就不会转运数据了, 1就是1次.
自动重装器: 传输计数器减到零, 立即重装到原来的数值, 达到循环模式.
M2M: Memory to Memory, 选择触发模式.
硬件触发: 一般用于外设, 需要找好Timing, 然后调用函数来触发. 只能用于指定的外设通道.
软件触发: 不用调用函数触发, 用最快的速度, 连续转运, 直到结束(计数器清零). 和自动重装器只能用一个. 用于存储器到存储器的转运, 因为不需要Timing. 最快完成就行. 可以用于所有的地址.
开关控制: 开启DMA. 写传输计数器时必须关闭DMA才能写入.
DMA转运条件
1. 开启开关控制
2. 转运计数器>0
3. 必须有触发源(M2M)
代码上如果使用const修饰全局变量, 会将该变量存放在Flash里面, 如果没有const修饰, 会放到SRAM里面, 如果一些不需要改变的变量, 并且常用的, 可以放到Flash里面, 节省SRAM的空间. const修饰局部变量还是放到SRAM中.
?