IoT Power PC 端技术总结 – 3 STM8的串口ISP升级

系列文章合集:IoT Power PC 端技术总结

IoT Power V1使用的是STM8作为主控,所以与PC的通信只能通过串口进行连接。同时芯片的固件升级也只能走串口,所以需要用到芯片内置的ISP功能来进行升级。

进入ISP模式的先决条件

芯片软件的准备

首先要想进入ISP模式,需要对两个地址写入指定的标记数据:OPTION地址487Eh = 0x55787Fh = 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,所以基本只会遇到S1S2开头的数据,格式如下:

类型后面数据的长度地址数据校验码
S1或S21字节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升级的整套流程

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注