目录

一、引言

二、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代码的如下:

STM8S和AF系列带bootloader代码清单

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

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

STM8S存储器映射图

三、Bootloader激活流程图

选定器件的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)的,已经写过程序。

Bootloader激活流程图

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

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就行。

四、CAN设置

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

STM8支持bootloader外设串口表

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

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器件发来的信息。

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

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<N<=255)

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

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

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

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

Write存储器命令(CAN)- host侧

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

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

Speed命令(CAN)- host侧

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

Speed命令(CAN)- STM8器件侧

5.6 Go命令

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

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

  • 命令message:Std ID = 0x21,DLC = 0x04,data = MSB,0xXX,0xYY,LSB

Go命令(CAN)- host侧

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

Go命令(CAN)- STM8器件侧

六、运行时间

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

  • CAN: 125 Kbit/s, 250 Kbit/s, 500 Kbit/s, and 1 Mbit/s

不同数据类型在不同CAN波特率下的运行时间对比

七、引用

Erase/write routines for STM8 ROM bootloader (UM0560)

STM8基于CAN协议bootloader实现方案相关推荐

  1. 用udp实现可靠传输python_一种基于UDP协议实时可靠图像传输方案的制作方法

    本发明设计属于数据传输与通信技术领域,具体涉及一种基于UDP协议(User Datagram Protocol)实时可靠图像传输方案. 背景技术: 随着网络技术的高速发展,无线数据传输在通信.控制等领 ...

  2. .NET或.NET Core Web APi基于tus协议实现断点续传

    [导读]前两天我采用技巧式方案基本实现大文件分片上传,这里只是重点在于个人思路和亲身实践,若在实际生产环境要求比较高的话肯定不行,仍存在一些问题需要深入处理,本文继续在之前基础上给出基于tus协议的轮 ...

  3. 基于XCP(On CAN)协议的Bootloader升级方案

    基于XCP(On CAN)协议的Bootloader升级方案 文章目录 前言 一.ECU端设计 1.Flash分配 2.软件架构层次图 3.流程图 4.源码 二.PC端设计 三.测试验证 四.总结 前 ...

  4. Android 模块 -- 基于XMPP协议的手机多方多端即时通讯方案

    目   录 基于XMPP协议的手机多方多端即时通讯方案................................................................. 1 目   录 ...

  5. SfxMCP基于onvif协议H5无插件直播方案中onvif设备的接入方法 - sfxlab

    SfxMCP基于onvif协议H5无插件直播方案中onvif设备的接入方法 - sfxlab SFX流媒体解决方案基于安防行业推出了以媒体汇聚平台(SfxMCP)为主,以媒体分发平台(SfxMDP)和 ...

  6. SfxMCP基于rtsp协议H5无插件直播方案中RTSP设备的接入方法 - sfxlab

    SfxMCP基于rtsp协议H5无插件直播方案中RTSP设备的接入方法 - sfxlab SFX流媒体解决方案基于安防行业推出了以媒体汇聚平台(SfxMCP)为主,以媒体分发平台(SfxMDP)和媒体 ...

  7. 基于FTP协议实现指定终端的日志自动上送方案

    日志是应用程序的镜子,重要性不言而喻.日志是排查问题的一种有效的和快速的途径. 以往现场出了问题,都需要外办的到处跑,去采集设备日志,再提供给研发分析处理. 且采日志的过程是繁琐的,需要带电脑带工具以 ...

  8. 基于XMPP协议的手机多方多端即时通讯方案

    原文地址为: 基于XMPP协议的手机多方多端即时通讯方案 基于XMPP协议的手机多方多端即时通讯方案 目   录 基于XMPP协议的手机多方多端即时通讯方案...................... ...

  9. 【科研论文】基于HTTP协议的嵌入式远程监控系统的研究

    内容简介: 利用网络实现局域乃至全球范围内的监测与控制,是信息与控制系统的主要发展趋势.嵌入式系统因其体积小.功能强.可靠性高.灵活方便等优点,已渗透到工业.农业.国防.教育.科研以及消费等各个领域, ...

最新文章

  1. Depth by Poking:从自监督抓取学习深度估计
  2. jenkins+docker部署java项目
  3. SAP在Kubernetes上打造的Kyma到底是个什么东东
  4. cg word List 1
  5. Mybatis实现CRUD操作
  6. 从WEB应用的角度,一个应用都需要维护一些不同作用范围的状态, 请问下面哪些状态作用域是WEB应用特有的:( )
  7. 卷烟厂招工内卷:要求本科以上,但报名的硕士太多
  8. 【C/C++】递归算法
  9. 2019最佳工作、平均年薪达百万!想入行,先看这10本书
  10. 全新Java高级工程师学习路线图(附学习资料)
  11. ArcGIS_一种简单的三维城市建模方法
  12. patterns in java_Patterns-in-Java
  13. Adoby photoshop cs5永久序列号
  14. Unity中鼠标的锁定与解锁
  15. 文字盘点:当今社会十句最恶俗的流行书面中文
  16. 为什么我们懂得很多道理,却依然过不好这一生?
  17. Pinterest模式:互联网新一轮热潮来临
  18. 可爱卡通幼儿教学课件PPT模板
  19. 红米手机如何HTML到电视上,红米(Redmi)路由器AX6用手机怎么设置?
  20. 关于磁场与磁能的一些总结

热门文章

  1. 计算机所有用户ev,EV屏幕共享(电脑屏幕共享助手)V1.0.1 免费版
  2. 山世光: 我的Face Zero之梦,写在AlphaGo Zero出世之际
  3. 使用mycat搭建实现mysql数据库集群管理
  4. 电流转电压模块4-20mA转0-3.3/5V/10V/15V转换变送器电路原理解析
  5. [R]_如何按条件提取列名
  6. 黑马量价启动副图指标 开始拉升出信号 超精致买入预警 通达信 源码分享
  7. 代码写入word时美化高亮
  8. Java框架springBoot企业级进销存ERP系统
  9. java汉字转换拼音
  10. VMware ESXi 更换 CA 证书