我用的是STM32F0系列的芯片,IDE是IAR,FLASH前16KB给了bootloader。 bootloader执行1秒后,通过下面代码跳入APP: __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); ((pFunction)(*(__IO uint32_t*) (APPLICATION_ADDRESS + 4)))();复制代码 然后我优化了APP编译选项,导致bootloader无法跳入APP。降低优化条件,便可以。 不知道是bootloader跳入有问题,还是IDE优化有BUG所致。
void execute_user_code(uint32_t Addr)
{
/* Change the Vector Table to the USER_FLASH_START
in case the user application uses interrupts */
SCB->VTOR = Addr & 0x1FFFFF80;
boot_jump(Addr);
}
评分
查看全部评分
boot_jump()代码是怎么样的?
__asm void boot_jump( uint32_t address )
{
LDR SP, [R0] ;Load new stack pointer address
LDR PC, [R0, #4] ;Load new program counter address
}
评分
查看全部评分
仿真可以的。
就是最优化后bootloader跳不过去,应该没有执行到APP的初始化代码,因为出来的是bootloader的HardFault处理打印信息。
后来我降低优化等级就可以了,然后再最优化编译,也可以了。不知道怎么地。
你是直接设置SP。
我是调用__set_MSP()设置的。还有一个函数__set_PSP(),不知道是不是跟这个有关系。
像HardFault的处理,就需要判断MSP和PSP,这部分机制有点忘了,哪位大神提示一下?跳入APP时设置MSP还是PSP,还是都可以?
评分
查看全部评分