基于STM32F103RCT6的Bootloader升级
Bootloader的用处
在产品发布后,免不了后续对产品进行升级以及修复BUG。
如果设备距离太远等一系列因素导致本地升级不方便,那么对固件的版本控制以及远程固件升级则是必不可少的一环。
Bootloader的本质
Bootloader本质其实就是引导程序,使之运行你想让它运行的版本。
ICP\ISP\IAP的区别
ICP:In circuit programmer,电路编程,即直接对存储区编程,如:JTAG等
ISP:In system programmer,在系统编程,一般是厂家的bootloader程序。
IAP:In application programmer,在应用里编程,用户可以自定义升级方式升级APP。
Bootloader架构
由于程序是存储在FLASH里,所以我们需要事先对FLASH地址进行划分。
以下是我划分的APP区域:
1、Bootloader地址 0x0800 0000 大小0xC800
2、APP运行地址 0x0800 C800 大小0x19000
3、APP备份地址 0x0802 5800 大小0x19000
4、参数地址 0x0803 E800 大小为剩余大小
注:这里的STM32用的型号是RCT6,每个型号的FLASH与SRAM大小都不同,具体如下:
**第二位:6=32K、8=64K、B=128K、C=256K、D=384K、E=512K**
所以分配地址需要按照大小分配,不可越界,地址起始为0x08000000。
架构说明
这里用的是双APP模式,考虑到升级的APP会有失效的情况,导致程序卡死或者不是自己想要的结果,这时候就需要用到备份APP。
这里bootloader会接收主站传输的版本号,版本号一致会直接跳转至APP运行。
APP版本号不一致则会将APP搬运至备份区存储。
这里我是用STMFLASH的库搬运的。缓存设定为1024,循环搬运。
void carry_APPtoBack(void)
{
u16 buff[1024];|\\1024缓存
u32 app_addr=appAddr,back_addr=backUpAddr;
for(u8 temp=1;temp<=