1. STM32通用定时器基础认知
第一次接触STM32的定时器时,我被它复杂的寄存器配置吓到了。直到有一天,我把定时器想象成厨房里的多功能料理机——它有基础计时功能(就像料理机的搅拌功能),但还能做PWM输出(相当于切丝)、输入捕获(类似称重)等高级操作。这种类比让我瞬间理解了通用定时器的本质:它是一个可编程的硬件计时单元,能独立于CPU运行,减轻主处理器负担。
STM32的通用定时器(如TIM2-TIM5)通常包含:
- 16位/32位自动重装载寄存器(ARR)
- 16位预分频器(PSC)
- 多个独立通道(CH1-CH4)
- 计数模式寄存器(CR1)
关键认知:预分频器PSC和自动重装载ARR的关系就像水龙头的流量调节——PSC控制水流速度(时钟分频),ARR决定接满一桶水的时间(计数值)。
2. 定时器时钟树深度解析
很多初学者配置定时器时容易忽略时钟源的选择。以STM32F103为例,通用定时器的时钟可以来自:
- 内部时钟(CK_INT)
- 外部触发输入(ETR)
- 内部触发输入(ITRx)
时钟路径示例:
code复制APB1预分频器 → TIMxCLK → 预分频器PSC → 计数器CK_CNT
实测案例:当APB1时钟为72MHz,PSC设为71时:
code复制实际计数频率 = 72MHz / (71+1) = 1MHz
这意味着每个计数周期为1μs,若ARR设置为999,则产生1ms的定时中断。
避坑指南:APB1总线上的定时器时钟会经过倍频器,当APB1预分频系数≠1时,TIMxCLK=APB1时钟×2!
3. 六种工作模式实战配置
3.1 定时器中断模式
这是最基础的应用场景,配置步骤:
- 使能TIMx时钟
c复制RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
- 初始化时基结构体
c复制TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 999; // ARR值
TIM_TimeBaseStructure.TIM_Prescaler = 71; // PSC值
TIM_Tim
