内容提要
引言
1. S32R274的系统功能框图和多核系统介绍
2. S32R274的存储器地址映射与使用Tips
3. S32R274的S32DS应用工程多核启动配置详解
4. Qorivva MPC57xx和S32R系列多核MCU bootloader开发要点详解
4.1 只需要为boot core CPU内核开发bootloader,因为每次MCU复位后,首先运行boot core CPU,然后再由其配置和使能非boot core内核;
4.2 运行在boot core内核的bootloader工程,需要启动配置半字(RCHW),可通过其链接文件(linker file)指定放置到MCU的Flash Boot Location区域,且必须保证在所有bootloader工程和应用工程地址空间分配中,bootloader的RCHW所在的boot location最小,推荐将bootloader的RCHW分配到MCU的boot location 0;
4.3 Flash分区时,bootloader与不同的多核APP工程之间不能跨Flash Block和RWW分区
4.4 bootloader到APP工程跳转时,使用硬件复位(推荐SWT看门狗复位)跳转至多核APP工程的boot core内核复位函数(通过将函数指针指向boot core内核的复位向量);
4.5 将多核APP工程编译生成的.S19/.HEX文件使用文本编辑器合并作为最终的下载文件
总结
引言
基于之前本公众号的技术分析文章(直接点击文章标题即可跳转阅读)《S32DS使用Tips--S32DS for Power V1.2 链接文件和启动过程详解》和《汽车电子ECU BootLoader开发之基于CAN总线通信的MPC574xP系列MCU bootloader开发详解》,很多读者想了解Qorivva MPC57xx和S32R系列MCU中的多核MCU的启动过程和bootloader开发细节;在此,本文就以S32R274这颗针对ADAS 77GHz雷达应用的多核MCU为例,为大家讲解一下。
1. S32R274的系统功能框图和多核系统介绍
S32R274是基于PowerPC e200z4和e200z7内核的多核MCU,其集成了1个最大运行频率为133MHz的双核锁步(LSP--Lock Step)的e200z4内核,作为系统的启动内核(boot core)和功能安全应用内核,以及2个可以独立运行最大工作频率为266MHz的e200z7高性能计算内核,当然为了支持77GHz雷达信号的实时处理,其还集成了一个NXP专门针对雷达信号处理开发的SPT--Signal Processing Toolbox,信号处理工具箱,以及带端到端的ECC(e2eECC--End to End ECC) 内部互联总线系统和带ECC的Flash和SRAM存储器,内核和外设模块的错误与失效收集与处理模块(FCCU),,从而在满足系统高性能工作的情况下,还可以实现汽车电子要求的ISO-26262 ASIL-D功能安全等级。其完整的的系统框图如下:
2. S32R274的存储器地址映射与使用Tips
S32R274的存储器地址映射如下表:
System memory map
Start Address
End Address
Size [KB]
Description
RWW Partition
SRAM Bank
Flash
0x00000000
0x003FFFFF
-
Reserved
-
UTest NVM Block
0x00400000
0x00403FFF
16
UTest Block
-
0x00404000
0x007FFFFF
-
Reserved
-
Data Flash
0x00800000
0x00803FFF
16
EEPROM Block 0
0
0x00804000
0x00807FFF
16
EEPROM Block 2
1
0x00808000
0x0080BFFF
16
EEPROM Block 1
0
0x0080C000
0x0080FFFF
16
EEPROM Block 3
1
0x00810000
0x009FFFFF
-
Reserved
-
Boot Flash Blocks
0x00A00000
0x00A03FFF
16
CSE2 flash block 0
4
0x00A04000
0x00A07FFF
16
CSE2 flash block 1
5
0x00A08000
0x00F97FFF
-
Reserved
0x00F98000
0x00F9BFFF
16
Flash Block 0 (boot location 0)
2
0x00F9C000
0x00F9FFFF
16
Flash Block 1 (boot location 1)
3
0x00FA0000
0x00FAFFFF
64
Flash Block 2 (boot location 2)
2
0x00FB0000
0x00FBFFFF
64
Flash Block 3 (boot location 3)
2
0x00FC0000
0x00FCFFFF
64
Flash Block 4
2
0x00FD0000
0x00FDFFFF
64
Flash Block 5
3
0x00FE0000
0x00FEFFFF
64
Flash Block 6
3
0x00FF0000
0x00FFFFFF
64
Flash Block 7
3
Code Flash Blocks
0x01000000
0x0103FFFF
256
Flash Block 8 (boot location 4)
6
0x01040000
0x0107FFFF
256
Flash Block 9 (boot location 5)
6
0x01080000
0x010BFFFF
256
Flash Block 10 (boot location 6)
6
0x010C0000
0x010FFFFF
256
Flash Block 11 (boot location 7)
7
0x01100000
0x0113FFFF
256
Flash Block 12
7
0x01140000
0x0117FFFF
256
Flash Block 13
7
Mirror Mid Flash Blocks
0x08F98000
0x08FFFFFF
-
mirrored from 0x00F98000 -0x00FFFFFF
-
Mirror Large Flash Blocks
0x09000000
0x0917FFFF
-
mirrored from 0x01000000 -0x0117FFFF
-
0x0A000000
0x3FFFFFFF
-
Reserved
-
SRAM
0x40000000
0x4001FFFF
128
SRAM
0
0x40020000
0x4003FFFF
128
SRAM
1
0x40040000
0x4005FFFF
128
SRAM
2
0x40060000
0x4007FFFF
128
SRAM
3
0x40080000
0x400BFFFF
256
SRAM
4
0x400C0000
0x400FFFFF
256
SRAM
5
0x40100000
0x4013FFFF
256
SRAM
6
0x40140000
0x4017FFFF
256
SRAM (overlay enabled)
7
0x50800000
0x5080FFFF
64
D-MEM core_0
-
0x50810000
0x5081FFFF
64
D-MEM core_1
-
0x50820000
0x5082FFFF
64
D-MEM core_2
-
其包含:
1个16KB的UTest NVM Block,用于配置MCU加解密信息和储存芯片出厂配置信息;
4个16KB的Data Flash Block,用于软件模拟EEPROM,储存用于数据或者亦可用于储存用户代码;
由2个16KB CSE2 flash block,2个16KB Flash Block0/1(boot location 0/1),6个64KB Flash Block2/3/4/5/6/7(含boot location 2/3)组成的Boot Flash Blocks,以及有6个256KB Flash Block8/9/10/11/12/13(含boot location 4/5/6/7)组成的Code Flash Blocks;总共2MB的Flash存储器;
SRAM分为有4个128KB小分区和4个256KB的大分区组成的1.5MB系统SRAM和分配给3个e200内核的64KB大小,总共192KB的D-MEM SRAM。
使用Tips:
1. e200内核的启动配置半字(RCHW)必须放置在CodeFlash的8个boot location,占用其最开始的8个字节地址(4B RCHW配置+4B reset vector),MCU启动时,从boot location 0开始依次查找合法的RCHW:
2. 无论Flash还是SRAM存储器都有写时读分区(RWW-Read-While_Write Partition),一个RWW分区的存储器资源,一个时刻只能被CrossBar总线的一个master访问。所以在分配多核CPU的存储器资源时,尽量不要跨RWW分区,以避免访问冲突和延迟,降低系统存储器访问效率;
3. D-MEM SRAM为各内核特有的访问资源,将其分配给对应的CPU内核作为其专有的存储器,比如其系统堆栈,可以有效防止多核间的相互干扰和非同步操作;
更多关于Qorivva MPC57xx和S32R系列多核MCU 储存器访问的技术细节和使用Tips,请参考本公众号之前的文章(直接点击文章标题即可跳转阅读):
《外设使用Tips之MPC57xx系列MCU C55 Flash模块详解及其SSD(标准软件驱动)使用》;
3. S32R274的S32DS应用工程多核启动配置详解
在S32DS for Power v2017.R1中,创建S32R274的应用工程,选择使能所有CPU内核:
3个CPU内核均分Flash和SRAM地址空间:
这样,就为S32R274创建好了多核应用工程,在S32DS for Power IDE的应用工程浏览器窗口中,可以看到以上过程为S32R274的每个CPU内核独自创建了一个应用工程:
其中,e200z4 CPU为boot内核,其启动函数startup在其连接文件中指定到0x1000000:
然后再通过e200z4内核的应用工程src/flashrchw.c指定合法的启动配置半字RCHW和e200z4内核的复位向量(启动函数_start)到上图中链接文件中为其保留的启动配置半字(RCHW)段中(address@0xFA0000),0xFA0000为S32R274的boot location 2,用户还可以修改e200z4内核应用工程的链接文件,将其放置到其他boot location:
另外两个非boot core--e200z7_0/1计算CPU内核的启动地址由e200z4内核应用工程main.c中的hw_init()函数通过初始化MC_ME.CADDR2.R和MC_ME.CADDR3.R两个硬件寄存器配置:
Tips:1. 多核MCU的MC_ME模块的CCTL2/3寄存器用于配置e200z7_0/1内核运行工作的模块,而CADDR2/3寄存器用于配置e200z7_0/1内核的启动地址,由于其仅取复位函数地址的高30-bit,所以该地址必须按32-bit(4字节)地址对齐;
2. 以上代码使用的条件编译宏定义TURN_ON_CPU1和TURN_ON_CPU2在创建多核应用工程时由IDE自动定义在多核工程的C编译器(C Compiler-->Preprocessor)和汇编器(Assembler-->Symbols)选项中全局定义:
多核MCU应用工程的汇编器编译选项设置:
其中,Z7_0 CPU内核的startup地址在0x1080000:
而Z7_1 CPU内核的startup地址在0x1100000:
Tips: 在多核工程中,如果修改了链接文件中Z7_0/1内核的地址分配,必须保证其m_text的地址与boot core内核中MC_ME.CADDR2.R和MC_ME.CADDR3.R两个硬件寄存器配置一致,才能正常启动和工作。
这里介绍的是多核MCU的启动配置,关于多核MCU的中断和异常配置,请参考以下文章(直接点击文章标题即可跳转阅读):
《外设使用Tips之Qorivva MPC56xx_57xx系列MCU内核异常(IVORx)与IRQ中断处理详解》;
4. Qorivva MPC57xx和S32R系列多核MCU bootloader开发要点详解
基于以上分析,我们在开发Qorivva MPC57xx和S32R系列多核MCU bootloader时,需要注意以下方面:
4.1 只需要为boot core CPU内核开发bootloader,因为每次MCU复位后,首先运行boot core CPU,然后再由其配置和使能非boot core内核;
在多核MCU中,每个CPU内核都可以访问MCU所有的片上Flash和SRAM储存器(各自内核的D-MEM SRAM除外),只需要在链接文件中将相应的地址分配好即可。
Tips:在创建多核MCU的bootloader工程时,只需要创建boot core内核的单核工程就好,在S32DS for Power应用工程创建向导的第二步只勾选boot core就可以了:
但是请注意,以上界面中可以调整每个CPU内核的Flash和SRAM大小,但不能调整boot core内核的起始地址,其默认为0x1000000,其属于Size=256KB的Flash Block 8(boot location 4), 其Flash Size较大,且boot location也不是最小,所以并不适合分配给bootloader工程使用,所以建议修改工程的链接文件将其分配到0xF98000开始Flash Block 0(boot location 0)开始的Flash地址空间(Flash size较小且包含boot location 0):
4.2 运行在boot core内核的bootloader工程,需要启动配置半字(RCHW),可通过其链接文件(linker file)指定放置到MCU的Flash Boot Location区域,且必须保证在所有bootloader工程和应用工程地址空间分配中,bootloader的RCHW所在的boot location最小,推荐将bootloader的RCHW分配到MCU的boot location 0;
将bootloader的RCHW分配到MCU的boot location 0可以保证每次MCU复位后,都首先运行bootloader,而不是其他代码。
4.3 Flash分区时,bootloader与不同的多核APP工程之间不能跨Flash Block和RWW分区
bootloader与APP工程占用不同的Flash Block,可以保证bootloader与APP的相互独立,提高APP升级效率;
bootloader与APP工程占用不同的Flash RWW分区,可以将bootloader中的Flash驱动放在Flash上直接运行,二无需将其拷贝/重映射到SRAM中运行;
4.4 bootloader到APP工程跳转时,使用硬件复位(推荐SWT看门狗复位)跳转至多核APP工程的boot core内核复位函数(通过将函数指针指向boot core内核的复位向量);
使用SWT timeout 的硬件复位跳转可以保证,运行APP工程之前,内核和外设处于复位状态,与单独运行APP程序时一致,从而避免出现跳转后外设模块初始化失败的情况(尤其是时钟模块,eg. PLL/ME等)。
4.5 将多核APP工程编译生成的.S19/.HEX文件使用文本编辑器合并作为最终的下载文件
由于多核APP工程为每一个CPU内核都创建了不同的应用工程,所以也会生产各自的编译结果(.map存储器映射文件、.elf二进制可执行调试文件和.S19/HEX/BIN编程文件)。
其中.S19和.HEX文件都是文本格式的,可以直接使用任意文本编辑器打开,然后将其中与Flash编程无关的行(比如S19文件的S0/S7/S8/S9行)去掉,拷贝到一个.S19/.HEX文件作为bootloader上位机的输入文件即可。
而.BIN文件仅包含编程数据,无编程地址,编程地址需要在编程时指定。所以在更新.BIN文件结果时,其编程地址根据各自内核的APP工程链接文件和map文件结果来决定。其为非文本文件,需要使用专门的阅读/编辑器才可以打开,比如Segger的编程软件J-Flash,或者VECTOR的hexviewer;
总结
本文虽然以S32R274和S32DS for Power为例介绍,但其中的多核启动配置和bootloader开发要点同样适用于Qorivva MPC57xx和S32R系列MCU中的其他多核MCU,比如MPC5748G和MPC5746R以及S32R372等。
这里只是抛砖引玉,希望对大家有所帮助。