DMA这个小弟的结构;
在DMA初始化阶段,内核大哥对DMA说了什么;
在运行过程中,DMA怎么应对大哥的软件触发请求,以及其他外设发出的请求。
DMA的结构
DMA小弟具有如下五个部分:
AHB从接口——内核大哥与DMA通信接口
DMA通道寄存器——DMA记录大哥要求的笔记本
请求通道——听数据传输请求的耳朵
优先级仲裁器——DMA判断哪个通道优先的脑
外设端口和存储器端口——DMA转移数据的手
最重要的,也是本文的核心内容,就是这五个部分的工作配合流程,如下:
内核大哥在配置阶段通过AHB从接口对DMA进行配置,将配置写入DMA的笔记本(DMA通道寄存器)中,具体写了什么配置,下文分解。
同时允许需要使用DMA的外设使用DMA进行数据传输(置位其DMA发送/接收使能位);
DMA根据内核大哥的要求,用耳朵(请求通道)听相关硬件或软件的请求;
当听到请求后,如果有多个请求同时发生,DMA会用脑子(优先级仲裁器)想想大哥说谁比较着急(优先级高),比较着急的请求优先处理;
处理请求时,DMA会根据自己的笔记本(DMA通道寄存器)上写的从哪搬数据、搬到哪去、搬多少...等信息,用手(外设端口和存储器端口)搬运数据。
外设寄存器地址——发生外设数据传输时,这个地址将是数据传输的源或目的地址
存储器地址——发生外设数据传输时,传输的数据将从这个地址读出或写入
需要传输的数据量,每次 DMA 传输后,该寄存器值递减
通道的优先级
传输方向
循环模式
外设和存储器的增量模式
外设和存储器的数据宽度
传输一半产生中断或传输完成产生的中断
启动该通道
DMA 通道 x 配置寄存器 (DMA_CCRx) | 位 14 | 存储器到存储器模式 |
位 13:12 | 通道优先级 | |
位 11:10 | 存储器数据宽度 | |
位 9:8 | 外设数据宽度 | |
位 7 | 存储器地址增量模式 | |
位 6 | 外设地址增量模式 | |
位 5 | 循环模式 | |
位 4 | 数据传输方向 | |
位 3 | 传输错误中断使能 | |
位 2 | 传输一半中断使能 | |
位 1 | 传输完成中断使能 | |
位 0 | 通道使能 | |
DMA 通道 x 传输数量寄存器 (DMA_CNDTRx) | 位 15:0 | 传输数据的数量 |
DMA 通道 x 外设地址寄存器 (DMA_CPARx) | 位 31:0 | 外设地址 |
DMA 通道 x 存储器地址寄存器 (DMA_CMARx) | 位 31:0 | 存储器地址 |
DMA 中断状态 寄存器 (DMA_ISR) | 位 19, 15, 11, 7, 3 | 通道 x (x = 1 ..5) 传输错误标志 |
位 18, 14, 10, 6, 2 | 通道 x (x = 1 ..5) 传输一半标志 | |
位 17, 13, 9, 5, 1 | 通道 x (x = 1 ..5) 传输完成标志 | |
位 16, 12, 8, 4, 0 | 通道 x (x = 1 ..5) 全局中断标志 | |
DMA 中断标志清除寄存器 (DMA_IFCR) | 位 19, 15, 11, 7, 3 | 通道 x (x = 1 ..5) 传输错误清除 |
位 18, 14, 10, 6, 2 | 通道 x (x = 1 ..5) 传输一半标志清除 | |
位 17, 13, 9, 5, 1 | 通道 x (x = 1 ..5) 传输完成标志清除 | |
位 16, 12, 8, 4, 0 | 通道 x (x = 1 ..5) 全局中断标志清除 |
当相应中断发生时,中断标志寄存器置位,若使能了相应中断,内核将跳转去执行相应的中断服务函数,执行完成后,该位会被自动清零。
如果我们并不想执行相应中断,可以选择向DMA中断标志清除寄存器的相应位写“1”来清除中断标志。
这种单纯的通道序号排序就是上图中标识的固定的硬件优先级。
1.5 外设端口和存储器端口“ 外设端口和存储器端口——DMA转移数据的手。” DMA有两个主接口(master port),分别为外设接口和存储器接口。两个主接口与总线矩阵相连,总线矩阵协调DMA到SRAM,Flash和外设的访问控制。 外设端口可以连接从外设;存储器端口可以连接存储器控制器(SRAM,flash,FSMA,等)。 在某些DMA控制器中,外设端口同样可以连接存储器控制器,实现存储器到存储器传输。 写到这,我在参考《Stm32F051x参考手册》和《Stm32F4参考手册》时发现,本节上图中的DMA主接口结构与下图左相同,对应的是Stm32F4系列的DMA结构,具有两个主接口。 但是在Stm32F0系列的则没有,而是如上图右,使用一条DMA总线与总线矩阵连接。 这二者的区别就如:F4的DMA控制器具有两只手,一左一右,左手右手都先寻址,左手取值交给右手,右手直接将值塞入另一个地址中,实现耗费较短的时钟周期完成传输。
F0的DMA控制器只有一只手,一只手先寻址再取值,取完后,手再去寻另一个址再赋值。耗费的时间是F4的两倍左右。
写在最后 :本文一共约3634字,写的很长,写到最后发现文章的结构已经有些乱了,开头说的本文介绍的三个内容也互相杂糅在一起,介绍出来。而我所谓通俗化理解,却也还需要一些单片机基础知识才能看懂,这也是我推荐大家在学习Stm32单片机之前,至少对微型计算机原理有略微了解。未来这篇文章可能还会再整理再写,但是目前我要把这篇文章放下,继续进行其他部分的学习了。