欢迎转载,请注明出处!
©MrWang_tju 2019.8.1
BootLoader是在操作系统内核运行之前运行的,主要功能是初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。BIOS是windows的bootloader,u-boot等为常见的Linux开发版的bootloader。ARM内核芯片下载程序方式可分为三类;
1.下载器(J-Link,ST-Link等)直接下载
2.ISP(in-system programming)下载,以STM32为例,可在不使用下载器而通过如UART、I2C、SPI、USB等通讯接口配合芯片启动代码(.s文件)进行升级
3.IAP(In Application Programming)下载,即编写应用软件实现程序升级,使用bootloader即属于此方法
在产品中,IAP升级的方式较其余两种的优势在于不需要接触芯片,不需要进行硬件配置更改即可实现程序远程升级,有益之处显而易见。物联网技术中的OTA(Over the Air Technology)升级也是基于IAP原理,在bootloader中实现网络通讯与云端配合进行程序升级。
言归正传,为STM32写bootloader实现IAP升级。
首先建立概念,bootloader与应用程序之间是两个独立的程序,在自身运行时互不干扰对方。两者共用的资源是单片机flash。升级Demo以stm32f103c8做实验芯片,编程使用keil MDK,采用HAL库使用cubeMX生成代码基础配置。
第一步:编程实现程序跳转大概需要三个步骤:
1.关闭外设中断 2.重设中断向量表 3.设置起始堆栈地址,将sp指针指向app程序main函数地址
将三个功能放在fun_jump.c函数中,
#include "fun_jump.h"
#include "main.h"
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr)