STM32的中断踩坑到出坑

大家好,我是刘士铭,一个硬件菜鸡,最近公司要研发一款简单的产品用来检测蓝牙设备列表,在程序即将完成的时候出现了问题。

问题描述:程序中一共用到了三个外部中断(按键触发),两个串口,两个定时器,一个窗口开门狗。使用第二个优先级分组。外部中断抢占优先级为0,串口中断抢占优先级为1,定时器中断抢占优先级为2,其中按键是用来设置地址并进行初始化操作的,问题出现在使用按键设置地址后,一按按键程序就会复位,注释掉看门狗后再按按键会死在初始化设置循环里,两个定时器都会停止计数。

解决过程:查看中断控制及状态寄存器ICSR显示一直卡在定时器异常里面

1、初步猜测是不是外部中断与定时器中断存在冲突,测试有两个外部中断触发时不会产生死机问题,所以排除。

2、使用外部中断作为按键触发时外部中断程序里面有10ms延时,考虑是不是外部中断优先级高打断了滴答定时器并使之死在滴答定时器计数里,注释掉延时函数问题犹在,所以排除。

3、仿真运行程序使外部中断产生进入死机状态后,按下停止程序,程序停在蓝牙模块初始化死循环里,初始化程序中根据switch与句选择执行步骤,但switch与句无法根据定时器计数进行操作(对外表现仍是定时器不工作)。

4、继续查询原因,卡了一天半时间,最后找到主循环里有一个初始化程序,定时器中也存在一个初始化程序,初始化程序里存在死循环,死循环根据定时器计数来工作,将定时器中断里面的初始化程序注释掉,程序正常,确定程序死在了定时器中断里面的初始化程序死循环里导致定时器无法正常计数,初始化死循环也无法正常进行。

感悟:

1、这其中我不止一次在想是不是stm32的外部中断与定时器中断存在bug,后来发现我错了,所以遇到问题要先怀疑自己是不是错了,不要轻易去质疑官方的产品,即使有bug也早就修复了,大概率不会遇到,遇到问题一定是自己哪地方操作错了。

2、中断里面要“快进快出”,最好只进行标志位的设置与清除,不要进行过程的操作,避免遇到问题。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值