华大HC32L系列运行中FLASH热擦除
实现运行中自己擦除自己
目前很多项目实现都要支持MCU级别的OTA,通过各种通讯途径从OTA Server拿到版本后并最终要烧写到运行区域并用新版本启动系统。由于华大的擦除程序必须从Flash开头区域运行(小于Flash偏移0x8000,部分型号略有差异),一般会通过放置在头部的Loader来实现这个。但是当容量受限,本身APP空间已经不够的情况下Loader可能就会被拿掉,此时只有一个单一APP IMAGE运行并且需要实现自身擦除自身。或者当Loader也需要升级时,就要考虑怎么升级擦除自己。以下实现在HD32L190系列上已经成功实现并部署,可供参考。该编译环境用的是Keil,如果采用别的开发环境需要适当调整链接脚本语法格式,原理相同。
1)预留Secure区域
修改Link Scripts为Flash擦除程序预留一个Secure Section空间,所有存在这个区域的代码将不被擦除,因此通常这里只存放不变的Flash操作驱动代码。以下示例只保留了4KB用于Secure空间,实测够了,如果还想塞入更多的代码可以适当放大,当空间溢出后,编译链接过程会检测到并报错的。
LR_IROM1 0x00000000 0x0001000 {
; load region size_region
ER_IROM1 0x00000000 0x00001000 {
; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
}
RW_IRAM1 0x20000000 0x00008000 {
; RW data
.ANY (+RW +ZI)
}
}
LR_IROM2 0x00001000 0x00001000 {
ER_IROM2 0x00001000 0x00001000 {
*.o (SECURECODE)
}
}
LR_IROM3 0x0