STM32 ADC与DMA原理详解
摘要:本文详细介绍了STM32微控制器中的ADC(模数转换器)和DMA(直接存储器访问)模块。ADC部分包括12位逐次逼近型转换器的工作原理、18个输入通道配置、4种转换模式及框图解析。DMA部分阐述了其减轻CPU负担、加速数据传输的核心功能,包含DMA控制器结构、7个通道的仲裁机制、数据传输流程及配置步骤。重点分析了ADC与DMA的协同工作方式,包括硬件触发选择、数据对齐规则和典型应用场景。文章
目录
一、ADC
1.1 简介
ADC(Analog-Digital Converter)模拟-数字转换器
ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁
12位逐次逼近型ADC,1us转换时间输入电压范围:0~3.3V,转换结果范围:0~4095
18个输入通道,可测量16个外部和2个内部信号源
规则组和注入组两个转换单元
模拟看门狗自动监测输入电压范围 STM32F103C8T6 ADC资源:ADC1、ADC2,10个外部输入通道
1.2 工作模式:逐次逼近型ADC
独立的8位逐次逼近型ADC芯片
通过地址锁存和译码编译选择输入通道,并配置ALE锁存 电压比较器逐次逼近算出输入电压的值(二分法) 当SAR完成逐次逼近过程,得到最终的数字结果后,该结果被锁存在8位三态锁存缓冲器中。 EOC信号:当转换完成后,定时和控制电路会发出EOC(End of Conversion)信号,表示转换结束。 读取数据:通过D0至D7这8个数据引脚,可以读取转换后的8位数字结果。OE(Output Enable)信号用于控制这些数据引脚的输出状态。
1.3 STM32的ADC框图
1. 模拟输入通道
-
ADCx_IN0至ADCx_IN15:这些是ADC的模拟输入通道,最多可以有16个规则通道和4个注入通道。
-
温度传感器:内部温度传感器作为额外的模拟输入源,其输出电压与芯片温度成正比。
-
VREFINT:内部参考电压,用于校准ADC。
2. 模拟多路开关
-
模拟多路开关:负责选择当前需要进行转换的模拟输入通道。它可以将选定的模拟信号路由到ADC的输入端。
3. 规则通道与注入通道
-
规则通道:最多支持16个规则通道,按照预设的顺序依次进行转换。
-
注入通道:最多支持4个注入通道,可以在规则通道转换过程中插入进行转换,通常用于高优先级的测量任务。
4. 模拟至数字转换器
-
模拟至数字转换器:(AD转换器)核心部分,负责将选中的模拟信号转换为数字信号。
5. AD数据寄存器
-
规则通道数据寄存器:存储规则通道转换后的16位数字结果。只有1个数字寄存器
-
注入通道数据寄存器:存储注入通道转换后的16位数字结果。有4个数字寄存器
6. 中断与标志位
-
EOC、JEOC、AWD:分别是转换结束、注入转换结束和模拟看门狗事件的标志位。
-
EOCIE、JEOCIE、AWDIE:对应的中断使能位,当相应的事件发生且使能位被置位时,会产生中断请求。
-
NVIC的ADC中断:最终的中断请求会被发送到NVIC(嵌套向量中断控制器),由它来处理中断服务程序。
7. 模拟看门狗
-
模拟看门狗:用于监控ADC转换结果是否在设定的阈值范围内。如果转换结果超出阈值范围,则会触发AWD事件。
-
阈值高限和低限:分别设置12位的阈值上限和下限。
8. 触发机制
-
EXTSEL[2:0]控制位:用于选择外部触发源,包括定时器的TRGO、CHx等信号。
-
EXTTRIG控制位:用于使能外部触发功能。
-
JEXTSEL[2:0]控制位和JEXTTRIG控制位:用于选择和使能注入组的外部触发源。
-
ADCx_ETRGINJ_REMAP和ADCx_ETRGREG_REMAP控制位:用于重映射触发信号。
9. 时钟与电源
-
ADCCLK:来自ADC预分频器的时钟信号,用于驱动ADC的工作。
-
VDDA和VSSA:模拟电源和地,为ADC提供必要的电源。
-
VREF+和VREF-:外部参考电压的正负极,定义了ADC的转换范围。
10. DMA请求
-
DMA请求:当转换完成后,可以通过DMA(直接内存访问)方式将转换结果传输到内存中,提高数据传输效率。
1.4 ADC基本结构
开启RCC时钟——开启GPIO——配置多路开关——ADC初始化——ADC使能——ADC校准
1.5 输入通道
| 通道 | ADC1 | ADC2 | ADC3 |
|---|---|---|---|
| 通道0 | PA0 | PA0 | PA0 |
| 通道1 | PA1 | PA1 | PA1 |
| 通道2 | PA2 | PA2 | PA2 |
| 通道3 | PA3 | PA3 | PA3 |
| 通道4 | PA4 | PA4 | PF6 |
| 通道5 | PA5 | PA5 | PF7 |
| 通道6 | PA6 | PA6 | PF8 |
| 通道7 | PA7 | PA7 | PF9 |
| 通道8 | PB0 | PB0 | PF10 |
| 通道9 | PB1 | PB1 | |
| 通道10 | PC0 | PC0 | PC0 |
| 通道11 | PC1 | PC1 | PC1 |
| 通道12 | PC2 | PC2 | PC2 |
| 通道13 | PC3 | PC3 | PC3 |
| 通道14 | PC4 | PC4 | |
| 通道15 | PC5 | PC5 | |
| 通道16 | 温度传感器 | ||
| 通道17 | 内部参考电压 |
1.6 转换模式
-
单次转换,非扫描模式
-
连续转换,非扫描模式
-
单次转换,扫描模式
-
连续转换,扫描模式
模式 类比场景 单次 + 非扫描 去厨房看一眼水烧开了没,看一次就回来 连续 + 非扫描 一直盯着水壶,看它什么时候开 单次 + 扫描 顺路看一眼厨房、客厅、卧室的灯有没有关,看一遍就完 连续 + 扫描 每隔几分钟就巡逻一遍所有房间,检查灯、温度、门窗
-->补充:存储器映像
| 类型 | 起始地址 | 存储器 | 用途 |
|---|---|---|---|
| ROM | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
| 0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 | |
| 0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 | |
| RAM | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
| 0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 | |
| 0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数 |
二、DMA
2.1 概念
-
定义:直接存储器访问(Direct Memory Access,简称DMA)是一种允许外围设备和主内存之间直接进行数据交换的技术,无需中央处理器(CPU)的直接干预。
-
目的:通过减少CPU在数据传输过程中的参与程度,提高系统效率和性能。
2.2 主要作用
-
减轻CPU负载
-
数据传输不再需要CPU执行一系列读写操作指令,由DMA控制器接管,使得CPU可以专注于其他任务处理。
-
-
加速数据传输
-
通过直接控制内存与外设之间的数据传输,避免了每次数据传输都要经过CPU的过程,从而加快了数据传输速度。
-
-
支持连续的数据传输
-
对于音频、视频流媒体等需要持续大量数据传输的应用场景,DMA提供有效的解决方案。
-
-
提升系统并发性
-
CPU可以在DMA处理数据传输的同时执行其他程序代码,提高了系统的并行处理能力和整体性能。
-
2.3 DMA框图
1. DMA控制器
-
系统中有两个DMA控制器:DMA1和DMA2。
-
每个DMA控制器包含多个通道(Channel),用于处理不同的DMA请求:
-
DMA1有7个通道(通道1到通道7)。
-
DMA2有5个通道(通道1到通道5)。
-
-
每个通道都有一个仲裁器(Arbiter),用于管理多个DMA请求之间的优先级和调度。
2. AHB从设备
-
AHB(Advanced High-performance Bus)是从设备接口,连接到DMA控制器。
-
这些从设备可以是各种外设或内存模块,如SRAM、Flash等。
3. 总线矩阵
-
总线矩阵是一个复杂的互连结构,用于协调不同组件之间的数据传输。
-
它连接了CPU、DMA控制器、外设和其他系统组件,确保数据能够高效地在各个部分之间流动。
4. 复位和时钟控制 (RCC)
-
RCC模块负责系统的复位和时钟管理,确保系统在正确的时钟频率下运行,并能够在需要时进行复位操作。
5. 桥接器 (Bridge)
-
桥接器(Bridge)用于连接不同类型的总线,例如APB1和APB2。
-
它们允许低速外设通过高速总线与系统其他部分通信。
6. 外设
-
图中列出了多种外设,包括ADC(模数转换器)、GPIO(通用输入输出)、USART(通用同步/异步收发传输器)、SPI(串行外设接口)、I2C(内部集成电路总线)等。
-
这些外设可以通过DMA请求与内存或其他外设进行数据交换。
7. 以太网MAC和USB OTG FS
-
以太网MAC(介质访问控制)和USB OTG FS(全速On-The-Go USB)是高级通信接口。
-
它们也通过DMA请求与其他系统组件进行数据传输,支持高速数据通信。
8. DMA 请求
-
外设和内存模块可以通过发送DMA请求来启动数据传输。
-
DMA控制器接收到请求后,会根据通道配置和仲裁策略来安排数据传输。
---工作流程示例
-
外设发起DMA请求:例如,ADC完成一次采样后,向DMA1的某个通道发送DMA请求。
-
DMA控制器接收请求:DMA1的仲裁器根据优先级选择合适的通道处理请求。
-
数据传输:DMA控制器接管总线控制权,将ADC采集的数据直接传输到指定的内存地址(如SRAM)。
-
传输完成:DMA控制器完成数据传输后,释放总线控制权,并可能向CPU发送中断信号,通知数据传输已完成。
2.4 DMA基本结构图
使用DMA配置步骤
RCC开启DMA时钟 ——DMA初始化 完成外设和存储器的配置、方向、传输计数器、自动重装器、选择触发源、通道优先级 ——DMA使能 (如果用的是硬件触发,记得对应的外设调用XXX_DMACmd,开启触发信号的输出) (需要DMA的中断,则调用DMA_ITConfig,开启中断输出——NVIC配置中断通道.....)
1.传输计数器
-
从给定的数据依次递减,完成一个数据的传输就-1,直到为0时意味着数据传输完成,此时之前自增的地址也会回复到起始地址的位置,以便下一轮的数据传输
-
写传输计数器时,DMA必须关闭才能写
2.自动重装器
-
传输计数器减到0时,是否需要自动恢复到初值
-
不重装:单次传输;
-
重装:循环模式;(这里和ADC的连续模式相似)
3.触发机制
-
硬件触发:由外设硬件信号触发DMA传输,适用于实时性要求高的场景。-- 多用于外设相关转运
-
软件触发:通过软件指令启动DMA传输,灵活性高,适用于多种应用场景。 -- 存储器之间的转运 尽力的使传输计数器清零 —— 与循环模式不能共用
4.M2M模式
-
Memory to Memory (M2M):支持存储器到存储器的数据传输。
-
数据选择控制位:软件触发——>1; 硬件触发——>0;
5.开关控制
-
作用:通过开关控制,灵活配置DMA的工作模式和参数,满足不同应用需求。
2.5 DMA请求
选择硬件触发时,要注意外设所在的是哪个通道(需要手动选择所要开启的通道),例如选择ADC1只能选择通道1. 软件触发则不需要注意通道的选择
2.6 数据宽度与对齐
总结如下:
| 输入 | 输出 | 规则 |
|---|---|---|
| 8 | 8、16、32 | 输入 < 输出 高位补0补齐 |
| 16 | 8、16、32 | 输入 = 输出 依次传递原数据 |
| 32 | 8、16、32 | 输入 > 输出 只传输地位的数据,高位舍弃 |
2.7 详细工作原理
DMA的工作过程可分为以下几个阶段:
1. 初始化阶段(CPU参与)
-
配置DMA控制器:
-
CPU通过I/O指令向DMA控制器写入必要的传输参数,包括:
-
源地址(Source Address):数据读取的起始内存或设备地址。
-
目标地址(Destination Address):数据写入的内存或设备地址。
-
传输数据量(Transfer Count):需要传输的字节数或数据块数量。
-
传输模式:单次传输(Single Transfer)、块传输(Block Transfer)、请求模式(Demand Mode)或级联模式(Cascade Mode)等。
-
传输方向:内存到外设、外设到内存、内存到内存(部分系统支持)。
-
-
-
外设准备就绪:
-
外设(如硬盘、网卡)准备好数据或准备好接收数据后,向DMA控制器发出DMA请求(DREQ,DMA Request)。
-
2. DMA请求与总线仲裁
-
DMA请求:
-
外设通过硬件信号线向DMA控制器发出DREQ信号。
-
-
总线请求:
-
DMA控制器接收到DREQ后,向CPU发出总线请求(HOLD 或 Bus Request),请求接管系统总线(地址总线、数据总线和控制总线)的控制权。
-
-
总线响应:
-
CPU在当前总线周期结束后,释放总线控制权,并向DMA控制器发出总线响应(HLDA 或 Bus Grant)信号。
-
此时,CPU进入保持状态(Hold State),暂停对总线的访问,但仍可执行内部寄存器操作。
-
3. 数据传输阶段(DMA控制器主导)
-
地址与控制信号生成:
-
DMA控制器获得总线控制权后,开始控制数据传输:
-
将源地址或目标地址发送到地址总线上。
-
发出读/写控制信号(如 MEMR#, IOR#, MEMW#, IOW#)。
-
-
-
数据传输方式:
-
单字节传输(Single Transfer):每次传输一个数据单元后释放总线,适合低速设备。
-
块传输(Block/Burst Transfer):连续传输整个数据块,期间持续占用总线,效率高,但会阻塞CPU较长时间。
-
周期窃取(Cycle Stealing):DMA控制器在CPU不使用总线的间隙“窃取”总线周期进行传输,实现CPU与DMA的交替使用,平衡性能与响应性。
-
-
地址与计数更新:
-
每传输一个数据单元,DMA控制器自动递增/递减地址寄存器,并减少计数器值。
-
4. 传输结束与中断通知
-
传输完成判断:
-
当DMA控制器的计数器减为0时,表示传输完成。
-
-
释放总线:
-
DMA控制器撤销总线请求信号(HOLD),释放总线控制权,CPU恢复对总线的控制。
-
-
中断CPU:
-
DMA控制器向CPU发出中断请求(IRQ),通知数据传输已完成。
-
CPU响应中断,执行相应的中断服务程序(ISR),进行后续处理(如释放缓冲区、启动下一次传输等)。
-
2.8 应用场景
-
大文件拷贝
-
音频、视频播放或录制
-
网络数据包的接收与发送
-
图形图像处理等需要高效数据传输的任务
-
与ADC功能高度符合,经常一起使用
2.9 注意事项
-
DMA的使用需要考虑硬件兼容性和配置问题,确保DMA通道正确分配且不发生冲突。
-
使用DMA虽然能显著提高效率,但在某些情况下,如小量数据传输时,可能不如传统CPU直接管理的方式灵活和高效。
以上内容为结合网上资源以及江协up主的学习心得与笔记,内容有误可及时指出,感谢大家的监督与观看,欢迎大家在评论区沟通探讨有关知识。
更多推荐



所有评论(0)