基于CAN总线通信的MPC574xP系列MCU bootloader开发详解
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功能。
而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;
Tips:
A. 同一个系列的MCU,不同的part number其System RAM的大小有所不同,MPC574xP系列MCU的具体SRAM地址映射如下:
B. CPU内核访问局部存储器(Local memory)比系统RAM更加高效,而且在多核MCU中,每个内核的局部存储器(Local memory)只有其自身可以访问,所以一般将运行在该内核上的应用工程的堆栈分配到其局部存储器(Local memory)上,这样不仅提高了内核的运行效率,以避免了多核最存储器资源的访问冲突,当然,其也可以分配给应用工程的其他数据段使用,比如.data段或者.bss段等;
以下为多核MCU--MPC574xR系列的SRAM地址映射,其中多核CPU的Local Memory地址是分开独立的:
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块组成。其为系统保留区,用户不可编程;
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大小如下表:
属于不同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的地址):
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地址中
具体通过修改工程的链接文件实现如下:
默认S3DS for Power v1.2新建应用工程的链接文件如下,其为分配上述Flash Block以及用作模拟EEPROM的4个Flash Block(总共96KB):
因此,本文介绍bootloader工程和应用程序工程的存储器地址分配如下表:
2. Flash 驱动开发(下载安装和使用C55 Flash SSD)
本文介绍的bootloader使用NXP官网提供的MPC57xx C55FG Flash SSD(REV 1.1.0),大家可以在NXP官网www.nxp.com的搜索栏输入“c55_jdp_ssd.exe”下载安装:
在该SSD中提供了如下Flash驱动函数,其相应的功能如下表:
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):
并将block_mpc574xp.c中的UINT32 SKIP_BLOCK_IDX[SKIP_IDX_NUM]数组成员定义为0x2和0x3,这样就能够完成解保护和擦除bootloader之外的所有分配给应用程序的Flash block:
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引出。
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模块;
3.3 FlexCAN模块通信波特率配置
在本bootloader开发中配置MPC5744P的FlexCAN使用外部40MHz晶振作为时钟源,通过配置FlexCAN模块的控制寄存器1(CAN_CTRL1)为获得500Kbps的通信速率:
CAN_0.CTRL1.R = 0x0414C036;
FlexCAN模块的波特率计算公式如下:
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*/
配置接收独立屏蔽寄存器(CAN_RXIMRn)和接收消息邮箱(MB)将消息邮箱MB6设置为只接收ID=0x64的标准数据帧,即本bootloader设计上位机软件下载数据的CAN消息帧ID;
配置中断屏蔽寄存器1(CAN_IMASK1)使能MB6的接收中断:
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:
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*/
接收MB6收到的CAN消息报文。
调用API:CAN0_TransmitMsg(MB0,CAN_TxMsg);
使用查询方式用MB0发送CAN消息报文,以应答上位机软件。
Tips:将FlexCAN的接收ID滤波器设置为仅接收bootloader PC上位机软件下载数据使用的ID,可以避免CPU被其他无关ID的CAN报文中断,从而提高bootloader效率。
4. 上位机软件及CAN总线通信协议介绍
运行在PC上的上位机软件主要功能是读取目标MCU的应用程序S19文件,并调用USB转CAN总线适配器 (Adapter) ,将其逐行下载到目标MCU,其软件设计软件设计流程图如下:
本设计中,采用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消息命令定义如下:
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工程的软件流程图如下:
由前面1.3 MPC5744P CAN总线bootloader和应用程序存储器地址分配的介绍,根据Power e200内核的启动过程,应用程序工程的启动函数地址存放在0x00FA_0004地址,所以只需要将其取出并转换为函数指针运行即可跳转到应用程序了。
Tips:在bootloader跳转到应用程序之前,尽量将bootloader中使用到的外设恢复到其初始化状态/配置,并把所有RAM清一遍可以保证从bootloader跳转到应用程序时,其运行环境与单独下载运行应用程序尽量一致。以避免由bootloader带来的影响。
新建的S32DS for Power v1.2应用工程,编译链接后并不会生成S19文件,需要配置工程属性使能Create flash image:
选择Motorola S-record:
这样配置之后,重新编译应用工程就会在工程目录下的FLASH子目录下生成与工程同名的S19文件,其后缀默认为.srec,需要手动将其改为.s19:
在S32DS for Power v1.2自动生成的S19文件中,存在非8字节地址对齐的情况:
所以需要在下载之前使用其他软件(比如hexviewer),将其按8字节对齐:
比如在本例应用工程编译的S19文件中Block 1的长度就是0x1FE=510个字节,而Block 2的长度为0xF4=244字节都不是8字节对齐:
使用Hexviewer打开之后,菜单Edit-->Data Alignment,打开对齐配置窗口
在对齐设置窗口中,设置Segment alignment为8,Fill(填充)0xFF,Align使能:
另存为其他名字的即可:
对齐后的结果如下,可以看Block 1和Block 2都按照8字节对齐了。
6. 使用本文介绍的bootloader
6.1 基于DEVKIT-MPC5744P的测试硬件连接
本例基于DEVKIT-MPC5744P和吉阳光电的GY8507 USB-CAN Adapter开发和测试,相应的硬件连接如下图所示:
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),
并通过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,开始发送/下载;
最后,复位(按下外部复位按键SW3或者重新上电POR复位)DEVKIT-MPC5744P,则会开始更新测试应用程序:
更新完成后,MCU就会自动跳转到测试应用程序,这时可以看到板载的RGB LED灯被PIT中断toggle,红色和蓝色LED不断交替闪烁。
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