汽车电子expert成长之路

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

基于CAN总线通信的MPC574xP系列MCU bootloader开发详解

0
阅读(5933) 评论(0)

汽车电子ECU BootLoader开发之基于CAN总线通信的MPC574xP系列MCU bootloader开发详解

内容提要

引言

1. MPC5744P的bootloader和应用程序存储器地址分配

1.1 MPC574xP系列MCU的SRAM资源

1.2 MPC574xP系列MCU的Flash资源

1.3 MPC5744P CAN总线bootloader和应用程序存储器地址分配

2. Flash 驱动开发(下载安装和使用C55 Flash SSD)

3. FlexCAN驱动开发

3. 1 DEVKIT-MPC5744P CAN总线硬件设计

3.2 Qorivva MPC57xx系列MCU FlexCAN 模块功能简介

Qorivva MPC57xx系列MCU使用FlexCAN 模块进行CAN总线通信,其具有如下特性:

3.3 FlexCAN模块通信波特率配置

3.4 FlexCAN模块RX ID滤波器设置,中断设置以及驱动程序API介绍

4. 上位机软件及CAN总线通信协议介绍

5. bootloader程序流程介绍(解析S19文件、调用 Flash SSD编程应用程序以及跳转方法)

6. 使用本文介绍的bootloader

6.1 基于DEVKIT-MPC5744P的测试硬件连接

6.2 在DEVKIT-MPC5744P上测试本例bootloader

总结


引言


Qorivva MPC57xx系列汽车级MCU至21015年底开始产量到现在,被广泛使用于各种汽车电子ECU产品中,而汽车电子ECU中,越来越多的要求开发基于CAN总线通信的bootloader功能,以实现在线升级应用程序的功能,或者对接未来基于车联网的FOTA--Firmware Over-The-Air功能。

2.jpg

而Qorivva MPC57xx系列汽车级MCU相对来说,其外设功能模块更加复杂,片上集成的存储器--SRAM和Flas模块较之前的S12(X)系列MCU尺寸更大而且更加复杂,另外,其软件开发环境--S32DS for Power V1.0/1/2也是一个推出不到两年的新环境,用户相对不是和熟悉,这些因素都导致Qorivva MPC57xx系列汽车级MCU的bootloader具有一定的挑战。


基于以上考虑,作者基于Qorivva MPC57xx系列的C55 Flash SSD和S32DS for Power V1.2开发完成了MPC5744P的CAN总线bootloader,并在DEVKIT-MPC5744P上测试OK。


本文旨在以MPC574xP为例介绍MPC57xx系列MCU的bootloader开发流程和注意事项,希望对大家有所帮助。


Tips:关于汽车电子ECU bootloader开发的一般原理和注意事项,请参考之前的文章《汽车电子ECU bootloader开发要点详解》(直接点击跳转阅读);


1. MPC5744P的bootloader和应用程序存储器地址分配


1.1 MPC574xP系列MCU的SRAM资源


MPC574xP系列MCU的SRAM包含系统RAM(Syetem RAM)和内核局部存储器(Local memory)两种,在CPU内核寻址地址空间中的地址映射分配如下:


Syetem RAM: 地址0x4000_0000 ~ 0x4005_FFFF,最多384KB不同的part number大小不同;


Local momory:地址0x5080_0000 ~ 0x5080_FFFF, 全部part number均为64KB;

3.jpg

Tips:

A. 同一个系列的MCU,不同的part number其System RAM的大小有所不同,MPC574xP系列MCU的具体SRAM地址映射如下:

4.jpg

B. CPU内核访问局部存储器(Local memory)比系统RAM更加高效,而且在多核MCU中,每个内核的局部存储器(Local memory)只有其自身可以访问,所以一般将运行在该内核上的应用工程的堆栈分配到其局部存储器(Local memory)上,这样不仅提高了内核的运行效率,以避免了多核最存储器资源的访问冲突,当然,其也可以分配给应用工程的其他数据段使用,比如.data段或者.bss段等;


以下为多核MCU--MPC574xR系列的SRAM地址映射,其中多核CPU的Local Memory地址是分开独立的:

5.jpg

1.2 MPC574xP系列MCU的Flash资源


MPC57xP系列MCU的片上Flash包括16KB UTest Flash、96KB的Data Flash和多达2464KB的Code Flash以及相应的Mirror Flash:


UTest Flash:地址0x0040_0000 ~ 0x0040_3FFF,总共16KB,系统保留区,用户存放Flash和芯片配置信息等,比如UDF记录、ADC trim参数以及IRC trim值等;


Data Flash:地址0x0080_0000 ~ 0x0081_7FFF,总共96KB, 4个Block,占3个RWW分区,一般用作模拟EEPROM,当然不做模拟EEPROM使用时,也可以用于存放用户应用程序代码和数据;


Code Flash:包括416KB的Small and medium Flash块,地址0x00A0_0000 ~ 0x00A5_FFFF和最多2MB的Large Flash块,地址0x0100_0000 ~ 0x011F_FFFF,其默认用于存储用户应用程序代码和数据,如果需要,也可以将其用于模拟EEPROM。


Mirror Flash:该区域由地址0x08A0_0000 ~ 0x08A5_FFFF的384KB Small and medium code Flash的镜像Flash和地址0x9100_0000 ~ 0x911F_FFFF,最多2MB的Large Flash的镜像Flash块组成。其为系统保留区,用户不可编程;

6.jpg

MPC5744P总共有2.5MB片上Flash存储器,包括4个16KB的Low Flash Block(4*16KB = 64KB)、2个32KB的Mid Flash Block(2*32KB = 64KB)和6个64KB的High Flash Block(6*64KB = 384KB)以及8个256KB的 256KB Flash Block(8*256KB = 2MB):


            64KB + 64KB + 384KB + 2MB = 2.5MB


MPC5744P具体映射地址和Flash Block分配以及RWW分区和Block大小如下表:

7.jpg

属于不同RWW分区的Flash Block间支持Read-While-Read操作,即允许在A Flash Block的Flash驱动可以操作B Flash Block;地址0x80000~0x817FFF的96KB Flash空间包含 LowFlash Block0~1和Mid Flash Block0~1总共4个Flash Block被分配作为模拟EEPROM使用,在整个2.5MB的Flash地址空间中,只有Low Flash Block2~3, High Flash Block0~1和和256KB Flash Block0~3四个Flash Block可以作为启动位置(boot location0~7)。


所谓boot location就是每次MCU复位后运行BAM时寻找合法启动半字和复位向量的区域。复位后CPU将从boot location0~7依次查找由正取boot_ID--0x5A组成的合法复位配置半字(RCHW)(高16-bit为RCHW,低16-bit保留,位于所在Flash block的起始地址)和应用程序开始地址(32-bit复位向量,位于所在Flash block的起始地址偏移0x4的地址):

8.jpg

9.jpg


Tips:PowerPC e200zx系列CPU内核不同于其他MCU内核比如S08,S12(X)和ARM Cortex-M内核,其复位后最开始运行应用程序的地址--一般称作复位向量,并不放在中断或者异常向量表中,而是保持在boot location的Flash Block地址偏移0x4的位置,所以,我们开发基于PowerPC e200zx内核的Qorivva MPC57xx系列MCU的bootloader时,为了保证每次上电后,首先运行bootloader,就必须将bootloader的启动函数地址和正确的boot_ID一起放在比应用程序启动函数地址和正确的boot_ID驻留Flash Block更靠前/更小的boot location Flash Block中。


Tips:关于MPC57xx系列MCU的Flash模块功能介绍,请参考本公众号之前的文章《外设使用Tips之MPC57xx系列MCU C55 Flash模块详解及其SSD(标准软件驱动)使用》(直接点击跳转阅读);


1.3 MPC5744P CAN总线bootloader和应用程序存储器地址分配


鉴于以上介绍,本文介绍的bootloader设计将boot location 0和1所在的2个16KB Small Flash Block分配作为bootloader的存储空间,并将bootloader的启动配置半字和启动函数地址指定到其最开始的0x00F9_8000 ~ 0x00F9_8007地址中

10.jpg

具体通过修改工程的链接文件实现如下:

11.jpg

默认S3DS for Power v1.2新建应用工程的链接文件如下,其为分配上述Flash Block以及用作模拟EEPROM的4个Flash Block(总共96KB):

12.jpg

因此,本文介绍bootloader工程和应用程序工程的存储器地址分配如下表:

2.jpg

2. Flash 驱动开发(下载安装和使用C55 Flash SSD)


本文介绍的bootloader使用NXP官网提供的MPC57xx C55FG Flash SSD(REV 1.1.0),大家可以在NXP官网www.nxp.com的搜索栏输入“c55_jdp_ssd.exe”下载安装:

14.jpg

在该SSD中提供了如下Flash驱动函数,其相应的功能如下表:

15.jpg

Tips:


A. 关于MPC57xx系列MCU的C55 Flash模块及其SSD驱动使用,请参考本公众号之前的文章《外设使用Tips之MPC57xx系列MCU C55 Flash模块详解及其SSD(标准软件驱动)使用》(直接点击跳转阅读),这里就不展开介绍了。


B. 由以上1.3小节--MPC5744P CAN总线bootloader和应用程序存储器地址分配的介绍,本例中使用RWW分区1的32KBFlash(RWW分区仅有的32KB地址空间)作为bootloader存储空间,剩下的分配给应用程序的Flash地址空间都属于不同的RWW分区,所以可以将SDD保存在bootloader的Flash空间,并在上面直接运行Flash驱动函数擦除和编程应用程序Flash空间。

在SSD配置文件block_mpc574xP.h中将UNLOCK_LOW_BLOCKS定义为0x0000000C锁保护眼睛分配给bootloader工程的low Flash block 2和3,其余Flash block(UNLOCK_MID_BLOCKS和UNLOCK_HIGH_BLOCKS)为0--解保护防止其被意外擦除,并将SKIP_IDX_NUM定位0x2(2个block):


16.jpg

并将block_mpc574xp.c中的UINT32 SKIP_BLOCK_IDX[SKIP_IDX_NUM]数组成员定义为0x2和0x3,这样就能够完成解保护和擦除bootloader之外的所有分配给应用程序的Flash block:

17.jpg

C. 如果大家想要开发bootloader本身也可以更新的双boot模式bootloader,想要把Flash SSD放在SRAM中运行,可以参考本公众号之前的文章《S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》(直接点击跳转阅读)中介绍的如何将鱼护自定义代码段中的重定向函数自动拷贝到RAM中的方法不和步骤。


3. FlexCAN驱动开发


3. 1 DEVKIT-MPC5744P CAN总线硬件设计


本设计中使用DEVKIT-MPC5744P的FlexCAN0与上位机软件进行通信获取应用程序,其与板载的CAN收发器MC33901连接(默认使能),从P5引出。

18.jpg

3.2 Qorivva MPC57xx系列MCU FlexCAN 模块功能简介


Qorivva MPC57xx系列MCU使用FlexCAN 模块进行CAN总线通信,其具有如下特性:

  • 全功能实现BOSCH的CAN总线协议规范CAN 2.0B

    • 支持标准数据帧和远程帧;

    • 支持扩展数据帧和远程帧;

    • 0~8字节数据长度;

    • 可编程通信波特率,最高可达1Mbps:

    • 内容相关地址

  • 兼容ISO11898-1标准;

  • 0~8字节的灵活消息邮箱(MB-MailBox);

  • 每个消息邮箱(MB)可配置为发送或者接收,且均支持标准帧和扩展帧消息;

  • 每个消息邮箱(MB)拥有自己独立的RX掩码寄存器用于ID滤波;

  • 全功能的RX FIFO保存能力,可以支持最多6帧数据接收和自动内部指针处理;

  • 支持发送终止功能;

  • 可编程的时钟源选择,可以选择总线时钟或者外部晶振时钟;

  • 未使用的buffer RAM空间可以当做通用RAM空间;

  • 兼容监听模式;

  • 可编程的辉煌模式以支持自测操作;

  • 可编程的发送优先级调度策略:最小ID优先,最小缓冲优先或者最高缓冲优先;

  • 16-比特只有运行的时间戳;

  • 特定消息的全局网络时间同步;

  • 可屏蔽中断;

  • 发送媒介独立(外接收发器);

  • 高优先级的消息仲裁将拥有短的延迟时间;

  • 支持低功耗模式;

  • 也提供了一些重要的新功能:

  • 远程请求帧可以自动处理或者有软件处理;

  • CAN位时间设置和配置位只能在模块冻结(Freeze)模式下可写;

  • TX消息邮箱(MB)状态;

  • 接收报文帧的ID滤波器命中提示(IDHIT);

  • 在状态1寄存器中提供SYNCH位以指示模块已经于CAN总线同步;

  • 已发送报文的CRC状态;

  • 接收FIFI全局屏蔽寄存器;

  • 在匹配处理是可以选择消息邮箱优先级和接收FIFO;

  • 提供强大的接收FIFI ID滤波器,可以设置为128个扩展帧、256个标准帧或者512个部分(8-bit)ID ,以及32个独立ID的屏蔽能力;

  • 100%向前兼容老的FlexCAN模块;

19.jpg

3.3 FlexCAN模块通信波特率配置


在本bootloader开发中配置MPC5744P的FlexCAN使用外部40MHz晶振作为时钟源,通过配置FlexCAN模块的控制寄存器1(CAN_CTRL1)为获得500Kbps的通信速率:

CAN_0.CTRL1.R  = 0x0414C036;

2-1.jpg

20.jpg

FlexCAN模块的波特率计算公式如下:

21.jpg

22.jpg

3.4 FlexCAN模块RX ID滤波器设置,中断设置以及驱动程序API介绍


通过调用API函数:

CAN0_ReceiveInit(MB6, StandardFrame, DataFrame, 0x64,0xFFF);

/*receive only standard ID 0x64 for bootloader download CAN frame ID*/

23.jpg

配置接收独立屏蔽寄存器(CAN_RXIMRn)和接收消息邮箱(MB)将消息邮箱MB6设置为只接收ID=0x64的标准数据帧,即本bootloader设计上位机软件下载数据的CAN消息帧ID;


配置中断屏蔽寄存器1(CAN_IMASK1)使能MB6的接收中断:

24.jpg

CAN_0.IFLAG1.R  = 0x000000F0;/*clean the flags first*/

CAN_0.IMASK1.R  = 0x000000F0;


Tips:FlexCAN模块的每个MB的发送完成和接收数据ready中断都是由CAN_IMASK1/2中相应的一个比特位控制的,所以为了避免用于查询方式发送数据的MB在发送完成后也产生中断,需要将相应的MB中断使能位清零;


并配置中断优先级寄存器INTC_0.PSR[523]设置其中断优先级为3:

25.jpg

INTC_0.PSR[523].R = 0x8003;/*priority of FlexCAN0 BUF47 as 3*/


在MB4~7(共用同一个中断向量和ISR)的中断ISR中调用API:


CAN_RxMsg = CAN0_ReceiveMsg(MB6);/*copy the received CAN data into RAM*/

26.jpg

接收MB6收到的CAN消息报文。


调用API:CAN0_TransmitMsg(MB0,CAN_TxMsg);

27.jpg

使用查询方式用MB0发送CAN消息报文,以应答上位机软件。


Tips:将FlexCAN的接收ID滤波器设置为仅接收bootloader PC上位机软件下载数据使用的ID,可以避免CPU被其他无关ID的CAN报文中断,从而提高bootloader效率。


4. 上位机软件及CAN总线通信协议介绍


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

28.jpg

本设计中,采用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消息命令定义如下:

29.jpg

5. bootloader程序流程介绍(解析S19文件、调用 Flash SSD编程应用程序以及跳转方法)


每次MCU复位 (包括上电复位、看门狗复位、外部输入复位、低电压检测复位、时钟检测复位和非法地址) 之后,进行系统初始化,配置系统时钟、打开定时器、配置FlexCAN和用于状态指示的LED控制GPIO,打开CPU全局中断,然后等待上位机boot命令并检查是否超时:


如果在规定的500ms内接收到了上位机请求进入boot的命令,则接收数据并解析得到行地址和字对齐 (1word=2Byte) 的数据,接着判断S19行地址空间,

若是Flash地址且是第一次收到Flash数据,则将除bootloader程序之外的所有片上Flash擦除为编程应用程序做准备;对Flash地址的数据,在编程到Flash中之前,还必须将以上解析结果的地址和数据进行4字(8字节)对齐,以满足MPC57xx系列MCU C55 Flash对ECC的要求;


若是RAM地址,则无需擦除,直接将介绍到的数据写到指定RAM地址;


然后与上位机建立通信,逐行接收,解析并将结果烧写到相应地址的片上Flash/EEPROM/RAM中,直至整个应用程序S19文件结束,最后复位外设(关闭MSCAN)、清除全部系统RAM空间、关闭CPU全局中断,禁止所有外设中断,结束bootloader跳转至应用复位函数开始执行应用程序;


如果在规定的500ms内未收到上位机通过CAN发来的进入boot命令,则直接关闭CPU全局中断,禁止所有外部中断,结束bootloader跳转至应用复位函数开始执行应用程序。


整个bootloader工程的软件流程图如下:

30.jpg

由前面1.3 MPC5744P CAN总线bootloader和应用程序存储器地址分配的介绍,根据Power e200内核的启动过程,应用程序工程的启动函数地址存放在0x00FA_0004地址,所以只需要将其取出并转换为函数指针运行即可跳转到应用程序了。

31.jpg

Tips:在bootloader跳转到应用程序之前,尽量将bootloader中使用到的外设恢复到其初始化状态/配置,并把所有RAM清一遍可以保证从bootloader跳转到应用程序时,其运行环境与单独下载运行应用程序尽量一致。以避免由bootloader带来的影响。


新建的S32DS for Power v1.2应用工程,编译链接后并不会生成S19文件,需要配置工程属性使能Create flash image:


32.jpg

选择Motorola S-record:

33.jpg

这样配置之后,重新编译应用工程就会在工程目录下的FLASH子目录下生成与工程同名的S19文件,其后缀默认为.srec,需要手动将其改为.s19:

34.jpg

在S32DS for Power v1.2自动生成的S19文件中,存在非8字节地址对齐的情况:

35.jpg

所以需要在下载之前使用其他软件(比如hexviewer),将其按8字节对齐:

比如在本例应用工程编译的S19文件中Block 1的长度就是0x1FE=510个字节,而Block 2的长度为0xF4=244字节都不是8字节对齐:

36.jpg

使用Hexviewer打开之后,菜单Edit-->Data Alignment,打开对齐配置窗口

37.jpg

在对齐设置窗口中,设置Segment alignment为8,Fill(填充)0xFF,Align使能:

38.jpg

另存为其他名字的即可:

39.jpg

对齐后的结果如下,可以看Block 1和Block 2都按照8字节对齐了。

40.jpg

6. 使用本文介绍的bootloader


6.1 基于DEVKIT-MPC5744P的测试硬件连接


本例基于DEVKIT-MPC5744P和吉阳光电的GY8507 USB-CAN Adapter开发和测试,相应的硬件连接如下图所示:

41.jpg


42.jpg


6.2 在DEVKIT-MPC5744P上测试本例bootloader


按照上图连接好电脑和硬件之后,


首先,下载本文文末提供的百度云盘分享,将MPC5744P_CAN_Bootloader_and_APP_two_in_one_package_DEKIT-MPC5744P_test_OK_2017.11.09.zip包含的bootloader和测试应用工程导入到S32DS for Power V1.2中(通过菜单File-->Import..-->General-->Existing projects inti workspace),

43.jpg

44.jpg


并通过DEVKIT-MPC5744P板载的OpenSAD调试器将MPC5744P_CAN_Bootloader工程下载到DEVKIT-MPC5744P中;


然后,打开基于吉阳光电的GY8507 USB-CAN Adapter开发的上位机软件下载测试应用工程S19文件:


Step1:下拉选择通信波特率--500Kbps;

Step2:点击“Open driver”打开GY8507 USB-CAN Adapter;

Step3:点击“Send File...”选择已经8字节对齐的测试应用工程--MPC5744P_CAN_Bootloader_APP_LED_Toggle的S19文件--MPC5744P_CAN_Bootloader_APP_LED_Toggle_Align_8.s19,开始发送/下载;

45.jpg


最后,复位(按下外部复位按键SW3或者重新上电POR复位)DEVKIT-MPC5744P,则会开始更新测试应用程序:


更新完成后,MCU就会自动跳转到测试应用程序,这时可以看到板载的RGB LED灯被PIT中断toggle,红色和蓝色LED不断交替闪烁。

46.jpg


Tips:在下载过程中,在刚开始的时候,会出现如下暂停界面,原因是bootloader在对MPC5744P的片上Flash进行擦除,故花费较长时间,期间上位机暂停下载数据,等待其擦除完成。


总结


本文系统全面的介绍了MPC5744P的CAN总线bootloader开发,并对其中的Flash驱动、FlexCAN配置和存储器地址空间划分以及bootloader向应用程序跳转等开发难点进行详解,并给出了在DEVKIT-MPC5744P demo板上测试和验证的方法和步骤。


虽然是针对MPC5744P系列MCU的bootloader开发实例,但对其他MPC57xx系列MCU的bootloader开发同样具有参考意义。


我已将本文中介绍的bootloader工程和测试APP应用工程以及匹配的上位机软件分享到如下百度云盘,大家可以下载参考学习,希望对大家有所帮助。


链接: https://pan.baidu.com/s/1slDOwET;

密码: xbtf