求助,定时器中断实验的问题

2019-10-14 23:32发布

//========主函数================================
int main(void)  {   delay_init();     //延时函数初始化   NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 uart_init(9600); //串口初始化为9600   LED_Init();     //LED端口初始化 TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms       while(1) {     }   }  
//=============中断函数========================
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志  LED1=!LED1; } TIM_Cmd(TIM3, DISABLE);  //关闭定时器 } 如上,正常实现的功能应该是:初始化时,LED1灭,定时器定时500ms,在中断函数中LED1状态反转为亮,然后定时器关闭,LED1一直处于亮的状态中。
而现实的现象却是:上电后,LED1亮了下,然后就熄灭了,一直处于灭的状态。
我用单步调试了下,如图1,初始化时,PE5(LED1)是高电平。
接着到图2中,用step into,一直下去,就到了图3的while(1),然后调试就跑死了,没反应了。这期间PE5一直是高电平。


而如果运行在图2的时候,用step over跳过使能TIM3库函数,就跳到图4的关闭定时器函数处了,此时PE5为低电平,LED1一直亮下去。

所以我的疑问是,用图4的方法单步调试,LED1实现了应该正常的实验现象。
而用图3的方法调试,程序怎么跑飞了?
如果不单步调试,上电后的现象是LED1亮一下,然后一直熄灭,达不到图4单步调试时实现的正常功能。
新手好困惑啊。。。。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
9条回答
beifengabc
2019-10-15 06:04
回复【3楼】正点原子:
---------------------------------
原子哥,我用软件仿真的逻辑仿真仪看了下。
初始化LED时,PE5接的LED1是高电平。然后
TIM3_Int_Init(4999,7199);//10Khz的计数频率,计数到5000为500ms  
在这个定时器初始化函数中,执行到NVIC_Init(&NVIC_InitStructure);时,PE5的电平被翻转了,变成了低电平。
然后定时器定时500ms,在中断函数里执行LED1=!LED1,电平又重新翻转成了高电平。接着关闭定时器。所以造成了实现现象是LED1亮500ms,然后熄灭。
而正常理解应该是初始化时,LED1灭,中断函数中LED翻转亮,接着定时器关闭,一直亮下去。
我现在不理解,为什么在NVIC_Init(&NVIC_InitStructure);时,造成了PE5的电平翻转呢?

一周热门 更多>