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


原文地址:https://www.cnblogs.com/tubujia/p/9559726.html

时间: 2024-10-29 06:40:00

[转]解决STM32开启定时器时立即进入一次中断程序问题的相关文章

解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的问题

0. libjpeg 介绍 libjpeg 是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码.JPEG编码和其他的JPEG功能的实现.这个库由独立JPEG工作组维护.参考:http://zh.wikipedia.org/wiki/Libjpeg 本文基于 libjpeg9 对使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的问题进行分析,文中的代码和解决问题的方法均可结合 libjpeg9 编译通过. 1.使用 libjpeg 保存图片的方法. 不多说,直接上代码: /**

安装mysql 开启服务时出错/etc/init.d/mysqld: line 264: 的解决办法

安装mysql 开启服务时,出错/etc/init.d/mysqld: line 264: cd: mysql-5.5.60: No such file or directory解决办法https://blog.51cto.com/genxin/1783419 basedir 设置正确后,又出现,错误[[email protected] ~]# service mysqld startStarting MySQL.Logging to '/usr/local/mysql-5.5.60/local

[Visual Studio] 解决移至定义时总是开启中继数据页面

摘要:[Visual Studio] 解决移至定义时总是开启中继数据页面 在一个方案(Solution)当中可能会依照功能不同切成多个项目(Project) 而这些项目可能会互相加入参考(References)来使用对方的功能 目前有两个项目在同一个方案内,分别是 - ConsoleApplication3 (主要程序) - MyLibrary (共用函数库 DLL) 通常我加入参考的方式是直接找到那个DLL,在这个例子里面的文件目录在 ConsoleApplication3MyLibraryb

Stm32高级定时器(一)

Stm32高级定时器(一) 1 定时器的用途 2 高级定时器框图 3 时基单元 4 通道 1 定时器的用途 已知一个波形求另一个未知波形(信号长度和占空比) 已知波形的信号长度和占空比产生一个相应的波形 增量正交编码器驱动电机获得动态信息(速度.加速度) 测量输入信号的脉冲宽度(输入捕获) 产生输出波形(输出比较.PWM.嵌入死区时间的互补PWM等) …… 我们知道,当我们需要测量一段直线的长度时,我们需要一把直尺,根据直尺上的刻度读出直线的长度,定时器也相当于直尺能够测量和产生特定的波形. 比

STM32通用定时器配置

一.STM32通用定时器原理 STM32 系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生.其它6个为普通定时器,时钟由APB1的输出产生. 下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图: 从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分. 下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频

STM32 通用定时器的几种配置方式

STM32 通用定时器的几种配置方式 //------------------------------------------------------------------------------ // 1.普通定时使用 #include"stm32f10x.h" #include"time.h" static Time_NVIC_Config( void ) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVecto

STM32通用定时器实现LED灯闪烁

刚才看了一下STM32通用定时器的教程,其实和51的定时器使用差不多.只是因为32的时钟更复杂,可操控的寄存器更多,所以写的时候可能更复杂. 使用通用定时器中断的一般步骤:1.使能定时器时钟 这个需要看时钟树,使能对应的时钟就好了.这里我使用的是TIM3,所以使能APB1的时钟即可. 2.设置定时器的分频系数和重装载值 定时器中断的时间为:Tout = (arr+1)/[Tclk/(psc+1)] 其实这个定时器中断时间还是要具体分析,这里是这样,其他地方或许不是这样,具体还是要参考<STM32

STM32之定时器

一.定时器简介 1.时钟来源 2.定时器结构(以基本定时器为例) 二.基本定时器的编程方法 1.基本定时器的寄存器 2.例程 /** * @brief 定时器6的初始化,定时周期0.01s * @param 无 * @retval 无 */ void TIM6_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = A

STM32使用定时器实现输入捕获

输入捕获简介输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能. STM32的输入捕获,简单地说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将此刻定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获. 使用TIM2输入捕获的配置步骤:1.开启TIM2时钟,配置PA0为下拉输入.需要使用到PA0作为TIM2_CH1上面的脉冲输入.2.设