STM32 定时器有时一开启就进中断
2016-10-17 13:27
351 查看
在用到STM32定时器的更新中断时,发现有些情形下只要开启定时器就立即进入一次中断。准确说,只要使能更新中断允许位就立即响应一次更新中断【当然前提是相关NVIC也已经配置好】。换言之,只要使能了相关定时器更新中断,不管你定时间隔多长甚至不在乎你是否启动了相关定时器,它都会立即进入一次定时器更新中断服务程序。
以STM32F051芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 【即使能更新中断】就立即进入更新中断服务程序。当然后面的中断都是正常的。
老实说,这个问题比较容易忽视,有些情况下也无关紧要,但有些情况可能会给应用带来困扰。从ST MCU相关技术手册似乎并不能明显地找到关于这个问题的很合适或者逻辑性很强的前因后果。
经过验证测试,如果注意一下相关指令代码顺序是可以回避这个问题的。
先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。至于开启相关定时器的指令摆放位置并不严格。下面是相关动作的操作顺序及结果,可以参考、验证之。这里共罗列了6种写法,其中有3种情形是会立即进入中断的,另外3种不会。
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除更新中断请求位
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能定时器1更新中断
TIM_Cmd(TIM1, ENABLE); //启动定时器
(1)。。。。。。不会立即进入更新中断程序。
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
(2)。。。。。。不会立即进入更新中断程序。
TIM_Cmd(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
(3)。。。。。。不会立即进入更新中断程序。
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
(4)。。。。。。立即进入更新中断程序。
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);
(5)。。。。。。立即进入更新中断程序。
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_Cmd(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
(6)。。。。。。立即进入更新中断程序。
顺便提下关于定时器里UG位和URS位的使用,分别在TIMx->EGR和TIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。
以STM32F051芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); 【即使能更新中断】就立即进入更新中断服务程序。当然后面的中断都是正常的。
老实说,这个问题比较容易忽视,有些情况下也无关紧要,但有些情况可能会给应用带来困扰。从ST MCU相关技术手册似乎并不能明显地找到关于这个问题的很合适或者逻辑性很强的前因后果。
经过验证测试,如果注意一下相关指令代码顺序是可以回避这个问题的。
先做更新中断标志的清除操作,即清除TIMx->SR寄存器里的UIF标志,然后做定时器更新中断的使能操作。至于开启相关定时器的指令摆放位置并不严格。下面是相关动作的操作顺序及结果,可以参考、验证之。这里共罗列了6种写法,其中有3种情形是会立即进入中断的,另外3种不会。
TIM_ClearITPendingBit(TIM1, TIM_IT_Update); //清除更新中断请求位
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE); //使能定时器1更新中断
TIM_Cmd(TIM1, ENABLE); //启动定时器
(1)。。。。。。不会立即进入更新中断程序。
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
(2)。。。。。。不会立即进入更新中断程序。
TIM_Cmd(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
(3)。。。。。。不会立即进入更新中断程序。
TIM_Cmd(TIM1, ENABLE);
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
(4)。。。。。。立即进入更新中断程序。
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
TIM_Cmd(TIM1, ENABLE);
(5)。。。。。。立即进入更新中断程序。
TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);//使能定时器1更新中断
TIM_Cmd(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除更新中断请求位
(6)。。。。。。立即进入更新中断程序。
顺便提下关于定时器里UG位和URS位的使用,分别在TIMx->EGR和TIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。
相关文章推荐
- <抄>STM32 定时器有时一开启就进中断的问题
- STM32 定时器有时一开启就进中断
- 解决STM32开启定时器时立即进入一次中断程序问题
- [置顶] ARM开发(10)基于STM32的通用定时器中断控制蜂鸣器响
- 使用STM32的systick定时器中断实现RTC工作过程出错
- STM32定时器中断实验-TIM3
- [转]STM32学习笔记6-定时器中断
- STM32学习笔记-定时器中断
- STM32实验1:定时器中断同时产生两路不同频率的信号
- Stm32定时器中断使LED灯闪烁
- stm32定时器中断
- stm32中断学习篇(1)——以定时器为例
- STM32单片机学习(5) 定时器中断实验
- stm32定时器中断实验
- R2 STM32基本定时器之中断笔记-TIM
- STM32学习笔记——定时器中断(向原子哥学习)
- STM32 定时器中断
- STM32 普通定时器(TIM3)中断 实现流水灯实验
- STM32定时器中断关于何时清除中断的总结
- stm32通用定时器进入不了中断