hal_delay函数死循环

最近在调touchGFX库发现一个问题,由于使用的是STM32H743开发板,正点原子的。开发板上连接触摸屏I2C接口,采用的普通 GPIO,只有采用模拟I2C。正点原子的触摸IC的最大的时钟频率为400KHZ,其中FT5206初始化代码采用HAL_Delay延时。贴一下代码:

hal_delay函数死循环

第一个61调用HAL_Delay就进入死循环。超级奇怪,进入断点查看,系统没有进入滴答时钟,但滴答时钟都是正常,都在产生中断。但如果把这个HAL_Delay注释掉,等进到freertos初始完成正常启动后,再调用HAL_Delay都是好的,也能进入滴答时钟中断。网上有许多解决办法,把滴答时钟中断的优先级改高,改成高于5的确 是正常了。但为什么会在系统初始完成后就正常,这也太奇怪了。我的main函数 初始如下,

hal_delay函数死循环

我在MX_FMC_init()中也有调用HAL_Delay

hal_delay函数死循环

在这个地方就不会进入死循环。这个问题越发奇怪,我开始把从159行到168的代码挨个注释,看看哪一个会引起这样的缘由,后来发现是MX_TouchGFX_Init();引起。但为什么调用这个会让HAL_Delay陷入死循环,实际就是滴答时钟中断不作用更新不了时钟数,进入rtos又好了。把滴答时钟的中断改成小于5就是就可以用。总结一点,就是解决这个问题的办法有两种:

1、把滴答时钟优先级改为小于5,就在MX_TouchGFX_Init();后,系统 启动前调用HAL_Delay调用。

2、不要在在MX_TouchGFX_Init();后,系统 启动前调用HAL_Delay调用。

通过个基本上判断,是MX_TouchGFX_Init()修改哪个地方让MCU不调用优先级低于5的中断,目前问题就比较明了。通过查看PM0253数据手册,查看中断屏屏蔽寄存器BASEPRI的定义,这个是定义低该定义的优先的中断不调用。在168行MX_TouchGFX_Init()处设个断点,发目前果然是它将BASEPRI改为5了,直接通过IDE手动修改BASEPRI为0,后面的HAL_Delay正常调用,不会再陷入死循环

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
X-LINYI的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容