|
本帖最后由 szttg 于 2021-10-25 13:56 编辑
一个项目的构成是Bootloader + APP的方式,使用的是F407VET6。
最近发现一个寄怪的问题。在个别的MCU上会发生HardFault,仔细检查错误发生在App中的__main()调用期间。
有时是UsageFault, 有时是BusFault, 具体的地址还不完全一样。更奇怪的是如果注释掉最后几个不用的中断向量(在startup_stm32f40_41xxx.s中),这种错误就不会再发生了。
Bootloader烧写在0x8000000处,占用前面48KB,App烧写在0x800C000处.
具体情况说明如下:
1、在Bootloader运行时,一直使用的HSI做主频,没有用PLL和HSE。初始化了串口1,检查如果没有新App代码,就用如下代码转到App的Reset_Handler()中:
JumpAddress = *(__IO uint32_t*) (0x0800C000 + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) IAP_Application_Address);
Jump_To_Application();
2、转入App后,SystemInit()函数运行正常,将主时钟设成了PLL, CPU运行在168M.
用调试跟踪的方法,发现错误均发生在 __main()函数调用期间, 共有两种错误:
一是总线错误,显示了具体的错误地址,但每次错误的地址又不完全一样。
BusFault_Handler(), SCB->CFSR = 8200
SCB->BFAR = a7e087c
二是Usage错误,有时是无效的状态, 有时是无效指令。
UsageFault_Handler(), SCB->CFSR = 10000
或
UsageFault_Handler(), SCB->CFSR = 20000
|
|