目录
2.外设数据产生有一定的时机,需要使用硬件触发特定的DMA通道
一、简介
1.DMA可以直接访问STM32内部的存储器
如运行内存SRAM,
程序存储器Flash,(普通变量被const修饰就会存储在Flash中)
各种芯片外设的数据寄存器(如ADC数据寄存器,串口数据寄存器等)
由此实现外设寄存器和存储器、存储器和存储器之间的数据转运
即从某个地址取出数据,再存到另一个地址去,如果数据宽度不一致则需要数据对齐
2.DMA每进行一种数据转运都需要占用一个自身的转运通道
STM32F1资源
DMA1: 7通道
所有通道分时复用DMA总线,需要仲裁器仲裁
3.每个通道都支持软件触发和特定的硬件触发
1.每个通道的硬件触发源都不同,具体查表
2.外设数据产生有一定的时机,需要使用硬件触发特定的DMA通道
软件触发例子:存储器到存储器(SRAM<——>Flash),一股脑以最快速度全部转运完成
硬件触发例子:外设到存储器(ADC数据转运),
等待ADC每个通道转换完成后硬件触发一次DMA才进行数据的转运
4.DMA能进行数据转运条件
1.DMA使能
2.传输计数器大于0
3.有触发信号
注意:对传输计数器写值必须先关闭DMA使能
二、DMA数据转运例子
1.软件例子
数据数据的转运:一对一的转运
2.硬件例子
将外设ADC_DR寄存器中的数据转运到数组中
每个ADC通道采集完成后触发DMA转运ADC_DR寄存器中的数据
通道2采集完成——> 存入ADC_DR ——> 硬件触发DMA将其运走至ADValue[0]
通道5采集完成——> 存入ADC_DR,覆盖前一个数据——> 触发DMA将其运走至ADValue[1]
通道4采集完成——> 存入ADC_DR,覆盖前一个数据——> 触发DMA将其运走至ADValue[2]
……
如果ADC为连续扫描模式,DMA计数器需要自动重装
三、杂谈
1.计算机的五大组成部分
运算器
控制器
存储器
输入设备
输出设备
运算器 + 控制器 = CPU
2.STM32F1存储器映像
ROM:只读存储器,掉电不丢失
程序存储器Flash:存储C语言编译后的程序代码 地址:0x0800 0000
系统存储器: 存储Bootloader 0x1FFF F000
选项字节: 存储一些独立于程序代码的参数配置 0x1FFF F800
RAM:随机存储器,掉电丢失
运行内存SRAM:存储运行过程中的临时变量,各种变量、数组等 0x2000 0000
外设寄存器: 存储各个外设的配置参数 0x4000 0000
内核外设寄存器:存储内核外设各个外设的配置参数,NVIC等 0xE000 0000
STM中拥有对存储器访问权限的角色
内核Dcode:只访问Flash
内核系统总线:访问各类存储器,包括DMA的寄存器
DMA总线:访问各类存储器
3.数据转运中的数据对齐问题
源端和目的端数据宽度一致,直接转运
源端数据宽度 小于 目的端数据宽度,目的端高位补0
源端数据宽度 大于 目的端数据宽度,源端高位数据舍去
4.DMA和CPU同时访问相同地址问题
DMA会暂停CPU的访问,但仲裁器仍保证CPU至少可以获得一半的总线带宽
( 倒反天罡 Σ(;゚д゚) )