本篇继 [[ZZZ-10-定时器中断]],学习定时器。我们可以把 STM32 的定时器资源想象成一个**“大型工厂的动力系统”,里面有不同等级的“发动机”和多条“传动轴”
1. 定时器的等级制度 (Classification)
在 STM32F103C8T6 中,并不是所有的定时器都一样。它们被分为三个等级:
| 等级 | 编号 | 特色功能 | 形象比喻 |
|---|---|---|---|
| 高级定时器 | TIM1 | 带死区控制、互补输出(专为电机驱动设计)。 | 全能大 BOSS |
| 通用定时器 | TIM2, 3, 4 | 具备定时、PWM、输入捕获、编码器接口。 | 工厂主力中层 |
| 基本定时器 | (C8T6 没有) | 仅有最基本的定时功能,通常给 DAC 触发用。 | 纯体力临时工 |
2. 定时器的内部结构图 (Mermaid)
为了让你看懂什么是 Channel(通道),我们先看一个定时器的内部逻辑。你可以把通道看作是定时器伸向外部引脚的“手臂”。
graph TD
Clock[内部时钟 CK_INT
72MHz] --> PSC[预分频器 Prescaler
降速] PSC --> CNT[计数器 Counter
数数] CNT --- ARR[自动重装载寄存器
目标数值] subgraph "定时器核心 (产生时间基准)" PSC CNT ARR end CNT --> Comparator[比较器/捕获逻辑] subgraph "Channels (外部交互的手臂)" Comparator --> CH1[Channel 1
PA0] Comparator --> CH2[Channel 2
PA1] Comparator --> CH3[Channel 3
PA2] Comparator --> CH4[Channel 4
PA3] end ARR --> Interrupt[定时更新中断]
72MHz] --> PSC[预分频器 Prescaler
降速] PSC --> CNT[计数器 Counter
数数] CNT --- ARR[自动重装载寄存器
目标数值] subgraph "定时器核心 (产生时间基准)" PSC CNT ARR end CNT --> Comparator[比较器/捕获逻辑] subgraph "Channels (外部交互的手臂)" Comparator --> CH1[Channel 1
PA0] Comparator --> CH2[Channel 2
PA1] Comparator --> CH3[Channel 3
PA2] Comparator --> CH4[Channel 4
PA3] end ARR --> Interrupt[定时更新中断]
3. 什么是 Channel(通道)
一个定时器(如 TIM2)只有一个计数器(CNT)在不断数数。但是,它有 4 个独立的通道。 这些通道共享同一个“数数进度”,但可以执行不同的任务:
- 输出比较 (Output Compare):
- 原理:我设定一个值(CCR),当计数器数到这个值时,让引脚电平翻转。
- 用途:PWM 输出(控制灯亮度、舵机角度)。
- 输入捕获 (Input Capture):
- 原理:外部引脚电平一变,我立刻记下当前计数器数到哪了。
- 用途:测量脉冲宽度、频率测量(比如测转速)。
- 单脉冲模式:
- 用途:像延迟开关一样,触发后出一颗脉冲。
通道背后的“秘密武器”:CCR 寄存器
为什么同一个计数器(CNT)能让不同的通道输出不同的信号?因为每个通道都配了一个属于自己的“挡位设置”,叫做 CCR(Capture/Compare Register,捕获/比较寄存器)。
| 组件 | 角色 | 谁拥有它? | 决定了什么? |
|---|---|---|---|
| CNT (计数器) | 跑步的秒表 | 整个定时器共有 | 频率(跑一圈要多久) |
| ARR (重装载值) | 跑道的终点 | 整个定时器共有 | 周期(什么时候回头重新跑) |
| CCR (比较值) | 跑道上的记号 | 每个通道独立拥有 | 占空比(跑到哪个位置触发动作) |
4. 为什么会有多个 Channel
比喻 1:教室里的那口大钟(一个节奏,多个事件) 想象一间教室,墙上只有一个大钟(这就是 Counter 计数器)。全班同学都看着这口钟。
- 大钟:从 0 分数到 60 分,然后循环。
- 通道 1:老师规定,数到 45 分时,铃声响起,大家去休息。
- 通道 2:校长规定,数到 60 分时,广播响起,大家去吃饭。
为什么要这么设计? 因为大家需要同步。如果每个事件都专门配一口钟,万一有的钟快一点,有的钟慢一点,学校的作息就乱套了。在单片机里,这能保证多个引脚的动作在时间线上是完全对齐的。
作为一个初学者,先理解这两点:
- 省资源:STM32 的定时器数量是有限的(只有几个)。如果控制 4 个灯都要开 4 个定时器,那芯片很快就不够用了。有了通道,1 个定时器就能管 4 个灯。
- 同节奏:当你需要多个引脚协同工作(比如驱动三相电机、多路舵机、全彩 RGB 灯)时,多个通道能保证它们永远不会“各跑各的”。
5. 在 CubeIDE 中配置时的重点
当你点开 TIM2 的配置:
- Clock Source: 选
Internal Clock,就是让它开始走字。 - Channel 1~4:
- 如果你想做呼吸灯或控制舵机,选择
PWM Generation CHx。 - 选完后,你会发现芯片引脚图上某个引脚(比如 PA0)变绿了,这说明该引脚被分配给了这个通道。
- 如果你想做呼吸灯或控制舵机,选择