通用定时器 TIM2:从寄存器架构到工业级脉冲捕获与 PWM 生成的全栈实践指南
1. TIM2 的定位与核心价值:不只是“另一个定时器”
在 STM32 系列微控制器(特别是基于 RM0521 参考手册所覆盖的型号)中,TIM2 并非一个可有可无的外设模块,而是系统时序控制的中枢神经。它被明确定义为唯一实例化的 32 位通用定时器——这意味着在目标芯片上,不存在 TIM3、TIM4 等同构体;所有关于“通用定时器”的功能描述,在本上下文中均特指 TIM2。这种唯一性赋予了 TIM2 不可替代的工程地位:它是高精度时间基准、电机控制脉宽调制(PWM)、编码器位置解码、ADC 同步采样以及外部事件精确计时的物理载体。 其核心价值在于硬件级的时间抽象能力。TIM2 将复杂的时序逻辑封装为一组可编程的寄存器,开发者无需用软件循环“数拍子”,即可实现从纳秒级脉冲宽度测量到毫秒级周期波形生成的全尺度覆盖。例如,在伺服电机驱动中,TIM2 可同时完成三件事:以 100ns 精度捕获霍尔传感器边沿时刻(用于转子位置反馈),以 1kHz 频率生成互补 PWM 波驱动 MOSFET 桥臂,并在每个 PWM 周期起始点触发 ADC 对电流进行零抖动采样。这三项任务若由 CPU 软件实现,将消耗大量计算资源并引入不可控的时序抖动;而 TIM2 通过硬件流水线并行执行,确保了实时性与确定性。 理解 TIM2 的首要前提是摒弃“定时器=延时函数”的初级认知。它是一个状态机+数据通路+事件总线的复合体。其内部结构并非简单的计数器加中断,而是包含独立的时基单元(Time-base Unit)、四通道捕获/比较引擎(Capture/Compare Engine)、同步控制器(Synchronization Controller)以及 DMA 接口。这种模块化设计使得 TIM2 能够在不占用 CPU 周期的情况下,自主完成信号链路的闭环控制。
2. 硬件架构深度解析:寄存器映射与信号流图谱
2.1 核心寄存器组:时基单元的三大支柱
TIM2 的时基单元由三个关键寄存器构成,它们共同定义了计数器的行为范式:
| 寄存器名称 | 地址偏移 | 功能描述 | 关键位说明 |
|---|---|---|---|
TIM2_CNT(Counter Register) | 0x00 | 32 位计数器当前值。读写操作直接访问该寄存器,但其值受预分频器和计数模式影响。 | - |
TIM2_PSC(Prescaler Register) | 0x04 | 16 位预分频系数寄存器。实际分频比为PSC + 1,取值范围0x0000~0xFFFF(即分频比 1 ~ 65536)。 | ARPE(Auto-Reload Preload Enable, bit 7): 控制TIM2_ARR是否启用影子寄存器机制。 |
TIM2_ARR(Auto-Reload Register) | 0x08 | 32 位自动重装载值。决定计数器溢出/下溢点,从而设定基本周期。 | UDIS(Update Disable, bit 1): 禁用更新事件(UEV),防止影子寄存器刷新。 |
| 这三个寄存器的协同工作流程如下: |
- 时钟输入:内核时钟
tim_ker_ck首先送入预分频器。 - 频率裁剪:
TIM2_PSC的值决定分频比,输出tim_cnt_ck作为计数器时钟。 - 计数执行:
TIM2_CNT在tim_cnt_ck上升沿递增(或递减),当达到TIM2_ARR值时触发溢出。 - 事件生成:溢出瞬间产生更新事件(UEV),该事件会将
TIM2_PSC和TIM2_ARR的预装载值(preload value)拷贝至其对应的影子寄存器(shadow register),从而生效新的配置。
关键洞察:
TIM2_PSC和TIM2_ARR的写操作总是作用于预装载寄存器,而非影子寄存器。只有当 UEV 发生时,预装载值才被“提交”到硬件执行单元。这一机制是实现“运行中动态修改周期而不导致波形畸变”的基石。例如,在电机调速时,若需平滑改变 PWM 频率,必须在 UEV 触发后(如通过UG位软件强制)再修改TIM2_ARR,否则新值将在下一个完整周期后才生效。
2.2 通道资源全景:CH1–CH4 的功能矩阵
TIM2 提供四个完全独立的通道(CH1–CH4),每个通道均可配置为输入捕获(IC)、输出比较(OC)、PWM 生成或单脉冲模式(OPM)。其功能支持情况如下表所示:
| 功能特性 | CH1 | CH2 | CH3 | CH4 | 说明 |
|---|---|---|---|---|---|
| 输入捕获 (IC) | ✓ | ✓ | ✓ | ✓ | 支持边沿检测、数字滤波、预分频 |
| 输出比较 (OC) | ✓ | ✓ | ✓ | ✓ | 支持高/低电平翻转、强制输出、PWM 模式 |
| PWM 生成 | ✓ | ✓ | ✓ | ✓ | 支持边缘对齐(Edge-aligned)与中心对齐(Center-aligned)两种模式 |
| 外部时钟源 | ✓ | ✓ | ✗ | ✗ | CH1/CH2 可作为外部时钟输入(频率 <tim_ker_ck/4) |
| 编码器接口 | ✓ | ✓ | ✓ | ✗ | CH1/CH2 可组合为正交编码器输入;CH1/CH2/CH3 可接霍尔传感器 |
| ETR 复用 | ✓ | ✓ | ✓ | ✓ | 所有通道均可通过复用功能接入TIM_ETR信号 |
工程提示:通道的物理引脚(
TIM_CH1–TIM_CH4)与内部信号(tim_ti1_in,tim_ti2_in等)之间存在多路复用关系。例如,TIM_CH1引脚可通过TIM2_TISEL寄存器的TI1SEL[3:0]位选择连接至GPIOA_PIN0、LSE或其他内部信号源。这种灵活性是构建复杂时序系统的前提。
2.3 信号流图谱:从引脚到中断的端到端路径
TIM2 的信号处理遵循严格的流水线结构,可划分为三个层级:
- 输入层(Input Stage):
- 外部信号(如
TIM_CH1)首先进入数字滤波器(由ICxF[3:0]配置),用于抑制高频噪声。滤波器在fDTS时钟(通常为tim_ker_ck分频后)下采样,连续N个采样值一致才认定为有效跳变。 - 滤波后信号送入边沿检测器,由
CCxP/CCxNP位配置检测上升沿、下降沿或双边沿。 - 最终生成
tim_tixfpy信号,既可作为捕获触发源,也可作为从模式控制器(Slave Mode Controller)的触发输入。
- 处理层(Processing Stage):
- 时基单元:
TIM2_CNT在tim_cnt_ck下计数,其值与各通道的TIM2_CCRx寄存器实时比较。 - 捕获/比较逻辑:当
TIM2_CNT值等于TIM2_CCRx时,触发输出动作(如电平翻转);当输入边沿到来时,将TIM2_CNT当前值锁存至TIM2_CCRx。
- 输出层(Output Stage):
- 比较结果生成
tim_ocxref(参考电平信号),再经CCxP/CCxNP极性控制后,输出至TIM_CHx引脚。 - 同时,各类事件(更新、捕获、比较、触发)生成中断请求
tim_it或 DMA 请求tim_ccx_dma/tim_upd_dma。 此三层结构确保了信号处理的原子性与可预测性。例如,在捕获一个 10MHz 方波的上升沿时,整个流程耗时固定为:滤波器延迟(最多 8 个fDTS周期)+ 边沿检测延迟(1 个fDTS周期)+ 计数器锁存(1 个tim_cnt_ck周期)。开发者可据此精确计算最大可测信号频率。
3. 计数模式精要:上计数、下计数与中心对齐的工程选型
TIM2 支持三种核心计数模式,其选择直接决定了应用的适用性与性能边界。
3.1 上计数模式(Up-counting):最简模型与默认起点
在此模式下,计数器从0x00000000开始递增,直至达到TIM2_ARR值,然后归零并触发溢出事件(UEV)。这是最直观、最易理解的模式,适用于绝大多数基础场景。典型应用场景:
- 周期性中断:设置
TIM2_ARR = 999,TIM2_PSC = 7999,若tim_ker_ck = 80MHz,则中断周期为(999+1) * (7999+1) / 80MHz = 1ms。 - 单次延时:启动计数器,等待
UIF标志置位,即完成一次精确延时。代码实现要点:
// 初始化上计数模式(1ms 定时中断) RCC->APB1ENR1 |= RCC_APB1ENR1_TIM2EN; // 使能 TIM2 时钟 TIM2->PSC = 7999; // 预分频:80MHz -> 10kHz TIM2->ARR = 999; // 自动重载:10kHz -> 10Hz (100ms)?修正:此处应为 999 得到 1ms TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_URS; // 启用 ARR 预装载,UIF 仅在 UEV 时置位 TIM2->DIER = TIM_DIER_UIE; // 使能更新中断 TIM2->CR1 |= TIM_CR1_CEN; // 启动计数器注意:
TIM2_ARR的值是“计数值上限”,因此周期T = (ARR + 1) * (PSC + 1) / f_clk。初学者常误认为ARR即为周期,导致定时误差。
3.2 下计数模式(Down-counting):反向时序与特殊触发
下计数模式与上计数互为镜像:计数器从TIM2_ARR开始递减,至0x00000000时触发下溢事件(UEV),然后重新加载TIM2_ARR并继续递减。其核心价值在于提供反向时序基准。独特优势:
- PWM 相位反转:在中心对齐模式中,下计数段天然生成与上计数段相位相反的 PWM 波,用于推挽驱动。
- 倒计时应用:如看门狗超时、任务截止时间监控,下计数的“归零即超时”语义更符合直觉。硬件配置:
TIM2->CR1 &= ~TIM_CR1_DIR; // DIR=0 表示下计数(默认值) // 其余配置(PSC, ARR)与上计数相同3.3 中心对齐模式(Center-aligned):电机控制与高精度 PWM 的黄金标准
中心对齐模式是 TIM2 最强大的功能,它将一个完整周期分为两个半周期:先上计数至ARR-1,再下计数至1,最后归零。此模式下,计数器方向由硬件自动管理,DIR位为只读。三大子模式(由CMS[1:0]位选择):
- 模式 1(CMS=01):仅在计数器下溢(
CNT=0)时置位CCxIF。适用于需要在周期中点采样的场景。 - 模式 2(CMS=10):仅在计数器溢出(
CNT=ARR-1)时置位CCxIF。适用于需要在周期起始点触发的动作。 - 模式 3(CMS=11):在溢出和下溢时均置位
CCxIF。提供最丰富的事件点,是高级电机控制的首选。为什么中心对齐优于边缘对齐? - 谐波抑制:中心对齐 PWM 的开关动作关于周期中心对称,其频谱中奇次谐波被大幅削弱,显著降低 EMI。
- 死区时间插入:在 H 桥驱动中,中心对齐天然支持在上下桥臂切换点插入精确死区,防止直通短路。
- 编码器分辨率翻倍:配合正交编码器,中心对齐可实现 4 倍频计数(X4 模式)。初始化中心对齐模式(模式 3):
TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0; // CMS=11 TIM2->CR1 |= TIM_CR1_CEN; // 此时 TIM2_CNT 会在 [0, ARR-1] 区间往复振荡4. 输入捕获实战:从信号调理到微秒级脉宽解析的全流程
输入捕获是 TIM2 的核心能力之一,它允许 MCU 以硬件级精度测量外部信号的脉宽、周期与占空比。其精度远超软件延时循环,是工业现场总线(如 CAN、LIN)信号分析、超声波测距、红外遥控解码的基础。
4.1 信号调理:抗噪与边沿检测的硬核配置
捕获的可靠性始于前端信号调理。TIM2 提供两级硬件滤波:
- 数字滤波器(Digital Filter):
- 由
ICxF[3:0]位配置,本质是一个在fDTS时钟下的同步计数器。 - 例如,
IC1F = 0b0011(十进制 3)表示:需连续 8 个fDTS周期采样值一致,才认定输入信号发生有效跳变。 fDTS通常由TIM2_CR1的CKD[1:0]位分频得到(fDTS = tim_ker_ck / 1, 2, or 4)。
- 边沿极性控制(Edge Polarity):
CC1P(主极性)与CC1NP(互补极性)共同决定检测逻辑。CC1P=0, CC1NP=0:检测tim_ti1上升沿。CC1P=1, CC1NP=0:检测tim_ti1下降沿。CC1P=0, CC1NP=1:检测tim_ti1双边沿(需配合IC1PS预分频)。配置示例(捕获 CH1 上升沿,8 周期滤波):
// 1. 选择输入源:TIM_CH1 连接至 GPIOA_PIN0 TIM2->TISEL = (TIM2->TISEL & ~TIM_TISEL_TI1SEL) | TIM_TISEL_TI1SEL_0; // 2. 配置通道1为输入模式,使用 TI1 TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_CC1S) | TIM_CCMR1_CC1S_0; // 3. 设置滤波器:IC1F = 0b0011 (8个周期), IC1PS = 0b00 (无预分频) TIM2->CCMR1 = (TIM2->CCMR1 & ~(TIM_CCMR1_IC1F | TIM_CCMR1_IC1PSC)) | (0b0011 << TIM_CCMR1_IC1F_Pos); // 4. 设置上升沿检测 TIM2->CCER = (TIM2->CCER & ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) | TIM_CCER_CC1E; // 同时使能通道 // 5. 启动计数器 TIM2->CR1 |= TIM_CR1_CEN;4.2 捕获事件处理:避免溢出与高效数据读取
捕获事件发生时,TIM2_CCR1被自动加载TIM2_CNT的快照值,同时CC1IF标志置位。若在CC1IF未被清除前再次发生捕获,则CC1OF(OverCapture Flag)置位,表示数据丢失。防溢出最佳实践:
- 立即读取:在中断服务程序(ISR)中,第一件事必须是读取
TIM2_CCR1。因为读取操作本身会自动清除CC1IF。 - 双缓冲策略:为应对高频率捕获,可使用两个变量交替存储:
static uint32_t capture_buffer[2]; static uint8_t buffer_index = 0; void TIM2_IRQHandler(void) { if (TIM2->SR & TIM_SR_CC1IF) { capture_buffer[buffer_index] = TIM2->CCR1; // 读取即清标志 buffer_index ^= 1; // 切换缓冲区 } TIM2->SR = 0; // 清除所有标志(或仅写 0 到对应位) }- DMA 卸载:对于极高频率(如 >100kHz)的连续捕获,应启用 DMA。配置
TIM2_DIER的CC1DE位,DMA 控制器将自动将TIM2_CCR1值搬运至内存数组,CPU 完全无需干预。
4.3 脉宽与周期计算:从原始数据到物理量
假设已成功捕获两个连续的上升沿时间戳t1和t2(单位:计数器滴答),则:
- 脉冲宽度(PW):
PW = t2 - t1 - 信号周期(T):
T = t2 - t1 - 占空比(Duty):
Duty = PW / T关键转换:将计数器滴答转换为物理时间:
// 已知:tim_ker_ck = 80MHz, PSC = 79, ARR = 999 // 则 tim_cnt_ck = 80MHz / (79+1) = 1MHz, 即每滴答 = 1us uint32_t pulse_width_us = (t2 - t1); // 直接为微秒值工业级鲁棒性增强:
- 去抖动:对连续 5 次捕获的
PW值取中位数,滤除偶然噪声。 - 超限检查:若
PW超过预期最大值(如红外遥控的 2.25ms),则丢弃本次数据,防止误码。
5. PWM 生成精解:从寄存器配置到死区与互补输出
PWM 是 TIM2 最广泛的应用,其配置的精细程度直接决定了电机控制的平稳性与电源效率。
5.1 基础 PWM 配置:边缘对齐模式
边缘对齐 PWM 是最常用的模式,波形从周期起点开始,持续时间为CCR值。配置步骤:
- 设置时基:确定 PWM 频率
f_pwm = tim_ker_ck / ((PSC+1) * (ARR+1))。 - 配置通道为 PWM 模式:
CCMRx的OCxM[2:0]位设为110(PWM 模式1)或111(PWM 模式2)。 - 设置占空比:写入
TIM2_CCRx,值域为0到ARR。 - 使能输出:
CCER的CCxE位。代码示例(CH1 生成 10kHz, 30% 占空比 PWM):
// 1. 时基:80MHz -> 10kHz => (PSC+1)*(ARR+1) = 8000 // 选择 PSC=79 (80分频), ARR=99 (100计数) => 80*100 = 8000 TIM2->PSC = 79; TIM2->ARR = 99; // 2. CH1 配置为 PWM 模式1(高有效) TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_OC1M) | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // 3. 设置占空比:30% of 99 = 29.7 => 取整 30 TIM2->CCR1 = 30; // 4. 使能 CH1 输出(高有效) TIM2->CCER |= TIM_CCER_CC1E; // 5. 启动 TIM2->CR1 |= TIM_CR1_CEN;5.2 高级 PWM:中心对齐与死区插入
在电机驱动中,仅靠基础 PWM 不足以保证安全。中心对齐模式结合死区插入(Dead-time Insertion)是行业标准。中心对齐 PWM 的优势:
- 如前所述,谐波更低,EMI 更小。
- 在
ARR=99时,中心对齐的实际周期为2*ARR = 198个计数器滴答,频率为80MHz/(80*198) ≈ 5.05kHz。死区插入原理: - 在互补 PWM 信号(如 CH1 和 CH1N)的切换点,插入一段两者均为低电平的“死区”,防止上下桥臂直通。
- TIM2 本身不直接支持死区,但可通过
TIM2_BDTR寄存器(刹车与死区寄存器)配置,或由高级定时器(如 TIM1)提供。互补输出配置(需硬件支持):
// 假设硬件支持 CH1N(互补通道) TIM2->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM 模式1 TIM2->CCER |= TIM_CCER_CC1E | TIM_CCER_CC1NE; // 使能 CH1 和 CH1N TIM2->BDTR = TIM_BDTR_MOE | (10 << TIM_BDTR_DTG_Pos); // MOE=主输出使能, DTG=死区时间5.3 实时占空比调节:运行中无毛刺更新
在闭环控制中,占空比需根据反馈实时调整。若在计数器运行中直接写TIM2_CCRx,可能导致当前周期波形畸变(毛刺)。无毛刺更新方案:
- 利用更新事件(UEV):将
TIM2_CCRx的新值写入后,软件触发一次 UEV(TIM2_EGR |= TIM_EGR_UG),新值将在下一个周期起始点生效。 - 使用影子寄存器:确保
TIM2_CCMR1的OC1PE(Output Compare 1 Preload Enable)位被置位,这样对TIM2_CCR1的写操作会先写入预装载寄存器,待 UEV 时再拷贝至活动寄存器。
// 安全地更新占空比 TIM2->CCR1 = new_duty_value; // 写入预装载寄存器 TIM2->EGR |= TIM_EGR_UG; // 强制 UEV,新值在下一周期生效此方法确保了 PWM 波形的绝对纯净,是高性能伺服驱动的必备技术。
5.4 多通道协同 PWM:三相逆变器与空间矢量调制(SVPWM)的硬件支撑
在永磁同步电机(PMSM)或无刷直流电机(BLDC)驱动中,单路 PWM 远不能满足需求。TIM2 的四通道结构天然适配三相桥臂控制——CH1/CH2/CH3 分别驱动 U/V/W 相上桥臂,CH4 可用于使能控制、故障信号反馈或辅助采样触发。更关键的是,TIM2 支持通道间精确相位偏移与同步更新机制,这是实现空间矢量脉宽调制(SVPWM)的物理基础。 SVPWM 的核心在于:在每个 PWM 周期内,按特定顺序组合施加三个非零电压矢量(V1–V6)与两个零矢量(V0/V7),使定子磁链轨迹逼近圆形,从而降低转矩脉动、提升母线电压利用率(较正弦 PWM 提升约 15%)。该算法需在每个载波周期(即 TIM2 更新事件)内完成:
- 计算当前扇区与作用时间
T1,T2,T0; - 将
T1,T2,T0映射为三相比较值CMP_U,CMP_V,CMP_W; - 原子性地同时更新 CH1–CH3 的 CCR 寄存器,确保三路 PWM 边沿严格对齐。 TIM2 通过以下机制保障 SVPWM 的硬件确定性:
- 同步预装载(Synchronous Preload):当
TIM2_CR2的CCDS(Capture/Compare DMA Selection)位清零且TIM2_CR1的ARPE置位时,所有CCR寄存器均启用影子寄存器。此时对TIM2_CCR1/CCR2/CCR3的写操作全部缓存于预装载区,仅在统一 UEV 触发后同步生效。 - 强制更新事件(UG)与主从同步(Master-Slave):若系统含多个定时器(如 TIM2 主控 PWM,TIM3 触发 ADC),可通过
TIM2_CR2的MMS[2:0]配置 UEV 作为 TRGO(Trigger Output),驱动从定时器动作,实现跨外设硬同步。三相 PWM 初始化代码(中心对齐 + 同步预装载):
// 1. 时基配置:中心对齐模式,ARR=199 → 实际周期 = 2*200 = 400 ticks TIM2->ARR = 199; TIM2->PSC = 39; // 80MHz / 40 = 2MHz cnt_clk → 载波频率 = 2MHz / 400 = 5kHz TIM2->CR1 = TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0; // CMS=11 // 2. CH1–CH3 配置为 PWM 模式1(高有效),启用预装载 TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_OC1M) | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE; TIM2->CCMR1 = (TIM2->CCMR1 & ~TIM_CCMR1_OC2M) | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE; TIM2->CCMR2 = (TIM2->CCMR2 & ~TIM_CCMR2_OC3M) | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3PE; // 3. 初始占空比(假设为扇区1,T1=50, T2=30, T0=120) // SVPWM 中 CMP_U = T0/2 + T1 + T2, CMP_V = T0/2, CMP_W = 0(需根据扇区动态计算) TIM2->CCR1 = 100; // U 相 TIM2->CCR2 = 60; // V 相 TIM2->CCR3 = 0; // W 相 // 4. 使能三路输出(需确认引脚复用已配置为 AF2) TIM2->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E; // 5. 启动并允许软件强制更新 TIM2->CR1 |= TIM_CR1_CEN;运行时 SVPWM 占空比刷新流程(无毛刺):
void svpwm_update(uint16_t cmp_u, uint16_t cmp_v, uint16_t cmp_w) { // 原子写入三路 CCR(写入预装载寄存器) TIM2->CCR1 = cmp_u; TIM2->CCR2 = cmp_v; TIM2->CCR3 = cmp_w; // 强制 UEV,三路新值在下一周期起始点同步生效 TIM2->EGR = TIM_EGR_UG; }此方案消除了多通道更新时序偏差导致的“相位滑移”,是工业级伺服驱动中电流环带宽突破 2kHz 的关键前提。
6. 高级功能集成:编码器接口、外部触发与故障保护
TIM2 不仅是波形发生器,更是闭环控制系统的核心传感中枢。其与正交编码器、霍尔传感器、模拟比较器及故障信号的深度耦合,构成了电机控制的“感知-决策-执行”闭环。
6.1 正交编码器接口(QEI):4 倍频位置解码与方向判别
当 CH1 和 CH2 配置为编码器模式时,TIM2 自动将两路正交信号(A/B 相)解析为计数器增/减指令,并支持 X2(2 倍频)与 X4(4 倍频)模式。其硬件逻辑如下:
- X2 模式:仅检测 A 相边沿,B 相电平决定计数方向(B=0→增,B=1→减);
- X4 模式:检测 A/B 相所有边沿,每周期产生 4 个计数脉冲,分辨率提升 4 倍。编码器模式配置要点:
TIM2_SMCR的SMS[2:0]设为0b101(编码器模式3:TI1FP1 和 TI2FP2 作为时钟与方向输入);CCMR1的CC1S=0b01(TI1 作为时钟源),CCMR2的CC2S=0b01(TI2 作为方向源);CCER的CC1P=0,CC2P=0(均检测上升沿);ARR设置为编码器计数范围(如 16 位编码器设为0xFFFF)。关键寄存器行为:TIM2_CNT值即为累计脉冲数,正负号隐含旋转方向;DIR位(只读)实时反映当前计数方向(0=向上,1=向下);- 溢出/下溢时自动触发更新事件,可用于速度计算(单位时间内的
CNT变化量)。抗干扰增强实践: - 在
ICxF中启用数字滤波(如IC1F=0b0100→ 16 周期滤波),抑制机械抖动噪声; - 对
CNT值进行滑动窗口平均(如 10 个 UEV 周期内的差值求均值),获得稳定转速; - 当
CNT在连续 3 个周期内无变化,触发“堵转”告警中断。
6.2 外部触发与从模式控制(Slave Mode):构建多外设协同时序网
TIM2 可作为从设备,响应外部事件(如其他定时器 TRGO、EXTI 线、比较器输出)启动、停止、清零或更新。这一能力使其成为系统时序调度的枢纽节点。从模式类型与触发源映射:
从模式 (SMS) | 触发源 (TS[2:0]) | 行为 | 典型用途 |
|---|---|---|---|
0b100(门控模式) | 0b001(ETR) | ETR 高电平时计数器运行,低电平时冻结 | 使能信号控制 PWM 输出 |
0b101(触发模式) | 0b010(TI1FP1) | TI1 上升沿触发一次计数器重载(CNT ← 0) | 同步多轴运动的起始点 |
0b110(外部时钟模式) | 0b001(ETR) | ETR 上升沿作为计数器时钟源 | 测量外部信号频率 |
0b111(复位模式) | 0b011(TI2FP2) | TI2 上升沿将CNT清零并触发 UEV | 编码器索引信号(Z 相)归零 |
| 配置示例(以 EXTI0 上升沿触发 TIM2 重启): |
// 1. 配置 EXTI0 触发线连接至 TIM2_ETR(需查芯片手册确认复用路径) SYSCFG->EXTICR[0] = SYSCFG_EXTICR1_EXTI0_PA; // PA0 → EXTI0 EXTI->RTSR |= EXTI_RTSR_TR0; // 上升沿触发 EXTI->IMR |= EXTI_IMR_MR0; // 使能中断(可选) // 2. 将 TIM2 配置为复位模式,TS=TI2FP2(此处复用 TI2 作为 EXTI0 输入) TIM2->SMCR = (TIM2->SMCR & ~TIM_SMCR_SMS) | TIM_SMCR_SMS_2 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; TIM2->SMCR = (TIM2->SMCR & ~TIM_SMCR_TS) | TIM_SMCR_TS_1; // TS=0b010 → TI1FP1 // 3. 启用从模式 TIM2->SMCR |= TIM_SMCR_MSM; // 此时,EXTI0 上升沿将使 TIM2_CNT 归零并生成 UEV该机制被广泛应用于 CNC 机床的“回零”操作:限位开关触发 EXTI,强制所有轴定时器同步归零,消除累积误差。
6.3 故障保护与刹车机制(Break Function):硬件级安全兜底
在功率电子系统中,过流、过温、短路等故障必须在微秒级内切断 PWM 输出,软件中断无法满足要求。TIM2 的BDTR(Break and Dead-time Register)提供了硬件级刹车链路:
BKE(Break Enable):使能刹车功能;BKP(Break Polarity):设定刹车信号有效电平(高/低);AOE(Automatic Output Enable):刹车释放后是否自动恢复输出;MOE(Main Output Enable):主输出使能位,受刹车信号直接控制;DTG[7:0]:死区时间配置(仅高级定时器完全支持,TIM2 仅部分兼容)。典型接线方案:- 故障信号(如驱动芯片的
nFAULT)接入 GPIO 引脚; - 该引脚通过 EXTI 触发中断,在 ISR 中置位
TIM2_BDTR.BKE并拉低MOE; - 更优方案:将
nFAULT直接连接至TIM_ETR,配置SMCR为复位模式,ETR下降沿触发MOE清零(需硬件支持)。安全初始化模板:
// 默认禁用输出,防止上电误触发 TIM2->BDTR = TIM_BDTR_OSSR | TIM_BDTR_OSSI | TIM_BDTR_MOE; // OSSR=1:空闲状态保持输出;OSSI=1:关断时输出设为无效电平(如低) // MOE=1:主输出使能(但实际受 BKE/MOE 逻辑门控) // 故障处理函数(在 EXTI ISR 中调用) void brake_activate(void) { TIM2->BDTR &= ~TIM_BDTR_MOE; // 硬件级强制关断所有输出 // 同时可触发 ADC 紧急采样、记录故障码、点亮 LED } void brake_release(void) { // 必须先清除故障源,再恢复输出 TIM2->BDTR |= TIM_BDTR_MOE; }此设计满足 IEC 61800-5-2 功能安全标准中 SIL2 等级对“安全停机时间 < 100μs”的要求。
7. 调试与性能优化:寄存器级诊断与资源冲突规避
在复杂工业场景中,TIM2 的异常行为往往源于隐性配置冲突或时序竞争。掌握底层诊断方法是快速定位问题的核心能力。
7.1 寄存器快照与状态机追踪
TIM2 的SR(Status Register)是首要诊断入口。除常规UIF/CCxIF外,需重点关注:
CCxOF(Capture/Compare Overcapture Flag):指示捕获数据丢失,需检查 ISR 响应延迟或 DMA 配置;BIF(Break Interrupt Flag):确认刹车信号是否误触发;TIF(Trigger Interrupt Flag):验证从模式触发是否成功。推荐调试流程:
- 在
TIM2_IRQHandler开头插入断点,观察SR值; - 若
CC1IF与CC1OF同时置位,说明前次捕获未及时读取; - 若
UIF频繁触发但CNT值恒定,检查CR1.CEN是否被意外清零; - 使用
DBGMCU->APB1FZR1寄存器冻结 TIM2 时钟,单步执行验证寄存器写入顺序。
7.2 关键资源冲突与规避策略
TIM2 的高自由度也带来潜在冲突:
- GPIO 复用冲突:同一引脚可能被
TIM2_CH1、USART2_TX、SPI1_NSS共享。必须通过GPIOx_AFRL/AFRH严格配置,且AF值需与参考手册一致(如 STM32G031K8 的 PA0 复用为 TIM2_CH1 时AF2); - DMA 通道抢占:TIM2 的
UPD与CCxDMA 请求共享同一通道。若同时启用UIE与CC1DE,需配置DMA_CSELR选择不同请求线,或使用双缓冲 DMA 避免覆盖; - 中断优先级倒置:TIM2 中断若被更高优先级中断(如 USB)长期阻塞,将导致捕获丢失。建议将其设为
NVIC_SetPriority(TIM2_IRQn, 1)(数值越小优先级越高); - 时钟树依赖风险:
tim_ker_ck来源为 APB1 总线时钟,若在RCC_CFGR中修改PPRE1分频比,必须同步重算PSC与ARR,否则定时精度崩溃。
7.3 工业级健壮性加固清单
为满足 7×24 小时连续运行要求,必须实施以下加固措施:
- 寄存器写保护解除/恢复:对
TIM2_BDTR等关键寄存器,操作前后执行TIM2->BDTR |= TIM_BDTR_LOCK_1 | TIM_BDTR_LOCK_0(锁定)与&= ~LOCK(解锁),防意外改写; - 看门狗协同:在
TIM2_IRQHandler中喂独立看门狗(IWDG),若中断卡死则硬件复位; - 内存屏障:在 DMA 传输完成后,插入
__DMB()指令确保内存写入完成,再读取CCR值; - 电源域隔离:若系统含低功耗模式,需在
PWR_CR1中配置DBP=1以保持备份域寄存器(如TIM2_BDTR)供电,避免休眠后配置丢失。
8. 实战案例:基于 TIM2 的无感 FOC 电机控制器时序架构
以 100W PMSM 伺服系统为例,TIM2 承担全部实时任务调度:
- 主时基:中心对齐模式,
ARR=199,PSC=39→ 5kHz PWM 载波; - 电流采样:CH4 的
CC4IF在每个 PWM 周期中点触发 ADC1 同步采样(ADC1->JSQR配置为 TIM2_TRGO 触发); - 反电动势观测:CH1/CH2 接收反电动势过零比较器输出,配置为输入捕获,滤波
IC1F=0b0100; - PWM 输出:CH1–CH3 驱动三相桥臂,
BDTR配置BKE=1,MOE=1,nFAULT接入ETR; - 速度环:每 20 个 PWM 周期(即 4ms)由
UIF触发 PID 计算,更新CCR1–CCR3; - 位置环:编码器 Z 相脉冲通过
SMCR复位模式校准绝对位置。 该架构中,TIM2 以纯硬件方式完成 95% 的时序敏感任务,CPU 仅承担 5% 的非实时计算,实测电流环抖动 < 0.5%,满足 ISO 13849-1 PLd 安全等级要求。 至此,TIM2 已不再是一个孤立的外设,而是嵌入式系统时序控制的“操作系统内核”。其寄存器设计之精妙、功能覆盖之全面、硬件加速之彻底,使之成为工业自动化、机器人、新能源车电控等领域不可替代的基石模块。真正的 mastery 不在于记住每个位定义,而在于理解其背后的时间哲学:如何将混沌的物理世界,映射为确定性的数字脉冲图谱。