STM32定时器中断入门:从基础配置到多任务时间基准
定时器是STM32上除了GPIO之外最常用的外设,可以说没有哪个嵌入式项目能完全绕开它。无论是精确延时、PWM输出、输入捕获测频测脉宽,还是作为操作系统的时基,定时器都是核心部件。而定时器中断更是让程序"按时间做事"的基础能力。本文从定时器的工作机制讲起,手把手带你在STM32F103上完成定时器中断的配置与实战。
一、STM32定时器的基本结构STM32的定时器本质上是一个16位(部分高级定时器)的自动加1计数器,在时钟驱动下不断向上计数,当计数到设定值(自动重装载值ARR)时产生更新事件并清零重新计数。为了让计数速度可控,时钟要先经过预分频器PSC分频。举个例子:系统主频72MHz,若PSC设为71则分频后计数器时钟为1MHz,即每微秒计一次;此时把ARR设为999,则每1000微秒(1ms)产生一次更新中断。这个"PSC定精度、ARR定周期"的关系,是配置一切定时器的基础。
二、定时器中断的配置步骤用标准库配置定时器中断,核心分四步:第一步开启定时器时钟,如TIM2挂在APB1总线上,需要RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步调用TIM_TimeBaseInitStruct配置PSC、ARR和计数模式(向上计数);第三步配置NVIC,设置定时器中断的优先级分组和抢占优先级、使能该中断;第四步调用TIM_ITConfig使能更新中断(TIM_IT_Update),最后TIM_Cmd使能定时器。中断服务函数TIM2_IRQHandler里先判断TIM_GetITStatus,处理完业务后用TIM_ClearITPendingBit清中断标志。理清这几步,STM32定时器中断配置就基本掌握了。
三、从固定延时到多任务时间基准定时器中断最简单的应用是替代软件延时,例如每1ms翻转一次LED实现精准闪烁。更进阶的用法是把它做成全局的时间基准:在1ms中断里维护一个tick变量,主程序通过比较tick的差值来判断"是否到时间",从而实现多个任务各自的定时,互不阻塞。这就是"多任务时间基准"的核心思想,也是裸机程序里常用的小型调度器雏形。与延时函数不同的是,中断式计时不会占用CPU空转,程序可以一边处理其他事务一边计时。
四、常见问题与进阶方向初学定时器中断常遇到的坑有:忘记使能NVIC导致中断不触发;中断频率太高导致主程序被频繁打断、CPU占用过高;多个定时器共用中断优先级未设计好造成响应延迟;还有PSC、ARR数值计算错误导致定时不准。建议先用逻辑分析仪或示波器验证实际波形。掌握定时器中断之后,可以进一步学习PWM输出(用TIM输出比较功能)、输入捕获(用TIM测量脉冲宽度/频率)和编码器接口,这些都是定时器的衍生能力,也是STM32定时器进阶开发的重点方向。
|
|
|
|
|
|
|
|