篆体字网 > 知识库

mpc软件

来源:篆体字网 2024-01-02 11:31:03 作者:篆字君

内容提要

引言

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等。

这里只是抛砖引玉,希望对大家有所帮助。

上一篇:c-tick认证

下一篇:北京广播电台

相关阅读