很多开发者都遇到过这样的场景:定时器初始化代码反复核对,使能位开了,NVIC优先级也配了,可中断服务函数就是纹丝不动。问题往往不在这些明面上的配置,而是藏在几个容易被忽略的角落。

1. 中断服务函数名写错了
这是最隐蔽的坑。你在代码里写了一个void TIM3_IRQHandler(void),编译通过,下载成功,但永远进不去。打开启动文件一看,里面定义的弱函数叫TIM3_IRQHandler,而你写的函数名可能多了一个下划线或者大小写不对。链接器不会报错,它只会默默把你的函数当成普通函数,中断向量表里挂的还是默认的空函数。
2. 定时器时钟根本没开
很多人以为配了PSC和ARR就万事大吉,却忘了使能定时器对应的RCC时钟。没有时钟,计数器不走,更新事件永远不会产生,中断自然无从谈起。检查一下RCC_APB1ENR或RCC_APB2ENR里对应的时钟使能位是否置1。
3. 更新中断使能位漏了
启动定时器不等于打开中断。TIMx_CR1的CEN位只是让计数器跑起来,但DIER寄存器的UIE位才是更新中断的开关。只调用HAL_TIM_Base_Start而不调用HAL_TIM_Base_Start_IT,中断通道就是断的。
4. 中断标志没清干净
进入中断服务函数后,必须手动清除SR寄存器里的UIF标志位。如果忘了清,退出ISR后标志还在,NVIC会认为中断仍在处理中,后续中断请求被阻塞,看起来就像“只进了一次就再也不进了”。
5. 全局中断被关了
检查一下程序里有没有调用__disable_irq()之后忘了__enable_irq(),或者某个临界区操作关掉了全局中断后没有恢复。PRIMASK寄存器一旦置1,所有可屏蔽中断都会被挡在门外。
下次定时器中断进不去,别只盯着使能位和优先级,从这五个角度排查一遍,往往能快速找到症结。
本文凡亿教育原创文章,转载请注明来源!

扫码关注







































