ZZZ-12-定时器

本篇继 [[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[定时更新中断]

3. 什么是 Channel(通道)

一个定时器(如 TIM2)只有一个计数器(CNT)在不断数数。但是,它有 4 个独立的通道。 这些通道共享同一个“数数进度”,但可以执行不同的任务:

  1. 输出比较 (Output Compare):
    • 原理:我设定一个值(CCR),当计数器数到这个值时,让引脚电平翻转。
    • 用途:PWM 输出(控制灯亮度、舵机角度)。
  2. 输入捕获 (Input Capture):
    • 原理:外部引脚电平一变,我立刻记下当前计数器数到哪了。
    • 用途:测量脉冲宽度、频率测量(比如测转速)。
  3. 单脉冲模式:
    • 用途:像延迟开关一样,触发后出一颗脉冲。

通道背后的“秘密武器”:CCR 寄存器

为什么同一个计数器(CNT)能让不同的通道输出不同的信号?因为每个通道都配了一个属于自己的“挡位设置”,叫做 CCR(Capture/Compare Register,捕获/比较寄存器)。

组件 角色 谁拥有它? 决定了什么?
CNT (计数器) 跑步的秒表 整个定时器共有 频率(跑一圈要多久)
ARR (重装载值) 跑道的终点 整个定时器共有 周期(什么时候回头重新跑)
CCR (比较值) 跑道上的记号 每个通道独立拥有 占空比(跑到哪个位置触发动作)

4. 为什么会有多个 Channel

比喻 1:教室里的那口大钟(一个节奏,多个事件) 想象一间教室,墙上只有一个大钟(这就是 Counter 计数器)。全班同学都看着这口钟。

  • 大钟:从 0 分数到 60 分,然后循环。
  • 通道 1:老师规定,数到 45 分时,铃声响起,大家去休息。
  • 通道 2:校长规定,数到 60 分时,广播响起,大家去吃饭。

为什么要这么设计? 因为大家需要同步。如果每个事件都专门配一口钟,万一有的钟快一点,有的钟慢一点,学校的作息就乱套了。在单片机里,这能保证多个引脚的动作在时间线上是完全对齐的。

作为一个初学者,先理解这两点:

  1. 省资源:STM32 的定时器数量是有限的(只有几个)。如果控制 4 个灯都要开 4 个定时器,那芯片很快就不够用了。有了通道,1 个定时器就能管 4 个灯。
  2. 同节奏:当你需要多个引脚协同工作(比如驱动三相电机、多路舵机、全彩 RGB 灯)时,多个通道能保证它们永远不会“各跑各的”。

5. 在 CubeIDE 中配置时的重点

当你点开 TIM2 的配置:

  • Clock Source: 选 Internal Clock,就是让它开始走字。
  • Channel 1~4:
    • 如果你想做呼吸灯或控制舵机,选择 PWM Generation CHx
    • 选完后,你会发现芯片引脚图上某个引脚(比如 PA0)变绿了,这说明该引脚被分配给了这个通道。
Licensed under CC BY-NC-SA 4.0