初级会员

- 积分
- 168
- 金钱
- 168
- 注册时间
- 2019-3-31
- 在线时间
- 34 小时
|
5金钱
本帖最后由 tilblackout 于 2020-2-26 00:50 编辑
我通过按键触发外部中断,在外部中断中写了Delay_Ms(5);LCD_DisplayStringLine();
主函数则是while(1){Delay_Ms(200);LCD_DisplayStringLine();}
延时函数不是论坛的,就是简单的设置一个变量,在systick中断函数里自减。
我把systick中断优先级设置成抢占优先级为1,把EXTI抢占优先级设置为2。这时候按下按键后,就回不到主函数的循环了。
①我调试了一下,具体是在中断中执行LCD_Display函数中,在某个毫不相干的代码处,会突然进入systick的中断函数中,将计时变量自减,对于16位变量来说0自减是65535了,然后外部中断函数结束后在Delay_Ms()函数的while循环中等待变量从最大值减为0,也就是要等655.35秒才能正常执行程序。把LCD_Display换为其它函数比如串口发送函数,一样会变为65535。如果换成一个耗时非常短的函数,那么也不会出问题,一旦代码耗时长一点就会出问题。main函数中的Delay_Ms的延时参数设置的越小,出问题的概率就越小。到了20以上,基本是一进中断就会出现这个问题。
③因为我是用外部中断来当按键用的,得用延时来消抖,所以抢占优先级设置成systick为1,EXTI为2,不然的话无法在中断中使用延时函数。而我索性不消抖了,去掉EXTI处理函数中的5ms延时函数(不改优先级去掉还是会出问题),把systick的抢占优先级设置为最小的15,竟然就不会出现问题了。所以这应该是个中断优先级的问题。有会的吗?主要是不理解为什么中断函数执行过程中,会无缘无故的跳入systick中断函数。。
|
|