STM32定时器初始化就进中断问题

发布者:琴弦悠扬最新更新时间:2017-11-04 来源: eefocus关键字:STM32  定时器  初始化  中断 手机看文章 扫描二维码
随时随地手机看文章

     在用到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,否则会立即进入更新中断。 


 


关键字:STM32  定时器  初始化  中断 引用地址:STM32定时器初始化就进中断问题

上一篇:关于STM32中断的部分理解
下一篇:STM32 USB设备电路设计

推荐阅读最新更新时间:2024-03-16 15:43

《Cortex-M0权威指南》之体系结构---异常和中断
  异常会引起程序控制的变化。在异常发生时,处理器停止当前的任务,转而执行异常处理程序,异常处理完成后,会继续执行刚才的任务。异常分为很多种,中断是其中之一。Cortex-M0处理器最多支持32个外部中断(IRQ)和一个不可屏蔽中断(NMI),中断事件的处理叫做中断服务程序(ISR),中断一般由片上的IO口的外部输入产生(边沿触发和电平触发)。   Cortex-M0处理器上可用的中断数量不确定,由厂商决定,最多32个外部中断。如果系统的外设很多,由于中断数目有限,多个中断源可能使用同一个中断连接。   除了IRQ和NMI,M0处理系还支持很多系统异常,它们主要用于操作系统和错误处理。 异常类型      异常编号      
[单片机]
STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf
STM8L051调试笔记之基础功能: 系统时钟、串口、定时器都是基础而且必须的功能,这里放在一起统一记录,之所以用TIM2定时器,是因为想实现STM32的滴答定时器功能 这些基础功能没什么好理解的,就直接贴代码了main.c: main.c: void main(void) { enableInterrupts(); Sysclk_Init(); LED_Init(); Uart1_Init(); printf( This is a STM8 code!!!rn ); while (1) { if(secondClock_flag) { secondCl
[单片机]
STM8L051F3基础功能:内部时钟;TIM2<font color='red'>定时器</font>;串口及printf
LPC824-系统定时器SysTick
在LPC824内部有一个特殊的定时器——系统定时器(SysTick),它位于Cortex-M0+内核里面,是ARM内核的一部分,主要用来给操作系统提供时间片轮转的定时,一般固定为10ms的定时,所以中文也称它为“嘀嗒”定时器(也称“心跳”定时器)。在不跑操作系统时,可以把它当作普通定时器来用,一般用来进行程序延时。在前面的第一个演示示例中就用到过,下面就来讨论一下如何运用SysTick来提供延时。 系统定时器也位于“私有外设总线”(Private peripheral bus)内,其地址为0xE000E010~0xE000E0FF。下面先来看一下SysTick的内部结构,如下图所示。 从上图中可以看出,SysTick定时器的位
[单片机]
LPC824-系统<font color='red'>定时器</font>SysTick
STM32 V3.4库函数使用建立工程方法
清晰地记得刚从51单片机过度到STM32,那种一头雾水的感觉。使用的STM32开发板是非常不适合初学者使用的开发板,它是硬件看上去华丽的神舟开发板。在这里我不评论神舟开发板如何如何,如果你是初学者,建议你不要使用神舟开发板。 拿到神舟开发板的教程,坑爹啊,如何使用STM32库的说明都没有,这对初学者也太不公平了吧。鄙人一个STM32菜鸟在网上花了半天时间才弄明白如何使用这个库,如何建立工程。今天分享我当初是如何使用STM32库文件建立工程的,非常适合初学者。 少废话,上图:
[单片机]
STM32 中断时间计算
定时中断发生的时间T: T = (arr+1)*(psc+1)/72M T=1/f 32的tclk已知 我们可以直接用这个tclk 去除我们设定的分频系数(psc+1) 也就是把tclk 分成了(psc+)份 这个分频系数的范围在1~65535 这样得到tclk/(psc+1)也就得到了定时器最终的频率 我们在倒过来 得到我们的周期(psc+1)/tclk 在乘上我们的装载值 也就得到我们想要的时间了 例
[单片机]
<font color='red'>STM32</font> <font color='red'>中断</font>时间计算
STM32 定时器输出比较翻转模式
STM32的定时器还有一个模式叫做输出比较翻转模式。这种模式,顾名思义,可以翻转电平,但是条件是:当计数值达到比较值时,才会在对应的通道引脚翻转原先的电平。利用这个特点,我们可以在引脚上生成PWM波。 下面就讲讲如何利用这个 翻转 这个特点,来输出PWM波。还是基于我自己的规工程。 1、工程的修改 1)这里用到了定时器,所以需要将stm32f10x_tim.h添加到STM32F10x_StdPeriod_Driver工程组中。 2)打开stm32f0x_conf.h文件,将其中原先被屏蔽的语句:#include stm32f10x_tim.h 的注释去掉。 3)新建OCToggle.c与OCToggle.h两个文件,分别保存
[单片机]
<font color='red'>STM32</font> <font color='red'>定时器</font>输出比较翻转模式
STM32 ADC用DMA方式传输数据出错的解决方法
在ADC高速采集数据时,通过DMA一次性获取大量的转换数据。比如5个通道,一次获取1000组数据。获得1000组数据后再统一处理,然后触发下一次转换。在调试过程中发现获取的通道数据序号出错。经过一番折腾终于调通,程序如下 定义 #define adNum 10000 u16 adsample ; //#define DMA1_Channel4_IRQn_EN 1//DMA 电压采集中断 #ifdef DMA1_Channel4_IRQn_EN #define DMA1_Channel4_IRQn_PreemptionPriority 1 #define DMA1_Channel4_IRQn_SubPriority
[单片机]
6步教你在STM32程序中添加 printf函数
简介:6步教你在STM32程序中添加 printf函数 前提是你有一个完整的keil工程 比如ADC的 调试的时候很多时候用到串口 这里教你怎么样使用Printf 函数 在程序中添加Printf 1, #include stdio.h 2, /* Private functions ---------------------------------------------------------*/ 下添加 void USART_Configuration(void); #ifdef __GNUC__ /* With GCC/RAISONANCE, small printf (option LD Linker
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved