我们开发的产品在出厂后,由于产品功能增加,或修改bug等原因,需要升级产品的固件firmware,把最新的程序导入到存储器中。怎么把程序烧到flash?通常有三种情况,分别对应产品开发的三个阶段,分别是: (1)研发调试阶段,使用仿真器通过仿真接口把程序烧到flash (2)工厂生产阶段,生产人员通过工装软件,短接boot引脚, cpu上电后执行内部的rom等待程序从串口,can等外设传入。 (3)产品发货后,升级程序,不能拆外壳,不能拨码,只能想办法在线升级。
我们需要设计一段程序用来擦除旧的程序写新的程序。两种做法第一种是划分一段flash地址作为bootloader。第二种是借助外部的spi flash或eeprom等非易失性存储器,先将新的程序保存,然后运行一段ram升级程序,擦除片内的flash,拷贝新程序到片内flash就完成了程序升级。
1.设计bootloader
这种方案很常见,暂时不做详细的介绍。
2.无bootloader
该方案的优势是不会浪费宝贵的片内flash资源,但是需要借助外部的NVRAM。
第一步需要通过通信协议将bin文件写到NVRAM。
第二步需要设计一段在ram运行的update_ram()程序(需要关闭中断,以防程序发生不要预期)。
void update_ram()
{
//读取NVRAM的标志位,判断是否需要升级
if(NVRAM_read(&upFlagAdd) == 1)
{
//擦除片内flash
//从NVRAM拷贝数据到片内flash
//reset CPU
}
}