STM8基于CAN协议bootloader实现方案

目录

一、引言

二、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都指芯片侧的代码或进程。

二、STM8的Bootloader介绍

器件芯片侧的bootloader的主要任务是上位机借助STM8器件芯片的集成外设(UARTs,SPI, I2C或CAN)下载应用程序到芯片内部存储器中,该存储区可以是RAM/FLASH/EEPROM其中之一,芯片侧的bootloader代码存储在内部boot ROM存储器中,芯片复位后,bootloader代码会检查程序存储器是否空白或者是否相应特殊配置字节被设置,以允许代码被修改。如果以上条件不满足,bootloader会被跳过继续执行用户程序。不是所有芯片都自嵌入了bootloader代码,目前STM8S和AF系列带bootloader代码的如下:

STM8基于CAN协议bootloader实现方案_第1张图片 STM8S和AF系列带bootloader代码清单

一旦满足了bootloader的条件,bootloader进程就会开始,轮询所有支持的串口检测那个外设可用,然后从上位机host接收编程代码,数据,配置字节和/或矢量表等,一切按令行事。

STM8硬件复位向量位于boot ROM(0x00 6000)的起始位置,其他中断向量位于起始于0x00 8004的Flash程序内存起始位置。

STM8基于CAN协议bootloader实现方案_第2张图片 STM8S存储器映射图

三、Bootloader激活流程图

选定器件的bootloader版本号可以通过"Get command"来从芯片中读取到,bootloader的版本由两位BCD编码为一个字节,比如0x22代表v2.2版本,bootloader版本和bootloader激活流程图是对应的,STM8S和STM8AF的当前的bootloader版本号如下表:

STM8基于CAN协议bootloader实现方案_第3张图片 bootloader版本和bootloader激活流程图必须是对应的

下面流程图中虚线部分的进程(EM/WM Erase/Write子程序)是上位机装载到RAM中,他们在程序跳到Flash程序存储器中执行应用程序之前由Go command清除掉。

根据地址0x8000中的内容可以判断Flash存储器是否为virgin,如果[0x8000] ==0x82 or 0xAC,那么Flash就不是空(virgin)的,已经写过程序。

STM8基于CAN协议bootloader实现方案_第4张图片 Bootloader激活流程图

接下来,我们就解读上面“激活流程图”是如何一步一步执行的:

1st:关闭所有中断

2nd:bootloader开始条件(如下表:bootloader开始三条件)

STM8基于CAN协议bootloader实现方案_第5张图片 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执行应用程序。

STM8基于CAN协议bootloader实现方案_第6张图片 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就行。

四、CAN设置

不是所有STM8器件都支持CAN Bootloader的,在器件选型时要留意这一点,器件本身也在更新迭代,采买应用时要咨询好器件的供货方。

STM8基于CAN协议bootloader实现方案_第7张图片 STM8支持bootloader外设串口表

为了访问总线上的其他器件,CAN协议提供标准ID(11Bit)和可选扩展ID(18Bit)帧,下图是一个标准帧的示意图。

STM8基于CAN协议bootloader实现方案_第8张图片 11位ID的标准帧

 Bootloader CAN设置如下:

  • 标准帧       
  • 波特率  125Kbit/s,  运行时间可以通过“speed命令”更改,最高波特率可达到1Mbps。

发送设置(从STM8器件到上位机host):

  • 发送邮箱0 (Tx mailbox0):On, 邮箱1 和 2:Off
  • 发送ID(Tx identifier):0x02
  • 外发信息包含一个数据字节

接收设置(从上位机host到STM8器件):

  • 同步字节0x7F就是host发送的ID,0x7F不在数据域中。
  • 接收ID依赖上位机的命令(0x00,0x03,0x11,0x21,0x31,0x43)。
  • 错误检查:如CAN_ESR寄存器bit[6:4]不是000b,接收到的信息被丢弃并发NACK给host。
  • 如果FIFO溢出,接收到的信息被丢弃并发NACK给host。

输入报文可以包含1到8个字节。

CAN外设可以通过CAN_TX和CAN_RX管脚访问,设置如下:

  • 当bootloader在等待同步信号(SYNCH=0x7F)时,CAN_TX管脚被设置为推挽模式。
  • 如果bootloader没有被激活(在1s的超时时间内没有收到同步字节)那CAN_TX管脚设置为缺省复位状态。
  • 如果bootloader被其他非CAN接口激活,CAN_TX管脚则保持推挽模式。
  • 一旦bootloader轮询选定同步好了一个通讯外设,就关闭其他串口外设。

五、Bootloader命令集

下表是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接收一个命令时,通常会做如下处理:

  1. bootloader发送一个ACK(0x79)字节给host,等待一个有效地址和校验和字节,二者被接收到时都要进行检查其有效和正确性。
  2. 当地址有效,校验和正确,bootloader发送ACK字节(0x79)给上位机host,否则发送NACK字节(0x1F)并中断指令。bootloader等待待传的字节数(N个字节)及其该字节数的补码字节(校验和)。

5.1 Get指令

Get指令允许host得到bootloader版本以及器件所支持的命令。当器件bootloader接收到host的Get命令时,器件发送bootloader版本以及支持的命令编码给上位机host。

Get命令:上位机host发送如下信息:

  • Message:STD ID = 0x00,数据长度(DLC)= '内容无所谓',然后就是接收STM8器件发来的信息。
STM8基于CAN协议bootloader实现方案_第9张图片 Get命令(CAN) - host侧

STM8器件接收到host的Get命令信息之后,接连发送以下信息:

  • Message1:标准帧ID = 0x02,DLC = 1, data = ACK
  • Message2:  标准帧ID = 0x02, DLC = 1, data = N = 6 = 待传字节数减1  (1<= N+1 <=256),7个字节(Version+Get+Speed+Read+Go+Write+Erase)
  • Message3:标准帧ID = 0x02, DLC = 1, data = bootloader版本 (0 < 版本 < 255)
  • Message4:标准帧ID = 0x02, DLC = 1, data =0x00         -Get命令
  • Message5:标准帧ID = 0x02, DLC = 1, data =0x03         -Speed命令
  • Message6:标准帧ID = 0x02, DLC = 1, data =0x11         -Read存储器命令
  • Message7:标准帧ID = 0x02, DLC = 1, data =0x21         -Go命令
  • Message8:标准帧ID = 0x02, DLC = 1, data =0x31         -Write存储器命令
  • Message9:标准帧ID = 0x02, DLC = 1, data =0x43         -Erase存储器命令
  • Message10:标准帧ID = 0x02, DLC = 1, data = ACK

STM8基于CAN协议bootloader实现方案_第10张图片 Get命令(CAN) - STM8器件侧

5.2 Read存储器命令

Read命令可以读取RAM,Flash程序,数据EEPROM或寄存器,当bootloader接收到Read命令后,从接收到的地址拿取数据(N+1字节)给上位机host。

Read命令:host发送如下信息

  • 发送ID  0x11
  • 该帧中数据包含4字节的目标地址(Byte1MSB,Byte4LSB),以及待读取的字节数(N)
  • Std ID = 0x11,DLC = 0x05,data = MSB,0xXX,0xYY,LSB,N(1
STM8基于CAN协议bootloader实现方案_第11张图片 Read存储器命令(CAN)- host侧

 STM器件发送以下信息:

  • ACK message:STD ID =0x02,DLC = 1, data = ACK
  • Data message1:STD ID =0x02,DLC = 1, data = 0xXX
  • Data message2:STD ID =0x02,DLC = 1, data = 0xXX
  • ... ...   ... ...
  • Data message(N+1):STD ID =0x02,DLC = 1, data = 0xXX 
STM8基于CAN协议bootloader实现方案_第12张图片 Read存储器命令(CAN)- STM8器件侧

5.3 Erase存储器命令

擦除存储器命令允许上位机host擦除Flash程序存储器和数据EEPROM中的sector区。

如果上位机host发送了0x43的ID,bootloader接收到该ID擦除命令后,将该ID数据域包含的扇区sectors统统擦掉。一个扇区1Kbyte,擦除命令的单位是8个blocks(每个block含128byte)。如果想擦除一个字节,使用write指令写入0x00即可。

Erase存储器命令描述(待擦除扇区数及这些扇区的编号):

  1. bootloader接收一个包含擦除扇区数目N的字节
  2. bootloader接收N+1个字节,每个字节包含一个扇区编号(扇区编号可查阅STM8 datasheet)

Erase命令:host发送如下信息(两种擦除方式):

  • Erase所有扇区:STD ID = 0x43,DLC = 0x01,data = 0xFF
  • Erase逐个扇区:STD ID = 0x43,DLC = 0x01 to 0x08,data = sector code... 查阅datasheet
STM8基于CAN协议bootloader实现方案_第13张图片 Erase存储器命令(CAN)- host侧

要提醒的是用户在发送擦除存储区扇区或写字节命令之前,要事先下载擦除或写例程到0xA0开始RAM中。例程命名如:E_W_ROUTINEs_128K_ver_2.2.s19 (STM8AF/STM8S)。

bootloader的过程中,除了下载erase/write例程外,对于下面RAM区域不要使用write命令:

  • STM8AF and STM8S Series devices: 0x00 0000 to 0x00 01FF
STM8基于CAN协议bootloader实现方案_第14张图片 Erase存储器命令(CAN)- STM8器件侧

5.4 Write存储器命令

Write存储器命令允许上位机host将数据写入任何存储器地址,在host决定写入那个存储器中之前,读入的数据总是先写入RAM中,Write命令最大数据长度为128bytes,有下面两种操作方式:

  • 字写入:如果写入的字节数N小于128,就得一个一个字节写入N次
  • 块写入:如果写入的字节数是128,写入目标地址是128的一个整数模块,那“块写入”操作就是把host发来一个block块一次性写入和存储器块对齐的位置中,如果不对齐,得用“字写入”命令

Write命令:上位机host发送以下信息:

  • 命令message:STD ID = 0x31,DLC = 0x05,data = MSB,0xXX,0xYY,LSB,N。N = 0 ... 127,(N等于待传字节减1)
  • Data message1:STD ID = 0x04,DLC1 = 0x01~0x08,data = byte1_1,...byte1_8
  • Data message2:STD ID = 0x04,DLC2 = 0x01~0x08,data = byte2_1,...byte2_8
  • Data message3:STD ID = 0x04,DLC3 = 0x01~0x08,data = byte3_1,...byte3_8
  • ......
  • Data messageM:STD ID = 0x04,DLCM = 0x01~0x08,data = byteM_1,...byteM_8
  • checksum message: Std ID = 0x04, DLC = 1, data = XOR (N,[N+1 data bytes])

备注:       

  1.   DLC1 + DLC2 + ... + DLCM = 128 (最大)
  2.   bootloader不检查数据和校验和信息的Std ID,所以其ID可以是0x00到0xFF,建议用0x04
STM8基于CAN协议bootloader实现方案_第15张图片 Write存储器命令(CAN)- host侧

再次提醒,用户在发送擦除存储区扇区sector或写字节word或block命令之前,要事先下载擦除或写例程到0xA0开始的RAM中。例程命名如:E_W_ROUTINEs_128K_ver_2.2.s19(STM8AF/S)。

STM8基于CAN协议bootloader实现方案_第16张图片 Write存储器命令(CAN)- STM8器件侧

5.5 Speed命令

Speed命令可以用来改变CAN波特率。

Speed命令:上位机host发送以下信息:

  • 命令message:Std ID = 0x03,DLC = 0x01,data = 0xXX ,0xXX可以是如下值:
    • 0x01 -> baud rate = 125 kbps
    • 0x02 -> baud rate = 250 kbps
    • 0x03 -> baud rate = 500 kbps
    • 0x04 -> baud rate = 1 Mbps
STM8基于CAN协议bootloader实现方案_第17张图片 Speed命令(CAN)- host侧

当bootloader接收到host的Speed命令,设置好自身新的波特率后,发送ACK信息给host,host等到ACK后设置自己的波特率,并以新的波特率等待接收bootloader设置成功的ACK信息。

STM8基于CAN协议bootloader实现方案_第18张图片 Speed命令(CAN)- STM8器件侧

5.6 Go命令

Go命令通过跳转到host指定的地址来执行已下载或其他进程代码。执行完bootloader后,应用程序应该设置缺省存储器的保护状态再次锁上程序和数据存储器,以防不测。

Go命令:上位机host发送下面字节:

  • 命令message:Std ID = 0x21,DLC = 0x04,data = MSB,0xXX,0xYY,LSB
STM8基于CAN协议bootloader实现方案_第19张图片 Go命令(CAN)- host侧

Go命令跳转地址,必须是有效地址,具体请查阅所使用器件的datasheet。

STM8基于CAN协议bootloader实现方案_第20张图片 Go命令(CAN)- STM8器件侧

六、运行时间

程序运行时间取决于外设CAN的波特率及待处理数据的大小:

  • CAN: 125 Kbit/s, 250 Kbit/s, 500 Kbit/s, and 1 Mbit/s
STM8基于CAN协议bootloader实现方案_第21张图片 不同数据类型在不同CAN波特率下的运行时间对比

七、引用

Erase/write routines for STM8 ROM bootloader (UM0560)

你可能感兴趣的:(单片机,嵌入式硬件,功能测试)