为了保证通信的可靠性,必须开发一个基于通信总线完善的通信协议,应用程
序下载端和 Bootloader 之间需要建立请求命令(request command)、确认
(acknowledge)、等待(block wait)、错误重传(error re-send)等机制----
Bootloader 根据不同的请求命令完成不同的任务并确认操作是否完成(ACK)以及数据是
否正被确完整的传输,若出现数据错误(通过校验和或者 ECC 实现),需要进行自动重
传;
应用程序编程文件(S19/HEX/BIN)都具有相应的校验和机制,所以可以采取直接传
送程序编程文件行的方式;否则,用户需要在上位机软件中首先解析编程文件,再将
其中的地址和数据及代码封装打包成某种定制的通信协议,
对编程文件的解析, 目的在于获得应用程序的程序代码和数据及其在 NVM 中的存
储地址;
MCU 的软件开发 IDE 一般都集成不同编程文件之间的转换工具:比如 S32DS 的
objcopy(Create Flash Image )
以及 Keil 的 Motorola S-Record to BINARY File Converter:
http://www.keil.com/download/docs/10.asp
NVM 驱动程序包括对 NVM 的擦除(erase)、编程(program)和校验
(verify)等基本操作,也包括对 NVM 的加密(secure)/解密(unsecure)和加保护
(protection)/解保护(unprotection)操作
由于 NVM 的工作速度一般较 CPU 内核频率和总线频率低,所以运行 NVM 驱动前
必须对 NVM 进行初始化,将设置分频器其工作频率设置为正常工作所需频率范围;
5.1 Bootloader 与应用程序的关系
Bootloader 和应用程序分别是两个完整的 MCU 软件工程,各自都由自己的启动代
码、 main()函数、链接文件、外设驱动程序和中断向量表
Bootloader 必须使用 MCU 默认的中断向量表,因为每次复位后 MCU 都是从其认中断向量表的复位向量取地址执行的;应用程序的中断向量必须进行偏移(通过相应的中断向量偏移寄存器,如 S12(X)系列 MCU 的 IVBR 寄存器或者 ARM
Cortex M 系列 MCU 的 SCB->VTOR 寄存器),而 NVM(P-Flash)的擦除都是按照sector 进行的,所以为了充分利用 NVM(P-Flash)空间,都将 Bootloader 分区到 包含默认中断向量表的若干 NVM(P-Flash)sector(S12(X)系列 MCU 的 NVM 最后若干 sector, ARM Cortex M 系列 MCU 从 0 地址开始的若干 sector);
5.2 Bootloader 到应用程序(APP)的跳转方法
开发使用 Bootloader 后,每次 ECU 复位之后都将首先运行 Bootloader,若无远程应用程序下载请求则直接跳转到应用程序复位函数地址,这里面有两个问题需要考虑
6.1 NVM 资源介绍
本地地址 (Local Address)** :也称为局部地址,指内核 CPU 能够直接线性访问的地址,对于 16 位 MCU 来说就是 0x0000~0xFFFF 的 64KB 地址空间,本地地址空间也被称作未分 页区(NON_BANKED), CPU 可以对其进行高效的寻址,应用程序的中断服务函数以及应用工程的启动信息都必须放置在未分页区;
逻辑地址 (Logic Address) : 也可以称为虚拟地址,是链接文件.prm 和内存映射文件.map 以及默认的 CodeWarrior 编译结果运
全局地址 (Global Address) : 也称为物理地址 (Physical Address) ,是芯片在设计时给P-Flash 分配的线性连续地址空间,对 P-Flash 进行操作 (比如编写 P-Flash 驱动程序,对 PFlash 进行擦除、编写等) 时使用,也是.phy 文件中所使用的地址。对于 S12/S12X 系列 MCU,其.phy 文件可以使用 P&E Log2Phy 软件由 S19 文件转换而得。 行时和 S19 文件所使用的地址。
S12G 系列的本地地址和全局地址关系
6.2 S12 片上NVM 驱动开发详解
对 S12 (X) 系列 MCU 的片上 Flash 和 EEPROM 的操作是通过操作 Flash 的通用命令目标寄存FCCOBIX/FCCOB,写入操作地址、数据和命令,并结合状态寄存器 FSTAT 组成命令序列完成的。典型的 NVM 命令写入序列流程图如下:
由于本设计中 NVM 的驱动需要与 Bootloader 分离,由上位机通过 CAN 总线下载到RAM 中运行,所以使用官方标准驱动 (SSD) 的 C 数组形式,将其编译到 0x3000 开始的 4KBRAM 空间并生成一个函数地址表,形成 S19 文件,最后与应用程序的 S19 文件合并(为了保证 NVM 驱动正常运行,必须保证合并后的 S19 文件中 NVM 驱动在最前面),一起下载。在Bootloader 中用函数指针函数调用
6.3 S19 文件详解
上位机发或者 Bootloader 必须对应用程序的编译结果文件进行解析以获取编程地址和信息,所以开发 Bootloader 时必须清楚编译结果文件的格式。
S19 文件,也称作 S 记录 (S-record) 文件是 CodeWarrior 5.1 IDE 编译器的默认编译结果文件,其由 Motorola 公司开发和主导,与 Intel 公司开发的 HEX 文件以及 bin 文件是嵌入式 MCU EEPROM/Flash 三种常用的编程文件格式
6.4 基于UDS CAN总线的bootloader 设计
基于 CAN 总线的 Bootloader 设计包括运行在 PC 上的上位机软件和运行在目标 MCU中的 Bootloader 主机 (host) 软件两部分
诊断控制会话(0x01)
诊断会话控制服务由Tester 发起请求,ECU 响应请求,请求的第一个字节0x10, 第二个字节模式定义如下所示
Byte | Contents | HEX Value |
---|---|---|
0 | Service Identifier | 10H |
1 | Diagnosestics Session Type | 0x01\0x02\0x03 |
表示ECU 处于不同的诊断会话模式中,1代表默认会话模式,2代表编程模式,3代表扩展会话模式,Bootloader 是在编程会话模式下完成,ECU 回应肯定回答
读取数据(0x22)
读取数据由Tester 发起请求,ECU 响应,并通过肯定应答返回Tester 所需要的信息,和Bootloader 相关的ECU 信息主要由VIN 号,已经下载软件硬件版本号,已经下载次数,最后一次下载时间,该信息主要用在Bootloader 下载过程中信息对比正确,进到下一步流程,否则终止
安全访问(0x27)
在bootloader 下载模式下,操作步骤如下:
a. Tester 请求Seed ,ECU 返回随机Seed
b. Tester 通过加密算法算出key 并发送, ECU 发送肯定响应然后通过Bootloader 安全级别访问
请求下载(0x34)
请求下载服务是开始启动从Tester 到ECU 的数据传输,当Tester 接受到该服务的有效的请求报文后,ECU 根据软件下载要求,准备擦写前逻辑条件工作,并做相应软件下载地址校验工作,在返回肯定应答报文后做好收数据准备,下载服务包含的主要信息由下载数据块地址,各占4byte
传输数据服务(0x36)
该服务是UDS 多包连续传输机制
请求退出传输(0x37)
当ECU 接受到该命令后,在完成软件完整性检查后,给出肯定应答,下载数据过程完成
电控单元复位(0x11)
每家OEM 有自己定义的UDS 流程
步骤1: 诊断会话控制(0x10),子服务为程序刷新服务,ECU 肯定响应,进入Bootloader 下载过程
步骤2: Tester 获取电控单元的物流数据,该数据存在FLASH 存储器中,Bootloader 上载日期和下载次数,软硬件版本是否匹配,保证软件下载的匹配可靠性
步骤3:Tester 在软件下载过程,需要种子匹配解锁, Tester 向ECU 请求Seed 数, 一般seed 数为随机数字,得到seed 后,Tetser 根据算法密钥计算,同时ECU 也会计算密钥,Tester 把密钥发给ECU 进行判断是否匹配
步骤4: 4.1 通过下载请求(0x34)启动软件下载,并把软件首地址和大小信息下载给ECU
4.2 通过传输数据(0x36)实现数据传输,在每个数据传输的过程中,需要做数据校验
步骤5:ECU 接受到0x37 服务后,计算下载到Flash 的数据校验值,并将校验值发给Tester, Tester 将ECU 的校验值相比较,若二者相等,则需要检查软件完整性,完成后更新软件有效标志位
步骤6: 0x11 复位程序
应用程序和Bootloader 需要一套转换程序逻辑
ECU 上电后复位启动,从XX 位置开始执行程序,初始化中断向量表,硬件内存ROM 和RAM 资源,配置相关功能寄存器输入输出硬件接口寄存器
软件从参数存储地址读出Bootloader 程序执行标志,标志有效,则执行Bootloader 程序软件入口,否则执行应用层软件
进入Bootloader 程序后,按照bootloader 程序更新软件,软件更新完成后清除bootloader 下载标志,最后通过UDS 协议复位
在应用程序执行的过程中,需要通过Bootloader 下载软件更新应用程序,先通过UDS 服务启动会话服务,会话服务开始后,通过密钥解锁程序下载
进入Bootloader 程序后,按照bootloader 程序更新软件,软件更新完成后清除bootloader 下载标志,最后通过UDS 协议复位
在应用程序执行的过程中,需要通过Bootloader 下载软件更新应用程序,先通过UDS 服务启动会话服务,会话服务开始后,通过密钥解锁程序下载