1 简介
EFM8SB1 UART Bootloader是官方的引导程序,用于EFM8SB1系列微控制器。它可以通过UART接口将固件传输到EFM8SB1微控制器中进行更新或配置。
EFM8各型号及其支持的固件升级方式如下图所示:
2 原理
固件升级流程图如下:
3 协议解析
3.1 协议格式
EFM8SB1 UART Bootloader串口下发协议格式如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(nbyte) |
|---|---|---|---|
| 0x24(‘$’) | 总长-2 | 0x30-0x36(‘0’-‘6’) | data |
EFM8SB1 UART Bootloader串口应答协议格式如下:
| 应答(1byte) |
|---|
| 0x40-0x43(‘@’ ‘A’ ‘B’ ‘C’) |
3.2 命令解析
下发命令如下:
| 命令 | 值 | 说明 |
|---|---|---|
| BOOT_CMD_IDENT | 0x30(‘0’) | 识别命令 |
| BOOT_CMD_SETUP | 0x31(‘1’) | 设置参数 |
| BOOT_CMD_ERASE | 0x32(‘2’) | 擦写Flash(先擦后写) |
| BOOT_CMD_WRITE | 0x33(‘3’) | 写Flash |
| BOOT_CMD_VERIFY | 0x34(‘4’) | 校验Flash |
| BOOT_CMD_LOCK | 0x35(‘5’) | 加锁Flash |
| BOOT_CMD_RUNAPP | 0x36(‘6’) | 运行应用程序 |
注意:上述命令是根据官方Bootloader的demo定义的,实际使用有所差异,如0x30和0x35命令在实际升级过程中并没有使用。
应答命令如下:
| 应答 | 值 | 说明 |
|---|---|---|
| BOOT_ACK_REPLY | 0x40(‘@’) | 回复命令 |
| BOOT_ERR_RANGE | 0x41(‘A’) | 地址范围错误 |
| BOOT_ERR_BADID | 0x42(‘B’) | ID错误 |
| BOOT_ERR_CRC | 0x43(‘C’) | 校验错误 |
3.2 数据传输
数据传输过程如下: 1. 主机发送设置参数命令0x31,设置Flash参数
命令下发如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(3byte) |
|---|---|---|---|
| 0x24 | 0x04 | 0x31 | flash keys(2byte,大端模式) + flash bank(1byte) |
如:24 04 31 a5 f1 00 根据EFM8SB1参考手册,flash key code就是 0xa5f1。
应答如下:
| 应答(1byte) |
|---|
| 0x40(‘@’) |
2. 主机发送写Flash命令0x32/0x33,传输数据
命令下发如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(nbyte) |
|---|---|---|---|
| 0x24 | 0x83 | 0x32/0x33 | flash地址(2byte,大端模式) + 新固件数据(128byte) |
注: 1.无论是0x32还是0x33命令,都是传输128byte的固件数据,但区别在于0x32命令需要先擦除对应区域的Flash,再写数据;0x33命令则不需要擦除直接写入。按照EFM8的内存分布,一个扇区是512byte,也就是说,每4条命令中,第1条命令是0x32,其余的3条命令都是0x33。 2.新固件第一帧第一个字节为0xFF,而非实际值,后续数据字节为实际值。若新固件传输异常中断,需重新传输时,因为首字节为0xFF,因此MCU启动时会自动跳转到Bootloader,而不会跳转到应用程序。
应答如下:
| 应答(1byte) |
|---|
| 成功:0x40(‘@’),地址错误:0x41(‘A’) |
3. 主机发送校验Flash命令0x34,校验数据
命令下发如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(nbyte) |
|---|---|---|---|
| 0x24 | 0x07 | 0x34 | flash起始地址(2byte,大端模式) + flash大小(2byte,大端模式) + 校验数据(2byte,大端模式) |
应答如下:
| 应答(1byte) |
|---|
| 成功:0x40(‘@’),校验错误:0x43(‘C’) |
4. 主机发送写Flash命令0x33,传输数据
命令下发如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(nbyte) |
|---|---|---|---|
| 0x24 | 0x04 | 0x33 | flash地址(2byte,大端模式) + 新固件首字节(1byte) |
应答如下:
| 应答(1byte) |
|---|
| 成功:0x40(‘@’),地址错误:0x41(‘A’) |
注:该命令和前面第2步命令相同,区别在于前面传输的固件首字节为0xFF,而该命令传输的固件首字节为实际值。
应答如下:
| 应答(1byte) |
|---|
| 0x40(‘@’) |
5. 主机发送运行应用程序命令0x36,重启MCU
命令下发如下:
| 帧头(1byte) | 长度(1byte) | 命令(1byte) | 数据(0byte) |
|---|---|---|---|
| 0x24 | 0x03 | 0x36 | 0x00 0x00 |
应答如下:
| 应答(1byte) |
|---|
| 0x40(‘@’) |
4 结束语更多内容,可参考官方文档:AN945: EFM8 Factory Bootloader User’s Guide
331