zoukankan      html  css  js  c++  java
  • [转]解决STM32开启定时器时立即进入一次中断程序问题

    整理:MilerShao 

         在用到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->EGRTIMx->CR1寄存器里。对UG位置1可以产生更新事件并对相关计数器和寄存器重新初始化,如果URS位为0的话,同时会产生更新中断。如果不希望对UG位置1的同时产生更新中断,得置URS位为1,否则会立即进入更新中断。 


  • 相关阅读:
    [求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
    [经验] Win7减肥攻略(删文件不删功能、简化优化系统不简优化性能)
    [原创] Easy SysLite V1.2 (2016.5.29更新,新增加WIN10支持,一个程序适配所有系统减肥)
    [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法
    [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續)
    [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得
    [原创] 【2014.12.02更新网盘链接】基于EasySysprep4.1的 Windows 7 x86/x64 『视频』封装
    [分享] 封装工具ES4配置文件解释
    [分享] 史上最简单的封装教程,五分钟学会封装系统(以封装Windows 7为例)
    [分享] 从定制Win7母盘到封装详细教程 By BILL ( 10月23日补充说明 )
  • 原文地址:https://www.cnblogs.com/tubujia/p/9559726.html
Copyright © 2011-2022 走看看