前言:
FLASH存储器的英文名称是"Flash Memory",一般简称为"Flash",它结合了ROM和RAM的长处,不仅具备电子可擦除可编程(EEPROM)的性能,还不会断电丢失数据同时可以快速读取数据(NVRAM 的优势)。过去的20年里,嵌入式系统一直使用ROM(EPROM)作为它们的存储设备,然而近年来Flash全面代替了ROM(EPROM)在嵌入式系统中的地位,用作存储Bootloader以及操作系统或者程序代码或者直接当硬盘使用(U盘),此专栏会有针对SPI的工作原理的详细介绍。
一、FLASH MEMORY 特性
1.1、包括代码闪存和数据闪存
1)代码闪存可以存储程序代码和数据,具有用户区和扩展区用户区。
2)数据闪存用于存储数据。
1.2、闪存编程方法
1)通过串行接口的闪存编程和用户对闪存的编程支持程序(自编程)。
1.3、支持BGO(后台地面操作)
1)BGO函数允许在数据闪烁时在代码闪存中执行程序正在编程/擦除内存。
1.4、闪存数据安全
1)支持安全功能,防止非法篡改或读取数据闪存。
2)支持保护功能,防止flash错误覆盖。
1.5、选项字函数
1)设置端口、WDTA、CVM和CAN FD CRC释放复位后的操作(支持)仅为溢价,和重置。
1.6、支持代码flash和数据flash中的ECC (error detection/ correcting)功能内存
1)内置ECC功能,可检测2位错误和检测/纠正1位错误。
1.7、可以在自编程模式下确认中断
二、FLASH MEMORY 存储器结构
2.1、代码Flash映射
下图说明了2 MB、1.5 MB、1 MB和768KB的代码闪存的映射设备。RH850/F1的代码flash的用户区分为8kb和32kb块,选择作为擦除的单位。一个单独的32 KB块也被合并为扩展块用户区。用户区和扩展用户区可作为存储用户程序的区域。
2.2、数据映射闪存
RH850/F1的数据闪存的数据区划分为64字节块作·除的一个单位。图显示了数据闪存的映射关系。
三、Flash相关的操作模式
下图是与闪存相关的模式转换示意图。
每种模式的可编程和可擦区域以及之后的启动程序复位释放。
项目 | 正常工作模式 | 用户启动方式 | 串行编程方式 |
可编程和可擦除区域 | 1、用户区 2、扩展用户区 3、数据区 | 1、用户区 2、数据区 | 1、用户区 2、扩展用户区 3、数据区 |
复位后启动程序释放 | 程序在用户区或扩展用户区(可以用变量重置向量) | 扩展用户区的程序。 (重置矢量为0100 0000H) | 串行固件程序编程 |
四、功能概述
RH850/F1的闪存可以通过串行接口通过专用闪存进行更新程序员(串行编程),在安装到目标系统或闪存适配器上之前系统。
此外,安全功能禁止更新写入闪存中的用户程序合并,这可以防止第三方篡改。
通过用户程序编程(自编程)适合于目标的应用程序系统程序在部署到最终用户后可能需要更新。安全的保护功能闪存的重写也包括在内。此外,支持自我编程期间的中断处理,因此编程可以与外部通信同时进行,等等,这允许在各种条件下进行编程。下表给出了编程方法及相应的操作方式。
编程的方法 | 描述 | 操作模式 |
串联处理 | 专用闪存编程器允许在设备安装到目标系统后对闪存进行板上编程。 | 串行编程方式 |
专用闪存编程器和专用编程适配器板允许闪存的板外编程,即在设备安装到目标系统之前对其进行编程。 | ||
自动编制程序 | 通过串行编程预先编写的编码闪存的用户程序也允许更新闪存。 后台操作能力使得当数据闪存是自编程时,在代码闪存中获取指令或以其他方式读取数据成为可能。 因此,可以通过执行写入代码闪存的程序来更新数据闪存。在自编程更新代码闪存时,无法获取代码闪存中的指令,也无法访问数据。在这种情况下,必须提前将更新程序转移到本地RAM并执行。 | 正常工作模式 用户启动方式 |
下表为FLASH的功能列表。专用的闪存编程器命令启用串行编程,而通过库函数或用户程序读取闪存则启用自编程。
功能 | 介绍 | 串行编程 | 自编程 |
效验空 | 这用于检查指定的块,以确保对它的写入尚未进行。从代码闪存和数据闪存读取结果不保证擦除后没有写入任何内容,因此使用空白检查来确认擦除后没有继续写入内存 | 支持 | 有条件支持 |
块擦除 | 擦除指定内存块的内容 | 支持 | 支持 |
程序设计 | 写到指定的地址 | 支持 | 支持 |
验证和校验 | 从闪存中读取的数据与从闪存寄存器传输的数据进行比较 | 支持 | 不支持 |
读 | 从闪存中读取的数据与从闪存寄存器传输的数据进行比较。已写入闪存的数据将被读出 | 支持 | 支持 |
设置OTP(一次性编程) | 为OTP设置指定的代码闪存块(OTP只能设置,也就是说,不可能释放块的OTP设置) | 支持 | 支持 |
ID设置 | 所述ID设置用于控制用于串行编程的专用闪存寄存器的连接,控制片上调试器,以及通过自我编程对代码闪存进行编程 | 支持 | 支持 |
安全设置 | 安全设置用于串行编程 | 支持 | 不支持 |
保护设置 | 提供了代码闪存块保护和变量重置向量的设置 | 不支持 | 支持 |
选项字设置 | 设置选项字节以更改RH850/F1的初始值 | 支持 | 支持 |
配置清除 | 初始化ID设置、安全设置、保护和选项字设置 | 支持 | 不支持 |
FLASH支持多种安全功能。
OTP设置和ID码认证是用于串行编程和自编程的安全功能。
在串行编程中,ID代码的身份验证、禁止连接专用闪存编程器和禁止命令(用于块擦除、编程和读取)都可作为安全功能使用。
FLASH支持的安全功能如下表:
功能 | 描述 |
OTP | OTP可以为用户区和扩展区的每个块单独设置。 用户区代码闪存。当对一个区域进行OTP设置时,禁止串行编程和自编程。 一旦设置,OTP设置不能被释放。此外,自从执行禁止在OTP的任何区域使用清除配置命令已设置,则不可能将安全设置从“禁止”更改为“允许”。 |
认证ID | 身份验证的结果可用于控制专用闪存编程器的连接进行串行编程。身份验证的结果也可以用来控制自编程的启用。 |
禁止连接专用闪存程序 | 禁止连接专用的闪存程序进行串行编程。由于在禁止连接专用闪存编程程序时也禁止执行配置清除命令,因此不可能将安全设置从“禁止”更改为“允许”。 |
禁止块擦除命令 | 禁止在串行编程时执行块擦除命令。当禁止块删除命令时,也禁止执行配置清除命令,因此不可能将安全设置从“禁止”更改为“允许”。 |
禁止编程 命令 | 禁止在串行编程时使用块擦除命令和编程命令。只有执行配置清除命令才能解除禁止。 |
禁止读命令 | 禁止在串行编程时读命令。只有执行配置清除命令才能解除禁止。 |
闪存支持多种保护功能。FLASH支持的保护功能如下表所示。
功能 | 描述 |
块保护 | 锁位设置可以单独进行,以启用或禁用编程和擦除代码闪存的用户区和扩展用户区的每个块。禁止对已设置锁定位并使能锁定位功能的区域进行编程和自编程擦除。当锁位功能在启用后被禁用时,编程或擦除可以再次进行。当一个代码块被擦除时,该块的锁位也被擦除 |
硬件保护 | FLMD0引脚上的级别可以设置为禁止编程和擦除代码闪存。 FLMD0 = 0:禁止编程 FLMD0 = 1:允许编程 |
变量重置矢量 | 保护设置包括对复位矢量的控制。如图所示,在编程一个新的引导程序而保留现有的引导程序之后,更改重置向量是一种安全的方法,可以将其更改到包含新的引导程序的区域。 可以使用重置向量指定的区域是用户区和扩展用户区 |
五、沟通方式的选择
在RH850/F1K中,通信方式可以通过FLMD0引脚的脉冲输入来选择(最多7脉冲)后转换到闪存编程模式。FLMD0脉冲是由专门的闪存寄存器生成的。
时钟周期的插入数量取决于通信方式,如下表格:
FLMD0 脉冲 | 通讯方式 |
0 | 双线程UART |
7 | 单线程UART |
3 | CSI |
出上述外 | 设置禁止 |
六、读FLASH寄存器
6.1、读取代码闪存
在正常模式下读取代码闪存不需要特殊设置。通过访问代码闪存中的地址,可以简单地读出数据。
从已擦除但尚未再次编程(即处于非编程状态)的代码闪存中读取代码会检测到ECC错误并生成相应的异常。
6.2、读取数据闪存
配置EEPRDCYCL寄存器在普通模式下从数据闪存读取数据之前的读取周期数。一旦正确配置了这个寄存器,就可以通过访问数据闪存中的地址来读取数据。
从已擦除但尚未重新编程的数据闪存中读取的值是未定义的。当需要确认某个区域处于非编程状态时,使用空白检查。
6.2.1、EEPRDCYCL -- 数据闪存等待周期控制寄存器
Bit position | Bit Name | Function | ||||
3 - 0 | WAIT | 等待周期数量 | ||||
WAIT | 数量 | CPU工作频率 | ||||
小于40MHZ | 40 - 80MHZ | 80 - 120MHZ | ||||
0000 | 1 | 可设置 | 禁止设置 | 禁止设置 | ||
0001 | 2 | 可设置 | 可设置 | 禁止设置 | ||
0010 | 3 | 可设置 | 可设置 | 可设置 | ||
0011 | 4 | 可设置 | 可设置 | 可设置 | ||
0100 | 5 | 可设置 | 可设置 | 可设置 | ||
0101 | 6 | 可设置 | 可设置 | 可设置 | ||
0110 | 7 | 可设置 | 可设置 | 可设置 | ||
0111 | 8 | 可设置 | 可设置 | 可设置 | ||
1000 | 9 | 可设置 | 可设置 | 可设置 | ||
其他 | 10 | 可设置 | 可设置 | 可设置 |
6.2.2、PRDNAMEn -- 产品名称存储登记册
Bit position | Bit Name | Function |
31 - 24 | PRDNAMEn | 产品名称第四个字节(PRDNAME1),第八个字节(PRDNAME2),第十二个字节(PRDNAME3) |
23 - 16 | PRDNAMEn | 产品名称第三字节(PRDNAME1),第七字节(PRDNAME2),第十一字节(PRDNAME3) |
15 - 8 | PRDNAMEn | 产品名称第二字节(PRDNAME1),第六字节(PRDNAME2),第十字节(PRDNAME3) |
7 - 0 | PRDNAMEn | 产品名称第一字节(PRDNAME1),第五字节(PRDNAME2),第九字节(PRDNAME3) |
七、选项字
闪存的选项字节是一个扩展区域,保存用户为各种目的指定的数据。由选项字节指定的外围模块等的初始设置在从重置状态释放时生效。
7.1、选项字配置
在将程序写入闪存之前,一定要设置与下面列出的可选函数相对应的选项字节区域。 选项字节指定的可选函数如下所示。
7.1.1、OPBT0 -- 选项字节0
Bit position | Bit Name | Function |
30 -29 | OPJTAG | 这些位控制端口组JP0的功能。 00: JP0用于通用/替代功能端口。 01: JP0用于LPD 4引脚模式。 10: JP0用于LPD 1引脚模式。 11: JP0用于Nexus I/F。 |
26 | WDT1_3 | 指定WDTA1的激活码方法。 0:固定激活码 1:可变激活码 |
24 | WDT1_1 | 指定WDTA1的启动模式。 0:软件触发启动方式 1:默认启动模式 |
23 | WDT1_0 | 启用或禁用WDTA1。 0:禁用WDTA1 1:启用WDTA1 |
22 | WDT0_3 | 指定WDTA0的激活码方法。 0:固定激活码 1:可变激活码 |
20 | WDT0_1 | 指定WDTA0的启动模式。 0:软件触发启动方式 1:默认启动模式 |
19 | WDT0_0 | 启用或禁用WDTA0。 0:禁用WDTA0 1:启用WDTA0 |
18 | WDT_2 | 控制WDTA0和WDTA1的溢出间隔时间 这些位指定WDTAnMD.WDTAnOVF[2:0]的重置值。 |
17 | WDT_1 | 控制WDTA0和WDTA1的溢出间隔时间 这些位指定WDTAnMD.WDTAnOVF[2:0]的重置值。 |
16 | WDT_0 | 控制WDTA0和WDTA1的溢出间隔时间 这些位指定WDTAnMD.WDTAnOVF[2:0]的重置值。 |
10 | CANFDCRC | CAN FD CRC协议 0:原始协议 1:新协议 |
9 | RESETOUTEN | RESETOUT控制 0:关闭复位 1:复位使能 |
5 | CVM_HD_EN | 高压监控器启用 0:关闭高压检测 1:开启高压检测 |
4 | CVM_LD_EN | 启用低压监控器 0:关闭低压检测 1:开启低压检测 |
7.1.1、OPBT1 -- 选项字节1
Bit position | Bit Name | Function |
31 - 10 | 无 | 写1 |
9 | 无 | 写0 |
8 - 0 | 无 | 写1 |