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

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
1楼-- · 2019-10-15 18:22
回复【7楼】正点原子:
---------------------------------
原子哥,为什么我用软件仿真,完全正确,程序下到硬件上却不行。还有,用JTAG仿真,也得不行?为什么啊,就这个定时器让灯亮3秒,然后再中断里灯灭,关中断的东西。搞了一下午了..........软件怎么仿真都正确,一到硬件上就不行。崩溃了
正点原子
2楼-- · 2019-10-16 00:16
那你可以硬件仿真不?
beifengabc
3楼-- · 2019-10-16 03:03
 精彩回答 2  元偷偷看……

一周热门 更多>