bootloader跳入系统软件的方式
我用的是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);
} wudianjun2001 发表于 2018-7-5 11:20
没看出啥问题来,我都是这样跳的
void execute_user_code(uint32_t Addr)
{
boot_jump()代码是怎么样的? everkimage 发表于 2018-7-5 13:17
boot_jump()代码是怎么样的?
__asm void boot_jump( uint32_t address )
{
LDR SP, ;Load new stack pointer address
LDR PC, ;Load new program counter address
} 可能是楼主优化代码以后,部分问题导致。建议楼主仿真测试一下。带有boot的程序也可以仿真的 安 发表于 2018-7-5 14:01
可能是楼主优化代码以后,部分问题导致。建议楼主仿真测试一下。带有boot的程序也可以仿真的 ...
仿真可以的。
就是最优化后bootloader跳不过去,应该没有执行到APP的初始化代码,因为出来的是bootloader的HardFault处理打印信息。
后来我降低优化等级就可以了,然后再最优化编译,也可以了。不知道怎么地。 wudianjun2001 发表于 2018-7-5 13:40
__asm void boot_jump( uint32_t address )
{
LDR SP, ;Load new stack pointer address
你是直接设置SP。
我是调用__set_MSP()设置的。还有一个函数__set_PSP(),不知道是不是跟这个有关系。 应该是把代码给优化掉了。 本帖最后由 everkimage 于 2018-7-5 16:32 编辑
everkimage 发表于 2018-7-5 16:24
你是直接设置SP。
我是调用__set_MSP()设置的。还有一个函数__set_PSP(),不知道是不是跟这个有关系。 ...
像HardFault的处理,就需要判断MSP和PSP,这部分机制有点忘了,哪位大神提示一下?跳入APP时设置MSP还是PSP,还是都可以? 做个标记,之后写bootloader参考怎么让跳转:lol
页:
[1]