我在项目中为 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();
}
}
}
}
|
|