int main() { pFunction Jump_To_Application; uint32_t JumpAddress; SystemInit(); /* 配置系统时钟为72M */ NVIC_Configuration(); watchdog_init(); delay_init(72); //72M w25x64_init(); InitSerial(); Signel_led_init(); TIM_init(); SerialPutString("BootLoader Runing...\n"); SerialPutString("BootLoader for "); SerialPutString(SYSTEM_NAME); SerialPutString("\n"); ymodem(); iap(); SerialPutString("Load App!\n"); TIM_Cmd(TIM2,DISABLE); if (((*(__IO uint32_t*)APP_LOCATION) & 0x2FFE0000 ) == 0x20000000) { JumpAddress = *(__IO uint32_t*) (APP_LOCATION + 4); Jump_To_Application = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t*) APP_LOCATION); Jump_To_Application(); } return 0; }
int main(void) { typedef void (*pFunction)(void); pFunction Jump_To_Application; uint32_t jumpAddress; __disable_irq(); jumpAddress = *(__IO uint32_t *)(MAIN_PROGRAM_START_ADDRESS + 4); Jump_To_Application = (pFunction)jumpAddress; __set_MSP(*(__IO uint32_t *)MAIN_PROGRAM_START_ADDRESS); Jump_To_Application(); while (1) { } }
/** ****************************************************************************** * @brief иЩ╪╤жВ╨╞йЩ * @param[in] None * @param[out] None * * @retval None ****************************************************************************** */ int32_t main(void) { pFunction Jump_To_Application; uint32_t JumpAddress; /* ЁУй╪╩╞иХ╠╦ */ hw_init(); print("\r\r\r\r\n"); print("*********************************************\r\n"); print("* BootLoader v1.1 *\r\n"); print("* CopyRight 2013 discovery407. *\r\n"); print("*********************************************\r\n"); /* ©╙фТ╤╗й╠фВ */ systick_open(); /* ╢╝©зиЩ╪╤ */ if (OK != uart_update()) { return -1; } /* ╧ь╠у╤╗й╠фВ */ systick_stop(); /* лЬв╙жас╕сцо╣мЁ */ print("Enter application ...\r\n"); /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (APP_START_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) APP_START_ADDRESS); Jump_To_Application(); return 0; }
void run_app(uint32_t ApplicationAddress) { uint32_t JumpAddress; pFunction Jump_To_Application; printf("AppAddress : %h\n\r", ApplicationAddress); /* Test if user code is programmed starting from address "ApplicationAddress" */ if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFC0000 ) == 0x20000000) { /* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); } else { printf("*** Application isn't Exist ...\n\r"); /* Infinite loop */ while (1) {} } }