写按键驱动的时候封装了一层函数,接收按键枚举和监听事件函数指针,传递给外部中断回调统一处理,习惯性地在监听函数写了HAL_Delay(200),然后就坏菜了

image.png

编译下载,按下Confirm,程序卡死

重新回顾了一下NVIC与HAL_Delay的机制,才注意到

image.png

HAL_Delay依赖HAL_GetTick获取SysTick计数值来实现延时的时间判断,而HAL_GetTick的值又需要SysTick中断来更新。在优先级更高的中断的回调中调用HAL_Delay时,优先级相对较低的SysTick中断无法触发,uwTick的值得不到更新,HAL_Delay所比较的时间一直不动,便一直执行阻塞,造成cpu卡死。


删除中断中出现的HAL_Delay(),编译下载,正常运行。