0
收藏
微博
微信
复制链接

定时器中断进不去,使能位和优先级都设了

2026-06-26 10:02
68

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

10.png

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,所有可屏蔽中断都会被挡在门外。

下次定时器中断进不去,别只盯着使能位和优先级,从这五个角度排查一遍,往往能快速找到症结。


本文凡亿教育原创文章,转载请注明来源!

登录后查看更多
0
评论 0
收藏
侵权举报
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。

热门评论0

相关文章

电路之家

专注电子、科技分享,对电子领域深入剖解

开班信息