TMS320F28335二次bootloader在线IAP升级
F28335总共ABCDEFGH个区域,每个32K*16bits,即64K字节。
bootloader代码占用A区,地址0x338000~0x33FF7F,cmd文件中SECTIONS部分,需要添加Flash28_API相关信息,具体下载Flash28335_API_V210的demo,参考里面的cmd文件。另外就是添加头文件,库文件,添加MemCopy等。
关键部分:
1. bootloader的cmd文件中,Flash28_API的LOAD=FLASHA,ramfuncs的LOAD=FLASHA,即都选择A区和bootloader代码一起,节省分区。
2. BEGIN的origin=0x33FFF6, length=0x000002
应用APP代码占用C区和D区,使用G区和H区作为升级临时备份区域。同样cmd文件中添加Flash28_API相关信息。另外就是添加头文件,库文件,添加MemCopy等。
关键部分:
1. APP的cmd文件中,Flash28_API的LOAD=FLASHD,ramfuncs的LOAD=FLASHD,即都选择D区。千万不要和bootloader中选择同样的A区,这样会覆盖,另外如果用到中断服务函数,会导致存储在FLASA中的Flash_API代码不一致。即bootload和APP不能共用Flash28_API和ramfuncs一个区域。
2. BEGIN的origin=0x320000,length=0x000002,即实际物理C区的起始地址,同时修改FLASHD的origin=0x320010,length=0x00F000(这个可以长一点,不超过C区范围即可)。
最后E区保留,作为数学库的区域。另外在H区的最后1K空间,用来保存是否升级标识。
总体逻辑如下:
1. 上电,从地址0x33FFF6进入厂家的boot,厂家的boot进入我们自己的bootloader。
2. 在自己的bootloader中读取H区最后1K空间是否存在升级标识。
3. 如果不存在,跳转到0x320000(D区),使用asm(" LB 0x320000");命令。
4. 如果存在,拷贝G区,H区数据覆盖C区、D区。然后再跳转到0x320000。
5. 进入APP后,读取H区最后1K空间是否存在升级标识,如果存在,就擦除G、H区。