解决STM32开启定时器时立即进入一次中断程序问题

配置STM32定时器时,定时器中断使能、定时器使能、清除更新中断标志位,三者不同顺序程序执行时有不同效果,具体如下:

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)。。。。。。立即进入更新中断程序。

参考:http://www.51hei.com/bbs/dpj-40940-1.html

         http://www.openedv.com/posts/list/41019.htm
————————————————
版权声明:本文为CSDN博主「YGT666」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ygt666/article/details/79586390

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,您可以使用STM32定时器来实现定中断。下面是一个简单的例子,可以帮助您实现5秒钟一次的定中断: 1. 首先需要配置定时器钟源和计数模式,以及计数值和预分频值。例如,使用 TIM2 定时器,将钟源设置为内部钟,计数模式设置为向上计数,计数值设置为10000,预分频值设置为7199,可以实现10ms的计中断。 ```c RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 7199; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period = 10000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); ``` 2. 然后需要使能定时器中断,并编写中断处理函数。在中断处理函数中,可以设置一个标志位,表示已经发生了定时器中断,并在主程序中进行相应的处理。 ```c void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) { // 定时器中断发生 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); flag_timer = 1; // 标记定时器中断已发生 } } ``` 3. 最后在主程序中循环读取标志位,如果定时器中断已经发生,则进行相应的处理,并清除标志位。 ```c while (1) { if (flag_timer == 1) { // 定时器中断已发生,进行相应的处理 // ... flag_timer = 0; // 清除标志位 } } ``` 通过以上操作,就可以实现5秒钟一次的定中断。将计数值设置为50000,预分频值设置为7199即可。当定时器计数到50000,就会发生一次定时器中断,然后在中断处理函数中设置标志位,主程序中进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值