【英语能力有限,难免有误,敬请纠错】
DMA控制器(Direct Memory Access)是STM32中一个独立于Cortex-M3内核的模块。主要功能是在不占用CPU资源的情况下完成数据在外设到存储空间,存储空间到外设或存储空间到存储空间的数据传输,即帮助应用在不受CPU支配的情况下高速地访问数据。其传输方向可以是单向的或双向的,通过程序来配置。
STM32F207的DMA基于一个灵活的总线矩阵,利用强大的双AHB主总线架构(翻译可能不专业哈)与独立的FIFO来优化系统带宽。两个DMA控制器共有16个数据流(stream),其中每个控制器有8个数据流(stream),每一个都独立地管理来自一个或多个外设的数据访问请求,每个数据流(stream)都有8个通道,而且每个都具有独立的仲裁机构来处理DMA请求之间的优先级。
STM32F207的DMA的主要功能:
(1) 双AHB总线架构,一条专门用于访问存储空间,另一条专门访问外设。
(2) AHB从编程接口只支持32位数据的访问。
(3) 每个控制器拥有8个数据流(stream),每个数据流又有8个通道(channel)。
(4) 每个数据流(stream)具有4个分开的32位FIFO缓冲器,使数据流可以工作在FIFO模式或直接模式。
a. 先进选出模式:软件可选择FIFO阀值大小为FIFO大小的1/4或1/2或3/4。
b. 直接模式:每个DMA请求都会立即启动源与目的地址的数据传输。
(5) 每个数据流(stream)都可以被配置成:
a. 一个常规的通道,支持外设到存储器、存储器到外设、存储器到存储器的数据传输。
b. 一个双缓冲通道,这种情况下在存储器端可支持双缓冲。
(6) 8个数据流的每一个都与专用的硬件DMA通道相连用于处理数据请求。
(7) 可编程配置不同DMA请求的优先级(共4个优先级:非常高(very high)、高(high)、中等(medium)、低(low)),或者根据硬件的配置确定优先级(如从硬件上来说,DMA请求0比DMA请求1的优先级高)。
(8) 每个数据流都同时支持由软件触发的从存储空间到存储空间的数据传输(此功能仅对DMA有效)。
(9) 每个数据流请求可以从多达8个可能的通道请求中选择,这种选择机制可以通过软件进行配置,允许多个外设对DMA请求进行初始化。
(10) 可以由DMA控制器或者外设来管理被传输数据条目的数量:
a. DMA数据流控制器:被传输数据条目的数量由软件配置(1-65535)。
b. 外设数据流控制器:被传输的数据条目的数量是未知的,数据传输会在外设硬件发送传输终止信号后停止。
(11) 独立的源和目的的传输器宽度(Byte、Half-Word、Word),当源和目的的数据宽度不相等时,DMA会自动的添加或减缩传输器以优化带宽,不过该功能仅在FIFO模式下有效。
(12) 可以将源及目的地址配置为递增或非递增地址中的任一一种。
(13) 支持4,8,16节拍的增量突发传输(地址递增),突发的长度可以由软件配置。通常是外设FIFO宽度的一半。
(14) 每个数据流都支持循环缓冲区管理。
(15) 每个数据流(stream)都有5个事件标志(DMA Half Transfer,DMA Transfer Complete,DMA Transfer Error,DMA FIFO Error,Direct Mode Error),它们进行逻辑'或'操作后合成一个中断请求。
单个DMA模块框图:
STM32F207的DMA控制器完成直接存储访问传输:作为一个AHB主设备,它能够控制AHB总线矩阵去完成传输功能的初始化。DMA模块可以执行以下几种传输模式:
a. 外设到内存的传输
b. 内存到外设的传输
c. 内存到内存的传输(注意:如上图所示,DMA1的外设端口并没有与总线矩阵相边,因些不支持此模式的传输功能)
DMA控制器提供两个AHB主端口:AHB内存端口(用于连接内存和AHB外设端口)、AHB外设端口(用于连接外设)。但是如果要允许内存到内存的传输,AHB外设端口也必须要对内存进行访问。
AHB从接口用于对DMA控制器进行编程(只支持32位字宽的访问)。
同上面注意事项一样,DMA1控制器AHB外设端口并未与总线矩阵相连,只有DMA2控制器的AHB外设端口及AHB内存端口都与总线矩阵相连,因此只有DMA2的数据流(stream)支持内存到内存的传输。
我表示,STM32官方的固件库很强大,以上内容如果没有错误的话,相信再结合固件库中关于DMA的例程来看,当然你直接看一个ADC的例程,好像也用到了DMA功能,这样相信你就会很快掌握STM32的DMA的用法了(当然用到非例程相关的资源时要多看PDF查阅相关参数),说多了无益,我准备把时间用在其他模块的研究中去了……请发现问题的大侠一定要指出来哦,我将“感激涕淋”
例程更新了,地址如下,说明:第一个例程是内存与内存之间进行DMA传输,带有详细的中文说明,后面的一个例程是讲解如何使用外设结合DMA来编写应用程序,就没有带太多中文说明了,希望会有点帮助:
——回复可见内容——
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |