打印
[STM32F1]

关于定时器的一个隐藏错误。请各位大神分析

[复制链接]
2748|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 天空之鱼5141 于 2013-12-28 21:32 编辑

定时器开启后立刻就跳入了中断(CNT没有溢出,配置的是更新中断)
这时正常的时序:



这时在程序中出现的实际时序:(为了表达的准确性,这张图是我PS的)

后附上代码(我查询和好几个人的例程(包括李想和原子的例程),貌似他们都没注意到这个问题)
定时器配置程序:
void TIM_Config()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
nvic.NVIC_IRQChannel=TIM6_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority=2;
nvic.NVIC_IRQChannelSubPriority=2;
nvic.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&nvic);
TIM6->ARR=10000;
TIM6->PSC=7199;
TIM6->CR1|=1<<3;//单脉冲模式
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//这里没有使能定时器,使能代码在外部中断服务函数中
}


void EXTI9_5_IRQHandler()  //用外部中断使能定时器
{
if(EXTI_GetFlagStatus(EXTI_Line5))
{
  TIM_Cmd(TIM6,ENABLE);
  TIM6->CNT=0;
  EXTI_ClearFlag(EXTI_Line5);
  }
}


void TIM6_IRQHandler()
{
if(TIM_GetFlagStatus(TIM6,TIM_FLAG_Update)//触发更新中断
{
  led(1);
  TIM_ClearFlag(TIM6,TIM_FLAG_Update);
  }
}


应有的实验现象:通过按键触发外部中断以后定时器被使能,定时器计数器开始自加,延时一秒,定时器更新中断被触发,led灯被点亮。

实际的实验现象:开机后还没按键(没有开启定时器),定时器被使能程序立刻就跑进了定时器断服务函数。且CNT寄存器没有发生上溢(我是用的向上计数),但是清除标志位退出中断函数后,后边的的定时器工作就能正常延时了


附:我后来在配置函数的的最后添上了一句更新事件标志位清除函数但没有作用。最后不得已在中断服务函数中添加了一句计数器值的判断语句:
if(TIM_GetFlagStatus(TIM6,TIM_FLAG_Update)&TIM6->CNT==10000)
{
  led(1);
  TIM_ClearFlag(TIM6,TIM_FLAG_Update);
  }
之后就一切正常。
但我还是很好奇为什么会造成这种现象。我都把寄存器手册翻来覆去看了几遍但还是没有找出结症所在。
请各位大神解答。小弟感激不尽!
沙发
天空之鱼5141|  楼主 | 2013-12-28 21:43 | 只看该作者
我知道了问题出在哪里。。。
中断控制器(NVIC)一定要在语句的最后。
要不然就会出现上述的错误。

使用特权

评论回复
板凳
gonggu8181| | 2013-12-29 07:58 | 只看该作者
mark

使用特权

评论回复
地板
airwill| | 2013-12-29 10:49 | 只看该作者
嗯, 是的, 所以我们在设计硬件初始化部分的软件时, 特别是自己玩寄存器操作时, 充分考虑指令执行而导致的设置异步情况, 设置要分先后次序, 把好最后关卡.

使用特权

评论回复
5
yywdc| | 2014-4-22 22:55 | 只看该作者
原来如此啊,我用STM32F2时也是出现了,开了中断使能后就直接进入中断的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

9

帖子

0

粉丝