目录
一、引言
二、STM8的Bootloader介绍
三、Bootloader激活流程图
四、CAN设置
五、Bootloader命令集
5.1 Get指令
5.2 Read存储器命令
5.3 Erase存储器命令
5.4 Write存储器命令
5.5 Speed命令
5.6 Go命令
六、运行时间
七、引用
STM8自嵌了bootloader代码段,我们只要编写上位机(host)程序和芯片的bootloader程序交互,就可以实现对板级STM8 MCU引导程序的升级,如果该MCU电路板的CAN总线连接或跨接了TBOX,通过TBOX无线下载该MCU待升级的引导程序到上位机host,host再通过bootloader升级MCU器件引导程序,那便可以理解为FOTA了,是新能源车上OTA较普遍解决方案。这里介绍一下STM8利用CAN协议实现bootloader的方案流程。
以下如无特别说明,bootloader都指芯片侧的代码或进程。
器件芯片侧的bootloader的主要任务是上位机借助STM8器件芯片的集成外设(UARTs,SPI, I2C或CAN)下载应用程序到芯片内部存储器中,该存储区可以是RAM/FLASH/EEPROM其中之一,芯片侧的bootloader代码存储在内部boot ROM存储器中,芯片复位后,bootloader代码会检查程序存储器是否空白或者是否相应特殊配置字节被设置,以允许代码被修改。如果以上条件不满足,bootloader会被跳过继续执行用户程序。不是所有芯片都自嵌入了bootloader代码,目前STM8S和AF系列带bootloader代码的如下:
STM8S和AF系列带bootloader代码清单一旦满足了bootloader的条件,bootloader进程就会开始,轮询所有支持的串口检测那个外设可用,然后从上位机host接收编程代码,数据,配置字节和/或矢量表等,一切按令行事。
STM8硬件复位向量位于boot ROM(0x00 6000)的起始位置,其他中断向量位于起始于0x00 8004的Flash程序内存起始位置。
选定器件的bootloader版本号可以通过"Get command"来从芯片中读取到,bootloader的版本由两位BCD编码为一个字节,比如0x22代表v2.2版本,bootloader版本和bootloader激活流程图是对应的,STM8S和STM8AF的当前的bootloader版本号如下表:
bootloader版本和bootloader激活流程图必须是对应的下面流程图中虚线部分的进程(EM/WM Erase/Write子程序)是上位机装载到RAM中,他们在程序跳到Flash程序存储器中执行应用程序之前由Go command清除掉。
根据地址0x8000中的内容可以判断Flash存储器是否为virgin,如果[0x8000] ==0x82 or 0xAC,那么Flash就不是空(virgin)的,已经写过程序。
接下来,我们就解读上面“激活流程图”是如何一步一步执行的:
1st:关闭所有中断
2nd:bootloader开始条件(如下表:bootloader开始三条件)
bootloader开始条件([BL_OPT]=0xFF00 STM8S208xx)条件1:上位机(host)通过检查地址0x008000的内容判断器件存储器是否为空,如果不等于0x82或0xAC说明是空的,bootloader保持激活状态,在不超时的范围内等待上位机命令。
条件2:上位机(host)检查bootloader的option bytes地址对应的两个字节[BL_OPT]是否被提前设置为允许bootloader的内容,如果值为0xFF00 (STM8S208xx)就使能了bootloader,bootloader激活并等待上位机命令,如果在1s的超时时间内没有等到上位机命令,则直接跳转到0x8000执行应用程序。
STM8S208xx Bootloader Option bytes条件3:如果option bytes不等于0xFF00,即[BL_OPT]=[0x487E,0x487F]不等于0xFF00,则程序内存是ROP读保护的,bootloader是被禁止的,则bootloader进程直接跳转到0x008000执行应用程序用户向量。
3rd:即上面的条件3,即便ROP也可以继续bootloader,这里不在赘述。
4th:如有外部时钟(8MHz,16MHz,或24MHz)的话,CAN才可以用,初始化为125Kbit/s,有6ms的时间等待外部晶振稳定下来。
5th:非CAN通讯的外设配置,本例只介绍CAN通讯,这一步可以忽略。
6th:接口轮询:在超时时限1s之内bootloader轮询所有可能的外设等待一个同步字节(SYNCHR=0x7F),如果超时了,如果程序内存是空(virgin)的,则软件复位回到ROM reset(0x6000)重复以上步骤,如果非空,则恢复寄存器的复位状态并跳转到0x008000复位向量执行。
7th:如果CAN接收到同步信息,关闭CAN之外的其他通讯外设,bootloader直接执行到下一步。
8th:等待命令:命令在一个无限循环里检查执行,想退出bootloader,上位机(host)必须发送一个‘Go’命令,如果这一步实施了,bootloader删除RAM存储器中的EM和WM例程,并跳转到host指定的地址。
附注:为了写或擦除Flash和EEPROM中的数据,上位机host写入RAM可执行的写或擦除例程,这些例程(*.s19 files)由bootloader提供,上位机host提前上载这些例程到RAM的地址0xA0就行。
不是所有STM8器件都支持CAN Bootloader的,在器件选型时要留意这一点,器件本身也在更新迭代,采买应用时要咨询好器件的供货方。
STM8支持bootloader外设串口表为了访问总线上的其他器件,CAN协议提供标准ID(11Bit)和可选扩展ID(18Bit)帧,下图是一个标准帧的示意图。
11位ID的标准帧Bootloader CAN设置如下:
发送设置(从STM8器件到上位机host):
接收设置(从上位机host到STM8器件):
输入报文可以包含1到8个字节。
CAN外设可以通过CAN_TX和CAN_RX管脚访问,设置如下:
下表是Bootloader支持的命令:
Bootloader命令集 | ||
---|---|---|
命令 | 命令代码 |
命令描述 |
Get | 0x00 | 得到bootloader版本以及当前版本支持的允许命令 |
Read memory | 0x11 | 可以读由host指定地址开始的最大256个字节存储内容 |
Erase memory |
0x43 | 擦除Flash或EEPROM指定数目或所有扇区 |
Write memory |
0x31 | 可以写由host指定地址开始的最大128个字节到RAM/Flash/EEPROM存储器中。 |
Speed | 0x03 | 改变CAN的收发波特率 |
Go | 0x21 | 跳到host指定地址或装载好的代码执行 |
下表是Bootloader编码表:
名称 | 编码 | 编码描述 |
SYNCH | 0x7F | 同步字节 |
ACK | 0x79 | 确认 |
NACK | 0x1F | 否确认 |
BUSY | 0xAA | 忙标签状态 |
当bootloader通过CAN接收一个命令时,通常会做如下处理:
Get指令允许host得到bootloader版本以及器件所支持的命令。当器件bootloader接收到host的Get命令时,器件发送bootloader版本以及支持的命令编码给上位机host。
Get命令:上位机host发送如下信息:
STM8器件接收到host的Get命令信息之后,接连发送以下信息:
Read命令可以读取RAM,Flash程序,数据EEPROM或寄存器,当bootloader接收到Read命令后,从接收到的地址拿取数据(N+1字节)给上位机host。
Read命令:host发送如下信息
STM器件发送以下信息:
擦除存储器命令允许上位机host擦除Flash程序存储器和数据EEPROM中的sector区。
如果上位机host发送了0x43的ID,bootloader接收到该ID擦除命令后,将该ID数据域包含的扇区sectors统统擦掉。一个扇区1Kbyte,擦除命令的单位是8个blocks(每个block含128byte)。如果想擦除一个字节,使用write指令写入0x00即可。
Erase存储器命令描述(待擦除扇区数及这些扇区的编号):
Erase命令:host发送如下信息(两种擦除方式):
要提醒的是用户在发送擦除存储区扇区或写字节命令之前,要事先下载擦除或写例程到0xA0开始RAM中。例程命名如:E_W_ROUTINEs_128K_ver_2.2.s19 (STM8AF/STM8S)。
bootloader的过程中,除了下载erase/write例程外,对于下面RAM区域不要使用write命令:
Write存储器命令允许上位机host将数据写入任何存储器地址,在host决定写入那个存储器中之前,读入的数据总是先写入RAM中,Write命令最大数据长度为128bytes,有下面两种操作方式:
Write命令:上位机host发送以下信息:
备注:
再次提醒,用户在发送擦除存储区扇区sector或写字节word或block命令之前,要事先下载擦除或写例程到0xA0开始的RAM中。例程命名如:E_W_ROUTINEs_128K_ver_2.2.s19(STM8AF/S)。
Speed命令可以用来改变CAN波特率。
Speed命令:上位机host发送以下信息:
当bootloader接收到host的Speed命令,设置好自身新的波特率后,发送ACK信息给host,host等到ACK后设置自己的波特率,并以新的波特率等待接收bootloader设置成功的ACK信息。
Go命令通过跳转到host指定的地址来执行已下载或其他进程代码。执行完bootloader后,应用程序应该设置缺省存储器的保护状态再次锁上程序和数据存储器,以防不测。
Go命令:上位机host发送下面字节:
Go命令跳转地址,必须是有效地址,具体请查阅所使用器件的datasheet。
程序运行时间取决于外设CAN的波特率及待处理数据的大小:
Erase/write routines for STM8 ROM bootloader (UM0560)