[STM32F4] STM32F407 Bootloader 问题

[复制链接]
14|0
咚了个咚 发表于 2026-9-2 17:19 | 显示全部楼层 |阅读模式
我在项目中为 STM32F407 开发 Bootloader用于固件升级。之前在 STM32F103上开发过同类 Bootloader,运行一切正常,但移植到 STM32F407 后遇到很多问题。

调试代码时,执行这一行:
`if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)`
判断结果***为 0,无法进入条件分支,也就不会执行跳转到应用程序的代码。

应用固件里已经定义 `#define VECT_TAB_OFFSET 0x8000`,始终无法跳转。

升级固件存放在 Flash 地址 `0x080E0000`,待运行的应用固件位于地址 `0x08008000`。
boot代码如下
sharpdefine ApplicationAddress    (0x8008000)
&sharpdefine ApplicationAddress_Firmware  (0x80E0000)
typedef  void (*pFunction)(void);
uint32_t JumpAddress;
pFunction Jump_To_Application;
/*----------------------------------------------------------------------------
  Main Thread 'main': Run Network
*---------------------------------------------------------------------------*/
int main (void) {
    uint8_t* App_ptr;
    SystemClock_Config();//initialize clocks
        BKP_Init();
    if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR6) == 0xA5A5){   

        if (((*(__IO uint32_t*)ApplicationAddress_Firmware) & 0x2FFE0000 ) == 0x20000000)                                                                                                                                
        {
            /* Jump to user application */
            JumpAddress = *(__IO uint32_t*) (ApplicationAddress_Firmware + 4);
            Jump_To_Application = (pFunction) JumpAddress;
            App_ptr = (uint8_t*)Jump_To_Application;

            if( (*App_ptr != 0xFF) &&  (App_ptr) )
            {                 
                /* Initialise user application's Stack Pointer */
                __set_MSP(*(__IO uint32_t*) ApplicationAddress_Firmware);        

                Jump_To_Application();
            }
        }  
    }else{
        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)                                                                                                                                
        {
            /* Jump to user application */
            JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
            Jump_To_Application = (pFunction) JumpAddress;
            App_ptr = (uint8_t*)Jump_To_Application;

            if( (*App_ptr != 0xFF) &&  (App_ptr) )
            {                 
                /* Initialise user application's Stack Pointer */
                __set_MSP(*(__IO uint32_t*) ApplicationAddress);        

                Jump_To_Application();
            }
        }
    }

}

您需要登录后才可以回帖 登录 | 注册

本版积分规则

191

主题

200

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0