1. 引言
时钟与定时器是嵌入式系统开发中不可或缺的基础模块。无论是实现延时、产生 PWM 波形、进行输入捕获,还是作为操作系统的系统节拍,都离不开定时器的参与。本文以 ARM 处理器为背景,系统梳理时钟树的基本概念、常见定时器类型及其工作原理,并结合实际开发场景给出使用建议。
2. 时钟系统基础
ARM 处理器的时钟系统通常由多个时钟源和分频/倍频电路组成。理解时钟树是正确配置定时器频率的前提。
2.1 常见时钟源
- 外部高速晶振(HSE):通常为 4MHz 至 25MHz 的无源晶振,精度高,适合作为系统主时钟。
- 外部低速晶振(LSE):常见为 32.768kHz,主要用于实时时钟(RTC)和低功耗唤醒。
- 内部高速 RC 振荡器(HSI):上电即用,启动快,但精度受温度影响较大。
- 内部低速 RC 振荡器(LSI):常用于看门狗和低功耗模式下的独立时钟。
- 锁相环(PLL):对参考时钟进行倍频,可产生远高于晶振频率的系统主频。
2.2 时钟树与总线时钟
ARM 内核与片上外设通常挂接在不同的总线(如 AHB、APB1、APB2)上,各总线时钟频率可能不同。定时器挂接在 APB 总线上时,其输入时钟往往还经过额外的预分频器,配置时需仔细查阅芯片参考手册中的时钟树框图。
c
/* 以 STM32 为例:使能定时器 2 的时钟 */
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
3. 定时器分类与工作原理
ARM 芯片中的定时器按功能和复杂度可分为基本定时器、通用定时器和高级定时器三类。
3.1 基本定时器
基本定时器结构最简单,通常只具备向上计数和定时中断功能,适合产生周期性中断或作为时基。它一般没有输入捕获和 PWM 输出通道。
3.2 通用定时器
通用定时器在基本定时器的基础上增加了输入捕获、输出比较和 PWM 生成能力,是日常开发中使用最频繁的定时器类型。其核心是一个可预装载的 16 位或 32 位计数器,配合预分频器(PSC)和自动重装载寄存器(ARR)实现灵活的分频与周期控制。
c
/* 通用定时器初始化示例:1ms 中断周期 */
void TIM_Init(void)
{
/* 假设 APB1 时钟为 72MHz,定时器时钟为 72MHz */
TIM2->PSC = 72 - 1; /* 预分频:72MHz / 72 = 1MHz */
TIM2->ARR = 1000 - 1; /* 自动重装载:1MHz / 1000 = 1kHz */
TIM2->DIER |= TIM_DIER_UIE; /* 使能更新中断 */
TIM2->CR1 |= TIM_CR1_CEN; /* 启动定时器 */
}
3.3 高级定时器
高级定时器在通用定时器的基础上增加了互补输出、死区插入、刹车输入等功能,主要用于电机控制和电源变换等需要复杂波形输出的场景。
4. 定时器核心寄存器
无论哪种定时器,其工作都围绕几个核心寄存器展开。理解这些寄存器的作用是编写驱动的基础。
| 寄存器 | 名称 | 作用 |
|---|---|---|
| PSC | 预分频器 | 对输入时钟进行分频,决定计数频率 |
| ARR | 自动重装载寄存器 | 决定计数周期,计数到该值后溢出或重载 |
| CNT | 计数器 | 当前计数值,可读可写 |
| CCR | 捕获/比较寄存器 | 用于输入捕获或输出比较的阈值 |
| SR | 状态寄存器 | 记录更新、捕获、比较等事件标志 |
| DIER | 中断使能寄存器 | 控制各类事件是否产生中断 |
5. 典型应用场景
5.1 定时中断与延时
利用定时器产生固定周期的更新中断,是替代软件空循环延时的常用方案。在中断服务函数中翻转 GPIO 或累加计数,即可实现精确的时基控制。
c
void TIM2_IRQHandler(void)
{
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF; /* 清除更新标志 */
/* 用户代码:翻转 LED 等 */
}
}
5.2 PWM 输出
通过配置 CCR 寄存器与 ARR 的比值,可以输出占空比可调的 PWM 波形,广泛用于 LED 调光、舵机控制和电机调速。
c
/* 设置 PWM 占空比为 50% */
TIM2->CCR1 = 500; /* 假设 ARR = 1000 */
5.3 输入捕获
输入捕获用于测量外部信号的频率或脉宽。当检测到指定边沿时,计数器当前值被锁存到 CCR 寄存器,通过两次捕获的差值即可计算信号参数。
6. 常见问题与调试建议
- 定时器时钟未使能:操作寄存器前务必确认对应外设时钟已打开,否则写寄存器无效。
- 预分频与重装载值计算错误:先确认定时器实际输入时钟频率,再反推 PSC 和 ARR 的取值。
- 中断标志未清除:中断服务函数中必须清除对应标志位,否则会反复进入中断。
- APB 预分频影响:当 APB 预分频系数不为 1 时,定时器时钟可能是 APB 时钟的倍数,需查阅手册确认。
7. 总结
ARM 定时器功能丰富,但核心原理相通:通过预分频器调整计数频率,通过自动重装载寄存器控制计数周期,再配合捕获/比较寄存器实现各种应用。实际开发中,建议先阅读芯片参考手册的时钟树和定时器章节,理清时钟来源与寄存器关系,再动手编写驱动,往往能事半功倍。