目录

  • 0. 概述
  • 1. keil设置
  • 2. IAP跳转函数
  • 3. APP重定向中断向量表
    • 3.1 标准库
    • 3.2 HAL库
  • 4. 一些小问题

0. 概述

实际中通常会用到升级功能。本文主要是记录下基本设置。

1. keil设置

  1. 设置flash起始地址和大小。IAP从起始地址运行,分配空间为8K,换算成16进制为0x2000,如下图:

    APP在IAP后,即从0x8002000开始。使用的STM32L051C8Tx flash空间为64K,去除IAP部分还剩56K,APP分配空间为52K,换算成16进制为0xD000,如下图:
  2. 设置为扇区擦除。IAP和APP程序设置相同,如下图:

2. IAP跳转函数

跳转函数如下:

#define APPLICATION_ADDRESS  (uint32_t)0x08002000typedef void (*pfun) (void);
pfun Jump_To_Application;
uint32_t JumpAddress;void go_to_app(void)
{if (((*(volatile uint32_t*)APPLICATION_ADDRESS) & 0x2FFFE000 ) == 0x20000000){JumpAddress =  *(volatile uint32_t*)(APPLICATION_ADDRESS + 4);Jump_To_Application = (pfun)JumpAddress;__set_MSP(*(volatile uint32_t*)APPLICATION_ADDRESS);Jump_To_Application();}
}

函数解释如下:

  1. if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFFE000 ) == 0x20000000)
    ApplicationAddress存放的是用户程序Flash的首地址,((volatile uint32_t)ApplicationAddress)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x20001FFF区间中,这个区间的大小为8K。
  2. test = (*(volatile u32*)ApplicationAddress),test保存的就是堆栈地址(并且是应用程序堆栈的栈顶地址)。查看STM32的向量表,可以知道:栈顶地址 + 4 存放的是复位地址,因此JumpAddress存放的是复位地址。
  3. 调用__set_MSP函数后,将把用户代码的栈顶地址设为栈顶指针。
  4. Jump_To_Application();的意思就是设置PC指针为复位地址。

CORTEX-M3上电后后检测BOOT引脚的电平来决定PC的位置。例:BOOT设置为FLASH启动,启动后CPU会先取两个地址:一个是栈顶地址,另一个是复位地址。因此才有了第3、第4点的写法。

摘自一篇非常详细的文章,可惜找不到链接了。

3. APP重定向中断向量表

3.1 标准库

STM32标准库可通过下面函数实现重定向:

NVIC_SetVectorTable(0x08000000,0x2000);

3.2 HAL库

HAL库不再支持该函数,通过下面函数完成重定向:

void SystemInit (void)
{......SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table ......
}

我们修改VECT_TAB_OFFSET宏定义的值即可:

/* #define VECT_TAB_SRAM */
#define VECT_TAB_OFFSET  0x2000U /*!< Vector Table base offset field.This value must be a multiple of 0x100. */

当需要调整IAP空间时,这里很容易漏掉。经常使用如下定义:

extern int Image$$ER_IROM1$$Base;
#define VECT_TAB_OFFSET  ((uint32_t)&Image$$ER_IROM1$$Base)

然后KEIL添加设置:

这样调整空间的同时,也调整了中断向量表:

源代码链接:STM32L051_Bootloader。

4. 一些小问题

这一小节记录下boot遇到的问题,逐渐补充,不针对上一节贴的代码。

  1. 从IAP跳转到APP后运行异常。
    单独运行IAP和APP都正常,但是跳转后APP不发正常运行。仿真发现APP的HAL_Delay异常,没有进入systick中断。
    发现IAP中进行了关中断操作:

    这是一个通用boot程序,以前的APP程序基于RTOS实现,现在APP采用裸机,所以需要手动开中断:

STM32的Bootloader实现相关推荐

  1. stm32 中bootloader、startup_stm32f10x_md.s的作用

     stm32 中bootloader.startup_stm32f10x_md.s的作用 转载 2016-09-12 10:47:39 一.启动文件的作用是: 1.  初始化堆栈指针 SP; 2. ...

  2. 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序

    对于很多人来说,BootLoader并不是一个陌生的词,甚至会经常用到它.因为在很多情况下我们都需要BootLoader程序,比如我们需要对系统在线升级时就需要它,还有当我们需要在外部存储器中运行程序 ...

  3. STM32的BootLoader 从SD卡更新固件

    目  录 1. 前言 2. 初识BootLoader 2.1      百度百科的BootLoader 2.2      BootLoader的简单理解 2.3      BootLoader的作用 ...

  4. STM32构建BootLoader实现多系统OTA

    STM32构建BootLoader实现多系统OTA 目录 STM32构建BootLoader实现多系统OTA 引言 一.基本概念 二.基础参考 三.认识STM32内置存储器扇区分布 四.构建BootL ...

  5. STM32之bootloader

    项目需要编写了STM32的bootloader,其实编写bootloader主要事项有以下: 1.为你的bootloader程序选择存储器地址,因为STM32的存储器FLASH存储程序代码空间为512 ...

  6. 【STM32】BootLoader介绍、编写 以及 OTA常见方案分析(差分升级 全量升级 AB面升级)

    参考博客:STM32 BootLoader升级固件_cyang's blog-CSDN博客 STM32固件升级详解(BootLoader)_EmbeddedOsprey-CSDN博客_stm32升级b ...

  7. RT_thread STM32通用Bootloader 做OTA升级

    项目上需要做设备的远程升级更新程序,从而避免每次更新程序时都需要去现场烧录的麻烦.从而学习探索了RT提供的OTA功能. RT-Thread 开发团队提供了通用的 Bootloader.开发者通过该 B ...

  8. stm32带BootLoader情况下,需要重新映射中断向量表

    应用程序起来第一件事,映射中断向量表.因为M0中断向量表在0x0,所以起来的时候把程序首地址0x8004000映射到ram0x200000000,然后配置一下__HAL_SYSCFG_REMAPMEM ...

  9. STM32通用Bootloader——FOTA

    1.固件升级简述 固件升级,通常称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术. 1.1 bootloa ...

  10. 第二章 C#+STM32实现设备远程管理与IAP—STM32的BootLoader

    整体思路 STM32复位先读取flash的固定区域,该区域存有升级相关信息,包含固件长度.下载地址.升级类型等,根据升级类型,开始升级.由于本次只用到http下载,所以升级类型是固定的.通过http下 ...

最新文章

  1. 【算法数据结构Java实现】折半查找
  2. macOS 环境安装Flutter
  3. 一个小清新搜索引擎试用感受 - 多吉搜索引擎(dogegoge)
  4. 【工程师综合项目二】React + Koa2打造『JS++官网管理后台』
  5. Java常用的一些容器
  6. 争分夺秒!制药公司如何用大数据加快药物试验进程?
  7. python爬虫怎么挣钱_python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?...
  8. python 分类变量xgboost_XGBoost 原理 及 常见面试题
  9. Windows2008R2自动更新造成的意外重启
  10. C-Sharp网络编程案例解析(Socket类的使用)
  11. centos u盘安装_利用Win32 Disk Imager 实现U盘刻录ISO
  12. IDEA怎么设置背景图片
  13. 最小生成树详解(模板 + 例题)
  14. 线性规划问题的目标函数灵敏度分析
  15. CentOS之命令方式安装向日葵与内网穿透
  16. TrafficMonitor:最好用的网速/内存/CPU监控软件
  17. 感受野(receptive filed)
  18. C#技术分享【Word转换成图片和PDF——2种方案】
  19. windows无人值守文件的制作_autounattend.xml
  20. 1+2+3+...∞=-1/12?——杨子曰数学

热门文章

  1. 解决远程主机不能cv问题
  2. 常见加密解密简单总结
  3. c语言程序设计教程课后选择题答案,C语言程序设计教程课后习题包括答案.docx...
  4. java+io+scanner_Java知识点总结(JavaIO- Scanner类 )
  5. 基线_Origin入门教程(九):扣除基线常用小妙招
  6. 浙江大学-包家立计算生物学1
  7. 岭回归、LASSO与LAR的几何意义
  8. 深度相机(六)--Kinect v2.0 手势样本库制作
  9. 人脸检测(六)--haar分类器代码理解
  10. 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...