我们在开拓阶段,调试单片机时改换程序,一样平常是通过下载器(仿真器),把保存程序的Flash擦除,再重新编程。
那如果到了量产阶段,已经组装好成品了,或者已经到用户手上了,须要再次更新程序时,就没办法通过下载器去更新了。此时考虑通过外围的通信接口(UART/USB/SPI/I2C/CAN等)来实现升级。

如何掌握升级过程?
为了担保升级的可重复性和安全性,从Flash中划分一小块区域作为升级利用,我们称之为Boot程序,或者Bootloader。这个程序是浸染便是管理升级,判断是否须要升级,升级数据包的吸收及Flash编程,运用程序的跳转掌握,以及升级过程中的非常处理等。
运用程序保存在Flash中的另一区域,运用程序跟Boot程序是独立的。实现在线升级的条件条件是Boot程序与运用程序可以相互跳转,或者可以通过软件掌握复位后先实行哪个程序。
须要考虑的问题:
怎么进入Boot程序?
设置复位后加载Boot程序
判断是否须要升级?
比如某个IO口电平(按住一个升级按键)触发时,或者通信握手成功等等,条件知足,等待升级。当条件不知足时,跳转到运用程序运行。
数据包的吸收及Flash编程
根据数据协议分段吸收并写入到Flash,一定要担保传输的精确性及Flash操作的精确性,最好Flash编程后再次验证。如果传输有误(校验码不匹配)就须要申请重发。
运用程序的跳转
当不知足升级条件时,或者升级完成后,设置复位后加载运用程序,然后重启。
下面以8051内核N76E003芯片先容下通过串口进行在线升级。
1 Flash划分(共18KB)
LDROM: 划分4KB作为Boot程序(该芯片可划分1KB/2KB/3KB/4KB,比较灵巧),新唐把这部分Flash叫做LDROM
APROM: 划分14KB作为运用程序,新唐把这部分Flash叫做APROM
2 Boot程序与运用程序的切换
在运用程序中,将BS位置1,然后软件复位。复位后就从LDROM启动,加载Boot程序。
在Boot程序中,将BS位清0,然后软件复位。复位后就从APROM启动,加载运用程序。很大略。
3 升级数据包的吸收和APROM编程
数据传输这里我参考了下Xmodem文件传输协议,每次128字节有效负载,
末了一次传输不足128字节的,补0xFF。
再次解释下为什么参考Xmodem协议,由于N76E003的Flash将128字节作为1页,擦除是按页进行的。
串口吸收,采取中断办法,吸收完一包,如果校验成功,写入到Flash,并回答ACK,准备吸收下一包(如果有);如果校验失落败,回答NAK,向上位机申请重发。
4 非常处理
如果在升级过程中发生了非常,比如串口线脱落或者MCU掉电,怎么规复升级?
由于考虑到要获取掉电前的状态,因此升级状态须要保存在Flash中,在LDROM(4KB)的末了的128字节用于保存升级状态,共须要三种状态就可以了,默认值是0xFF(未编程)、升级失落败和升级完成。
在进入Boot程序时,先读取这个状态,如果不是升级完成,就等待上位机命令升级,如果已经是升级完成,等待一小段韶光,如果没有上位机升级命令,就切换到运用程序。
在升级过程中,升级状态始终为失落败,当数据包全部都精确写入到APROM后,升级状态修正为完成。
5 上位机软件
大略的选择串口,点击Connect,选择待升级的BIN文件,开始升级。由于我开拓的产品都是内置锂电池供电的,通过Micro-USB接口充电,恰好将串口旗子暗记引出到Micro-USB插座,外部通过TTL-USB转接线连接到PC。由于是内置电池,以是运用程序在吸收到升级命令后,再切换到Boot程序运行,进行升级。







