一个IAP程序 下载完程序后软件复位后 卡死在hardfault_handler

2019-08-14 01:58发布

主芯片用的是stm32l15系列
在0x08000000-0x08004000放了一段IAP程序
0x08004000之后放的是主程序。

直接用Keil下载两段程序后可以正常跳转到主程序运行。运行IAP模式, 更新主程序后复位再次跳转到主程序是卡死在第一段程序的hardfault_handler。

 修改了第一段程序的 HardFault_Handler函数
void HardFault_Handler(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
//   while (1)
//   {
 // }
wait();
}
__asm void wait()
{
BX lr
}
 
发现是运行到0x080043F8后跳转到HardFault_Handler 查代码发现是system_stm32|1xx.c 325行里 static void SetSysClock(void) 中的
    FLASH->ACR &= ~FLASH_ACR_LATENCY;  这一行。

几个疑问:
1.为什么我正常下载程序没问题,IAP更新的程序(同一段主程序)会有问题?是否是我Flash擦写操作有问题?我单步调试,在Keil里用memory查看擦写的地址,都是正常在擦写的。
2.为什么已经跳转进入第二段程序(我把断点设置在static void SetSysClock(void) 开头,Debug时可以正常进入,单步运行到上述那行时就出错),出现硬件错误,还是跳转回第一段程序的HardFault_Handler,是否我跳转时向量表便宜设置有问题?

我把第二段程序再用KEIL 下载一遍 程序又可以正常运行了。

各位大侠有没有遇到过这种问题,或者可不可以提供一点调试思路。调试了两天了 好难过

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。