初级会员

- 积分
- 196
- 金钱
- 196
- 注册时间
- 2014-10-5
- 在线时间
- 39 小时
|
本帖最后由 stm32新人一枚 于 2025-1-30 02:16 编辑
最近用STM32H743做Bootloader。
Bootloader没啥问题,但是APP程序中,即便已经改好了中断向量地址,但仍然会莫名奇妙导致HardFault。
我这里整体情况是:
STM32CubeMX配置底层代码,使用FreeRTOS、LVGL、USB、FATFS,等等。
仔细对比填加Bootloader前后的R0㏑15 的寄存器组,除了R15,其他也没有任何区别。
最后挨个对比core peripherals中的各个寄存器,发现SysTick的VAL和CTRL寄存器是不同的:
没有Bootloader时,程序运行至main函数且没执行SystemClock_Config()函数时,SysTick->VAL和SysTick->CTRL的值都是0。
在有Bootloader时,运行APP程序进入main函数且没执行SystemClock_Config()函数时,SysTick->VAL和SysTick->CTRL的值都不是0。
既然发现了不同的地方,那就做出相应的调整:
进入main函数后,先重定向向量表地址,然后清除SysTick->VAL和SysTick->CTRL的值,其他保持不变。
程序运行后,果然正常了。
我推测APP程序因为SysTick->VAL和SysTick->CTRL两个寄存器就导致HardFault的原因大概是因为FreeRTOS和LVGL都需要SysTick做心跳。
由于运行Bootloader程序时,SysTick已经有了数值,导致FreeRTOS或LVGL出了问题。
在运行FreeRTOS和LVGL之前,复位SysTick,就能正常运行了。
|
|