OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2438|回复: 0

延时函数和中断优先级的问题

[复制链接]

6

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2019-3-31
在线时间
34 小时
发表于 2020-2-25 23:10:27 | 显示全部楼层 |阅读模式
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中断函数。。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 22:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表