STM32启动文件详解:Start.S

(一)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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值