知识点1【DMA的介绍】
直接内存访问(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,无需CPU的干预,数据可以通过DMA快速地移动,这就节省了CPU的资源,来做其他的操作------提高CPU的效率
在STM32F103ZET6中
两个DMA控制器
12个通道:DMA1(7个),DMA2(5个)
每个通道用来专门管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁其来协调各个DMA请求的优先权
下面我分析一下这张框图
1、DMA框图
寄存器是一种特殊的SRAM,CPU可以对寄存器进行读写,进而来来操作外设,寄存器是软件和硬件之间的桥梁。
内核外设有 NVIC和SysTick

总线矩阵左端 是主动单元 ,拥有主动权,右端是被动单元,会被主动单元读写
DCode专门用来访问Flash的,系统总线用来访问其他东西的。这些了解就好,这里着重介绍于DMA相关的。
以DMA1为例,可见DMA1有7个通道 ,但是DMA总线只有一条(对于DMA1来说) ,如果产生冲突就会有仲裁器根据优先级决定哪个通道先使用DMA通道。
注意:在总线矩阵处也有一个仲裁器,防止DMA,系统,DCode总线之间的冲突。
AHB从设备 ,是DMA自身的寄存器,用于配置DMA参数 。连接到了被动单元,因此DMA即使总线矩阵的主动单元(可以读写),也是被动单元(可以被CPU所配置)。
DMA请求,外设(寄存器)需要DMA的时候,会向DMA发出硬件触发信号 (DMA请求),之后DMA会执行数据转运的操作
补充:Flash一般是只读的,例如系统总线,DMA想要操作Flash都是只读的。如果想要对其写入,就需要借助Flash接口控制器。
因此我们使用DMA进行数据转运的时候,目的地址填写了Flash的地址,就会出错
这里补充一下存储器的地址映像
2、存储器映像

程序是从0地址开始运行,但在0地址会进行映射到目标地址,如Flash会映射到起始地址位为0x0800 0000 的地址块
3、DMA基本结构

大家看江协课程中的这张图片
我们从下向上看
分析
1、软件触发/硬件触发,决定DMA转运的时机 ,这个是由M2M(memory to memory)决定的
硬件触发:一般都是与外设相关的转运,这些转运需要特定的时机。
软件触发:并不是调用某个函数,就触发一次,而是以最快的速度,连续不断地触发DMA ,以将计数器减小到0,因此不可与自动重装载同时配置,不然将停不下来。
2、传输计数器,数据转运的的次数,是一个自减计数器,没转运一次就停止转运,减到0后,自增的地址 也会恢复到起始地址,以方便进行新一轮的转换。
自动重装器:是当计数器减到0后 ,是否要恢复到最初的值。常与ADC的连续转换模式结合
3、数据可以从外设寄存器转运到存储器,也可以有存储器转运到外设寄存器,这个是由方向寄存器配置的。
数据组成
**起始地址:**发送什么数据
数据宽度:分为字节,半子,字,决定转运数据的大小
地址是否自增:如ADC的扫描模式,外设地址就无需自增,存储器需要自增;但是如果一个数组数据转运到另一个数组,就需要自增了。
注意
外设寄存器(只是个名字)中可以写Flash或SRAM地址
这里注意Flash 的只读属性,图中是单向的。
4、DMA开启条件
1、DMA使能
2、传输计数器大于0
3、触发源
**注意:**写传输计数器的时候,必须关闭DMA。因此
一次数据转运完毕后,需要线关闭DMA,写传输计数器,打开DMA。
上面那张是形象后的图形,手册中的图如下,大家可以看一下

5、DMA的中断请求

6、数据宽度与对齐
大家看下表

总结
1、目标数据位如果大于 源数据,高位补0
2、目标数据位如果小于 源数据,高位舍弃
知识点2【DMA通道分布】


知识点3【寄存器介绍】
这里我以比较重要的DMA_CCRx 通道x配置寄存器为例



14:软硬件触发选择
12-13:优先级配置(仲裁)
8-9,10-11:数据宽度
6,7:自增模式选择
5:自动重装器配置
4:方向配置
1-3:中断配置
0:DMA使能

这三个寄存器
数目是16位,
地址是32位的,
外设寄存器地址寄存器:CPAR
存储器寄存器地址寄存器:CMAR
知识点4【DMA标准库函数介绍】

每个外设中又有对应的DMA配置函数,但配置的流程都大相径庭。
如ADC中,的

虽然ADC扫描模式在单个通道转换完成后,不产生任何中断和标志位,但会触发DMA进行数据转运
ADC在扫描模式中,由于多通道共用同一个数据寄存器,因此数据覆盖率很高,这导致ADC和DMA经常配合使用
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!!
