自定义完成boot loader
系统内boot loader与自定义boot loader区别
系统内的boot loader主要的功能是:
- 串口挂起,等待接收程序数据。
- 数据接收与解析:支持接收十六进制 HEX 文件,解析后提取原始二进制(BIN 格式)数据。
- Flash 写入:将解析后的二进制数据写入 Flash 对应存储区域
自定义 Boot Loader 简化:
自定义 Boot Loader 通常直接接收 BIN 文件,无需 HEX 解析步骤。
Flash 存储位置与冲突问题
1. 存储位置说明
- 系统内置 Boot Loader:存储在特殊地址
0x1FFF F000; - 自定义 Boot Loader:默认存储在 Flash 起始地址
0x0800 0000。
2. 程序覆盖冲突
自定义 Boot Loader 若直接存于 Flash 起始地址,串口接收新程序写入时,会覆盖原有 Boot Loader 程序,导致功能异常。
解决方法是flash分区:boot loader程序和application程序需要存放到不同的位置。也就是常说的AB区。B区一定要存放在flash的起始位置,A区要放在B区后,至于位置在哪根据bootloader程序大小划分(boot loader程序写好后点击.map文件查看total ROM size)
一般可以安排给boot loader比较大的空间来使用 16k A程序的地址就是0x0800 4000(16*1024转化为十六进制是4000)。
此时又有问题:这样编写时每一次复位单片机去执行哪个程序呢?
答:复位永远执行B程序。
那单片机永远执行不到APP程序了吗?
答:通过跳转方式 执行A程序,即便B程序和A程序的代码地址是完全连号的也不会执行A程序(因为main方法执行完了)。只能在B程序的main方法里有一个明确的跳转指向A程序的复位中断(A程序的flash的地址+4就是复位中断)。
