一、时钟树
1.1 基础时钟源
1.1.1 三种振荡器
1. RC振荡器
- **无需外部电路,需要电源;**成本低、精度低、启动快
2. 无源晶体振荡器
- 需要外部电路 (匹配电容+芯片内部电路),无需单独供电;成本中、精度高、启动速度中
3. 有源晶体振荡器
- 无需外部电路,需要单独供电;成本高、精度高、启动速度中
1.1.2 四种时钟源
1. HSI(内部高速时钟)
-
来源:内部 16MHz RC 振荡器
-
用途:直接做系统时钟,或作为 PLL 输入
-
优点:成本低(无需外部元件)、启动速度快
-
缺点:精度不如外部晶振(即使校准后)
-
自带,快但不准
2. HSE(外部高速时钟)
-
来源:外部有源晶振或无源晶振
-
用途:直接做系统时钟,或作为 PLL 输入
-
优点:精度高
-
缺点:需要外部元件,成本高,启动慢
-
外接,准但启动慢
3. LSI(内部低速时钟)
-
来源:内部 RC 振荡器,约 32kHz
-
用途:独立看门狗(IWDG)、RTC(低精度场景)
-
特点:功耗极低,可在停机和待机模式下保持运行
-
缺点:精度差,频率随温度波动
-
自带低速,省电但不准
4. LSE(外部低速时钟)
-
来源:外部 32.768kHz 晶振或陶瓷谐振器
-
用途:RTC(实时时钟/日历)、其他定时功能
-
优点:功耗低、精度高
-
缺点:需要外部晶振
-
外接晶振,准又省电
1.2 SYSCLK(系统时钟)
1.2.1 SYSCLK含义
SYSCLK 是系统时钟 ,也就是 CPU、内存、总线(AHB/APB)等核心部件的工作时钟,决定了处理器执行指令的速度。

1.3 外设时钟
1.3.1 HCLK(AHB 总线时钟)
1 HCLK含义
HCLK (High-speed Clock )是 AHB 总线时钟 ,由 SYSCLK(系统时钟)经过 AHB Prescaler(AHB预分频器) 分频后得到,为 AHB 总线上的高速外设提供时钟。
分频器把系统时钟分配成不同的时钟域,然后输出给不同的模块使用(不同模块的最大时钟频率不一样)
2 HCLK 提供时钟的模块
| 模块 | 说明 |
|---|---|
| DMA | 直接存储器访问,高速数据传输 |
| Cortex System Timer | 系统滴答定时器,常用于操作系统心跳 |
| FCLK | 处理器自由运行时钟,休眠时仍保持运行 |
| APB1 | 低速外设总线,最大42MHz |
| APB2 | 高速外设总线,最大84MHz |
| PTP | 精确时间协议,用于网络时钟同步(以太网IEEE 1588) |
1.3.2 外设控制器时钟
1 外设时钟来源
| 总线 | 最大频率 | 一句话作用 | 典型外设 |
|---|---|---|---|
| AHB | 168MHz | 给高速核心模块提供时钟 | DMA、GPIO、CRC、Flash、SRAM |
| APB1 | 42MHz | 给低速外设提供时钟 | USART2/3/4/5、I2C1/2/3、SPI2/3、CAN、DAC、PWR |
| APB2 | 84MHz | 给高速外设提供时钟 | USART1、SPI1、ADC1/2/3、TIM1/8/9/10/11、SYSCFG |
外设用哪条总线,就由哪条总线的时钟驱动,各总线频率不同,满足不同外设的速度需求。
当 APB1 预分频器分频系数 APB1大于 1 时,定时器时钟会自动 乘以 2 ,让定时器获得比总线更高的时钟,以提高 PWM 精度和计时分辨率。
2 一条总线上挂多个外设的含义
-
同一条总线上的外设共享同一个时钟源
-
如果该总线的时钟被关闭,上面挂载的所有外设都会停止工作
-
每个外设可以独立控制自己的时钟使能(在RCC寄存器中配置)

1.4 RTC 时钟源
RTC(实时时钟)的输入时钟可以由以下三种来源提供,通过 RTC Clock Mux(RTC时钟选择器) 选择:
| 时钟源 | 类型 | 典型频率 | 说明 |
|---|---|---|---|
| LSE | 外部低速晶振 | 32.768kHz | 精度高,功耗低,RTC首选 |
| LSI | 内部低速RC | ~32kHz | 精度低,省电但不准 |
| HSE(分频后) | 外部高速晶振 | 4~26MHz(分频后得到1MHz以内) | 需要外接晶振,分频后给RTC用 |


二、UART控制器原理
2.1 定义
2.1.1 串口通讯
串口通讯是一种串行 传输方式,即数据一位一位地按顺序进行发送和接收。在嵌入式系统中,它通常由UART控制器 硬件实现。由于接线少、协议简单,它广泛用于嵌入式系统、传感器、单片机与外围设备之间的数据交换。
串行 vs 并行方式
| 特性 | 串行通讯 | 并行通讯 |
|---|---|---|
| 传输方式 | 一位接一位,通过 1 条数据线 传输 | 多位同时(如 8 位),通过 多条数据线 传输 |
| 硬件成本 | 低(只需 2-3 根线:TX、RX、GND) | 高(需要多根数据线 + 控制线) |
| 传输速度 | 单比特速率高(可达几 Mbps 以上),总体吞吐量可很高 | 理论上多条线同时传,吞吐量高,但易受信号干扰和线间延迟影响 |
| 传输距离 | 长(RS-232/RS-485 可到十几米甚至千米) | 短(通常不到 1 米,易受串扰和时钟偏移限制) |
| 抗干扰能力 | 较强(差分形式的 RS-422/485 更强) | 较弱(多条线同时翻转,串扰明显) |
| 典型应用 | 单片机调试、GPS、蓝牙模块、工业总线 | 老式打印机、并口存储器、芯片间短距高速总线(如并口 LCD) |
-
串口:省线、抗干扰、适合远距离或简单连接。
-
并口:一次传多位,短距离内吞吐量高,但连线多、不宜长距离。
2.1.2 波特率
-
码元指传输线上的一个信号变化(在串口里就是一个电平位宽)
-
波特率 :1秒内传输的码元个数(单位:Baud)
-
比特率 :1秒内传输的比特个数(单位:bps)
-
通用公式:比特率 = 波特率 × 每个码元对应的二进制位数
-
在普通串口(UART)中 :每个码元携带 1个bit(高低电平的信息) ,因此 波特率 = 比特率(数值上相等)
两个设备的波特率需一致,不然会造成数据丢失
比特率的计算

USARTDIV 的小数部分存入 BRR 寄存器时:
-
16倍采样(OVER8=0) :小数实际值 × 16,取整数存入(4位,精度 1/16)
-
8倍采样(OVER8=1) :小数实际值 × 8,取整数存入(3位,精度 1/8)
-
小数乘以16(或8),是为了算出这个小数相当于多少个1/16(或1/8)刻度,结果取整存入寄存器。
2.1.3 数据帧
1 一帧完整的数据帧组成
| 组成部分 | 说明 |
|---|---|
| 起始位 | 以低电平开始,表示一帧数据的开始 |
| 数据位 | 通常为 8 位(也可选 9 位),实际传输的有效数据 |
| 校验位 | 可选(奇校验/偶校验),用于简单错误检测 |
| 停止位 | 以高电平结束,常见为 1 位(也可选 0.5、1.5、2 位) |
2 数据位与校验位的关系
-
配置为 8 位数据位(从低位开始传) + 启用校验 → 实际有效数据只有 7 位,1 位被校验位占用
-
配置为 9 位数据位 → 通常是为了使用校验位
-
常用模式:8N1(8 位数据 + 无校验 + 1 位停止位)
串口一帧数据由起始位(低电平开始)、数据位(常用8位)、可选校验位(奇/偶校验,占用数据位)、停止位(高电平结束,常用1位)组成。
3 奇偶校验规则
| 校验类型 | 规则 |
|---|---|
| 奇校验 | 一帧数据中高电平个数为 奇数 |
| 偶校验 | 一帧数据中高电平个数为 偶数 |
发送方根据要发送的数据计算出校验位(奇或偶)并附加在帧中发送;接收方收到数据后,用同样的规则重新计算校验位,如果与接收到的校验位不一致,则判定该帧数据传输过程中发生了错误。
弊端:校验位只能检测单比特错误 ,不能纠正错误,也不能检测偶数个比特错误。
2.2 串口收发流程
2.2.1 DR 寄存器
在许多串口控制器(如 STM32)中,TDR 和 RDR 实际上是共用同一个地址的 DR(数据寄存器):
-
写 DR → 数据进入 TDR(发送)
-
读 DR → 数据来自 RDR(接收)
DR 是程序与串口控制器之间唯一的"数据接口"。
DR 寄存器作为程序与串口硬件之间的缓冲,避免了直接操作慢速移位寄存器导致的时序耦合,让 CPU 能以字节/字为单位一次性读写数据,而硬件独立完成逐位收发。
2.2.2 发送流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 将数据写入内存 | 准备要发送的数据 |
| 2 | 程序将内存数据写入 DR 寄存器 | DR 自动将数据送入 TDR |
| 3 | TDR 数据自动转入发送移位寄存器(从低位开始) | 硬件自动完成 |
| 4 | 移位寄存器将数据从 TX 引脚逐位发出 | 串行输出 |
2.2.3 接收流程
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | RX 引脚接收数据 | 逐位进入接收移位寄存器 |
| 2 | 接收移位寄存器接收完整一帧 | 硬件自动完成 |
| 3 | 数据自动转入 RDR 寄存器 | 硬件自动完成,RDR 可通过 DR 读取 |
| 4 | 程序读取 DR 寄存器(从高位开始读) | 实际读到的是 RDR 的数据 |
| 5 | 将数据存入内存使用 | 程序处理收到的数据 |

2.3 硬件流控
2.3.1 硬件流控含义
一种通过物理信号线 自动控制数据传输的机制,用于协调两个设备之间的数据流动,防止数据丢失或溢出。
2.3.2 硬件流控 vs 软件流控
| 对比项 | 硬件流控 (RTS/CTS) | 软件流控 (XON/XOFF) |
|---|---|---|
| 实现方式 | 物理信号线 | 在数据流中插入特殊字节 |
| 响应速度 | 实时 | 需要解析数据,较慢 |
| 占用数据带宽 | 不占用 | 特殊字节可能干扰二进制数据 |
| 额外接线 | 需要2根额外信号线 | 无需额外接线 |
2.3.3 实际应用
nCTS表示低电平的时候信号有效

-
nRTS 是本设备的"接收通知":告诉对方"我能收/不能收"
-
nCTS 是本设备的"发送许可":告诉本设备"对方允许我发/禁止我发"
| 信号线 | 方向(本设备) | 连接对象 | 本设备中的作用 | 有效电平 |
|---|---|---|---|---|
| TX | 输出 | 对方的 RX | 发送数据 | 数据信号 |
| RX | 输入 | 对方的 TX | 接收数据 | 数据信号 |
| nRTS | 输出 | 对方的 nCTS | 告诉对方:我是否准备好接收 | 低电平=准备好 |
| nCTS | 输入 | 对方的 nRTS | 判断对方是否允许我发送 | 低电平=允许发送 |
2.5 RCC
1 作用
前面的检验(协议头、长度、结束位)只能验证数据格式的"完整性"和"边界",而CRC校验能验证数据内容的"正确性",防止数据在传输中发生比特错误(比如0变1)而格式却碰巧正确。
2 原理
每个传感器自带的原理不同,比如PM2.5是数据位相加,接收的时候会得到数据位和校验位;
传感器发送的 "数据位" 按固定规则(如累加和、异或、CRC )计算出一个 "校验位" 一并发出;接收端用 同样的规则 重新计算收到的数据位,若结果 ≠ 收到的校验位,则说明传输或数据出错。
3 与奇偶校验的区别
奇偶校验是"简陋版",只能发现奇数个错误;CRC是"加强版",能发现几乎所有错误,工业标准都在用它。
1.6 电平标准
1 三种常见电平标准对比
| 标准 | 逻辑 0 电平 | 逻辑 1 电平 | 特点 |
|---|---|---|---|
| TTL | 0V ~ 0.8V | 2.4V ~ 5V | 短距离(<1m),板级通信 |
| RS232 | +3V ~ +15V | -3V ~ -15V | 长距离(约15m),负逻辑 |
| RS485 | A-B:-2V ~ -6V | A-B:+2V ~ +6V | 超长距离(1200m),差分抗干扰 |
TTL和RS232都是一对一,RS485一对多,但是单向的而且同一时刻只能选一个设备进行通信
2 转换芯片与常用接口
| 电平标准 | 转换芯片(TTL ↔ 标准) | 常用接口 |
|---|---|---|
| TTL | 不需要转换 | 排针、杜邦线 |
| RS232 | MAX232、SP3232、MAX3232 | DB9(9针)、DB25 |
| RS485 | MAX485、SP3485、MAX13487 | 接线端子(A/B)、RJ45 |
3 Modbus 协议
| 项目 | 内容 |
|---|---|
| 定义 | 一种基于串行通信的工业通信协议 |
| 目的 | 为工业现场提供通用的通信标准 |
| 功能 | 实现不同设备之间的数据交换和控制 |
| 一帧结构 | 地址域 + 功能码 + 数据 + 差错校验 |
| 地址域 | 1字节,1~247,标识目标设备 |
| 功能码 | 操作类型(如 0x03 读寄存器、0x06 写寄存器) |
| 数据域 | 寄存器地址、数量或具体数据内容 |
| 差错校验 | RTU模式用CRC,ASCII模式用LRC |
| 通讯机制 | 应答机制(主机请求 → 从机响应) |
三、DMA控制器原理
3.1 介绍
1 概念
- DMA 是一种无需 CPU 干预即可在外设与存储器之间直接传输数据的机制,通过减少 CPU 开销来提升大量数据传输时的系统性能。
- CPU只需要一开始对DMA进行配置:指定从哪个寄存器到哪个外部设备
- DAM搬完后会自动向CPU发送消息,通知CPU搬完了
2 DMA 的仲裁器
- STM32F407 有 2 个 DMA 控制器
- 每个控制器有 8 个数据流
- 每个数据流 有 8 个通道
- 1 个数据流每次只能搬运 1 个通道的数据
| 项目 | 说明 |
|---|---|
| 作用 | 管理多个 DMA 通道对系统总线的竞争访问,协调传输顺序 |
| 软件优先级(4级) | 很高 > 高 > 中 > 低(在 DMA_CCRx 寄存器中设置) |
| 硬件优先级 | 当软件优先级相同时,通道编号越小,优先级越高 |
3 DMA事务
| 操作 | 说明 |
|---|---|
| 从源地址读取数据 | 通过 DMA_SxPAR(外设地址)或 DMA_SxM0AR(存储器地址)寻址,从源端读取数据 |
| 向目的地址写入数据 | 通过 DMA_SxPAR 或 DMA_SxM0AR 寻址,将读取的数据写入目的端 |
| 传输计数器递减 | 每次完整传输完成后,DMA_SxNDTR 计数器减1,记录剩余待传输的数据项数目 |
3.2 DMA传输
1 DMA 传输方向配置
| DIR1:0 | 传输模式 | 源地址 | 目标地址 |
|---|---|---|---|
| 00 | 外设 → 存储器 | DMA_SxPAR(外设地址) | DMA_SxM0AR(存储器地址) |
| 01 | 存储器 → 外设 | DMA_SxM0AR(存储器地址) | DMA_SxPAR(外设地址) |
| 10 | 存储器 → 存储器 | DMA_SxM0AR(源存储器地址) | DMA_SxM0AR(目标存储器地址) |
- 通过 DMA_SxCR 寄存器的 DIR1:0 位选择传输方向
2 FIFO
FIFO 大小:
每个数据流都有一个独立的 4 字(16 字节)FIFO。
工作流程
- 启用 FIFO 后,源地址中的数据不会直接由 DMA 搬运到目标地址。
- 数据先从源地址读取,存入 FIFO 缓冲区中。
- 当 FIFO 中积累的数据达到预设的阈值时,DMA 才会将数据从 FIFO 中取出,写入到目标地址。
核心特点
FIFO 起到了缓冲作用,可以将多个小数据量合并为一次突发传输,提高总线利用效率。
3.3 指针增量
控制位说明
DMA_SxCR 寄存器中的 PINC 位控制外设地址指针是否递增 ,MINC 位控制存储器地址指针是否递增。
递增模式
- 当设置为增量模式时,每次传输完成后,下一次传输的地址 = 前一次地址 + 增量值。
- 增量值由数据宽度决定:字节(8位)时加1,半字(16位)时加2,字(32位)时加4。
常量模式
当设置为保持常量时,每次传输都使用同一个内存地址,反复从同一位置读取数据或写入同一位置。
典型应用
递增模式适合传输数组或连续内存块。
常量模式适合反复读写同一个外设寄存器(如 ADC 数据寄存器)。
3.4 数据宽度
- 数据宽度通过 DMA_SxCR 寄存器的 PSIZE(外设数据宽度)和 MSIZE(存储器数据宽度)位配置。
直接模式
- 直接模式下,源和目标的传输数据宽度必须相等。
- 宽度由 DMA_SxCR 中的 PSIZE 位定义,MSIZE 位在此模式下无效。
FIFO 模式
- 使用内部 FIFO 时,FIFO 进行数据对齐和打包;源和目标的数据宽度可以通过 PSIZE 和 MSIZE 位分别编程,支持 8 位、16 位或 32 位,两者可以不同。
宽度不等时的传输计数
- 当 PSIZE 和 MSIZE 不相等时,DMA_SxNDTR 寄存器中配置的传输数据项数目,其数据宽度等于外设总线的宽度(由 PSIZE 位定义)。
- 举例:PSIZE 配置为半字(16位),则实际传输的字节数 = 2 × NDT(NDT 为 DMA_SxNDTR 中的计数值)。

四、ADC控制原理
4.1 介绍
1 定义
ADC的作用是将连续变化的模拟信号(如电压)转换为离散的数字信号,供微处理器读取和处理。
2 工作流程
-
采样:以固定时间间隔(采样周期T)采集连续模拟信号,将其在时间上离散化。采样频率Fs=1/T,根据奈奎斯特定理,Fs > 2倍信号最高频率时,原始信号可完全恢复。采样频率越高,信号损失越小。
-
量化 :将采样后幅值连续的信号进行分级,用离散的等级值代替连续的幅值 。量化方式有只舍不入和四舍五入两种,量化间隔越小精度越高,量化过程必然存在量化误差(大小为一个量化间隔)。
-
编码:将量化后的等级值转换为二进制数字信号输出,供微处理器读取和处理。
3 量化中的参数
-
参考电压(VREF) :ADC量化的基准,由 VREF+(正参考电压)和 VREF−(负参考电压)共同决定。VREF+范围 1.8V ~ VDDA,VREF− 通常接地(VSSA)。量化间隔 =(VREF+−VREF−)/2的(分辨率位数)次方。 STM32的参考电压通常为3.3V。

-
分辨率 :决定将参考电压划分的份数,用位数表示(如8位、10位、12位),通过 ADC_CR1.RES 位配置。**分辨率越高,量化间隔越小,能测量的最小电压就越小,精度越高。**例如:10位分辨率将电压分成1024份,量化间隔 = 参考电压 / 2^10。
4.2 常见的 ADC 类型
1 并联比较型
工作原理
参考电压 VREF经电阻串(R1~R8)分出多个等间隔的比较电平,输入电压 VIN同时与所有比较电平进行比较,比较结果经编码器直接输出二进制数字(D0,D1...)。
主要优缺点:
-
优点:转换速度极快,结构简单。
-
缺点 :分辨率提高时比较器和电阻数量会指数级增加(2的N次方的电阻;2的N次方−1 个比较器 ),功耗大、成本高、芯片面积大,因此通常只用于低分辨率(≤8位)、超高速的场合。

2 逐次逼近型
二分算法
逐次逼近型ADC采用二分搜索算法:先比较输入电压与参考电压的1/2,若输入大于1/2参考电压则保留该位为1并累加1/4参考电压继续比较 ,否则该位清零并比较1/4参考电压,以此类推逐次逼近。比较次数等于分辨率位数,N位ADC需比较N次,最终累加值即为转换结果。
电路结构
控制电路逐位产生数字码,经D/A转换器生成模拟电压与输入电压 VINVIN 比较,根据比较结果逐次确定每一位的取值,最终逼近得到数字输出 D2 D0。

4.3 寄存器工作原理
4.3.1 输入通道
ADC通道是模拟信号输入到ADC控制器的单个输入路径 ,一个ADC控制器可具有多个通道。
- 外部通道(16个)连接外部GPIO引脚;
- 内部通道(仅ADC1有,共3个):
- 通道16连接温度传感器
- 通道17连接内部参考电压
- 通道18连接VBAT(电池/电源采集)
- 模拟电压输入范围为 VREF−≤VIN≤VREF+。
4.3.2 转换序列
转换序列是指多个ADC通道以任意顺序进行转换 时的长度 (需要转换的通道个数)和顺序(通道转换的先后次序)配置。
转换序列有两种:规则序列和注入序列
1 规则序列
规则序列(最多16个通道):从规则序列1(SQ1)到规则序列16(SQ16),按SQ1→SQ16依次转换。配置方法:
-
通过
ADC_SQR1.L位设置序列长度(长度) -
通过
ADC_SQRx.SQRn位添加转换通道(顺序严格按照从SQ1往后):-
ADC_SQR3 :存放 SQ1~SQ6(转换的最前面 6 个)
-
ADC_SQR2 :存放 SQ7~SQ12
-
ADC_SQR1 :存放 SQ13~SQ16(转换的最后 4 个)
-

2 注入序列
注入序列长度最大为4(JSQ1~JSQ4),转换顺序与长度配置相关,转换始终从 JSQ4(编号最大)开始,向 JSQ1(编号最小)方向反向进行 。终点始终是JSQ4,起点随长度增加而前移。
配置方法:
-
通过
ADC_JSQR.IL位设置注入序列长度 -
通过
ADC_JSQR.ISQx位添加转换通道(把要放入的通道放入ISQX里 ,这样就能按照序列长度的顺序来一次读取通道)(ISQ4对应JSQ4,ISQ3对应JSQ3,以此类推)
注入序列主要用于两种场景,通过 ADC_CR1.JAUTO 位选择模式:
-
自动注入 (
JAUTO=1):规则序列转换完成后自动转换注入序列 ,无需软件或外部触发,但必须禁止注入通道外部触发。适用于规则序列长度不足 -
触发注入 (
JAUTO=0):通过外部事件或软件触发启动,可打断正在进行的规则序列,转换完成后自动恢复规则序列。适用于需要临时插入高优先级转换
4.3.3 转换触发源
ADC转换启动方式分为软件触发 和事件触发两种,规则序列和注入序列各有独立的触发配置。
软件触发:
-
规则序列:向
ADC_CR2.SWSTART写1触发,转换开始后硬件自动清零 -
注入序列:向
ADC_CR2.JSWSTART写1触发,转换开始后硬件自动清零 -
前提:ADC控制器需先使能(向
ADC_CR2.ADON写1上电)
事件触发:
-
通过外部事件(定时器捕获、EXTI中断线等)触发转换
-
规则序列:
ADC_CR2.EXTEN选择触发极性,ADC_CR2.EXTESEL选择事件源 -
注入序列:
ADC_CR2.JEXTEN选择触发极性,ADC_CR2.JEXTESEL选择事件源 -
支持上升沿、下降沿或双边沿触发
4.3.4 转换时间
1 ADC时钟来源
-
ADCCLK(模拟电路时钟) :来自APB2经可编程预分频器分频(2/4/6/8分频),通过
ADC_CCR.ADCPRE位配置,最大频率36MHz,决定采样和转换时间。 -
数字接口时钟:用于寄存器读写访问,等于APB2时钟频率。
2 采样时间配置
-
每个通道可独立设置采样周期数
-
ADC_SMPR2:设置通道0~9 -
ADC_SMPR1:设置通道10~18
3 总转换时间计算公式
| 分辨率 | 转换时间 |
|---|---|
| 12位 | Tconv = 采样周期数 + 12个ADCCLK周期 |
| 10位 | Tconv = 采样周期数 + 10个ADCCLK周期 |
| 8位 | Tconv = 采样周期数 + 8个ADCCLK周期 |
| 6位 | Tconv = 采样周期数 + 6个ADCCLK周期 |
4.3.5 扫描模式
ADC扫描模式与非扫描模式总结:
-
非扫描模式 (
ADC_CR1.SCAN=0):仅按序列中的第一个通道进行单通道转换,即使序列长度大于1也无效。 -
扫描模式 (
ADC_CR1.SCAN=1):按序列中预设的顺序对多个通道轮流进行转换 ,适用于多通道采集场景。(注入序列的触发注入会自动转化到非扫描模式) -
使用规则:序列长度=1时用非扫描模式,序列长度>1时必须使能扫描模式才能实现多通道转换。
4.3.6 连续与单次
-
单次转换模式 :ADC按序列长度完成一次序列转换后自动停止,需要重新触发才能再次转换。
-
连续转换模式 :ADC按序列长度完成一次序列转换后,自动回到序列头开始新一轮转换,循环进行。
-
注意 :注入序列无法使用连续转换模式 ,也不支持 CONT 位配置。即使使能 JAUTO 自动注入,也只是让注入序列在每次规则转换完成后额外执行一次,并非注入序列自身的连续循环。
4.3.7 数据存储
-
规则数据寄存器(ADC_DR) :只有1个,16位有效长度,规则序列中所有通道共用一个数据寄存器,后一次转换结果会覆盖前一次,需及时读取。
-
注入数据寄存器(ADC_JDRx) :共4个(ADC_JDR1~ADC_JDR4),16位有效长度,与注入序列转换顺序一一对应:
ADC_JDR1存储第一个转换结果,ADC_JDR2存储第二个,以此类推,不会被覆盖。

数据对齐
数据对齐指ADC转换结果在数据寄存器中的存储方式,分为左对齐 和右对齐 两种,通过 ADC_CR2.ALIGN 位控制(0=右对齐,1=左对齐)一般右对齐。
-
6位分辨率 :按**字节(8位)**对齐,存储在寄存器低8位或高8位
-
8位、10位、12位分辨率 :按**半字(16位)**对齐,存储在寄存器低16位或高16位
五、TIM控制器原理
5.1 基本定时器
STM32F4xx 系列的基本定时器有 TIM6 和 TIM7,两者相互独立,不共享资源。
基本定时器组成

1 时钟源
基本定时器(TIM6/TIM7)的时钟源(CK_INT)来源于 APB1 总线时钟。
2 预分频器(PSC)
对定时器输入时钟(CK_INT)进行分频,降低频率,实现更灵活的时间控制。
3 计数器
| 项目 | 说明 |
|---|---|
| 时钟来源 | 预分频器输出 CK_CNT |
| 计数模式 | 仅支持递增计数(基本定时器) |
| 计数寄存器 | TIMx_CNT |
| 启动条件 | TIMx_CR1 寄存器中的 CEN 位置 1 |
| 启动延迟 | CEN 置 1 后,一个时钟周期后计数器才真正开始 |
| 计数范围 | 从 0 → 自动重载值(TIMx_ARR)(实际计数要减一,因为从0开始) |
| 上溢事件 | 计到 ARR 后,下一时钟回到 0 并产生上溢事件 |
TIMx_CNT存放计数器的值;TIMx_ARR存放的是用户设计的目标值
时序图

CNT_EN 是计数器使能信号,CEN 置 1 后一个时钟周期有效,高电平期间计数器正常工作。
4 自动重载器
| 项目 | 说明 |
|---|---|
| 作用 | 控制计数器的最大计数值,决定溢出时间 |
| 寄存器 | TIMx_ARR(预装载寄存器) |
| 影子寄存器 | 实际生效的寄存器,预装载寄存器的值在更新事件时传入 |
| 溢出条件 | TIMx_CNT = TIMx_ARR |
| 溢出后 | CNT 自动清零,产生更新事件(UEV) |
| 预装载生效方式 | 由 TIMx_CR1 寄存器的 ARPE 位控制 |
| ARPE = 0 | 或后为1;写入 ARR 后立即生效(直接进影子寄存器) |
| ARPE = 1 | 或后为0;写入 ARR 后,等**下一次更新事件(UEV)**时才生效 |
| 更新事件产生条件 | 计数器上溢 且 TIMx_CR1 寄存器中的 UDIS 位 = 0 |
| 软件更新 | 也可通过软件产生更新事件 |
5 UEV 事件产生

| 项目 | 说明 |
|---|---|
| UEV来源1 | 计数器上溢(CNT = ARR) |
| UEV来源2 | 软件手动触发(TIMx_EGR 寄存器的 UG 位置 1) |
| 允许产生条件 | TIMx_CR1 寄存器中的 UDIS = 0 |
| 禁止产生条件 | TIMx_CR1 寄存器中的 UDIS = 1 |
| UDIS = 0 时 | 上述两种来源都能正常产生 UEV |
| UDIS = 1 时 | 上述两种来源都无法产生 UEV |
5.2 通用定时器
5.2.1 TIM2 到 TIM5
1 主要特性
计数器
-
位宽:
-
TIM3、TIM4:16 位
-
TIM2、TIM5:32 位
-
-
计数模式:递增、递减、递增/递减(中心对齐)
预分频器
-
16 位可编程
-
分频系数:1 ~ 65536
-
支持运行时修改
独立通道(最多 4 个)
每个通道可用于:
-
输入捕获
-
输出比较
-
PWM 生成(边沿对齐 / 中心对齐)
-
单脉冲模式输出
同步电路
-
可用外部信号控制定时器
-
支持多个定时器互连
中断 / DMA 触发事件
-
更新事件:计数器上溢/下溢、软件/硬件初始化
-
触发事件:启动、停止、初始化、计数
-
输入捕获事件
-
输出比较事件
2 通用定时器内部结构
| 组成部分 | 主要作用 | 核心组成 |
|---|---|---|
| 1. 时钟源 | 提供定时器的工作时钟,决定计数频率 | 内部时钟、外部时钟模式1/2、内部触发输入 |
| 2. 控制器 | 控制定时器的启动、停止、复位及触发信号处理 | 触发控制器、从模式控制器 |
| 3. 时基单元 | 设定定时的时间基准,是定时的核心 | 预分频器(PSC)、自动重载寄存器(ARR)、计数器(CNT) |
| 4. 输入控制 | 处理外部输入信号,为输入捕获做准备 | 输入滤波器、边沿检测器、通道映射 |
| 5. 输入捕获/输出比较 | 测量外部波形或产生内部波形(PWM/比较输出) | 4个独立的捕获/比较通道(含CCR寄存器) |
| 6. 输出控制 | 将输出信号按需求配置后输出到芯片引脚 | 输出使能、极性选择、输出模式控制器 |
| 时钟源 | 说明 |
|---|---|
| 内部时钟(CK_INT) | 来自 RCC 的定时器总线时钟(APB1/APB2),最常用 |
| 外部时钟模式1 | 从 TI1 / TI2 (通道输入引脚)输入外部时钟信号 支持单沿计数(Tl1FP1/Tl2FP2) (仅上升沿或仅下降沿) 支持双沿计数(Tl1F_ED)(上升沿和下降沿均计数) |
| 外部时钟模式2 | 从 ETR(外部触发输入引脚)输入外部时钟信号 |
| 内部触发输入(ITR) | 来自其他定时器的输出,用于定时器级联同步 |

3 具体设置
| 类别 | 知识点 | 说明 |
|---|---|---|
| 时钟源选择 | 选择内部时钟的条件 | TIMx_SMCR.SMS = 000 且 TIMx_SMCR.ECE = 0 |
| 从模式控制寄存器 | TIMx_SMCR | SMS 位:从模式选择,设为 000 时禁止从模式 ECE 位:外部时钟使能,设为 0 时禁止外部时钟 |
| 预分频器 | 实际分频系数 | TIMx_PSC + 1 |
| 计数模式 | CMS=00 | 边沿对齐模式,DIR 可控(0=递增,1=递减) |
| CMS=01 | 中心对齐模式1,DIR 只读(仅在下降段(递减)产生中断) | |
| CMS=10 | 中心对齐模式2,DIR 只读(仅上升段(递增)产生中断) | |
| CMS=11 | 中心对齐模式3,DIR 只读**(上升段和下降段都产生中断)** | |
| 切换限制 | 模式切换限制 | CEN=1 时,不能从边沿对齐切换为中心对齐 |
| DIR 只读条件 | 中心对齐模式或编码器模式下,DIR 为只读 | |
| 自动重载 | ARPE=0 | TIMx_ARR 不缓冲,立即生效 |
| ARPE=1 | TIMx_ARR 缓冲,更新事件时才生效 |
5.2.2 通用定时器内部结构对比
| 组成部分 | TIM2~TIM5 | TIM9 / TIM12 | TIM10/11/13/14 |
|---|---|---|---|
| 1. 时钟源 | 内部时钟 + 外部时钟模式1/2 + 内部触发输入 | 内部时钟 + 外部时钟模式1/2 + 内部触发输入 | 仅内部时钟 |
| 2. 控制器 | 完整(触发控制器 + 从模式控制器) | 完整(触发控制器 + 从模式控制器) | 简化(仅触发控制器) |
| 3. 时基单元 | 16位或32位计数器,支持递增/递减/中央对齐 | 16位计数器,仅支持递增 | 16位计数器,仅支持递增 |
| 4. 输入控制 | 4通道,含滤波器、边沿检测、预分频器 | 2通道,含滤波器、边沿检测、预分频器 | 1通道,含滤波器、边沿检测、预分频器 |
| 5. 输入捕获/输出比较 | 4个独立通道 | 2个独立通道 | 1个独立通道 |
| 6. 输出控制 | 支持边沿对齐和中心对齐 | 仅支持边沿对齐 | 仅支持边沿对齐 |
5.3 三种计数方式
| 对比项 | 递增计数 | 递减计数 | 中央对齐计数 |
|---|---|---|---|
| 计数方向 | 从 0 递增到 ARR | 从 ARR 递减到 0 | 先递增到 ARR,再递减到 0 |
| 更新事件产生时机 | 计数器达到 ARR 时 | 计数器达到 0 时 | 递增到 ARR 和 递减到 0 时(两次) |
| 计数器周期 | ARR + 1 | ARR + 1 | ARR × 2 |
| PWM 对齐方式 | 边沿对齐(左对齐或右对齐) | 边沿对齐 | 中心对齐 |
| 适用定时器 | 所有通用定时器 | TIM2~TIM5(部分支持) TIM9~TIM14 仅递增 | TIM2~TIM5 TIM9~TIM14 不支持 |
| 典型应用场景 | 基本 PWM、简单定时 | 特殊波形、反向 PWM | 电机控制、需要对称波形的场景 |
设备要求信号是中心对称的信号的时候用中心对齐模式
中央对齐计数时序图

六、PWM控制原理
6.1 PWM输出比较(递增计数)
1 工作原理
设置关键寄存器:
-
ARR(自动重载寄存器):计数器累加的最大值
-
比较值(CCR):与当前计数值进行比较的阈值
-
CNT(计数器寄存器):计数器当前计数的值
工作过程:
-
CNT 从 0 开始递增
-
当 CNT < 比较值时,输出高电平
-
当 CNT ≥ 比较值时,输出低电平
-
当 CNT 计数到 ARR 时,清零并重新从 0 开始
-
所以一个周期就为CNT的值从0开始加,加到ARR,这个过程中与比较值比较的结果
结论:
-
ARR 决定 PWM 周期(一个周期 = CNT 从 0 加到 ARR 的时间)
-
比较值决定 PWM 占空比(高电平时间 = 比较值 × 每个计数步长的时间)
下面是PWM的时序图

2 PWM输出比较内部结构
| 条件 | 说明 |
|---|---|
| 完成对预装载寄存器的写入 | 用户通过 CCR1H/CCR1L 成功写入比较值 |
| 通道配置为输出模式 | CC1S1:0 设置为输出模式(非输入捕获) |
| OC1PE 决定传输时机 | OC1PE=0 时立即传输;OC1PE=1 时等待更新事件(UEV) |

CCR1H 和 CCR1L 是两个 8 位寄存器,合起来组成一个 16 位的捕获/比较寄存器 1(CCR1),用于存放与计数器 CNT 比较的数值(输出模式)。
写入比较值的过程
- 用户通过总线写入 CCR1H 和 CCR1L 时,写控制逻辑会产生一个 "write_in_progress" 的内部状态信号,
- write_in_progress 的高电平表示正在写入,其下降沿才代表写入成功;
- 未写入时信号一直为低电平且无下降沿,通过检测边沿而非电平来区分"从未写入"和"写入已完成"。。
3 PWM输出控制内部结构
| 类别 | 项目 | 说明 |
|---|---|---|
| 输入信号 | OCREF_CLR | 当ETRF(TIMx_SMCR 配置的外部触发信号)检测到高电平时,强制清零 OC1REF,实现逐周期电流管理(如刹车或过流保护) |
| CNT > CCR1 | 来自时基单元(CNT 与 CCR1 比较结果),判断当前计数值是否大于比较值,用于决定输出电平 | |
| CNT = CCR1 | 来自时基单元(CNT 与 CCR1 比较结果),判断当前计数值是否等于比较值,用于产生匹配事件 | |
| 控制参数 | OC1M2:0 | 来自 TIMx_CCMR1,决定当 CNT 与 CCR1 判断时 OC1REF 的行为(置高、置低、翻转或强制固定电平) |
| 输出信号 | OC1REF | 输出模式控制器产生的中间参考信号,决定 PWM 或比较输出的原始波形形态,再经输出控制单元送到芯片引脚 |

CC1P 位(来自 TIMx_CCER)用于选择输出极性;选择高/低电平有效
CC1E是输出使能