rong,
可以用串口进行在线升级。
首先是你要自己先一段bootloader程序放在一个特殊的扇区,这个扇区在升级的过程中是不能擦除的。
然后在用户程序中监视串口的命令,当接收到串口发送过来升级的指令的时候,就需要调到bootloader的入口,bootloader进行初始化,重新初始化系统时钟,串口等,然后回送应答给串口上位机,准备接收上位机发送过来的数据。因为升级数据很大,所以不可能一次接收完,一般是分次接收,当接收到一块数据后,就调用Flash API函数烧写到Flash中,烧写完后,回送应答给上位机,上位机再发送下一个数据块。当然,这个数据块需要包含地址信息,数据长度,数据,校验和。
最后烧写完成后,就可以重新跳到Flash的入口,0x3F7FF6。
在上位机你也要读hex文件,解析成一块块数据,发送给下位机。
这是大概的思路。
附件是2812的SCI boot Flash烧写的例子,跟在线升级不同的地方是,这个例程的bootloader是通过SCI boot 方式load到RAM中,然后再运行bootloader接收上位机数据,调用Flash API烧写。
Eric
- ERIC
rong,
可以用串口进行在线升级。
首先是你要自己先一段bootloader程序放在一个特殊的扇区,这个扇区在升级的过程中是不能擦除的。
然后在用户程序中监视串口的命令,当接收到串口发送过来升级的指令的时候,就需要调到bootloader的入口,bootloader进行初始化,重新初始化系统时钟,串口等,然后回送应答给串口上位机,准备接收上位机发送过来的数据。因为升级数据很大,所以不可能一次接收完,一般是分次接收,当接收到一块数据后,就调用Flash API函数烧写到Flash中,烧写完后,回送应答给上位机,上位机再发送下一个数据块。当然,这个数据块需要包含地址信息,数据长度,数据,校验和。
最后烧写完成后,就可以重新跳到Flash的入口,0x3F7FF6。
在上位机你也要读hex文件,解析成一块块数据,发送给下位机。
这是大概的思路。
附件是2812的SCI boot Flash烧写的例子,跟在线升级不同的地方是,这个例程的bootloader是通过SCI boot 方式load到RAM中,然后再运行bootloader接收上位机数据,调用Flash API烧写。
Eric
- ERIC
举报