关于STM32定时器使用的一个注意事项(以此为前车之鉴,重要!)
2012年护士资格证分数线关于STM32定时器使⽤的⼀个注意事项(以此为前车之鉴,重
要!)
我们平时使⽤定时器的时候多数都是处于开启状态,平时的定时中断书写格式⼀般是:十级伤残标准
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
}
}
但是,项⽬的实验过程中,我使⽤的定时器处理事件稍微有点特殊,即,定时器不是⼀直处于开启状态, ⽽且关闭时候也是在中断⾥关闭。⼤概形式这样:
void TIM3_IRQHandler(void)
{
电脑游戏手柄怎么设置if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
名牌奶粉TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
TIM_Cmd(TIM3, DISABLE);  //失能(函数外使能)
}
}
樱组词和拼音
看似没错,⽽且也看似正常。但是,处理的事件内容出现了很多未知错误(由于我的这个处理事件有很强的时序性,开始和结束都⽐较严格),⽆法正常执⾏。通过后来的调试中发现(把处理时间改为点灯或者打印输出⽅式),发现是:TIM_Cmd(TIM3, DISABLE);  扰乱了时序关系。当失能后,其实中断并没有真正失能,还会再进⼊⼀次中断,因此事件⼜被执⾏了⼀次,对于时序⽐较严格的事件,就产⽣了问题!
到了原因,因此,我猜测虽然定时器失能并且关闭了定时器,但是可能中断标志位并没真正清除,虽然中断开始已经清除过⼀次,但估计因为失能使得标志位⼜被置位了,因此,我在失能前⾯加了句清除中断更新标志位,如下:
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//要处理的事件内容。。。。
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//再清除标志位
TIM_Cmd(TIM3, DISABLE);  //失能(函数外使能)活埋 李涛
}
}
果然,程序可以正常的时序运⾏。
⽐较纳闷关定时器前⼜得清下标志位,因此引起了另⼀个好奇⼼,是不是在其他地⽅关闭定时器(如主函数),也得这样做才可以。所以对这个好奇⼼进⾏了下测试。发现:如果把关闭定时器放到了主函数后,不⽤再清中断标志位。能正常把定时器关闭,并不会进⼊中断。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。