汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

基于CAN总线通信的S12(X) 系列MCU独立NVM驱动安全bootloader

0
阅读(244) 评论(0)

汽车电子ECU BootLoader开发之基于CAN总线通信的S12(X) 系列MCU独立NVM驱动安全bootloader

内容提要


引言

1.  CAN总线和汽车ECU bootloader

2.  S12 (X) 系列MCU片上NVM资源及其驱动程序开发

2.1  S12 (X) 系列MCU存储器的分页工作机制和S12G128片上NVM资源介绍

2.2  S12 (X) 片上NVM驱动开发

2.3  S19文件详解

3.  基于CAN总线的bootloader设计

3.1  PC上位机软件及通信协议设计

3.2  bootloader 主机 (host) 软件设计

3.3  应用程序软件设计

4. 基于CodeWarrior处理器专家系统的图形化快速实现

4.1  CodeWarrior 5.1 IDE及处理器专家系统及其使用简介

4.2  bootloader和应用程序内存分配及处理器专家系统配置

5. 总结

参考文献


引言


之前我写了一篇《汽车电子ECU bootloader开发要点详解》,为大家介绍了汽车电子ECU BootLoader开发的诸多要点和注意事项。其文全为理论分析和经验分享。很多读者给我反馈,希望能够分享一些具体的汽车电子ECU BootLoader开发实战经验。


基于此,今天在此先给大家分享基于CAN总线通信的S12(X) 系列MCU独立NVM驱动bootloader开发,希望对大家有所帮助和启发。后续计划分享MPC57xx系列和MagniV S12Z系列的BootLoader开发,敬请关注。


1.  CAN总线和汽车ECU bootloader


CAN (Control Area Networking) bus--现场控制域网络总线因其良好的差分通信抗干扰能力而被广泛应用于汽车ECU通信。目前在汽车ECU中被广泛采用的CAN总线为协议2.0 A/B, CAN 2.0A只支持11位长度ID的标准帧,而CAN 2.0B可以支持长达29位的扩展帧。最新的CAN总线协议为CAN FD (Flexible Data rate) , 其可以支持最高8Mbit/s的通信速率和长达64个字节的数据载荷,同时又向前兼容CAN 2.0 A/B协议 [1] 。

 

CAN 2.0A/B的典型通信速率为125Kbit/s、250Kbit/s、500Kbit/s以及最高的1Mbit/s,乘用车上通常会设计一个通信速率为250Kbit/s的低速CAN网络和一个通信速率为500Kbit/s的高速CAN网络,低速CAN用于传感器数据采集和简单的控制ECU,如汽车门窗座椅调节控制器、空调控制器 (HAVC) 和汽车诊断;而高速CAN网络用户互联大数据处理和复杂控制的ECU,如汽车发动机管理ECU,汽车仪表以及电子助力转向ECU等。高速CAN和低速CAN之间的互联通信由车身网关 (Gateway) 或者车身电子模块 (BCM) 完成。


bootloader从字面上理解就是引导加载程序,是MCU上电或者复位之后最先运行的一段永久驻留于ECU非易失性存储器 (NVM Non-Volatile Memory) 中的一段极小的程序,它将完成MCU的时钟、存储器和通信外设初始化,监测外部是否有进入引导加载的命令,如果有,则建立通信,下载、解析并存储应用程序到ECU的非易失性存储器区域,从而完成应用程序的在线升级功能。典型的常见bootloader如通用PC上的BIOS系统。bootloader主要完成的3个功能是:


1.与上位机或者远程主机建立通信,完成应用程序的下载;

2. 应用程序的格式解析;

3. 将解析后的应用程序二进制代码编程到ECU的非易失性存储器中[1]。

 

汽车电子中ECU一旦设计完成,装车量产就很难再拆卸并返回零部件供应商完成功能升级或补丁修复。一旦出现售后质量问题,如果召回的话,零部件供应商和整车厂将面临严重的经济损失,因此设计基于CAN总线的ECU在线程序更新bootloader可以很好的解决这一问题,将零部件供应商和整车厂的损失降低到最小。目前国外大部分汽车整机厂和全球的一级汽车零部件供应商 (Tier 1) 都要求在其设计的ECU实现bootloader功能。


2.  S12 (X) 系列MCU片上NVM资源及其驱动程序开发

 

 S12 (X) 系列MCU是NXP专门针对汽车车身通用控制和发动机控制ECU应用的16位汽车级MCU,目前被各大零部件供应商广泛采用,年出货量超过十亿片。这里主要介绍通用车身控制应用的S12G系列和发动机控制应用的S12XE系列MCU的片上NVM(Non-Volatile Memory,非易失性存储器,包括片上的EEPROM和Flash)资源。


一个MCU的存储器寻址能力 (即其寻址范围大小) 取决于其系统地址总线,与MCU所采用的内核密切相关,一般而言,CPU寄存器中的堆栈寄存器SP和程序计数寄存器PC的宽度与地址总线相同。在S08与S12 (X) 内核中SP和PC寄存器都是16bit位宽,因此其最大线性寻址范围 (或者也叫直接寻址范围) 为216=64KB。

  

然而,汽车电子应用日益复杂,用户应用程序需要不断增加, 64KB的存储空间已经无法满足需求。一些大于64KB Flash的汽车MCU出现了,比如128KB P-Flash的S08DZ128, 128KB P-Flash的S12G128, 1MB P-Flash的S12XEP100等MCU。为了高效的访问大于64KB的P-Flash存储空间,Freescale提出了存储器分页访问的工作机制。即通过0x8000~0xBFFF的16KB Flash窗口以存储器映射的方式对分页的Flash空间进行访问 [2] 。

 

所以在介绍S12 (X)  NVM驱动程序开发之前有必要先介绍一下S12 (X)  系列MCU的存储器分页工作机制。


2.1  S12 (X) 系列MCU存储器的分页工作机制和S12G128片上NVM资源介绍


首先介绍几个S12 (X)  系列MCU存储器分页访问时常用的地址定义:


本地地址 (Local Address) :也称为局部地址,指内核CPU能够直接线性访问的地址,对于16位MCU来说就是0x0000~0xFFFF的64KB地址空间,本地地址空间也被称作未分页区(NON_BANKED),CPU可以对其进行高效的寻址,应用程序的中断服务函数以及应用工程的启动信息都必须放置在未分页区;


逻辑地址 (Logic Address) :  也可以称为虚拟地址,是链接文件.prm和内存映射文件.map以及默认的CodeWarrior编译结果运行时和S19文件所使用的地址。其地址空间是以16KB为单元的间断空间,一般形式为P-Flash分页号 (Flash分页号 (Page Number) 保存在存储器映射控制器PPGAE寄存器 (S12G中地址为0x0015) 中,用于在通过分页窗口访问Flash时索引逻辑地址) +Flash分页窗口 (Paging Window) 地址 (0x8000~0xBFFF) 组成,例如Page C的Flash对应的逻辑地址为:0xC8000~0xCBFFF,而Page E的Flash对应的逻辑地址为0xE8000~0xEBFFF;


全局地址 (Global Address) :也称为物理地址 (Physical Address) ,是芯片在设计时给P-Flash分配的线性连续地址空间,对P-Flash进行操作 (比如编写P-Flash驱动程序,对P-Flash进行擦除、编写等) 时使用,也是.phy文件中所使用的地址。对于S12/S12X系列MCU,其.phy文件可以使用P&E Log2Phy软件由S19文件转换而得。

 

 S12G系列MCU的本地地址与全局地址的映射关系图如下:

2.jpg

图 1. 局部地址与全局地址映射关系

 

这里以典型的S12G128为例进行介绍,其P-Flash资源地址映射如下:

3.jpg

图 2. S12G128片上NVM资源映射

 

S12G128的128KB Flash包括了从全局地址0x20000开始的8个连续16KB Flash页 (Page) ,其支持1/2/4/8/16KB的区域 (region) 保护 (Protection) 整个P-Flash的加密 (Secure) 。所谓保护是指,不能被应用程序擦除和改写,这一功能在bootloader开发中常被用于保护bootloader程序自身不被应用程序修改,因为bootloader是ECU在线升级的基础程序,需要长期驻留在ECU中。而加密是针对BDM调试接口的,但S12G加密之后,外部调试器能够执行的唯一一条BDM命令就是大规模擦除 (mass erase) ,要想解密就得执行大规模擦除命令将整个P-Flash上的数据清空或者通过8个字节的后门密码 (backdoor key,位于局部地址0xFF00~0xFF07,全局地址0x3FF00~0x3FF07) 进行解密,因此就无法通过BDM接口正常访问 (读取或者写入) 片上的P-Flash资源,从而有效的保护用户的软件知识产权。


Tips:S12(X)系列不同part的MCU,其局部地址、逻辑地址与全局地址之间的map映射关系不同,逻辑地址号也不尽相同,且其RAM、EEPRPOM等存储器也可能存在分页情况(比如S12XE和S12XHZ/Y系列MCU),具体请参考其各自的datasheet/reference manual。


2.2  S12 (X) 片上NVM驱动开发


对S12 (X)  系列MCU的片上Flash和EEPROM的操作是通过操作Flash的通用命令目标寄存器FCCOBIX/FCCOB,写入操作地址、数据和命令,并结合状态寄存器FSTAT组成命令序列完成的。典型的NVM命令写入序列流程图如下:

4.jpg

图 3 . Flash命令写入序列流程图

 

典型的S12 (X) NVM操作包括擦除、编程、校验等,完整的NVM命令及其模式和加密状态权限如下表1所示:


表 1. NVM命令及其模式和加密状态权限

5.jpg

 (1 解密正常单芯片模式; 2 解密特殊单芯片模式; 3 加密正常单芯片模式; 4 加密特殊单芯片模式)


用户可以使用CodeWarrior 5.1 IDE中的处理器专家系统图形化配置生成这些NVM操作驱动程序API函数,或者直接使用NXP官网提供的标准驱动代码 (SSD) 。后者提供了运行时独立的源代码、S19文件,C数组以及静态库等形式的NVM驱动,更方面灵活使用[4]。


由于本设计中NVM的驱动需要与bootloader分离,由上位机通过CAN总线下载到RAM中运行,所以使用官方标准驱动 (SSD) 的C数组形式,将其编译到0x3000开始的4KB RAM空间并生成一个函数地址表,形成S19文件,最后与应用程序的S19文件合并(为了保证NVM驱动正常运行,必须保证合并后的S19文件中NVM驱动在最前面),一起下载。在bootloader中用函数指针函数调用。

制作独立NVM驱动的方法是:首先,根据实际MCU型号配置SSD(位于SSD安装目录\drvsrc\include\SSD_SGF18.h中的FLASH_DERIVATIVE定义),make(双击运行SSD安装目录\drvsrc\make\make.bat命令批处理文件)生成C数组形式的NVM驱动(位于SSD安装目录\driver\c-array_driver目录),将其整理在一个C文件中与SSD头文件(SSD安装目录\drvsrc\include目录下的3个头文件)添加到CodeWarrior 5.1 工程,并将各个NVM驱动函数地址放在位于地址0x3F80的数组(使用CodeWarrior 地址指定符”@”指定数据存储地址)中作为NVM驱动函数地址表。因为所有的NVM驱动函数数组和NVM驱动函数地址表都由C语言关键词const修饰,是数组常量,默认放在ROM_VAR段中,修改工程PRM链接文件,将ROM_VAR段放置在开辟的NVM_RAM中即可将NVM驱动编译到0x3000开始的RAM地址,得到S19文件,从S19文件中分离得到NVM驱动及其函数地址表的S19格式文件。


具体的NVM驱动函数映射地址表及工程链接文件如下图:

6.jpg

图 4. NVM驱动函数映射地址表及工程链接文件


Tips:NVM独立驱动是灵活可裁剪的,对于基本的bootloader功能,只需要初始化init()、EEPROM/P-Flash擦除erase()、EEPROM/P-Flash编程program()和EEPROM/P-Flash校验verify()几个驱动函数就足够了。因此可以根据bootloader的功能选择必要的NVM driver函数,从而减少其占用的RAM空间,以适应小RAM尺寸的MCU(比如1KB RAM的S12GN16/32系列),当然还需要改变其编译地址和NVM驱动函数映射地址表。


表 2. S12G系列MCU片上存储器和外设资源对比

7.jpg

Tips:关于S12(X)系列的存储器分页访问机制,请参考本公众号文章:

a. 《S12(X)系列MCU的片上存储器资源与分页访问机制详解(一)》;

b. 《S12(X)系列MCU的片上存储器资源与分页访问机制详解(二)》;


2.3  S19文件详解


上位机发或者bootloader必须对应用程序的编译结果文件进行解析以获取编程地址和信息,所以开发bootloader时必须清楚编译结果文件的格式。S12 (X) 系列MCU的CodeWarrior 5.1 IDE编译结果为S19文件,因此,下面将详细介绍。


S19文件,也称作S记录 (S-record) 文件是CodeWarrior 5.1 IDE编译器的默认编译结果文件,其由Motorola公司开发和主导,与Intel公司开发的HEX文件以及bin文件是嵌入式MCU EEPROM/Flash三种常用的编程文件格式。

 

S19文件内容为ASCII编码,可使用任意文本编辑器打开查看,其内容的每一行都以ASCII码的字母“S”开始,以0~9作为不同类型行的标示符,其中“S0”为S19文件信息,对编程无意义,”S1~S9” 表示真正与编程相关的信息,因此而得名。具体的S19文件每一行的格式和定义如下:

8.jpg

 图 5. S19行文件格式

Type (类型) :2个字符。用来描述记录的类型  (S0,S1,S2,S3,S5,S7,S8,S9) 。

Count (计数) :2个字符。 用来组成和说明了一个16进制的值,显示了在记录中剩余成对字符的计数。

Address (地址) :4或6或8个字节。用来组成和说明了一个16进制的值,显示了数据应该装载的地址, 这部分的长度取决于载入地址的字节数。2个字节的地址占用4个字符,3个字节的地址占用6个字符,4个字节的地址占用8个字符。


Data (数据) :0—64字符。用来组成和说明一个代表了内存载入数据或者描述信息的16进制的值。


Checksum (校验和) :2个字符。这些字符当被配对并换算成16进制数据的时候形成了一个最低有效字符节,该字符节用来表达作为补充数据,地址和数据库的字符对所代表的 (字节的) 补码的byte总和。即计数值、地址场和数据场的若干字符以两个字符为一对,将它们相加求和,和的溢出部分不计,只保留最低两位字符NN,checksum =0xFF-0xNN。


S0 Record:记录类型是“S0” (0x5330) 。地址场没有被用,用零置位 (0x0000) 。数据场中的信息被划分为以下四个子域:

  • Name  (名称)  :20个字符,用来编码单元名称

  •  Version  (版本)  :2个字符,用来编码版本号

  •  Reversion  (修订版本)  :2个字符,用来编码修订版本号

  •   Description  (描述)  :0-36个字符,用来编码文本注释

此行表示程序的开始,不需烧入memory。


S1 Record:记录类型是“S1” (0x5331) 。地址场由2个字节地址来说明。数据场由可载入的数据组成。


S2 Record:记录类型是“S2” (0x5332) 。地址场由3个字节地址来说明。数据场由可载入的数据组成。


S3 Record:记录类型是“S3” (0x5333) 。地址场由4个字节地址来说明。数据场由可载入的数据组成。


S5 Record:记录类型是“S5” (0x5335) 。地址场由2字节的值说明,包含了先前传输的S1、S2、S3记录的计数。没有数据场。


S7 Record:记录类型是“S7” (0x5337) 。地址场由4字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入存储器。


S8 Record:记录类型是“S8” (0x5338) 。地址场由3字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入存储器。


S9 Record:记录类型是“S9” (0x5339) 。地址场由2字节的地址说明,包含了开始执行地址。没有数据场。此行表示程序的结束,不需烧入存储器。


Tips:

A. 同一个S19文件中,可能同时存在S2/3/4三种不同的数据记录行;

B. 根据不同的描述信息,在以上S7/8/9三种不同的结束行中选择一种使用。


3.  基于CAN总线的bootloader设计


基于CAN总线的bootloader设计包括运行在PC上的上位机软件和运行在目标MCU中的bootloader 主机 (host) 软件两部分。


3.1  PC上位机软件及通信协议设计

         

运行在PC上的上位机软件主要功能是读取目标MCU的应用程序S19文件,并调用USB转CAN总线适配器 (Adapter) ,将其逐行下载到目标MCU,其软件设计软件设计流程图如下:

9.jpg

图 6. PC上位机软件设计流程图


本设计中,采用Visual C++调用WFC和武汉吉阳光电的-GY8507 USB转CAN适配器驱动,编写上位机界面软件。


PC上位机下载应用程序S19文件的CAN消息是ID为0x64的标准数据帧,而bootloader host程序应答上位机的CAN消息帧是ID为0xC8的标准数据帧,通信速率设置为500Kbit/s。因此在S12G初始化时将MSCAN模块的接收ID滤波器设置为只接收ID为0x64的标准帧,以避免正常网络上其他ECU的干扰。具体在整车上实现时通信速率由当前ECU所在的CAN网络决定,其通信的消息ID由整车厂定义。具体的CAN消息命令定义如下:


表 3. bootloader通信 CAN消息命令定义

10.jpg


3.2  bootloader 主机 (host) 软件设计


bootloader 主机 (host) 软件设计流程如下图所示:

11.jpg

图 7. bootloader 主机  (host)  软件设计流程图

 

每次MCU复位 (包括上电复位、看门狗复位、外部输入复位、低电压检测复位、时钟检测复位和非法地址) 之后,进行系统初始化,配置系统时钟、打开定时器、配置MSCAN和用于状态指示的LED控制GPIO,打开CPU全局中断,然后等待上位机boot命令并检查是否超时:如果在规定的500ms内接收到了上位机请求进入boot的命令,则接收数据并解析得到行地址和字对齐 (1word=2Byte) 的数据,接着判断S19行地址空间,若是Flash地址且是第一次收到Flash数据,则将除bootloader程序之外的所有片上Flash擦除为编程应用程序做准备;若是EEPROM地址且是第一次收到EEPROM数据,则将全部EEPROM擦除;若是RAM地址,则无所擦除。对Flash地址的数据,在编程到Flash中之前,还必须将以上解析结果中的局部地址/逻辑地址转换为Flash驱动所需的线性连续物理地址,并将数据进行4字对齐,以提高编程效率。然后与上位机建立通信,逐行接收,解析并将结果烧写到相应地址的片上Flash/EEPROM/RAM中,直至整个应用程序S19文件结束,最后复位外设(关闭MSCAN)、清除NVM驱动所在的RAM空间、关闭CPU全局中断,禁止所有外设中断,结束bootloader跳转至应用复位函数开始执行应用程序;如果在规定的500ms内未收到上位机通过CAN发来的进入boot命令,则直接关闭CPU全局中断,禁止所有外部中断,结束bootloader跳转至应用复位函数开始执行应用程序。


3.3  应用程序软件设计


  在应用程序设计时,需要在系统初始化时设置IVOR=0xEF,将应用程序中断向量表偏移至0xEF80,使其与MCU复位后默认的中断向量表0xFF80分开,从而执行不同的外设中断服务函数。

 

另外需要将COP看门狗使能,在应用程序主循环中正常喂狗,而在MSCAN接收中断中对接收到的CAN消息ID进行判断,若接收到Boot ID,则进入死循环,让看门狗溢出复位MCU,从而进入bootloader。

 

因此,典型的应用程序软件设计流程图如下:

12.jpg

图 8. 典型的应用程序软件设计流程图


4. 基于CodeWarrior处理器专家系统的图形化快速实现


4.1  CodeWarrior 5.1 IDE及处理器专家系统及其使用简介


CodeWarrior 5.1 IDE (Integrated Development Environment,集成开发环境) 是NXP自己开发的支持S12 (X) 全系列MCU的集成开发环境,其集成构建平台和应用所必需的所有主要工具 - IDE、编译器、调试器、编辑器、链接器、汇编程序等。将先进的调试技术与健全开发环境简易的集成在一起,将C/C++源级别调试和嵌入式应用开发带入新的水平。IDE提供高度可视且自动化的框架,可以加速甚至是最复杂应用的开发,因此对于各种水平的开发人员来说,创建应用都是简单而便捷的。本文以CodeWarrior 5.1 IDE作为软件开发工具进行介绍。


CodeWarrior 5.1 IDE集成的处理器专家系统 (Processor Expert) 是一个专门针对S12 (X) 系列MCU内核和外设驱动程序开发的量产级自动代码生成图形化配置工具。


使用时,只需要在工程创建向导中使能使用Processor Expert选型 (默认为None,不使用) 即可创建处理器专家工程。MCU的每一个外设被称为一个组件 (component) , 用户按照自己的需求,从组件库中添加相应的组件即可对相应的外设进行图形化配置了,对CPU中断、系统时钟以及内存分配的配置则是在创建工程是默认添加的CPU组件中完成。在配置的过程中,处理器专家系统会自动检查各个外设资源配置之间的冲突,只有当所有外设配置正确时,才能正常生成代码。


每一个外设组件都有属性 (Property) 、方法 (methods) 、事件 (event) 和注释 (Comment) 四个选项,在属性中配置该组件对应外设的功能寄存器,比如MSCAN模块的时钟选择、波特率、ID滤波器设置、唤醒功能,中断使能等;在方法选项中,可以选择是否生产该组件工作相关的API函数 (只有正确配置了该API相关的属性之后才可以对该API进行配置) ;在事件选项中配置是否生产相应的中断回调函数及其函数名 (只有能够产生中断并且使能了该中断的组件才可以配置) ,注释选项用于对该组件的配置和使用进行说明,用户可以根据设计情况添加。

13.jpg

图 9. 处理器专家系统外设组件(FreescaleCAN)


在CPU组件中会多编译选项 (Build options) 和使用 (used) 两个选项,其中编译选项用于配置MCU的内存和链接文件 (prm) ,其中需要关心的是工程堆栈大小的配置; 使用选项用于配置片上资源是否用于处理器专家系统配置以及对具体被哪一个组件使用的统计。

14.jpg

图 10. 处理器专家系统CPU组件


每次编译工程时,处理器专家系统会自动更新和同步CPU和外设的配置,并维护自动生成的代码。每一个组件对于会生成一个以组件名命名的.c和.h文件,位于文件夹“Generated Code”下 (该文件夹下的代码用户不可以修改,每次生成代码时,都将自动覆盖) 。用户可编程的代码放在文件夹“User Module”下,其中main函数位于以工程名命名的.C文件中,event.h和event.c为中断回调函数 (call back function) , 是用户编写中断服务函数的地方,用户只需要在相应的中断回调函数中添加自己的中断处理代码即可完成中断处理,无需关心中断标志的清楚,因为处理器专家系统生成的中断ISR中已经将相应的中断标志清除。

15.jpg

图 11处理器专家系统自动生成代码后的工程目录


Tips:每个处理器专家组件都有详细的帮助文档,介绍其配置和使用,这里就不展开介绍了。


4.2  bootloader和应用程序内存分配及处理器专家系统配置


在bootloader工程中使用处理器专家系统配置外部8MHz晶振作为PLL参考时钟,配置PLL倍频输出50MHz作为CPU运行时钟,其二分配得到的25MHz作为总线时钟频率;MSCAN通信速率为500Kbit/s,使能接收中断。配置0xF000开始到0xFEFF的3.8KB空间作为bootloader存储空间,堆栈大小为256B,保留0x3000到0x3FFF的4KB空间作为NVM驱动代码的存储和运行空间并将其初始化为0。将默认的ROM_C000页地址改为0xC00E到0xEFFF,系统RAM空间为0x2000到0x2FFF。


在应用程序工程中,需要保留bootloader所在的Flash最后4KB空间,其余Flash空间全部可以被应用程序使用;对于RAM空间,则全部8KB都可以被用户使用。但必须保证其入口函数Entry_Point () 位于地址0xC00E (因为使用处理器专家系统配置生成的工程中,默认从0xC000开始放置默认中断服务函数Cpu_Interrupt () 和汇编软件延迟函数Cpu_Delay100US (), 其分别占2个字节和12个字节,然后才放置MCU复位中断服务函数_EntryPoint () ,如果在处理器专家系统的CPU组件中未使能和汇编软件延迟函数Cpu_Delay100US (), 则应将bootloader和应用程序中的应用程序入口地址由0xC00E改为0xC002) 。


Tips:如果通过从应用工程(user app project)的复位向量(本例中为0xEFFE)取出应用程序的复位函数地址,然后使用函数指针赋值跳转的方式进行应用程序跳转,则无需考虑应用工程中程序增加导致的复位函数地址变化问题。


#define APP_StartAddr (*(uint16_t*)0xEFFE)/*get the reset function address from app reset vector*/


typedef void (* Jump_Func)(void); /*define a void function pointer*/


(*(Jump_Func)(APP_StartAddr))(); /*jump to app _start*/

或者:

(*(void (*)(void))(APP_StartAddr))();/*jump to app _start*/


本文介绍的Bootloader和应用程序的内存分配如下:

16.jpg

图 12 .Bootloader和应用程序内存分配


使用处理器专家系统CPU组件的编译选项能够非常方便快捷的完成上述内存分配并生成prm链接文件, bootloader内存分配处理器专家系统配置结果如下所示:

17.jpg

图 13. bootloader内存分配处理器专家系统配置


处理器专家系统自动生成的相应链接文件如下 (其中蓝色高亮部分为PRM链接文件关键词或者系统保留段) :

18.jpg

 

Tips:关于CodeWarrior IDE的prm文件使用详解,请参考文章《CodeWarrior IDE使用tips之prm链接文件详解(自定义存储器分区以及自定义RAM数据初始化与在RAM中运行函数)》;

 

5. 总结

 

本文针对NXP公司的S12 (X) 系列汽车级MCU在汽车ECU应用中bootloader开发的实际需求,介绍了S12 (X) 系列MCU的片上非易失性存储器 (NVM) 资源极其驱动开发,提出并实现了一种基于CAN总线将NVM驱动程序由上位机下载到RAM中运行而非让其驻留于MCU片上Flash的安全bootloader设计,有效避免了应用程序跑飞运行至驻留于片上Flash的NVM驱动代码所造成的程序/数据丢失失效。借助于CodeWarrior 5.1 IDE中图形化外设配置和自动代码生成工具----处理器专家系统,便捷的实现了bootloader和应用程序的内存分配和片上外设配置。本设计给实际的工程应用提供了参考,客户在本设计的基础上,根据整车厂的要求修改CAN报文boot ID和命令,并增加相应的UDS或者CCP协议栈即可快速开发出符合车厂要求的安全bootloader产品。


Tips:本文中介绍的BootLoader开发host和app工程、S12G系列MCU的NVM SSD驱动安装包、上位机GUI软件以及详细的用户手册等,我已打包分享到如下百度云盘链接,供大家参考学习:


链接:http://pan.baidu.com/s/1i5N7EbN

密码:p5n6

19.jpg


下图为本文BootLoader用户手册截图:

20.jpg


参考文献


[1]. [德]康拉德·莱夫 (Konad Reif) 主编, 孙泽昌等译, BOSCH汽车电气与电子, 中文第二版. 2014.8.

[2]. AN3784.Understanding the Memory Scheme in the S12(X) Architecture, Application Note. . NXP Semiconductor, http://www.nxp.com.  2009.

[3]. MC9S12G Family Reference Manual, Rev.1.25. NXP Semiconductor, http://www.nxp.com. 2014.

[4]. Standard Software Driver for MC9S12G / MC9S12VR User’s Manual, Rev.3.1. NXP Semiconductor, http://www.nxp.com. 2012.