news 2026/4/23 12:32:22

【DMA控制器原理】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【DMA控制器原理】

DMA控制器介绍

DMA代表直接存储器访问。DMA是一种嵌入式系统中用于高效传输数据的机制,提供在外设与存储器、存储器和存储器之间的高速数据传输,它允许外设中的数据直接传输到系统存储器,而无需通过CPU的干预。特别是在大量数据传输的场景下,通过减少CPU的干预,系统性能得到提升。

DMA的通道请求

STM32F407有2个DMA控制器,每个控制器有8个数据流,每个数据流有8个通道,1个数据流每次只能搬运1个通道的数据

请求印射

DMA1

DMA2

DMA的仲裁器

DMA中的仲裁器是一个用于管理多个DMA通道之间竞争访问系统总线的组件。当系统中有多个外设或DMA设备需要访问系统内存时,可能会存在竞争条件。仲裁器的任务是协调这些通道的访问。

软件优先级:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:

最高优先级(Very High)

高优先级(High)

中等优先级(Medium)

低优先级(Low)

硬件优先级:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。

DMA事务

每个DMA传输包含三项操作:

通过DMA_SxPARDMA_SxM0AR寄存器寻址,从外设数据寄存器或存储器中加载数据

通过DMA_SxPAR或DMA_SxM0AR寄存器寻址,将加载的数据存储到外设数据寄存器或存储器

DMA_SxNDTR计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数。

要传输的数据项的数目及其宽度(8位、16位或32位)可用软件编程。

DMA的传输模式

外设控制器地址设置:DMA_SxPAR

存储器地址设置:DMA_SxM0AR

存储器范围:0x2000000至0x200200000共128KB

FIFO

启用FIFO后,每个数据流都有一个独立的4字(16字节)FIFO,源地址中的数据不会之间由DMA搬运到目标地址中,而是先将数据存入FIFO中,当到达设置的阈值时DMA会从FIFO中将数据取出放入存储器。

DMA的指针增量

DMA的循环模式

循环模式可用于处理循环缓冲区和连续数据流(例如ADC扫描模式)。

可以使用DMA_SxCR寄存器中的CIRC位使能此特性。

当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应DMA请求。

DMA的双缓冲模式

通过将DMA_SxCR寄存器中的DBM位置1,即可使能双缓冲区模式,存储器到存储器模式不适用。

在此模式下,DMA_SxM0AR与DMA_SxM1AR寄存器互相协作,每次事务结束时,DMA控制器都从一个存储器目标交换为另一个存储器目标。

软件在处理一个存储器区域的同时,DMA传输还可以填充/使用第二个存储器区域。

DMA的流控制器

控制要传输的数据数目的实体称为流控制器。

流控制器使用DMA_SxCR寄存器中的PFCTRL位针对每个数据流独立配置。

1、DMA控制器:在这种情况下,要传输的数据项的数目在使能DMA数据流之前由软件编程到DMA_SxNDTR寄存器。

2、 外设源或目标:当要传输的数据项的数目未知时属于这种情况。当所传输的是最后的数据时,外设通过硬件向DMA控制器发出指示。仅限能够发出传输结束信号的外设支持此功能(STM32中只有SDIO可以)。

当外设流控制器用于给定数据流时,写入DMA_SxNDTR的值对DMA传输没有作用。一旦使能数据流,硬件即会将该值强制置为0xFFFF。

配置过程

DMA的搬运模式

外设到存储器模式

存储器到外设模式

存储器到存储器模式

只有DMA2可以使用该模式

常用状态

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:31:00

【流体】基于二维稳态不可压缩层流通道流(利用FVM和SIMPLE 解平行板间层流的速度、压力和温度)附Matlab代码和报告

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码获取及仿…

作者头像 李华
网站建设 2026/4/23 11:31:39

rh850 can uds刷写 boot +OTA 1. 基于can 通讯 的bootloader

rh850 can uds刷写 boot OTA 1. 基于can 通讯 的bootloader,芯片用的是rh850u2a16 2. 配套capl上位机 3. uds服务刷写 4. flash driver 可选择在ram中运行 5. 支持single map/ double map ota/single map GCFU ota三种模式下的刷写,支持单/双map 两种模式…

作者头像 李华
网站建设 2026/4/23 9:52:04

基于Matlab的遗传算法设计:多旅行商问题(MTSP)的求解与输出路径

基于matlab多旅行商MTSP问题,利用遗传算法求解多旅行商问题的算法设计,输出MTSP路径。 相互独立路径,同一起点路径。 程序已调通,可直接运行。直接上干货!咱们今天用Matlab整一个多旅行商问题的遗传算法解决方案。这个…

作者头像 李华
网站建设 2026/4/23 11:20:02

学了四年金融,想转AI:第一步究竟该迈向哪里?

临近毕业,当身边的同学纷纷锁定银行、券商和会计师事务所的职位时,金融系的陈琳却陷入了深深的迷茫。她看着自己写满宏微观经济学、货币银行学笔记的本子,再望向招聘网站上那些充满吸引力的“AI量化分析师”、“智能风控工程师”岗位&#xf…

作者头像 李华
网站建设 2026/4/23 11:18:42

接口测试的常见问题与解决方案

接口测试作为软件测试的关键环节,是确保系统组件间通信和数据交换正确性的重要手段。随着微服务架构和分布式系统的普及,接口测试在软件质量保障体系中的地位日益凸显。本文将系统梳理接口测试实践中常见的技术难点与典型问题,并提供经过验证…

作者头像 李华
网站建设 2026/3/14 6:34:42

需求可测试性分析Checklist:提升软件测试效率的实用指南

在软件测试领域,需求可测试性直接影响测试活动的成败。可测试性需求指需求描述是否具备可验证、可度量、无歧义等特性,确保测试团队能据此设计有效用例。本文基于行业实践,构建一份系统化的checklist,帮助测试从业者在需求评审阶段…

作者头像 李华