Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Bootloader
qboot
制作极简版bootloader
发布于 2020-08-03 20:51:24 浏览:8341
订阅该版
[tocm] # 使用QBoot组件制作极简版Bootloader ## 1. 写在开始之前 #### 今天接到一个新项目,当拿到板子和原理图,我傻了! #### 嗯??? 调试串口呢??? 运行指示灯呢??? #### 什么!!! 怎么没有debug串口!!! 怎么连运行指示灯都没有啊!!! #### 悲催啊!!! 这让我怎么调试啊!!! #### 板子设计已然这样了,没办法!就这么干吧! #### MCU使用的是stm32l431rc,flash尺寸256k,ram尺寸48k,没有外部flash。 #### 既然没有串口、没有指示灯,flash又这么小,那干脆做一版极简版的bootloader试试吧! #### 开始动手... ## 2. 创建极简工程 ### 2.1 基于芯片创建工程 #### 使用RT-Thread Studio基于芯片创建工程,配置如下: ![QBoot_mini_tu01.jpg](/uploads/20200803/d2aa49802e87029fd46154397b7acb17.jpg) #### 点击完成!等待Studio生成工程... ### 2.2 裁剪工程到极简 #### 在生成工程中,打开`RT-Thread Settings`,在Settings页面点击 `更多配置` 进入详细配置界面。在内核配置页面,取消所有打勾项,如下图所示: ![QBoot_mini_tu02.jpg](/uploads/20200803/887303e16381727e281cbec6079c196e.jpg) #### 修改 `内核设备对象` 项如下图所示: ![QBoot_mini_tu03.jpg](/uploads/20200803/55cd83677e9a27b96c01b7f9fd1c18eb.jpg) #### 切换到`组件`配置页面,取消`shell`,如下图所示: ![QBoot_mini_tu04.jpg](/uploads/20200803/ca06e035143e866d019566dfa5851f73.jpg) #### 取消`设备驱动程序`中的`使用UART设备驱动程序`项和`使用设备IPC`项,仅保留`使用PIN设备驱动程序`项,如下图所示: ![QBoot_mini_tu05.jpg](/uploads/20200803/176038a3ca4b998a4cc89cc8f2c980e4.jpg) #### 保存工程,完成配置保存。 #### 进入`构建配置`界面,修改`优化选项`为`尺寸优化`,点`应用并关闭`保存修改,如图: ![QBoot_mini_tu06.jpg](/uploads/20200803/3364ece13087c54f62a6bba92d54fca7.jpg) #### 编译工程,无错误,完成极简工程创建。flash使用13.15k,ram使用3.20k。 ![QBoot_mini_tu07.jpg](/uploads/20200803/db1db0ea24266403fdeafca8fa9d4102.jpg) ### 2.3 加入必备组件 #### 加入fal组件,打开软件包中心,搜索fal,将fal组件加入工程,保存工程,完成组件下载和安装。 ![QBoot_mini_tu08.jpg](/uploads/20200803/e2ca5dce5a9820ad1a4ac458ebc18007.jpg) #### 在工程的`driver`文件夹下创建文件夹`ports`,如图: ![QBoot_mini_tu09.jpg](/uploads/20200803/b6c46177344ad84f4f0ed39e972f2d86.jpg) #### 在`ports`文件夹下,加入文件`fal_cfg.h`,代码如下: ```c #ifndef _FAL_CFG_H_ #define _FAL_CFG_H_ #include
#include
#define RT_APP_PART_ADDR (0x08000000 + 32*1024)//app partition begin address #define NOR_FLASH_DEV_NAME FAL_USING_NOR_FLASH_DEV_NAME//"norflash0" /* ===================== Flash device Configuration ========================= */ extern const struct fal_flash_dev stm32_onchip_flash; //extern struct fal_flash_dev nor_flash0; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32_onchip_flash, \ /*&nor_flash0,*/ \ } /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table */ #define FAL_PART_TABLE \ { \ /*{FAL_PART_MAGIC_WORD, "bl", "onchip_flash", 0, 32*1024, 0},*/ \ {FAL_PART_MAGIC_WORD, "app", "onchip_flash", 32*1024, 128*1024, 0}, \ /*{FAL_PART_MAGIC_WORD, "factory", "onchip_flash", 160*1024, 92*1024, 0},*/ \ {FAL_PART_MAGIC_WORD, "download", "onchip_flash", 160*1024, 92*1024, 0}, \ /*{FAL_PART_MAGIC_WORD, "param", "onchip_flash", 252*1024, 4*1024, 0},*/ \ /*{FAL_PART_MAGIC_WORD, "filesys", NOR_FLASH_DEV_NAME, 0, 8*1024*1024, 0},*/ \ } #endif /* FAL_PART_HAS_TABLE_CFG */ #endif /* _FAL_CFG_H_ */ ``` #### 在`ports`文件夹下,加入文件`drv_fal_init.c`,代码如下: ```c #include
#ifdef PKG_USING_FAL #include
extern int fal_init(void); INIT_COMPONENT_EXPORT(fal_init); #endif ``` #### 修改`board.h`,将以下代码: ```c #define ROM_START ((uint32_t)0x08000000) #define ROM_SIZE (256) #define ROM_END ((uint32_t)(ROM_START + ROM_SIZE * 1024)) #define RAM_START (0x20000000) #define RAM_SIZE (48) #define RAM_END (RAM_START + RAM_SIZE * 1024) ``` #### 修改为 ```c #define ROM_START ((uint32_t)0x08000000) #define ROM_SIZE (256 * 1024) #define ROM_END ((uint32_t)(ROM_START + ROM_SIZE)) #define RAM_START (0x20000000) #define RAM_SIZE (48 * 1024) #define RAM_END (RAM_START + RAM_SIZE) ``` #### 去掉`BSP_USING_ON_CHIP_FLASH`的注释,打开芯片flash驱动 ```c /*#define BSP_USING_ON_CHIP_FLASH*/ ``` #### 修改为 ```c #define BSP_USING_ON_CHIP_FLASH ``` #### 修改main.c,删除main函数内的所有代码,仅保留`return RT_EOK;` ```c int main(void) { return RT_EOK; } ``` #### 打开构建配置,向编译配置的`includes`中加入目录`drivers/ports` ![QBoot_mini_tu10.jpg](/uploads/20200803/620a81611a46b99b0e9acd39934d565d.jpg) #### 保存、编译工程,无错误,添加fal组件完成。编译生成代码,flash使用14.67k,ram使用3.25k。 ![QBoot_mini_tu11.jpg](/uploads/20200803/f220b66f28bf92040039c3e1faa8554d.jpg) ## 3. 加入QBoot组件 #### 打开软件包中心,搜索`qboot组件`,添加`qboot组件`到工程,关闭软件包中心。 ![QBoot_mini_tu12.jpg](/uploads/20200803/a471c425c01f24b5c9df7c3dc6ebbe20.jpg) #### 配置`qboot组件`,双击qboot组件,进入组件详细配置页面,取消所有打勾项,仅保留`using quicklz decompress`项,如图所示: ![QBoot_mini_tu13.jpg](/uploads/20200803/987a8337c0ae594e42a6036cb3cdcd56.jpg) #### 保存配置,完成qboot组件添加。 #### 说明:因为没有debug串口、没有状态指示灯,所以shell和打印输出相关的功能都用不上,所以统统去掉了。为什么仅保留quicklz解压呢?因为AES解密功能的flash使用比较多,所以未使用;gzip解压功能使用flash软多,不适用于资源较小的MCU,所以未选用;fastlz的资源使用与quicklz差不多,但其压缩率没有quicklz好,所以最终使用了quicklz解压功能;不用解压功能岂不是更省资源吗?为什么还要用quicklz呢?因为quicklz使用flash很少,不足1k,而使用了压缩后download区就可节省出1/4的空间(因为quicklz的压缩率在70~75%左右),比如app分区是128k,那么download分区就可以减少到96k,由此可见使用压缩还是很划算的。QBoot各功能资源使用情况详见:[qboot各项配置资源占用情况说明](https://gitee.com/qiyongzhong0/rt-thread-qboot/blob/master/doc/QBoot%E5%90%84%E9%A1%B9%E9%85%8D%E7%BD%AE%E8%B5%84%E6%BA%90%E5%8D%A0%E7%94%A8%E6%83%85%E5%86%B5%E8%AF%B4%E6%98%8E.md) #### 编译工程,无错误,极简版bootloader制作完成。flash使用17.95k,ram使用12.35k。 ![QBoot_mini_tu14.jpg](/uploads/20200803/7585a3f86d6e01b00cf598307e248760.jpg) ## 4. 测试验证 #### 烧入刚制作完成的bootloader到0x08000000处,再烧入app到0x08000800处。重新上电,app可以运行,说明bootloader可正常跳转到app执行。 #### 修改app版本,然后将新的app打包为rbl固件包,将生成的固件包扩展名改为.bin,使用烧写工具将扩展名为bin的固件包写入download分区地址0x08028000处。重新上电运行。 #### 使用仿真器查看app分区程序版本号,已变成修改后的版本号,说明bootloader释放download分区固件到app分区功能正常。 ## 5. 加入未来支持 #### 极简版bootloader虽然可用,但调试起来太不方便了;经与硬件设计人员沟通确定,下一版本将加上debug串口和运行指示灯,所以现在在极简版的基础上,加入log输出和运行指示功能。为方便调试,自己飞线引出了debug串口。 #### 进入内核配置页,加入控制台功能,如图: ![QBoot_mini_tu15.jpg](/uploads/20200803/1e2de5a310357fdc206d6d2430f84ed4.jpg) #### 切换到组件配置页,加入UART设备驱动,如图: ![QBoot_mini_tu16.jpg](/uploads/20200803/1d8730048a7f0ee9b78d1ef713be52ec.jpg) #### 进入qboot配置页,加入状态指示灯功能和syswatch组件(可能是强迫症犯了,总感觉不保险,所以加了syswatch),如图: ![QBoot_mini_tu17.jpg](/uploads/20200803/56f832abec9f0f625b800e23db0f5d6f.jpg) #### 保存、编译,flash使用28.90k,ram使用13.09k。 ![QBoot_mini_tu18.jpg](/uploads/20200803/4558ac7e1c6a219e91adb681b248610d.jpg) #### 下载运行,哇!终于又能看到log了... ![QBoot_mini_tu19.jpg](/uploads/20200803/d9c42e6031d938b20b57d886b067251b.jpg) #### 通过ymodem下载固件包到download,bootloader可正常释放固件到app ![QBoot_mini_tu20.jpg](/uploads/20200803/00dcda271b6abc4d0dcbbdc74a6a2953.jpg) ## 6. 总结:通过极简版bootloader的制作可见,基于RT-Thread V4.0通过裁剪也可以制作出尺寸较小的bootloader,最小尺寸不足20k,如果加入log输出和syswatch,尺寸不足32k,能够满足大多数小资源MCU的使用;而且通过RT-Thread V4.0制作bootloader比较简单和容易。
28
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
红枫
这家伙很懒,什么也没写!
文章
6
回答
597
被采纳
133
关注TA
发私信
相关文章
1
Linux下通过USBTinyISP为Arduino开发板烧?写Bootloader
2
请教修改NVIC后RTT调度函数失效的问题[已解决 bootloader中打开了不必要的中断]
3
进入bootloader的方式探讨
4
求助:IAP里的APP使用的RTT,跳转后出错。[已解决]
5
有没有人在STM32F103上用UART IAP跑过RT-Thread?
6
想做网口的IAP远程升级,不知可不可行
7
IAP问题
8
[已解决]请教基于RTT的IAP程序切换到应用程序不成功的问题(基于STM32F4)?
9
stm32f4xx-----IAP移植APP程序需要注意的地方
10
在调试IAP网络升级遇到跳转之后bootloader程序网络不通
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
20
个答案
2
次被采纳
张世争
11
个答案
2
次被采纳
rv666
9
个答案
2
次被采纳
用户名由3_15位
13
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
RTT_逍遥
1
篇文章
6
次点赞
大龄码农
1
篇文章
5
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部