本帖最后由 天空之鱼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);
}
之后就一切正常。
但我还是很好奇为什么会造成这种现象。我都把寄存器手册翻来覆去看了几遍但还是没有找出结症所在。
请各位大神解答。小弟感激不尽!
|