(一)STM32启动文件详解:Start.S
链接1: STM32启动文件详解
链接2: STM32 startup.s启动文件分析
(二)IAP 升级文件
一、IAP升级的主要功能
(1)读取升级状态flag
(2)数据拷贝、搬移
(3)运行跳转到异常向量表
(4)NVIC_SystemReset
stm32F10x
stm32f0xx
int ret;
int retry = 2;
uint32_t flash_flag = IAP_ReadFlag();
if (flash_flag == UPDATE_FLAG_DATA) {
while (retry--) {
ret = cp_back_to_app();
if (ret < 0) {
} else {
break;
}
}
}
ret = IAP_run_APP(); // 向量表跳转
// uart_close();
if (ret) { // 重启reboot
NVIC_SystemReset();
HAL_Delay(1000);
NVIC_SystemReset();
HAL_Delay(1000);
}
/**------------------
-------------- 向量表跳转 --------------------------------------
* @ STM32F09x系列:0x20000000 - 0x20007FFF, SRAM = 32 KB
* @ 0x20007FFF的对立:0x2FFF8000
* @ *(__IO uint32_t*)ApplicationAddress:堆栈指针(SP) 必须在 0x2000 0000 -- 0x2000 7FFF 这块Region开辟堆栈
*/
pFunction Jump_To_Application;
uint32_t JumpAddress;
int IAP_run_APP(void)
{
if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFF8000) == 0x20000000) { // & 0x2FFE0000用于判断SRAM
JumpAddress = *(__IO uint32_t*)(ApplicationAddress + 4); // JumpAddress = reset重复位向量地址
Jump_To_Application = (pFunction)JumpAddress; // Jump_To_Application函数指针:指向reset中断向量地址
__set_MSP(*(__IO uint32_t*)ApplicationAddress); // 设置栈顶指针:指向ApplicationAddress
Jump_To_Application(); // 进入reset设置
return 0;
} else {
return -1;
}
}