在中断里延时,,真有你的哦 |
yzwzfyz 发表于 2021-10-25 16:10 他在中断处理函数里面放了while |
在中断处理函数里面放while(),你不死机天理难容啊。人家中断处理函数要么打个标记,要么几十微秒内退出,毕竟中断要轮询,要嵌套。你直接while住,函数怎么跑。 |
51hei截图20211026084256.png (40.79 KB, 下载次数: 60)
如果你说的是真实的,则外中断后,跳入中断服务程序执行,外中断服务程序在下列情况下会死机: 1、没有写外中断服务程序,即中断后,程序就【飞】了。 2、有死等的条件语句,因条件不成立,死等出不来。 3、修改的主程序的重要参数,造成主程序发生未预期的结果。例如,主程序在等某一事件的结果,突然被外中断打断,中断服务程序又将这个事件清除了,造成中断返回后,主程序等不到事件的结果。 |
EXTI4_IRQHandler里面Delay_ms(10)是用systick中断实现的吧???systick中断优先级低于exti4,所以执行到这一句永远无法进一步执行下去了。 千万不要在中断处理函数里面用delay,这是个基本原则问题。 |
下面是主程序 while(1) { if ( time >= 300 ) /* 10 * 1 ms = 10ms ʱ¼äµ½ */ { d=Get_Max31855(); TM1=d; if(TM1>=92.5) { TM2=TM1+(TM1-92.3)*0.026;//²ÉÑù¾«¶È²¹³¥ }else { TM2=TM1; } time = 0; } if ( time2 >= 1000 ) /* 1000 * 1 ms = 1s ʱ¼äµ½ */ { pid.Pv=TM2;//µ±Ç°ÎÂ¶È PID_Calc(); //pid¼ÆËã Mode();//ʱ¿Ì²ì¾õÉèÖÃζȵı仯 time2 = 0; } if ( time3 >= 200 ) /* 10 * 1 ms = 10ms ʱ¼äµ½ */ { time3 = 0; OLED_Temp(); } } |