APP下载

基于S32R274的Bootloader开发与实现

2021-07-28王宇谭砚磊邹雄飞胡哲昊

现代信息科技 2021年2期

王宇 谭砚磊 邹雄飞 胡哲昊

摘  要:针对汽车ECU的Bootloader开发问题,使用恩智浦(NXP)S32DS IDE工具进行相关的开发与实现。作为汽车电子程序中需要运行的第一段代码,Bootloader的开发问题是该行业开发人员所面临的首要问题。恩智浦所提供的S32DS IDE工具,具有图形化的配置界面。通过该IDE工具,并基于恩智浦的S32R274芯片来详细说明关于此芯片的Bootloader开发与配置过程。并设计了一个简单的实验,以验证Bootloader是否成功跳转到应用程序中,用以说明整个基于此芯片的Bootloader的开发与配置。

关键词:汽车ECU;Bootloader;S32R274;NXP;S32DS IDE

中图分类号:TP311.11      文献标识码:A 文章编号:2096-4706(2021)02-0041-04

Abstract:Aiming at the problem of Bootloader development of automotive ECU,NXP(NXP)S32DS IDE tool is used to develop and implement it. As the first code to run in automotive electronic program,the development of Bootloader is the most important problem for developers in this industry. S32DS IDE tool provided by NXP has a graphical configuration interface. Through this IDE tool,and based on S32R274 chip of NXP,the development and configuration process of Bootloader about this chip are explained in detail. And a simple experiment is designed to verify whether the Bootloader can jump to the application successfully,which is used to explain the development and configuration of the whole Bootloader based on this chip.

Keywords:automotive ECU;Bootloader;S32R274;NXP;S32DS IDE

0  引  言

Bootloader是微處理器ECU非易失性存储器中的一段程序加载代码,每次ECU复位后都会运行Bootloader[1,2]。它会检查是否有来自通信总线的远程加载请求,如果有则进入Bootloader模式,建立与程序下载端的应用程序,解析其地址和数据代码,运行NVM(None ValitaleMomory——非易失性存储器)驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更新。如果没有来自通信总线的远程程序加载请求,则直接跳转到应用程序复位入口函数,运行应用程序[3-5]。

恩智浦针对自己研制的芯片开发了相对应的IDE工具,通过IDE工具可以初步实现对Bootloader的图形化配置,大大缩短了芯片开发周期,提高开发人员的工作效率。本文基于IDE工具和S32R274芯片来说明一个完整的Bootloader配置过程。

1  总体配置方案

为保证Bootloader正常运行,还要保证Bootloader能够正常启动和加载应用程序,就需要将Bootloader程序和应用程序放在不同的内存分区。

恩智浦S32R274芯片分为三个内核,其中Z4核属于启动核,Bootloader程序也主要在此启动内核中运行;外两个内核Z7_1/2核属于DSP核,主要用于应用程序的运行。在此芯片中,程序总是“从启动配置半字”(RCHW)开始运行,RCHW须放置在芯片的boot location块中,占用最开始的8个字节地址,MCU启动时,从boot location 0开始依次查找合法的RCHW,开始MCU的启动。此芯片存储器包含Flash和SRAM两个部分,这两部分存储器都具有写时读分区(Read-While-Write Partition,RWW),一个写时读分区的资源,在一个时刻只能被总线上的一个master访问。所以,在分配多核CPU的存储器资源时尽量不要跨写时读分区,以避免因访问冲突或延迟所带来的系统存储器访问效率低下。

1.1  存储器分配

在芯片中为内存块做了区分,确保不同的内存块运行时不会相互影响。需要将Bootloader程序和应用程序放置在不同的内存块中,便于应用程序从正确的地址进行启动和加载。

下文为S32R274芯片存储器分配:

(1)1个16 kB的UTest NVM Block,用于配置MCU加解密信息和存储芯片出场配置信息。

(2)4个16 kB的Data Flash Block,用于软件模拟EEPROM、存储数据以及存储用户代码。

(3)由2个16 kB CSE2 Flash Block、2个16 kB Flash Block0/1(boot location 0/1)、6个64 kB Flash Block2/3/4/5/6/7

(含boot location 2/3)组成的Boot Flash Block,以及由6个256 kB Flash Block8/9/10/11/12/13(含boot location 4/5/6/7)组成的Code Flash Block,总计2MB的Flash存储器。

SRAM由4个128 kB大小的分区和4个256 kB大小的分区组成,共计1.5MB。三个CPU内核分别被分配了64 kB大小的专有空间资源(D-MEM SRAM),总共192 kB的D- MEM SRAM[6]。

D-MEM SRAM为各内核中的专有资源可以保证多核间的运行不会相互干扰,还可以实现一些多核间的非同步操作。

1.2  S32RS IDE中新工程的Bootloader配置过程

用户可以在S32DSIDE中简化Bootloader的配置过程(该IDE提供了图形化的配置界面),通过配置向导创建一个空的Bootloader工程,然后还可以根据程序对资源的使用情况在此基础上再对内存块进行重新划分。

Bootloader内存空间配置中,默认芯片的三个CPU内核均分Flash和SRAM地址空间。

创建完成多核应用工程,在S32DS IDE的应用工程浏览窗口中,可以看到分别为S32R274的每一个CPU内核创建了一个应用工程。

其中,Z4_0为boot内核,其启动函数startup在其连接文件中指定到地址0x10000000。

MEMORY  //关键词MEMORY标识系统存储器分区

{

……

m_text :org = 0x1000000,len = 512K //主要代码区,起始地址0x10000000

……

}

SECTIONS

{

……

.startup : ALIGN(0x400) //启动段,使用关键词ALING进行1K字节对齐

{

__start = . ;

*(.startup)

} >m_text

……

}

每一个核心都对应一个链接文件,在进行不同核心的启动配置的时候,每个核心的启动位置须位于不同的boot location,用于确保程序之间的运行不会相互干扰。

以上代码段所在的链接文件指定了启动段,Z4核工程中的flashrchw.c文件要指定合法的启动配置半字和复位向量到链接文件指定的启动段中,用户还可以在此处修改Z4核应用工程的链接文件,将其放到其他的boot location。

externvoid_start(void);

#define ENTRY_POINT  _start //启动函数

……

const uint32_t __attribute__ ((section(".cpu0_reset_vector"))) RCHW2 = (uint32_t)ENTRY_POINT;//指定到启动配置半字段中

另外两个非启动核—Z7_1/2核的启动地址,由Z4内核应用工程main.c中的hw_init()函数通过初始化MC_ME.CADDR2.R和MC_ME.CADDR3.R两个硬件寄存器配置[7]。

defined(START_FROM_FLASH)

MC_ME.CADDR2.R = 0x1080000 | 0x1;//初始化MC_ME.CADDR2.R寄存器

defined(START_FROM_FLASH)

MC_ME.CADDR3.R = 0x1100000 | 0x1;//初始化MC_ME.CADDR3.R寄存器

上文给出了一个完整的Bootloader配置过程,通过该配置可以创建一个完整的空Bootloader工程。

2  软件设计

由IDE创建好Bootloader工程后,用户还可以对代码进行修改,可以自定義数据段和代码段。为保证自定义数据段和代码段可以正常初始化,需要对启动文件中的启动函数进行修改,用户可以在启动函数的.customize_data_section段和.bootloader_section段中添加自定义数据和代码。启动函数程序流程图如图1所示。

S32DS IDE调试编译工程可以生成对应的S19文件,S19文件以ASCII的形式存储数据,可以直接写入到MCU的Flash中。以S19文件中的几行数据为例,对文件格式进行说明,例如:

“S0290000533332523237345F426F6F746C6F616465725F4170704578616D706C65315F5A342E7372656380;

S315010000807C2103A67C2FF1207C2903A67C3043A684;

S70501000000F9”

S0,S格式文件的第一行数据,表示文件名(含路径)。

S3,地址为4个字节的一行数据,此类型的数据包含了程序内容。

S7,S格式文件的最后一行数据,表示程序的开始执行地址,此行表示程序的结束。

一个S19文件由一行S0类型的数据和、一行S7类型的数据以及若干S3类型的数据组成,S3类型的数据存储了文件的主要内容,以上述S3类型数据为例:

“S3”表示一条S3类型的数据。

“15”表示该条数据记录有0x15个字节(包括4字节地址、16字节数据、1字节校验和)。

“01000080”表示该条数据的目标地址。

“7C2103A67C2FF1207C2903A67C3043A6”表示该条数据的数据内容。

“84”表示这条数据的校验和。

3  Bootloader通信过程说明

用户调试板有两个CAN通信接口CAN 0和CAN 2,CAN 0接口用于接收上位机传输过来的S文件,主要用于与上位機的通信。CAN 2接口用于原始数据的传出,采集到的雷达回波信号通过CAN 2接口传输到数据采集的上位机软件中,进行后续的数据分析和处理。

下文给出了上位机与用户调试板之间的详细通信过程,将S文件写入到用户调试板MCU当中,以CAN通信的方式写入S文件:

(1)上位机发送ID=100,data=0xFF,持续发送该报文直至收到从机的响应ID=200,Data=0xC2。从机收到报文后通过MC_ME的模式转换产生复位,初始化完成,等待1ms的时间看是否有上位机的指定报文。

(2)从机再次收到报文,此时从机发送ID=200,Data=0xC2(Busy),其作用在于通知上位机,从机已经进入Bootloader模式,正在擦除Flash。

(3)从机发送ID=200,Data=0xC3,表示Flash擦除完成,进入准备状态。

(4)上位机发送ID=100,Data=0xFE,表示一行S19数据发送完成。从机发送ID=200,Data=0xC3,表示接收到的一行数据已经被写入Flash。

(5)上位机发送ID=100,Data=0xFD,表示整个S19文件发送完成。

(6)从机发送ID=200,Data=0xC1,表示所有数据写入完成,即将退出Bootloader,进入应用程序。

4  方案验证

为验证是否成功通过bootloader程序跳转到应用程序中,笔者在此芯片的Z7_1核主程序中编写了一段简单的测试代码。测试代码为:

while(1)

{

……

//测试代码

uint8_tarrData[64]={1,1,1,1,1,1,1,1};

mcal_mcanSend(0x1FF, The_Standard_Frame, 8, arrData);

……

}

此代码是通过CAN通道发射一串CAN信号到上位机的CAN信号输出窗口,将此段程序放到APP程序中,用来验证是否成功跳转到APP程序当中,如图2所示。

图2显示结果表明,本方案可以得到预期的输出结果,表明可以通过Bootloader程序成功启动应用程序。

5  结  论

本文详细介绍了采用S32DS IDE工具对恩智浦S32R274芯片的Bootloader的开发与配置过程,并验证了其是否可以成功启动应用程序,结果表明,Bootloader程序可以成功启动应用程序。

此IDE工具将Bootloader的开发过程图形化,使得开发人员可在开发过程中熟悉整个硬件结构,能够加快开发进程,降低开发人员初期开发的时间成本。特别是通过本文的讲解能够让基于恩智浦芯片开发的初学者对启动加载程序有一个基本的了解,使得初学者能够尽快上手。

本文提到的验证Bootloader是否成功启动应用程序的方法虽然很简单,但是对验证Bootloader是否成功运行和启动应用程序具有现实意义。当然验证方法并不局限于此,本文也仅仅是提出了一种验证思路。此外,基于S32R274芯片的完整的Bootloader开发过程对汽车电子相关开发人员也具有一定的参考和借鉴意义。

参考文献:

[1] 汪庆武,郇钲,黎泽清,等.基于SPI接口DSP程序引导加载方法设计与实现 [J].仪表技术,2016(5):6-8+18.

[2] 詹克旭.基于UDS协议的汽车ECU升级方案 [J].计算机应用与软件,2019,36(1):191-196+203.

[3] 刘坤,韩朝智.浅析基于ARM嵌入式开发的BootLoader设计及其实现 [J].电子技术与软件工程,2016(2):203-204.

[4] 张宇,张勤俭,沈海阔,等.基于TMS320DM642的Flash头文件烧写法的DSP二级BootLoader开发 [J].机电工程,2014,31(3):400-403+408.

[5] 王琦,黄悦鹏,邢正阳,等.基于CAN总线的Bootloader设计与实现[J].微型机与应用,2015,34(18):14-16.

[6] NXP Semiconductors.S32R274/S32R264 SeriesData Sheet [EB/OL].(2019-08-18).https://www.nxp.com.cn/docs/en/data-sheet/S32R274DS.pdf.

[7] NXP Semiconductors.S32R274/S32R264 Series ReferenceManual [EB/OL].(2020-06-26).https://www.nxp.com/webapp/sps/download/preDownload.jsp?render=true.

作者简介:王宇(1975—)男,汉族,四川成都人,副教授,硕士生导师,博士,研究方向:数字信号处理、图像处理;谭砚磊(1996—)男,汉族,山东潍坊人,硕士研究生在读,研究方向:嵌入式开发、雷达算法;邹雄飞(1979—)男,汉族,四川成都人,讲师,博士,研究方向:微波电路、无线通信、电磁场与波;胡哲昊(1997—)男,汉族,浙江金华人,硕士研究生在读,研究方向:图像处理。