STM定时器中断问题

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

STM32F103芯片为例,做了几种不同顺序的组合测试。根据测试发现,的确有些情况下一运行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);//清除更新中断请求位


 

 顺便提下关于定时器里UG位和URS位的使用,分别在TIMx->EGRTIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。 


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32定时器中断是指在STM32微控制器中使用定时器功能时,通过配置定时器的中断使能和中断服务函数来实现定时中断的功能。定时器中断可以用于实现一些定时任务,比如定时触发某个事件或周期性地执行某个操作。 在STM32中,定时器的配置和中断的设置需要通过相关的库函数来完成。首先需要配置定时器的时钟源和计数值,然后设置定时器的中断使能,并编写相应的中断服务函数来处理定时器中断事件。 具体的步骤如下: 1. 配置定时器的时钟源和计数值。可以通过相关的库函数来设置定时器的时钟源和预分频值,以及自动重装载寄存器的值。这些参数决定了定时器的计数速度和定时周期。 2. 开启定时器中断。使用相关的库函数来使能定时器的中断功能,比如设置定时器的中断使能位。 3. 配置中断服务函数。编写一个中断服务函数来处理定时器中断事件。在中断服务函数中,可以根据需要执行一些操作,比如更新计数器的值、清除中断标志位等。 需要注意的是,具体的配置和使用方法可能会根据不同的STM32系列和型号而有所差异。因此,在使用定时器中断功能时,建议参考相关的芯片手册和库函数文档,以确保正确配置和使用定时器中断。 \[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [stm32 TIM定时器中断](https://blog.csdn.net/m0_48789433/article/details/124382904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [7. STM32——定时器中断(1秒闪烁灯)](https://blog.csdn.net/weixin_46105931/article/details/120395321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值