stm32一上电就进入中断函数

本文探讨了STM32定时器在启用更新中断时可能出现的立即触发中断现象。通过实验发现,该问题源于上电后定时器中断标志位默认置1,若不先清除中断标志位,启动定时器会导致立即中断。解决方案是先清除中断请求位再启用中断。文章列举了不同代码顺序的效果,并提出正确的编程顺序可避免此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进入一次中断。准确说,只要使能更新中断允许位就立即响应一次更新中断【当然前提是相关NVIC也已经配置好】。换言之,只要使能了相关定时器更新中断,不管你定时间隔多长甚至不在乎你是否启动了相关定时器,它都会立即进入一次定时器更新中断服务程序。

以STM32芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 【即使能更新中断】就立即进入更新中断服务程序。当然后面的中断都是正常的。

老实说,这个问题比较容易忽视,有些情况下也无关紧要,但有些情况可能会给应用带来困扰。从ST MCU相关技术手册似乎并不能明显地找到关于这个问题的很合适或者逻辑性很强的前因后果。

经过验证测试,如果注意一下相关指令代码顺序是可以回避这个问题的。

先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。至于开启相关定时器的指令摆放位置并不严格。下面是相关动作的操作顺序及结果,可以参考、验证之。这里共罗列了6种写法,其中有3种情形是会立即进入中断的,另外3种不会。

(1)不会立即进入更新中断程序。

TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除更新中断请求位

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能定时器1更新中断

TIM_Cmd(TIM1, ENABLE); //启动定时器

(2)不会立即进入更新中断程序。

TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位

TIM_Cmd(TIM1, ENABLE);

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

(3)不会立即进入更新中断程序。

TIM_Cmd(TIM1, ENABLE);

TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

(4)立即进入更新中断程序。

TIM_Cmd(TIM1, ENABLE);

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位

(5)立即进入更新中断程序。

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位

TIM_Cmd(TIM1, ENABLE);

(6)立即进入更新中断程序。

TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断

TIM_Cmd(TIM1, ENABLE);

TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位

综上所述,可能是因为stm32上电后寄存器进行了复位,导致定时器中断标志位默认置1,如果不先手动清除一下中断标志位的话,那么一开启定时器中断cpu就会判断现在中断标志位为高电平,所以一上电什么都还没干就给我进入了定时器中断函数。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值