了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader)
欢迎咨询或定制bootloader(在线升级程序)。
上一篇博文介绍的NXP S32K116 serial bootloader, 由于上位机不是专门的bootloader上位机,没有通信协议,没有应答机制,所以严格意义上讲,只能用于学习或研发阶段使用,是不可以用于量产产品上。一些客户看到我的博文,联系上我,说他们也有产品用到NXP 这款芯片,让我做一个可靠性高的,可以用于量产产品上的S32K116 bootloader。为了响应客户的要求,我重写Bootloader程序并命名为S32Boot_S32K116, 并用C#写了专门的上位机。上位机和S32Boot之间交互有了通信协议。上位机按照通信协议发送指令和数据,S32Boot接收到数据后,解析数据,完成烧写,成功则返回ACK (0x15), 出错则返回NACK (0x51)。通信协议的指令如下:
0x6F: HAND_SHAKE (握手,或叫更新请求)
0x02: WR_MEM (Flash 烧写)
0x03: ER_MEM (Flash 擦除)
0x04: VF_MEM (Flash 验证)
0x1F: RUN_APP (跳转到application)
S32K116板子启动后运行在S32Boot模式,S32Boot初始化完成后,开始数秒,1秒内收到更新请求就停留在S32Boot, ACK 应答。 超时就检查Appilcation的有效性,成功就跳转到Application,出错就重启。接收擦除指令,完成擦除,成功就ACK应答,否则NACK应答。接收烧写指令,完成烧写,成功就ACK应答,否则NACK应答。最后是跳转指令,成功就跳转到Application,否则就重启。
S32Boot和Application的Memory map 和上一篇博文《自己用C语言写NXP S32K116 serial bootloader》介绍的memory map 是一样,这里就不重复介绍。但是由于有专门上位机的原因,S32Boot_S32K116的实现方式和HyperBoot_S32K116有很大的不同。它的实现逻辑如上面所讲,就是接收指令及指令后面的数据,包括地址数据和BIN数据。然后执行指令。
今天主要想介绍我用C#写的专门的上位机,我为其取名为s32Loader,整个用户界面虽然不是很漂亮,但是很简洁。如下
s32Loader可以自动识别所有可用的串口端口,点击下拉框选择要用的端口,baud rate默认是19200,因为这是我的Uart Bootloader使用频率最高的baud rate, 也可以从下拉框中选择9600,38400, 115200等其他baud rate. 前提是要和Bootloader的baud rate保持一致。点击“浏览”选好要烧写的application hex 文件。最后点击“Start” 后,立马reset 硬件板,即可完成Application 的升级。有进度显示。100%完成后Log窗口会出现“Programming done"文字。