OpenBLT移植教程
要实现Bootloader远程升级的功能,需要明白该功能的实现分为三个部分:
1.上位机:用于将要烧写的程序传输给mcu;
2.mcu的bootloader分区:用于接收上位机发送的程序数据;
3.mcu的application分区:判断接收到的数据是否为程序升级相关,并跳转到bootloader;
OpenBLT作为一款开源的MCU Bootloader,其开源的代码和工具也包含这三个内容。将其理解就能够正确使用了。
1. 文件结构
下载开源文件后打开,可以看到其文件夹内容如下:
Doc:使用手册等参考文件。
Host:上位机相关工具和源代码。
Target:mcu代码,包含了boot分区和app分区的代码。
Host的上位机可以直接使用,我们不过多讲解。我们主要讲解Target的MCU相关内容。
1.1. Target的文件夹解构如下:
Demo:是针对各个mcu的工程模板,均已经完成编译,可以直接使用。
Source:为主要实现软件功能的源码,也根据不同的mcu进行了分类。
2. 代码工程结构
其代码设计为了考虑移植性和低耦合采用了以下的结构(即Target中针对MCU的代码)。
分为了四个部分:
层级 | 功能描述 | 移植关注点 |
---|---|---|
Application Specific | 应用配置层 | 修改配置以适应特定OTA需求 |
Target Independent | 业务逻辑层 | 实现核心Bootloader逻辑,不依赖具体MCU |
Target Dependent | 硬件抽象层 | 对接MCU底层硬件,需要针对平台适配 |
Compiler Specific | 编译器适配层 | 处理不同编译器的差异 |
根据这个四个部分完成移植。
3. 移植教程
3.1. Boot移植教程
我们以stm32f1系列的mcu型号,以及Keil的开发背景,打开Demo中的一个Boot工程(Demo中的工程模板分为Prog和Boot,Prog为App程序)。查看其文件夹包含设置。如图:
其中lib下的文件为CMSIS和HAL库相关的代码,与OpenBLT不相关,忽略。剩下Boot下的文件和Source下的四个文件包含,也对应了章节2的四个部分。我们接下去就根据章节2的四个部分进行移植。
3.1.1. Application Specific层
- 位置:
Target/Demo/ARMCM3_STM32F1_Nucleo_F103RB_Keil/Boot
- 内容:配置文件和应用特定实现
移植文件中的c/h文件即可
3.1.2. Target Independent层:
- 位置:Target/Source
- 内容:核心业务逻辑实现
该部分对应的是文件夹下的C和H文件,其子文件夹是为Target Dependent和Compiler Specific相关的代码。
3.1.3. Target Dependent层:
- 位置:Target/Source/ARMCM3_STM32F1
- 内容:STM32F1系列硬件抽象实现
3.1.4. Compiler Specific层:
- 位置:Target/Source/ARMCM3_STM32F1/Keil
- 内容:Keil编译器特定适配
以上,我们的文件就添加完毕了。
3.1.5. 软件编译
完成3.1.的操作后,还不能通过keil的程序编译。编译后会报错,报错分为3个部分。
1.error: #20: identifier "tFlashSector" is undefined,我参考了官方的文件工程,发现报错的文件flash_layout.c在工程中是被屏蔽的,不进行工程的编译。
同样将该文件在我们的工程中屏蔽即可。
2.error: #20: identifier "CAN_HandleTypeDef" is undefined,等关于一些通讯的变量未声明。
因为openblt的demo中已经完成了串口和CAN进行的bootloader升级,故移植之前需要在cubemax勾选CAN以及串口的功能。
3.error: #20: identifier "LL_RCC_ClocksTypeDef" is undefined,LL库等变量未声明。
demo中的中间层主要是以LL库来进行对接编写的,在cubemax勾选功能后还要设置该功能使用LL库,方可在后续工程中应用。
可以在cubemax的Project management 的advanced settings中可以选择底层库使用HAL还是LL。
其实关于2和3的报错警告是关于底层的链接的,demo中以及按他的方式以LL库的方式实现好了,若是有自己的需求可以根据自己的需求变更target dependent层来重新编写底层的与mcu的对接实现。
解决报错后,就能够正常通过编译了。
3.2. App移植教程
同样打开一个Demo的Prog工程,查看其文件包含,结构如下:
同样的,lib文件下的是CMSIS和HAL库相关的代码,不必理会。即剩下了Prog下面的代码了。
其中boot.c和boot.h文件为核心实现,用于实现从App跳转到Boot的逻辑。根据需要修改和移植到自己的工程软件即可。