单片机Bootloader与App的Hex文件手动合并方法

本文介绍如何将Boot和App的Hex文件合并,适用于嵌入式软件的大批量生产。讲解了Hex文件的基本格式及合并方法,并提供了包含固定参数区的合并实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

对带有IAP的嵌入式软件,生产大批量加工时,研发需要提供Boot和App的合并Hex文件,这样才能加快生产进度。

Hex文件的简单说明

编译器编译出的HEX文件一般格式如下:
:020000040800F2 //烧录起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //数据
:10001000593B0008C9040008CD6900080000000031 //数据
:100020000000000000000000000000000D49000872 //数据
… //数据
:0488D00000000000A4 //数据
:04000005080001BD31 //线性地址记录
:00000001FF //结束

Boot和App的Hex合并说明

把Boot的最后一行去掉,再把App的所有文件复制到Boot后即可。具体如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot数据
:10001000593B0008C9040008CD6900080000000031 //Boot数据
:100020000000000000000000000000000D49000872 //Boot数据
…//Boot数据
:0488D00000000000A4 //Boot数据
:04000005080001BD31 //线性地址记录Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP数据
:10001000E7930108EB930108EF930108000000004B//APP数据
:10002000000000000000000000000000F3//APP数据
…//APP数据
:0C3B4000581698C821AC2D530800000056//APP数据
:04000005080101BD30//APP线性地址记录
:00000001FF//结束

多个app合并方法:

如果有两个APP,把Boot的最后一行去掉,去掉App1的Hex文件最后一行,再把App1文件复制到Boot后,然后把App2所有文件复制到刚刚合并的文件中。

boot+app+固定参数的合并方法

有时候需要在出厂程序固定地方写入特定的数据,这个时候除了boot和app的合并,需要加入固定参数区。比如,boot起始地址0x08000000,app起始地址0x08010000,特定参数1起始地址0x08073000,长度16字节,特定参数2起始地址0x08074000,特定数据长度128字节,则合并如下:
:020000040800F2 //boot起始地址
:10000000C8BD0620D10100085D3B0008DD350008B1 //Boot数据
:10001000593B0008C9040008CD6900080000000031 //Boot数据
:100020000000000000000000000000000D49000872 //Boot数据
…//Boot数据
:0488D00000000000A4 //Boot数据
:04000005080001BD31 //线性地址记录Boot
:020000040801F1//App起始地址
:1000000040BB0220A5EA0208E59301087F8A0308A5//APP数据
:10001000E7930108EB930108EF930108000000004B//APP数据
:10002000000000000000000000000000F3//APP数据
…//APP数据
:0C3B4000581698C821AC2D530800000056//APP数据
:04000005080101BD30//APP线性地址记录
:020000040807EB //地址0x08070000
:083000005627bd656c9f03001b//0x08073000地址区16字节特定数据
:10400000A4EF74000000FFFF504453535F54455326//0x08074000地址区特定数据
:10401000540000000000000000000000000000004C//0x08074000地址区特定数据
:104020000000000000000000434D4E455400000019//0x08074000地址区特定数据
:104030000000000000000000000000000000000080//0x08074000地址区特定数据
:104040000000000000000000736569626572747210//0x08074000地址区特定数据
:104050006F6E2E756269736F722E636F6D00000054//0x08074000地址区特定数据
:104060000000000000000000BB260000020001006C//0x08074000地址区特定数据
:10407000BBAAFFFF0000FFFFFFFFFFFFFFFFFFFFE7//0x08074000地址区特定数
:00000001FF//结束

Hex格式详解参考

第一个字节 表示本行数据的长度;

第二、三字节表示本行数据的起始地址;

第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。

‘00’ Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

‘01’ End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

‘02’ Extended Segment Address Record:用来标识扩展段地址的记录

‘03’ Start Segment Address Record:开始段地址记录

‘04’ Extended Linear Address Record:用来标识扩展线性地址的记录

‘05’ Start Linear Address Record:开始线性地址记录

然后是数据,最后一个字节 为校验和。

校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和

注意事项

1.合并文件时不要留有空格
2.注意Boot和App的起始地址
3.在hex文件里面添加参数域,要注意,比如写入0x080730000开始的16byte数据,写法如下:
:020000040807EB
:083000005627bd656c9f03001b
而不是
:023000040807XX
:080000005627bd656c9f0300XX

扩展知识

1.hex和bin文件只是格式不同,文件的有效data是完全一样的,因此网上有很多工具可以对两种文件进行自动转换。hex文件一般用于出厂设备生产批量烧录,出厂烧录时一般会把bootloader和app的hex合并后烧录,bin文件一般用于设备现场维护升级使用,升级使用只有app,因为bootloader一旦出厂几乎不能更改。

ST_LINK读取特定地址的数据:

打开软件:
1
显示如下:
1
连接电路板后,点击“1”,则界面3中会出现flash中的数据,在“2”中输入起始地址,大小和数据显示格式,界面“3”会从固定地址,特定格式显示flash内容,根据需要可以进行拷贝。
st_link跟电路板接线参考:https://blog.csdn.net/wxbluesun/article/details/94738272?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.nonecase

<think>好的,用户想了解如何修改单片机bootloader中的APP部分。我需要先理解他们的需求,然后结合提供的引用内容来组织答案。 首先,用户可能已经知道bootloader的基本概念,但需要具体操作步骤。根据引用[1],提到了设置程序偏移地址的方法,这可能涉及到链接器脚本或IDE中的配置。需要详细说明如何调整APP的起始地址,确保和bootloader不冲突。 然后,引用[3]提到复位时跳转到bootloaderAPP,这涉及到修改复位向量和中断向量表。这部分需要解释如何重新映射中断向量,可能需要在APP代码中设置新的向量表地址,并在编译时指定正确的偏移。 接下来,引用[4]讨论了一次性烧录bootloaderAPP方法,这可能涉及到将两个程序的hex文件合并。用户可能想在生产时直接烧录,所以需要指导如何生成合并后的文件,比如使用工具或脚本。 另外,用户可能需要了解如何配置编译环境,比如在MPLAB X IDE中设置地址偏移,如引用[1]所述。需要分步骤说明如何在IDE中修改配置,确保APP代码编译到正确的位置。 还需要考虑bootloaderAPP之间的通信机制,比如如何通过bootloader更新APP,但用户的问题主要是修改APP区域,所以可能重点在编译和烧录配置上。 最后,生成相关问题时要围绕bootloader配置、地址设置、中断处理、烧录方法等方面,帮助用户进一步深入。</think>### 如何修改单片机 BootloaderAPP 区域代码或配置 #### 1. **理解 Bootloader APP 的地址分配** - BootloaderAPP 程序在单片机的存储空间中需独立分配地址,通常 Bootloader 位于低地址区域(如 $0x0000$ 至 $0x1000$),APP 位于高地址区域(如 $0x1000$ 至 $0xFFFF$)[^1]。 - 在 IDE(如 MPLAB X)中,通过修改链接器脚本或项目配置,设置 APP 程序的起始地址,确保其不 Bootloader 地址重叠。 #### 2. **修改 APP 程序的编译配置** - **设置代码偏移地址**:在编译 APP 时,需指定程序入口地址为 Bootloader 预留空间后的起始位置。例如,若 Bootloader 占用 $0x0000$ 至 $0x1000$,则 APP 的入口地址应设为 $0x1000$[^1]。 - **调整中断向量表**:APP 需使用独立的中断向量表,通常需在代码中重新定义中断向量偏移寄存器(如 `SCB->VTOR`),使其指向 APP 的中断向量表地址[^3]。 #### 3. **生成可合并的烧录文件** - 将 BootloaderAPPHEX/BIN 文件合并为一个文件。可使用工具如 `srec_cat` 或自定义脚本,确保 BootloaderAPP 的地址段无重叠。 - 示例命令: ```bash srec_cat bootloader.hex -Intel app.hex -Intel -o combined.hex -Intel ``` - 合并后的文件可直接烧录到单片机中,无需分步操作[^4]。 #### 4. **实现 Bootloader APP 的跳转逻辑** - **复位跳转**:在 Bootloader 中,通过判断条件(如按键、标志位)决定跳转到 APP。跳转前需关闭中断,并设置栈指针为 APP 的初始值。 ```c void jump_to_app(uint32_t app_address) { typedef void (*app_entry)(void); app_entry app = (app_entry)(*(volatile uint32_t*)(app_address + 4)); __disable_irq(); SCB->VTOR = app_address; // 设置中断向量表偏移 __set_MSP(*(volatile uint32_t*)app_address); app(); } ``` - **APP 中的复位处理**:在 APP 的启动代码中,需确保中断向量表地址正确指向 APP 区域。 #### 5. **验证调试** - 使用调试器检查程序是否从正确地址执行。 - 验证中断是否正常触发(如定时器、UART 中断)。 - 通过串口或日志输出确认 Bootloader APP 的通信逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值