STM32的Bootloader实现
目录
- 0. 概述
- 1. keil设置
- 2. IAP跳转函数
- 3. APP重定向中断向量表
- 3.1 标准库
- 3.2 HAL库
- 4. 一些小问题
0. 概述
实际中通常会用到升级功能。本文主要是记录下基本设置。
1. keil设置
- 设置flash起始地址和大小。IAP从起始地址运行,分配空间为8K,换算成16进制为0x2000,如下图:
APP在IAP后,即从0x8002000开始。使用的STM32L051C8Tx flash空间为64K,去除IAP部分还剩56K,APP分配空间为52K,换算成16进制为0xD000,如下图:
- 设置为扇区擦除。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();}
}
函数解释如下:
if (((*(volatile uint32_t*)ApplicationAddress) & 0x2FFFE000 ) == 0x20000000)
:
ApplicationAddress存放的是用户程序Flash的首地址,((volatile uint32_t)ApplicationAddress)的意思是取用户程序首地址里面的数据,这个数据就是用户代码的堆栈地址,堆栈地址指向RAM,而RAM的起始地址是0x20000000,因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x20001FFF区间中,这个区间的大小为8K。test = (*(volatile u32*)ApplicationAddress)
,test保存的就是堆栈地址(并且是应用程序堆栈的栈顶地址)。查看STM32的向量表,可以知道:栈顶地址 + 4 存放的是复位地址,因此JumpAddress存放的是复位地址。- 调用
__set_MSP
函数后,将把用户代码的栈顶地址设为栈顶指针。 - 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遇到的问题,逐渐补充,不针对上一节贴的代码。
- 从IAP跳转到APP后运行异常。
单独运行IAP和APP都正常,但是跳转后APP不发正常运行。仿真发现APP的HAL_Delay异常,没有进入systick中断。
发现IAP中进行了关中断操作:
这是一个通用boot程序,以前的APP程序基于RTOS实现,现在APP采用裸机,所以需要手动开中断:
STM32的Bootloader实现相关推荐
- stm32 中bootloader、startup_stm32f10x_md.s的作用
stm32 中bootloader.startup_stm32f10x_md.s的作用 转载 2016-09-12 10:47:39 一.启动文件的作用是: 1. 初始化堆栈指针 SP; 2. ...
- 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序
对于很多人来说,BootLoader并不是一个陌生的词,甚至会经常用到它.因为在很多情况下我们都需要BootLoader程序,比如我们需要对系统在线升级时就需要它,还有当我们需要在外部存储器中运行程序 ...
- STM32的BootLoader 从SD卡更新固件
目 录 1. 前言 2. 初识BootLoader 2.1 百度百科的BootLoader 2.2 BootLoader的简单理解 2.3 BootLoader的作用 ...
- STM32构建BootLoader实现多系统OTA
STM32构建BootLoader实现多系统OTA 目录 STM32构建BootLoader实现多系统OTA 引言 一.基本概念 二.基础参考 三.认识STM32内置存储器扇区分布 四.构建BootL ...
- STM32之bootloader
项目需要编写了STM32的bootloader,其实编写bootloader主要事项有以下: 1.为你的bootloader程序选择存储器地址,因为STM32的存储器FLASH存储程序代码空间为512 ...
- 【STM32】BootLoader介绍、编写 以及 OTA常见方案分析(差分升级 全量升级 AB面升级)
参考博客:STM32 BootLoader升级固件_cyang's blog-CSDN博客 STM32固件升级详解(BootLoader)_EmbeddedOsprey-CSDN博客_stm32升级b ...
- RT_thread STM32通用Bootloader 做OTA升级
项目上需要做设备的远程升级更新程序,从而避免每次更新程序时都需要去现场烧录的麻烦.从而学习探索了RT提供的OTA功能. RT-Thread 开发团队提供了通用的 Bootloader.开发者通过该 B ...
- stm32带BootLoader情况下,需要重新映射中断向量表
应用程序起来第一件事,映射中断向量表.因为M0中断向量表在0x0,所以起来的时候把程序首地址0x8004000映射到ram0x200000000,然后配置一下__HAL_SYSCFG_REMAPMEM ...
- STM32通用Bootloader——FOTA
1.固件升级简述 固件升级,通常称为 OTA(Over the Air)升级或者 FOTA(Firmware Over-The-Air)升级,即固件通过空中下载进行升级的技术. 1.1 bootloa ...
- 第二章 C#+STM32实现设备远程管理与IAP—STM32的BootLoader
整体思路 STM32复位先读取flash的固定区域,该区域存有升级相关信息,包含固件长度.下载地址.升级类型等,根据升级类型,开始升级.由于本次只用到http下载,所以升级类型是固定的.通过http下 ...
最新文章
- 【算法数据结构Java实现】折半查找
- macOS 环境安装Flutter
- 一个小清新搜索引擎试用感受 - 多吉搜索引擎(dogegoge)
- 【工程师综合项目二】React + Koa2打造『JS++官网管理后台』
- Java常用的一些容器
- 争分夺秒!制药公司如何用大数据加快药物试验进程?
- python爬虫怎么挣钱_python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?...
- python 分类变量xgboost_XGBoost 原理 及 常见面试题
- Windows2008R2自动更新造成的意外重启
- C-Sharp网络编程案例解析(Socket类的使用)
- centos u盘安装_利用Win32 Disk Imager 实现U盘刻录ISO
- IDEA怎么设置背景图片
- 最小生成树详解(模板 + 例题)
- 线性规划问题的目标函数灵敏度分析
- CentOS之命令方式安装向日葵与内网穿透
- TrafficMonitor:最好用的网速/内存/CPU监控软件
- 感受野(receptive filed)
- C#技术分享【Word转换成图片和PDF——2种方案】
- windows无人值守文件的制作_autounattend.xml
- 1+2+3+...∞=-1/12?——杨子曰数学
热门文章
- 解决远程主机不能cv问题
- 常见加密解密简单总结
- c语言程序设计教程课后选择题答案,C语言程序设计教程课后习题包括答案.docx...
- java+io+scanner_Java知识点总结(JavaIO- Scanner类 )
- 基线_Origin入门教程(九):扣除基线常用小妙招
- 浙江大学-包家立计算生物学1
- 岭回归、LASSO与LAR的几何意义
- 深度相机(六)--Kinect v2.0 手势样本库制作
- 人脸检测(六)--haar分类器代码理解
- 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...