当前位置: 首页 > news >正文

STM32 DMA技术深度解析:从原理到实战应用讲解

知识点1【DMA的介绍】

直接内存访问(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输,无需CPU的干预,数据可以通过DMA快速地移动,这就节省了CPU的资源,来做其他的操作——提高CPU的效率

在STM32F103ZET6中

两个DMA控制器

12个通道:ADC1(7个),ADC2(5个)

每个通道用来专门管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁其来协调各个DMA请求的优先权

下面我分析一下这张框图

1、DMA框图

寄存器是一种特殊的SRAM,CPU可以通过寄存器进行读写,结束寄存器来操作外设,是软件和硬件的桥梁。

总线矩阵左端 是主动单元,拥有主动权,右端是被动单元,会被主动单元读写

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经常配合使用

结束

代码重在练习!

代码重在练习!

代码重在练习!

今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏加关注,谢谢大家!!!

http://www.dtcms.com/a/191693.html

相关文章:

  • TCP 粘包
  • TCP实现安全传输的核心机制 + TCP的报文讲解(全程图文讲解)
  • 工业4.0神经嫁接术:ethernet ip转profinet协议通信步骤图解
  • 2025年渗透测试面试题总结-阿里云[实习]阿里云安全-安全工程师(题目+回答)
  • 典型的**N+1查询问题**
  • 云原生数据库排障新挑战:AI驱动与分布式架构深度解析
  • 区块链blog1__合作与信任
  • U盘启动CentOS安装与网卡驱动修复指南
  • 实战分析Cpython逆向
  • GpuGeek:为创新者提供灵活、快速、高效的云计算服务!
  • window 显示驱动开发-报告图形内存(四)
  • 磁盘I/O瓶颈排查:面试通关“三部曲”心法
  • 计算机视觉----常见卷积汇总
  • git工具使用详细教程-------命令行和图形化工具
  • DB-GPT扩展自定义app配置说明
  • 空间组学高级分析方法介绍
  • 基于Deeplearning4j的多源数据融合预测模型实现:从设计到落地全解析
  • 线程通信的核心机制
  • 一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库
  • Java集合框架
  • 学习日志07 java
  • .NET 无侵入自动化探针原理与主流实现详解
  • redis中key的过期和淘汰
  • 【python实用小脚本-63】每天花费2小时修复黑白照片,Python一键转换,节省90%时间(建议收藏)
  • C++(12):using声明
  • TensorFlow深度学习实战(16)——注意力机制详解
  • 医疗数据迁移质量与效率的深度研究:三维六阶框架与实践创新
  • OpenCV光流估计:原理、实现与应用
  • 【视频】解决FFmpeg将RTSP转RTMP流时,出现的卡死、出错等问题
  • OpenCV CUDA模块中矩阵操作------范数(Norm)相关函数