模式
AG32 Bootloader参考
关于资源 > AG32 Bootloader参考
Bootloader的作用:升级代码
在单片机的代码升级时,一般需要额外做一个Bootloader程序来实现该功能。不管哪种单片机,这里的逻辑是相似的。
正常逻辑:
- 芯片上电后,先运行Bootloader;
- Bootloader中检测是否要升级:
- 如果要升级则执行升级动作(用新的bin覆盖掉旧的bin);
- 如果不用升级,则跳转到用户程序(开始真正运行用户程序)。
为方便描述,Bootloader后续简称Boot,用户程序简称为App。
所以,Boot程序是额外需要实现的一个应用程序。
可以理解为:
- Boot也是一个应用程序,只不过相比App稍微特殊点,是专用于升级功能而已。
- 在下位机上,需要同时装载两个程序:Boot和App。
- Boot开发和App一样,可以使用芯片内的所有资源。调试程序可以在VSCode下调试。
实际应用中的升级方式
实际应用中,常见的升级方式有两种:近端升级(二级烧录)和远程升级。
1. 近端升级
- 是设备和PC有连线情况下的升级方式。
- 芯片原厂会提供原始烧录工具(称为一级烧录)。但这套工具在串口烧录时,需要操作
boot0
和boot1
引脚,对终端用户来说,利用这种方式升级,操作过程太不友好。 - 希望的是,用户不用额外操作设备,直接通过串口线插上去就能很方便的升级。
2. 远程升级
- 是设备有联网功能,能从服务器下载新固件,然后自己完成升级动作。
- 这种方式下,不用用户的参与,直接可以服务器端推送来完成升级。
- 这种场景下,设备连接到服务器,从服务器下载新版本的bin,然后设置好标记位,主动重启设备进入Boot,判断到标记后,Boot将下载好的新版本的bin覆盖掉本地的bin,从而完成版本的升级。
这两种升级方式,都需要Boot的参与。但这两种升级的Boot,要实现的功能是不同的。
AG32升级的特点
AG32一套程序需要运行的bin有两个:
code.bin
和logic.bin
;- Boot部分需要这样的两个bin,App也需要这样的两个bin;
- 所以,共需要4个bin:
boot_code
、boot_logic
、app_code
、app_logic
。
升级,就是用App新的bin替换掉旧的bin;
- 可以只单独升级
app_code
或app_logic
, - 也可以
code
和logic
一起升级;
- 可以只单独升级
Boot和App的这4个bin,都是存储在Flash上的;
- Boot的
logic
可以选择内置到code
,也可以不内置; - App的
logic
也可以选择内置和不内置; - 不管
logic
是否内置到code
里去,这样的bin至少都应该是先制作出来,并最终放进Flash。
- Boot的
Boot+App模式下,芯片上电后的运行逻辑:
- A. 芯片上电后,芯片内部ROM程序先装载
logic.bin
到CPLD的运行区;- 这段ROM程序是芯片内部固化的启动程序,不可更改。
- 这个
logic.bin
,是在制作batch.bin
时指定的logic
,样例中,是app_logic
。
- B. 跳转到Boot的
code
来运行; - C. Boot自己启动后,先重新加载一次自己内置的
logic
到CPLD运行区;- 样例中是内置
logic
方式。这里可以自行修改; - 注意:这次加载
logic
,会覆盖掉步骤A中加载的logic
逻辑;
- 样例中是内置
- D. 加载完
logic
后,才真正执行Boot的升级代码;- 所以,Boot的代码真正跑起来,使用的是自己的
logic
(而不是app_logic
);
- 所以,Boot的代码真正跑起来,使用的是自己的
- E. 如果有升级动作,则Boot会执行升级逻辑,升级完成后重启;
- F. 如果没有升级动作,则跳转到App去运行:
- 这个跳转动作,分为三步:
- 先释放掉Boot使用的全部资源,并切回内部时钟;
- 加载App的
logic
到CPLD到运行(该动作会再次覆盖Boot的CPLD逻辑); - 跳转到App入口,开始运行App程序。
- 这个跳转动作,分为三步:
- A. 芯片上电后,芯片内部ROM程序先装载
关于CPLD的运行区:
- 不管是
boot_logic
还是app_logic
,都是释放到“CPLD运行区”运行的。 - 而整颗芯片只有一个CPLD运行区。
- Boot的
logic
释放过去,芯片运行的就是Boot的logic
, - App的
logic
释放过去,芯片运行的就是App的logic
。 - 如果有两次释放,后释放的,会覆盖掉先释放的。
- 在上边流程里:
- A. 芯片上电后,内置ROM程序先释放
batch_bin
里的logic
(其实就是App的logic
);- 然后再跳转到Boot的程序。
- B. 进入Boot程序后,Boot首先释放自己的
logic
,覆盖掉App的logic
;- 然后再执行Boot自己的程序逻辑;
- C. Boot代码最后跳转到App时,Boot会再次释放App的
logic
,覆盖掉Boot的logic
;- 然后再程序跳转到App,开始运行App。
- A. 芯片上电后,内置ROM程序先释放
- 不管是
近端升级的样例逻辑
设备端有两段程序:
boot.bin
和app.bin
;boot
放置在0x80000000
的位置,(内置boot_logic.bin
)app
放置在约定好的位置0x80008000
(外置app_logic.bin
);- (如果不带Boot,App会被放置在起始的
0x80000000
位置)
- (如果不带Boot,App会被放置在起始的
设备启动后,先进入Boot;
- 在Boot中会等待几秒钟,等待PC的下发消息,
- 如果没有等到消息,则跳转到App运行;
- 如果有升级命令,则进入Boot升级流程;
Boot升级的过程,就是PC工具和Boot交互的过程;
- 过程中,Boot会一段一段接收bin的数据,并覆盖掉本地的
app.bin
;
- 过程中,Boot会一段一段接收bin的数据,并覆盖掉本地的
这个过程中,需要:
- 事先规划好
boot.bin
、app.bin
的存放位置,并制定好PC和Boot的交互协议; - Boot中需要实现:支持串口、实现与PC的协议交互、写数据到Flash;
- PC工具中需要做:实现跟设备端的协议交互;
以上是原理部分。充分理解原理后,可以针对以上原理开发Boot程序。
样例获取
从网盘中可以获取到基于407的近端升级的样例:
链接:https://pan.baidu.com/s/1wcBnqnray7bu4IURDIoDDQ?pwd=1205 里边的\其他文档\bootLoader相关\
下边,有全部的文档和例程。其中的Boot部分和PC工具,都是源码开放的。客户可以根据自己的实际情况来修改使用。
拓展
在调试Bootloader时,如果需要联调App,可以在VSCode的Console控制台里,使用如下命令加载App。加载后,就可以在执行完UTIL_JumpToAddress
进入App继续跟踪(先是一段汇编,然后进入App的main
)。
命令:
plaintext
add-symbol-file ./example_app_logicUncompress/.pio/build/debug/agm_example.elf
其中 add-symbol-file
是加载debug信息,后边跟App编译出来的.elf
文件。
正常情况下,跳转后如果App可以正常起来,就不用这么复杂了。【因为App直接就可以在VSCode跟踪,没必要通过Bootloader这层】