keil相关之:我为什么只要 hex

1. 前言

上次说了
怎么只生成 hex,现在说一下我为什么只要 hex。

先看看我的程序设计。

2. 我的程序布局

  1. bootloader + application;
  2. bootloader 存储在 flash,运行在 flash;
  3. application 存储在 flash,运行在 RAM。
  4. 上电执行 bootloader,由 bootloader 搬运 application 到 RAM 然后跳转;

限制条件:

  1. 在 keil 中编译完成后直接生成最终的烧写文件;
  2. 只能使用 keil 下载。

3. keil 工程设置及生成的 hex

3.1 bootloader

微信图片_2025-12-01_095451_318

 

bootloader.hex:

微信图片_2025-12-01_095522_492

3.2 application

微信图片_2025-12-01_095822_891

 

application.hex:

640

 

4. keil 下载 hex 

从上面的 hex 数据图片中可以看到,hex 文件包含了程序在 flash 中的起始地址。keil Download 时会先解析 hex 文件,得到程序数据及其在 flash 的存储地址,然后调用 flash 算法向 flash 中写入数据。

烧写 bootloader.hex 时会向 flash 的地址 0 写入数据。

烧写 application.hex 时会向 flash 的地址 0x20000000(0x2000 << 16) 写入数据。可是,0x20000000 是 RAM 地址不是 flash 地址

所以,application.hex 会烧写失败。

所以,需要先将两个 hex 转为地址无关的 bin 文件,然后将两个 bin 合并后再转回 hex:

1
2
3
4
ounter(lineounter(lineounter(line
boot.hex---> boot.bin                      
                       + ====> prj.bin ---> prj.hex
app.hex ---> app.bin

为什么需要将 bin 转回 hex?

因为 keil 不支持烧写 bin 文件!

 

文件之间的转换有点麻烦,尤其是在限制条件之下。需要借助第三方工具 srecord,还需要写 windows bat 文件。下次再说具体实现。

 

posted @ 2025-12-01 09:59  xyzjacky  阅读(0)  评论(0)    收藏  举报