目录
2.4.1 Code Flash和Data Flash的最小编程单元
RH850-U2A16是瑞萨(Renesas)公司针对汽车域控制器推出的一款MCU芯片,功能强大,资源丰富。本系列文章将详细介绍RH850-U2A16芯片,本文为RH850-U2A16 RAM和Flash介绍。
表1:RH850-U2A芯片RAM资源表
用户可使用的RAM有两类:
LRAM(Local RAM): 共4个,每个64KB大小,每个CPU有一个。
CRAM(Cluster RAM): 共4块CRAM,Cluster RAM0:512KB, Cluster RAM1:512KB, Cluster RAM2: 2M, Cluster RAM3:256KB?
表2:LRAM和CRAM的起始地址
RH850-U2A16芯片有4个核,每个核有一个LRAM,所有的核共享CRAM。LRAM的读写速度要快于CRAM。
不管LRAM还是CRAM,在使用前都需要进行初始化,如果使用没有初始化的RAM空间,读数据时可能产生ECC校验错误。
为什么说可能产生ECC校验错误? -- 因为ECC校验类似CRC校验,每四个字节产生ECC校验数据,ECC校验数据在写RAM数据时写入,ECC校验在读RAM数据时发生。所以,如果我们在初始化阶段没有对RAM进行初始化,但是我们在使用未初始化的RAM空间时是按4字节数据操作写入的话,在读数据时也是4字节数据读出来,就不会产生ECC校验错误。
RAM初始化一般在系统启动阶段(跳到main函数之前)通过汇编代码完成。
软件复位(非冷启动,Power On Reset)系统重启后,没有初始化的RAM中数据还保存上一次的值。
车载项目中ECU内部跑的代码是不带Flash擦写驱动的(升级时外部导入),如果ECU系统本身还没有外挂EEPROM的话(无Flash驱动也就是意味着不能写片内Flash,无外挂EEPROM,也就是意味着整个系统无可用的ROM),我们可以利用1.4中RAM不初始化复位后记忆数据的特性存储升级标志。
ECU内存布局设计(Memory Layout)的时候,在给函数调用栈(Stack)的头尾预留合适的冗余RAM,这样在发生栈溢出的时候还能一定程度上防止改成其他重要的RAM数据。同时在设计栈监控(stack monitor)程序的时候也能排上用场。
图2:栈冗余RAM
表3:RH850-U2A芯片Flash资源表
CFlash(Code Flash): 16M
DFlash(Data Flash): 576KB的Data Flash == 512KB User Area + 64KM专门用于ICUMHA(Intelligent Cryptographic Unit)
表4:CFlash和DFlash的起始地址
顾名思义,CFlash一般用于存储代码,DFlash一般用于存储数据。CPU指令可以从CFlash,LRAM,CRAM中取(运行程序),但是不能从DFlash中取。
DFlash起到片内EEPROM的作用,一般用来存储一些下电需要保存的Flag。
图3:Flash的读写单元
Code Flash最小的编程单元是512字节,Code Flash一般用来存储代码,Code Flash可以运行代码(其实就是从Code Flash中取指令)。
Data Flash最小的编程单元是4字节,Data Flash一般用来存储非易失数据,Data Flash不可以运行代码。
Flash的擦写驱动不允许出现在量产的产品软件当中,升级时通过UDS升级协议存储到ECU RAM当中,完成升级后RAM被重新初始化,Flash擦写驱动被清楚,防止产品软件被异常擦除。
RH850-U2A16的Flash驱动需要通过读写Flash控制及状态寄存器,发送FACI(Flash Application Command Interface)命令来实现。
Note: RH850-U2A16的Flash驱动的具体编写请关注本公众号的后续文章!
图4:FACI编程命令
图4:FACI块擦除流程图
项目开发初期,就会对项目使用Memroy进行内存划分(Memroy Layout),包括Bootloader存储区,APP代码存储区,标定数据区,栈区等。这些逻辑逻辑区的物理载体就是芯片的RAM和Flash,所以熟悉一款芯片的RAM和Flash对于底层开发的工程师来说也非常的重要。