|

楼主 |
发表于 2021-12-29 20:10:56
|
显示全部楼层
根据硬汉哥的提示,在之前的版本上修正了入口地址错误,改为正确的0x08010000,在boot(keil工程名:SPI_STM32F4)不开启优化O0,无法进行跳转,开启O1优化可实现跳转,汇编下跳转函数分别如下:
- // O1优化,可跳转:
- // flash_run_app()汇编
- 421: {
- 422: // pFunction Jump_To_Application;
- 423: void (*SysMemBootJump)(void); /* 声明一个函数指针 */
- 424: uint32_t JumpAddress = 0;
- 425:
- 0x08002A88 B082 SUB sp,sp,#0x08
- 426: DBG_PRINTF("app start addr:0x%08X", Address);
- 427:
- 428: /* Jump to user application */
- 429: // JumpAddress = *(__IO uint32_t*) (Address + 0x04);
- 0x08002A8A F2435115 MOVW r1,#0x3515
- 0x08002A8E 4604 MOV r4,r0
- 0x08002A90 F6C00100 MOVT r1,#0x800
- 0x08002A94 A308 ADR r3,{pc}+0x24 ; @0x08002AB8
- 0x08002A96 2001 MOVS r0,#0x01
- 0x08002A98 F44F72D5 MOV r2,#0x1AA
- 0x08002A9C 9400 STR r4,[sp,#0x00]
- 0x08002A9E F7FFFFC3 BL.W 0x08002A28 bsp_dbg_print_lvl
- 430: SysMemBootJump = (void (*)(void)) (*((__IO uint32_t *) (Address + 4)));
- 0x08002AA2 6860 LDR r0,[r4,#0x04]
- 0x08002AA4 2100 MOVS r1,#0x00
- 405: __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
- 0x08002AA6 F3818810 MSR PRIMASK,r1
- 458: __set_MSP(*(__IO uint32_t*) Address);
- 459: //__set_PSP(*(__IO uint32_t*) Address);
- 460:
- 461: //__set_CONTROL(0);
- 462:
- 0x08002AAA 6821 LDR r1,[r4,#0x00]
- 324: __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : );
- 0x08002AAC F3818808 MSR MSP,r1
- 463: SysMemBootJump();
- 464:
- 0x08002AB0 4780 BLX r0
- 0x08002AB2 BF00 NOP
- 465: while(1)
- 0x08002AB4 E7FE B 0x08002AB4
复制代码- // O0优化,不可跳转:
- // flash_run_app()汇编
- 421: {
- 422: // pFunction Jump_To_Application;
- 423: void (*SysMemBootJump)(void); /* 声明一个函数指针 */
- 0x0800395C B580 PUSH {r7,lr}
- 0x0800395E B088 SUB sp,sp,#0x20
- 0x08003960 9005 STR r0,[sp,#0x14]
- 0x08003962 2000 MOVS r0,#0x00
- 424: uint32_t JumpAddress = 0;
- 425:
- 0x08003964 9002 STR r0,[sp,#0x08]
- 0x08003966 9003 STR r0,[sp,#0x0C]
- 426: DBG_PRINTF("app start addr:0x%08X", Address);
- 427:
- 428: /* Jump to user application */
- 429: // JumpAddress = *(__IO uint32_t*) (Address + 0x04);
- 0x08003968 9805 LDR r0,[sp,#0x14]
- 0x0800396A 4669 MOV r1,sp
- 0x0800396C 6008 STR r0,[r1,#0x00]
- 0x0800396E F2444155 MOVW r1,#0x4455
- 0x08003972 F6C00100 MOVT r1,#0x800
- 0x08003976 F24443A7 MOVW r3,#0x44A7
- 0x0800397A F6C00300 MOVT r3,#0x800
- 0x0800397E 2001 MOVS r0,#0x01
- 0x08003980 F44F72D5 MOV r2,#0x1AA
- 0x08003984 F7FFFFA4 BL.W 0x080038D0 bsp_dbg_print_lvl
- 430: SysMemBootJump = (void (*)(void)) (*((__IO uint32_t *) (Address + 4)));
- 0x08003988 9802 LDR r0,[sp,#0x08]
- 0x0800398A 9905 LDR r1,[sp,#0x14]
- 0x0800398C 6849 LDR r1,[r1,#0x04]
- 0x0800398E 9104 STR r1,[sp,#0x10]
- 0x08003990 9006 STR r0,[sp,#0x18]
- 405: __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
- 0x08003992 9806 LDR r0,[sp,#0x18]
- 0x08003994 F3808810 MSR PRIMASK,r0
- 458: __set_MSP(*(__IO uint32_t*) Address);
- 459: //__set_PSP(*(__IO uint32_t*) Address);
- 460:
- 461: //__set_CONTROL(0);
- 462:
- 0x08003998 9805 LDR r0,[sp,#0x14]
- 0x0800399A 6800 LDR r0,[r0,#0x00]
- 0x0800399C 9007 STR r0,[sp,#0x1C]
- 324: __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : );
- 0x0800399E 9807 LDR r0,[sp,#0x1C]
- 0x080039A0 F3808808 MSR MSP,r0
- 463: SysMemBootJump();
- 464:
- 0x080039A4 9804 LDR r0,[sp,#0x10]
- 0x080039A6 4780 BLX r0
- 465: while(1)
复制代码 完整源码如下:
SPI_STM32F4.7z
(13.07 MB, 下载次数: 1)
STM32F407VET6,Keil + STM32CubeMX
请帮忙分析一下原因。不胜感激。
|
|