STM32H743+LWIP+USB+U盘,持续工作,不定时进入HardFault

平台

芯片:STM32H743II
HAL库:1.2
系统:UCOSII V1.30.02
USB库:V3.2.2
USB:dev模拟串口,和上位机收发通信
U盘:host

领导让我把LWIP+UCOSII+USB+U盘+FATFS+SD卡+LTDC显示屏先搭到STM32H743II上。

出现问题

任务:

任务1:网络一直扫描接收,如果接收到数据,且数据量是1190(先固定数据量),则回发OK
任务2 : 轮询,每次轮询相应执行读写SD卡,读写U盘
任务3:U盘的周期性枚举

问题:

串口和USB通信,USB将收到的数据+1后回发
网络的通信是任务1的作用
STM32H743+LWIP+USB+U盘,持续工作,不定时进入HardFault_第1张图片

但是,持续一段时间,不定时的,会进入HardFault.

解决:(截图是模拟仿真得来,并不是真正的出错截图,而是为了更好的说明解决步骤)

1.处于HardFault中,找调试窗口的SP指针的值。比如,0X240442B0
STM32H743+LWIP+USB+U盘,持续工作,不定时进入HardFault_第2张图片
2.Memory窗口找出LR指针
输入SP指针,找出LR指针的值,4字节对齐,第5个框框就是LR指针,LR表示芯片即将返回的处理地址
在这里插入图片描述
3. 找出LR指针对应的地点
在下面的窗口中
在这里插入图片描述
右键-----Show Disassembly at address
在这里插入图片描述
输入第二步的LR指针的值点确定

  1. 跳到LR指针处
    我的问题是跳到了下图这个地方
    STM32H743+LWIP+USB+U盘,持续工作,不定时进入HardFault_第3张图片

  2. 猜想
    在任务切换时可能是有别的地方,在任务返回或者切换时改变了任务堆栈保存的寄存器的值,导致SP或者LR指针数值被改变。
    因此,猜想中断中每次进入/突出中断都需要调用OSIntEnter,OSIntExit,这两个函数的作用是在系统中的中断嵌套的作用,有一个变量每嵌套一次中断就+1,退出一次中断就-1.
    果然,USB和U盘,ETH网络的中断是没有调用这两个的,因此把他们加上去即可解决。

本文是记录在一次工作中遇到的问题,希望给遇到问题的朋友们提供一点小参考。如果有讲的不对的地方,请麻烦告诉我,不断学习,向您学习。

你可能感兴趣的:(STM32)