1
GOKIT_OTA 教程
机智云
编制人
TerryLi
审核人
批准人
产品名称
产品型号
文档编号
会签日期
版本
GizWits
2
修改记录:
修改时间
修改记录
修改人
版本
备注
20160510
初建
TerryLi
1.0.0
20160530
Bootloader 区拷贝固件后增加 APP 区
域新固件的 MD5 校验
TerryLi
1.1.0
20160907
修改部分图示
TerryLi
1.2.0
3
目录
GOKIT_OTA
教程
.....................................................................................................................
1
简述 STM32 启动
...................................................................................................................
4
FLASH 区间划分
.....................................................................................................................
4
GOKIT_OTA 方案
....................................................................................................................
6
开始 Bootloader
.....................................................................................................................
7
Bootloader 程序流程
.........................................................................................................
7
Bootloader 编译设置
.........................................................................................................
7
开始写 APP 关于固件升级部分
............................................................................................
9
固件接收流程
.....................................................................................................................
9
编译器设置
......................................................................................................................
10
运行日志
..............................................................................................................................
11
APP 接收云端固件数据
...................................................................................................
11
Bootloder 执行升级任务
.................................................................................................
12
云端操作
..............................................................................................................................
13
添加新固件
......................................................................................................................
13
下载固件
..........................................................................................................................
14
Keil 生成 bin 文件
................................................................................................................
16
合并 hex
................................................................................................................................
18
4
简述
STM32
启动
ARM7/ARM9
内核的控制器在复位后,
CPU
会从存储空间的绝对地址
0x000000
取出第一
条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为
0x000000
(
PC =
0x000000
)同时中断向量表的位置并不是固定的。然而,
Cortex-M3
内核启动有
3
种情况:
1
、 通过
boot
引脚设置可以将中断向量表定位于
SRAM
区,即起始地址为
0x2000000
,同
时复位后
PC
指针位于
0x2000000
处
;
2
、 通过
boot
引脚设置可以将中断向量表定位于
FLASH
区,即起始地址为
0x8000000
,同
时复位后
PC
指针位于
0x8000000
处
;
3
、 通过
boot
引脚设置可以将中断向量表定位于内置
Bootloader
区
;
Cortex-M3
内核规定,起始地址必须存放堆顶指针,而第二个地址则必须存放复位中断
入口向量地址,这样在
Cortex-M3
内核复位后,会自动从起始地址的下一个
32
位空间取出
复位中断入口向量,跳转执行复位中断服务程序。对比
ARM7/ARM9
内核,
Cortex-M3
内核
则是固定了中断向量表的位置而起始地址是可变化的。
总结一下 STM32 的启动文件和启动过程。首先对栈和堆的大小进行定义,并在代码区的
起始处建立中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。
然后在复位中断服务程序中跳转 C/C++标准实时库的 main 函数,完成用户堆栈等的初始化
后,跳转.c 文件中的 main 函数开始执行 C 程序。假设 STM32 被设置为从内部 FLASH 启动(这
也是最常见的一种情况),中断向量表起始地位为 0x8000000,则栈顶地址存放于 0x8000000
处,而复位中断服务入口地址存放于 0x8000004 处。当 STM32 遇到复位信号后,则从
0x80000004 处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转 main 函
数,最后进入 mian 函数。
分析下 GOKIT_OTA 需求,我们将建立两个工程,分别是 Bootloader 还有 APP,我们将
Bootloader 下载到 FLASH 空间 0x8000000 地址处,那么 STM32 启动后会首先执行我们的
Bootloader 程序,然后就可以按照我们意愿实现 OTA 了。
FLASH
区间划分
根据需求,我们将 STM32F103C8T6 这个芯片(GOKIT2 代)Flash 空间划分出 4 个区域:
Bootloader、FLAG、APP、APPBAK。四个区间作用描述如下:
Bootloader:存储 Bootloader 固件,MCU 上电后首先运行该固件。
FLAG:存储有关升级的相关标志位,Bootloader 和 APP 都需要操作该区域。
APP:存储用户程序固件。
APPBAK:临时存储云端下发的新固件,升级固件的一个过渡存储区。
Gokit 分区方案如下图所示:
5