|
100汤圆
本帖最后由 leebilly007 于 2020-8-28 15:38 编辑
平台:STM32F103CBT6 + W5500 + IAR Arm 8.42.1
程序使用的是MXCube 直接生成的工程,使用的HAL库。
软件的设置:
问题描述:
1、全新的电路板的情况下,用stlink v2 烧写bootloader,程序会正常加载APP程序,但在加载完成重启之后,运行完bootloader之后无法正常进入APP程序,程序进入HardFault_Handler(void);
2、全新的电路板的情况下,用stlink v2 分别烧写bootloader 和 APP 程序,程序正常运行,跳转以及所有的功能均正常。且通过WEB打开升级开关,也能正常的从TFTP服务器加载最新的APP程序。但此时分为两种情况,
⑴ 新加载的APP程序如果与之前的APP程序没有任何改动的情况下,正常加载之后一切正常,所有功能正常。
⑵ 新加载的APP程序如果是修改且编译生成之后的,那情况与1、的情况相同,即无法从bootloader跳转至APP程序。
附上跳转的程序:
1、bootloader跳转至APP:
void reboot_app(void)
{
pFunction Jump_To_Application;
uint32 JumpAddress;
HAL_DeInit();
__disable_irq();
HAL_RCC_DeInit();
HAL_NVIC_DisableIRQ(RCC_IRQn);
JumpAddress = *(__IO vu32*) (ApplicationAddress + 0x00000004);
Jump_To_Application = (pFunction) JumpAddress;
//initialize user application's stack pointer
__set_MSP(*(__IO uint32_t *)ApplicationAddress);
Jump_To_Application();
}
2、APP跳转至bootloader(重启)
void reboot(void)
{
HAL_DeInit();
HAL_RCC_DeInit();
HAL_NVIC_DisableIRQ(RCC_IRQn);
HAL_TIM_Base_Stop_IT(&htim1);
pFunction Jump_To_Application;
uint32 JumpAddress;
JumpAddress = *(vu32*) (FLASH_BASE + 0x00000004);
Jump_To_Application = (pFunction) JumpAddress;
//initialize user application's stack pointer
__set_MSP(*(__IO uint32_t *)FLASH_BASE);
Jump_To_Application();
}
3、APP程序 main()开头的语句
NVIC_SetVectorTable(FLASH_BASE,0x8000);
__ASM("CPSIE I"); // 开启中断
__enable_irq(); // 开启所以中断
__enable_fault_irq();
基于以上的信息,请帮忙分析问题的原因,并给出正确的解决办法,有任何疑问也请留言提出。谢谢。 |
附件: 您需要 登录 才可以下载或查看,没有帐号?注册
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|