系列文章合集:IoT Power PC 端技术总结
IoT Power V1使用的是STM8作为主控,所以与PC的通信只能通过串口进行连接。同时芯片的固件升级也只能走串口,所以需要用到芯片内置的ISP功能来进行升级。
进入ISP模式的先决条件
芯片软件的准备
首先要想进入ISP模式,需要对两个地址写入指定的标记数据:OPTION地址487Eh = 0x55
、787Fh = 0xAA
/*解锁Flash*/
do {
FLASH_DUKR = 0xAE;
FLASH_DUKR = 0x56;
}
while (!(FLASH_IAPSR & 0X08));
/*对选项字节进行写操作使能*/
FLASH_CR2 = 0X80;
/*互补控制寄存器*/
FLASH_NCR2 = 0X7F;
/*写入OPTION内容*/
*((unsigned char * ) 0x487E) = 0x55;
*((unsigned char * ) 0x487F) = 0xAA;
/*等待写结束*/
while (!(FLASH_IAPSR & 0x04));
代码可以在接收一个自己指定的命令后执行,提前配置好标志位。
接着需要通过RESET
引脚来使得STM8硬件重启。这里需要注意,必须通过硬件重启才能进入芯片内置的ISP Bootloader中,软件复位是无法进入的。
在IoT Power V1的硬件设计中,使用了串口的RTS与STM8的RESET引脚相连,从而可以手动硬件重启复位芯片。
固件数据解析
因为我们的固件使用的是s19
格式,需要手动解析成实际的二进制数据,所以这里PC端需要提前解析一下芯片的固件数据。
因为我们用的是STM8,所以基本只会遇到S1
和S2
开头的数据,格式如下:
类型 | 后面数据的长度 | 地址 | 数据 | 校验码 |
---|---|---|---|---|
S1或S2 | 1字节16进制数 | 地址(16位S1,24位S2) | 一堆数据 | 1字节校验和(除去Sx都加起来) |
按对应的格式,把实际的数据全部解析出来,就可以用来发给MCU了
ISP的通信
完整的通信协议可以直接查看ST官网上的文档:cd00201192-stm8-bootloader-stmicroelectronics.pdf
通信时可能会有的坑:你发的数据包会被错误分包,有时需要发送单字节来使得分包错位开,让MCU可以正确处理数据。听说这个bug只在早期isp固件中存在。
协议约定
串口波特率默认为115200,1开始位、1停止位、8数据位、Even偶校验
当设备返回0x79
(ACK)时,通常代表成功
当设备返回0x1F
(NACK)时,通常代表失败
或者错误
开机握手
当正确配置好ISP和硬件复位后,STM8开机后会等待一秒钟的时间,来读取握手指令,如果没有收到握手指令,则会直接正常运行代码。
握手指令是0x7F
,MCU收到后会自适应波特率,并返回一个0x79
注意这个不能多发,一旦收到0x79
后需要立刻停止发送流程,不然后续命令可能出错。
全片擦除
擦除命令是0x43
,按照指令格式,后面要跟上校验码0xBC
。
当芯片有返回后,发送要擦除的地址。因为我们这里是全片擦除,所以直接发FF 00
等待芯片返回结果,就擦除完成了
写入固件数据
- 发送
31 CE
开始写入数据,等待返回ACK - 发送4字节地址+异或校验码,指定要写入的地址,等待返回ACK
- 发送
7F
、要写入的数据长度-1(1字节)、这一包要写入的所有数据、异或校验码,等待返回ACK - 重复上述步骤,直至所有数据全部写入
这一步的坑主要在于,传输数据的哪个长度,文档中的定义是带写入数据的长度-1
,也就是说如果你要发5个字节,那你就要传0x04
到MCU
重启
直接发21 DE
等待返回后,再发你代码器动的地址,从用户代码器动即可
升级完成
以上就是STM8升级的整套流程