keil相关之:我为什么只要 hex
1. 前言
上次说了
怎么只生成 hex,现在说一下我为什么只要 hex。
先看看我的程序设计。
2. 我的程序布局
- bootloader + application;
- bootloader 存储在 flash,运行在 flash;
- application 存储在 flash,运行在 RAM。
- 上电执行 bootloader,由 bootloader 搬运 application 到 RAM 然后跳转;
限制条件:
- 在 keil 中编译完成后直接生成最终的烧写文件;
- 只能使用 keil 下载。
3. keil 工程设置及生成的 hex
3.1 bootloader

bootloader.hex:

3.2 application

application.hex:

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(lineboot.hex---> boot.bin + ====> prj.bin ---> prj.hexapp.hex ---> app.bin |
为什么需要将 bin 转回 hex?
因为 keil 不支持烧写 bin 文件!
文件之间的转换有点麻烦,尤其是在限制条件之下。需要借助第三方工具 srecord,还需要写 windows bat 文件。下次再说具体实现。

浙公网安备 33010602011771号