1. 定时器/计数器在单片机中的核心价值
第一次用delay_ms()函数实现LED闪烁时,我就被这种阻塞式延时的低效震惊了——整个系统在延时期间完全停止响应。直到接触定时器中断,才真正理解精准时序控制的精髓。定时器/计数器作为现代单片机的标准外设,其价值远不止简单的延时功能。
1.1 阻塞式延时的致命缺陷
新手最常写的代码往往是这样的:
c复制while(1) {
LED = 1;
delay_ms(500); // CPU空转等待
LED = 0;
delay_ms(500);
}
这种方式的三大硬伤:
- CPU资源浪费:delay期间处理器只能执行无意义的循环计数
- 系统响应冻结:无法同时处理其他任务或中断事件
- 时序精度差:受中断干扰和循环指令周期影响
1.2 硬件定时器的优势对比
以STM32的通用定时器为例,其工作特点:
- 独立运行:专用硬件电路,不占用CPU资源
- 精准可调:时钟分频+自动重装载实现纳秒级精度
- 多任务并行:通过中断/事件机制实现非阻塞控制
实测对比:使用TIM2定时器中断实现1ms时基,系统功耗降低72%,同时可正常响应串口数据
2. 定时器核心工作机制解析
2.1 时钟树与分频原理
以STM32F103的时钟系统为例:
code复制HSI(8MHz) → PLL×9 → SYSCLK(72MHz)
→ APB1 Prescaler/2 → TIM2CLK(36MHz)
→ TIM_PSC(分频系数) → CK_CNT(计数时钟)
关键参数计算:
c复制// 目标1kHz中断频率(1ms周期)
TIM_Period = 1000 - 1; // 自动重装载值
TIM_Prescaler = (36000000/1000000) - 1; // 分频到1MHz
2.2 工作模式全景图
| 模式 | 典型应用 | 触发条件 | 相关寄存器 |
|---------------|--------------------|---
