<!-- 本文件由脚本自动转换生成，请勿手动编辑 -->

> **《LKS32MC09x User Manual》非易失性存储体** . 完整目录见 [README.md](README.md)
>
> **声明**：本文档由芯片用户手册自动转换生成，仅供检索与查阅参考。Markdown 格式可被自由编译、修改，本文档不构成正式技术文件，相关内容以凌鸥创芯官方网站正式发布的手册为准。
>
> 南京凌鸥创芯电子有限公司 . (C) 2023, 版权归凌鸥创芯所有 . 机密文件，未经许可不得扩散

# 非易失性存储体

## 概述

非易失性存储体包含两个部分:FLASH和ROM。

FLASH存储体包含两个部分:NVR和MAIN。NVR大小为1.5KB；MAIN有两个大小尺寸:64KB和128KB。

- FLASH存储体主闪存存储区（MAIN），包括应用程序和用户数据区
- FLASH信息存储区（NVR），预留给用户使用数据区

LKS32MC09x系列芯片，非易失性存储体包含两个型号:

- 型号1:1.5KB NVR，64KB FLASH
- 型号2:1.5KB NVR，128KB FLASH

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-1
非易失性存储体空间划分框图及型号

## 功能特点

非易失性存储体控制器，主要实现对FLASH存储体的相关操作；ROM存储体仅包含执行操作。具体包括:

- FLASH读取数据的操作，包括对NVR部分的读取和对MAIN部分的读取。
- FLASH写入数据的操作，包括对NVR部分的写入和对MAIN部分的写入。
- FLASH擦除操作，包括Full擦除和Sector擦除。NVR部分仅支持Sector擦除，MAIN部分支持Full擦除和Sector擦除。
- FLASH深度休眠的操作，以降低芯片的休眠功耗。
- FLASH存储体内容的加密操作。
- FLASH的读取加速操作，以提升芯片整体运行效率。
- FLASH控制寄存器的访问。
- ROM区域，仅可执行，不可拷贝。
- FLASH保护状态下，NVR的Sector 2（从0开始计算）支持读取，编程和擦除。

### 功能描述

非易失性存储体控制器，实现了对FLASH存储体的复位/读出/写入/擦除/休眠等操作。如下为控制状态转换图:

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-2
FLASH控制状态转换图

#### 复位操作

系统完成复位后，FLASH需要一段时间恢复。其目的是保证FLASH存储体内部的电路稳定。待稳定后，MCU才可对FLASH执行对应操作。此操作由硬件自动实现，无需软件干预。

#### 休眠操作

FLASH的休眠操作分成两个部分:Standby和Deep
Sleep。当系统不执行对FLASH的操作时，FLASH可自动进入StandBy状态（若开启预取，此功能失效）。当系统执行Deep
Sleep操作时，将触发FLASH也进入Deep
Sleep，实现降低功耗的目的。FLASH进入Deep
Sleep的操作，硬件自动完成，无需软件介入。

当外界唤醒系统，同时将唤醒FLASH。经过一段时间恢复后，FLASH可执行正常操作。此唤醒恢复操作，硬件自动完成，无需软件介入。

#### 读取操作

读操作为FLASH的基本操作。系统可通过两条路径访问FLASH内部的数据。

- MCU通过AHB总线，直接对FLASH执行取指、取数操作，宽度为32bit，且只能访问MAIN空间的数据。为了加快MCU的取指、取数据的速度，硬件提供了加速的功能。
- MCU通过AHB总线，访问控制器的寄存器，间接实现读取FLASH内部数据的操作。可以访问MAIN和NVR空间的数据；若执行连续读取操作，硬件可自动完成地址累加，无需每次都更新地址寄存器的值。

ROM不可被读取，仅可执行基本操作。系统只有一条路径访问ROM内部的数据

- MCU通过AHB总线，直接对ROM执行取指、取数操作，宽度为32bit。

FLASH_CFG.REGION位指示当前访问的是哪个空间。具体表格如下:

表7-1
FLASH访问空间分配表

|||
|---|---|
|FLASH_CFG.REGION|访问区域|
|0|MAIN区域|
|1|NVR区域|

访问本控制器的寄存器，实现间接读取FLASH内部数据的操作的执行流程如下:

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-3
FLASH间接读取操作流程图

#### FLASH编程操作

执行对FLASH存储体的编程操作。一般而言，我们先执行擦除操作，然后执行数据编程操作。同时，只能通过访问FLASH控制器的寄存器，实现编程操作。具体流程为:

- SYS_FLSP寄存器，写入0x8F35，开启编程使能开关1
- FLASH_CFG.PRG_EN写1，开启编程使能开关2
- FLASH_ADDR，写入编程地址
- FLASH_WDATA，写入编程数据

访问本控制器的寄存器，实现FLASH编程操作的执行流程如下:

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-4
FLASH模块编程操作流程图

为了防止FLASH区域被误编程，额外增加一组编程的使能开关--SYS_FLSP。SYS_FLSP保护FLASH，防止误编程。写入0x8F35，开启编程使能，再配置FLASH_CFG.PRG_EN，最终开启FLASH的编程功能。

系统工作频率的判断，需要参考SYS_CLK_CFG的配置。FLASH编程/擦除操作的绝对时间是固定的，FLASH控制器需要保存这些绝对时间对应的计数值。FLASH_CFG.TBS默认值是96MHz时钟频率下的计数值；当芯片工作在其他频率下时，需要配置FLASH_CFG.TBS的值，以实现48MHz和24MHz的计数值（其它频率暂不支持）。最终保证计数值的值×时钟频率等于恒定的时间。不同频率下对应的FLASH_CFG.TBS值，已经在FLASH_CFG寄存器列出。切记，FLASH_CFG.TBS仅能配置寄存器说明中提供的几组值，不能被写入其它值，否则可能导致FLASH编程/擦除失败。建议对FLASH_CFG的操作，执行先读回，然后按照或/与的方法操作。另外，在执行FLASH的编程/擦除操作时，CPU将暂停工作直至FLASH的编程/擦除操作完毕。

图7-4仅展示了一次编程的流程。若执行连续编程时，可以在写入FLASH_ADDR寄存器前，配置FLASH_CFG.ADR_INC，开启地址自动递增模式，后续只需要反复写FLASH_WDATA寄存器即可，FLASH_ADDR每次写入一次数据会自动增加0x4。连续读操作类似。连续编程的流程如下:

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-5
FLASH模块编程操作流程图

#### FLASH擦除操作

擦除操作为FLASH的基本操作。系统只能通过访问FLASH控制器的寄存器实现。具体流程为:

- SYS_FLSE寄存器，写入0x8FCA，擦除操作使能开关1
- FLASH_CFG.ERS_EN写1，擦除操作使能开关2
- FLASH_ADDR，写入擦除地址
- FLASH_ERASE，触发擦除操作

为了防止FLASH区域被误擦，额外增加一组擦除的使能开关--SYS_FLSE。SYS_FLSE保护FLASH，防止误擦，写入0x8FCA，开启擦除使能，再配置FLASH_CFG.ERS_EN，最终开启FLASH的擦除功能。

执行对FLASH存储体的擦除操作。擦除分成Sector和Full。分别对应，512Byte的擦除和32KB/64KB/128KB的擦除。通过配置FLASH控制寄存器决定执行哪一种类型的擦除操作。

下表为Secotor地址分配空间。

表7-2
FLASH Sector地址分配表

||||
|---|---|---|
|Name|Addresses|Size(Bytes)|
|Sector 0|0x0000 0000 - 0x0000 01FF|512|
|Sector1|0x0000 0200 - 0x0000 03FF|512|
|Sector2|0x0000 0400 - 0x0000 05FF|512|
|…|…|…|
|Sector127|0x0001 FE00 - 0x0001 FFFF|512|

NVR区域只能实现Sector擦除，NVR区域只有三个Sector(0/1/2)；MAIN区域可以实现Sector擦除和Full擦除。具体表格如下:

||||
|---|---|---|
|NVR（FLASH_CFG .REGION）|Sector Erase|Full Erase|
|0|Main区域|Main区域|
|1|NVR区域|Main区域|

FLASH擦除操作流程如下所示。

【图片已删除】为控制知识库体积，本文档不携带图片，相关图示请查阅凌鸥创芯官网发布的正式手册。

图7-6
FLASH模块擦除操作流程图

若选择Secotor擦除，需要通过FLASH_ADDR确定哪个Secotor被擦除，若是Full模式的话，FLASH_ADDR的值将失效。FLASH_ERASE写入0x7654DCBA触发擦除操作。

#### FLASH预取操作

因FLASH存储体的速度限制，无法达到96MHz的速度。对FLASH进行读取操作时，需要大于一个96MHz的时钟周期，才能完成数据的读出。为了加快数据的读出，FLASH控制器增加了预取功能。当FLASH控制器完成当前的读取操作后，在不影响正常程序执行的前提下，顺序预取下一个WORD的数据。预取操作的开启和关闭，只需要设置FLASH_CFG.PREF即可。

当系统频率降低到48MHz及以下，对FLASH进行读取操作，无需两个时钟周期的等待。此时，可以配置FLASH_CFG.WAIT为0，去掉一个额外的等待周期。切记，从高频调整到低频的时候，先调慢时钟，然后将FLASH_CFG.WAIT改成0；从低频调整到高频的时候，先将FLASH_CFG.WAIT改成1，然后再调快时钟。

#### 非易失性存储体保护

非易失性存储体加密保护，保护FLASH和ROM。因ROM只能执行，无法拷贝，已经处于保护状态且无法更改；本小节主要解释FLASH部分的保护。

FLASH保护的目的:防止外界非法获取FLASH的内容。

若FLASH存储体内的数据处于保护状态，用户可执行去保护操作；相反，若FLASH存储体内的数据处于去保护状态，用户可执行保护操作。默认情况下，FLASH存储体内的数据处于保护的状态。芯片上电复位完成后，硬件自动执行一次状态更新操作，若是保护状态则保持保护的状态，否则，变成去保护状态。

FLASH存储体有32KB、64KB和128KB，各自的最后一个WORD设计为保护字（32KB对应0x7FFC，64KB对应0xFFFC，128KB对应0x1FFFC）。当这个WORD内容为全1时，说明，
FLASH的内容无需保护，读取FLASH_PROTECT寄存器，完成状态更新即可；当这个WORD的内容被写为非全1时，说明，FLASH的内容需要保护。若需要保护，仅需要将最后一个WORD的内容，写入非全1的值，读取FLASH_PROTECT寄存器，完成状态的更新（读取FLASH_PROTECT返回值无意义），启动保护了。

去保护分成两种情况。若最后一个WORD没有执行过写入非全1的操作，读取FLASH_PROTECT寄存器，即完成状态更新（读取FLASH_PROTECT返回值无意义），解除保护。若最后一个WORD已经非全1，需执行擦除操作才能解除保护。先对FLASH执行擦除操作，将最后一个WORD恢复为全1值，然后读取FLASH_PROTECT寄存器，完成状态的更新，取消保护（读取FLASH_PROTECT返回值无意义）。

**在FLASH处于保护状态下，为了方便客户实现二次烧录等特殊应用需求。LKS32MC09x放开且仅放开了NVR区域的Sector
2，供客户访问操作，包括读取、编程和擦除。注意，只有FLASH处于保护状态下，此功能才有效。同时，执行此操作的时候，我们只能通过访问如下寄存器FLASH_NCFG/NADDR/NWDATA/NRDATA/NERASE/NKEY，实现此功能。**

具体流程为:

- SYS_FLSE寄存器，写入0x8FCA，擦除操作使能开关1
- SYS_FLSP寄存器，写入0x8F35，开启编程使能开关2
- 读取FLASH_PROTECT寄存器，确定FLASH处于保护状态
- FLASH_NKEY，写入特殊值（0x0000_000F），开启保护状态下对NVR Sector
  2的操作
- FLASH_NCFG，开启编程和擦除开关（若需要）
- FLASH_NADDR，写入编程或擦除地址
- FLASH_NERASE，实现对NVR Sector 2的擦除（若需要）
- FLASH_NWDATA，实现对NVR Sector 2的编程（若需要）
- FLASH_NRDATA，实现对NVR Sector 2的读取

**切记，此通路只能访问到NVR Sector 2，且一般访问完毕后，执行硬复位。**

#### FLASH在线升级(IAP)

IAP模式，实现中断向量表的重映射。在LKS32MC09x系列芯片中，包含了系统寄存器VTOR，其地址为0xE000_ED08。用于重新映射中断向量表入口地址。

表7-3 IAP
VTOR寄存器描述

|||||||
|---|---|---|---|---|---|
|名称|复位值|偏移|位置|权限|说明|
|VTOR|0x0||\[31:7\]|RW|执行写入操作，写入中断向量表入口地址|

默认值为0x0，此时中断向量表入口地址为0x0。当写入非0值时，中断向量表入口地址将映射到VTOR寄存器所对应的地址上，立即生效。读回时会右移7位。

在LKS32MC09x系列芯片中，因为有VTOR寄存器。用户可根据自己需求，更新整个FLASH的内容。在线升级过程中可以使用中断，也可以关闭中断。

##### 开启中断的在线升级

推荐软件配置流程:

关闭MCU的中断控制器，暂时不接收新的中断响应；

在新的中断入口地址处，放置中断处理函数代码；

将新的中断入口地址写入VTOR寄存器；

开启MCU的中断控制器，使能中断；

用户跳转至在线升级函数，开始在线升级功能；

完成升级，关闭MCU的中断控制器，配置VTOR为默认值0；

执行MCU软复位，系统PC重新从0地址开始执行升级后的程序；

##### 关闭中断的在线升级

关闭MCU的中断控制器，暂时不接收新的中断响应；

用户跳转至在线升级函数，开始在线升级功能；如果在线升级使用了类似UART的外设通讯，需要MCU轮询处理UART的中断标志位。

执行MCU软复位，系统PC重新从0地址开始执行升级后的程序；

##### 在线升级函数的位置

如果需要将FLASH全部擦除，则需要将在线升级函数放置在RAM中，如果需要使用中断则新的中断向量入口地址也需要位于RAM地址空间。

如果只需要擦除应用程序占用的部分FLASH区域，则可以将在线升级函数放置在FLASH高段地址的空闲区域，使用块擦除FLASH旧的应用程序，写入新的应用程序。

## 寄存器

### 地址分配

FLASH控制器模块寄存器的基地址是0x0002_0000寄存器列表

表7-4
FLASH控制器模块寄存器列表

||||
|---|---|---|
|名称|偏移|说明|
|FLASH_CFG|0x00|FLASH配置寄存器|
|FLASH_ADDR|0x04|地址寄存器|
|FLASH_WDATA|0x08|写数据寄存器|
|FLASH_RDATA|0x0C|读数据寄存器|
|FLASH_ERASE|0x10|擦除控制寄存器|
|FLASH_PROTECT|0x14|FLASH保护状态寄存器|
|FLASH_READY|0x18|FLASH工作状态寄存器|
|FLASH_SIZE|0x1C|FLASH容量状态寄存器|
|FLASH_NCFG|0x20|FLASH配置寄存器（保护状态下，针对NVR操作）|
|FLASH_NADDR|0x24|地址寄存器（保护状态下，针对NVR操作）|
|FLASH_NWDATA|0x28|写数据寄存器（保护状态下，针对NVR操作）|
|FLASH_NRDATA|0x2C|读数据寄存器（保护状态下，针对NVR操作）|
|FLASH_NERASE|0x30|擦除控制寄存器（保护状态下，针对NVR操作）|
|FLASH_NKEY|0x34|FLASH密钥寄存器（保护状态下，针对NVR操作）|
|FLASH_EPSM|0x38|FLASH Main区域Sector擦除保护寄存器|
|FLASH_EPSN|0x40|FLASH NVR区域Sector擦除保护寄存器|
|FLASH_LIB_ADDR|0x44|FLASH库代码起止Sector寄存器|

### FLASH_CFG 配置寄存器（推荐先读回，按或/与方式修改）

地址:0x0002_0000

复位值:0xC0

表7-5
FLASH_CFG配置寄存器

||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28||27||26|25|24||23|||22|21|20|19||18||17|16|
|ERS_EN||||PRG_EN||||||||ADR_INC||||||PREF|||||
|RW||||RW||||||||RW||||||RW|||||
|0||||0||||||||0||||||0|||||
|15|14|13|12||11||10|9|8||7|||6|5|4|3||2||1|0|
|ERS_TYPE||||REGION||||||WAIT|||TBS||||||||||
|RW||||RW||||||RW|||RW||||||||||
|0||||0||||||1|||0x40||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|ERS_EN|FLASH擦除使能。默认为0。0:关闭擦除1:开启擦除|
|\[27\]|PRG_EN|FLASH编程使能。默认为0。0:关闭编程1:开启编程|
|\[23\]|ADR_INC|FLASH地址递增使能。默认为0。0:关闭递增使能1:开启递增使能当执行FLASH连续读写访问时，可以开启此功能减少对地址的操作。|
|\[19\]|PREF|FLASH预取加速使能。默认为0。0:关闭加速1:开启加速|
|\[15\]|ERS_TYPE|FLASH擦除类型选择。默认为0。0:Sector1:Full|
|\[11\]|REGION|访问FLASH区域选择。默认为0。0:MAIN1:NVR|
|\[7\]|WAIT|读取FLASH数据，等待开关。默认为0。0:读取，等待一个周期1:读取，等待两个周期向\[10:7\]写入0xA，WAIT为0；写入其他值WAIT为1|
|\[6:0\]|TBS|编程/擦除时间基数寄存器,默认值为0x60。只能配成如下几个值0x60:96MHz系统频率下，FLASH编程/擦除时间基数配置值。0x47:72Mhz系统频率下，FLASH编程/擦除时间基数配置值。0x30:48Mhz系统频率下，FLASH编程/擦除时间基数配置值。0x17:24Mhz系统频率下，FLASH编程/擦除时间基数配置值。|

### FLASH_ADDR 地址寄存器

地址:0x0002_0004

复位值:0x0

表7-6
FLASH_ADDR地址寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||ADDR|||||||||||||||
||RW|||||||||||||||
||0|||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:15\]||未使用|
|\[14:0\]|ADDR|地址寄存器。读/写/擦除操作对应的地址寄存器。因按照WORD操作，最低两位会被FLASH控制器忽略。执行擦除操作时，需要根据擦除类型，地址需要对齐。一个Sector是512-Byte。若执行Sector擦除，地址需要是512的整数倍（若带偏移，偏移量会被忽略）。全芯片擦除，不会参考这个寄存器的值|

### FLASH_WDATA 写数据寄存器

地址:0x0002_0008

复位值:0x0

表7-7
FLASH_WDATA写数据寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|WDATA||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|WDATA||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|WDATA|执行写入操作，写入FLASH的值|

### FLASH_RDATA 读数据寄存器

地址:0x0002_000C

复位值:0x0

表7-8
FLASH_RDATA读数据寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|RDATA||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RDATA||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|RDATA|执行读取操作，读出FLASH的值|

### FLASH_ERASE 擦除控制寄存器

地址:0x0002_0010

复位值:0x0

表7-9
FLASH_ERASE擦除控制寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|ERASE||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|ERASE||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|ERASE|写入0x7654DCBA，触发擦除操作|

### FLASH_PROTECT 保护状态寄存器

地址:0x0002_0014

复位值:0x0

表7-10
FLASH_PROTECT保护状态寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|PROTECT||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|PROTECT||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|PROTECT|读取该寄存器，更新加密/解密状态读取返回值无参考意义。|

### FLASH_READY 工作状态寄存器

地址:0x0002_0018

复位值:0x0

表7-11
FLASH_READY工作状态寄存器

||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1||0|
||||||||||||||||READY||
||||||||||||||||RO||
||||||||||||||||0||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:1\]||未使用|
|\[0\]|READY|1:FLASH处于Idle状态；0:FLASH处于Busy状态|

### FLASH_SIZE 容量寄存器

地址:0x0002_001C

复位值:0x00

表7-12
FLASH_SIZE容量寄存器

||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9||8|7||6|5||4|3|2|1|0|
|||MASK3|MASK2|MASK1|MASK0|||||FLS_SIZE|||||||LIB_PRESENT|ROM_PRESENT|
|||RO|RO|RO|RO|||||RO|||||||RO|RO|
|||0|0|0|0|||||0|||||||0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:14\]||未使用|
|\[13\]|MASK3||
|\[12\]|MASK2||
|\[11\]|MASK1||
|\[10\]|MASK0||
|\[7:6\]|FLS_SIZE|FLASH容量寄存器，仅可读0:32KB1:64KB2:保留3:128KB|
|\[5:4\]||未使用|
|\[3:2\]||未使用|
|\[1\]|LIB_PRESENT|Flash存在不可读、可执行的库区域|
|\[0\]|ROM_PRESENT|Flash存在可读、可执行、但禁止擦除的ROM区域|

### FLASH_NCFG 配置寄存器（推荐先读回，按或/与方式修改）

地址:0x0002_0020

复位值:0x000000E0

表7-13
FLASH_NCFG配置寄存器

|||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28||27||26|25|24||23||22|21|20|19|18|17|16|
|ERS_EN|||||PRG_EN|||||ADR_INC||||||PREF||||
|RW|||||RW|||||RO||||||RW||||
|0|||||0|||||0||||||0||||
|15|14|13|12||11||10|9|8||7||6|5|4|3|2|1|0|
|ERS_TYPE||||REGION||||||WAIT||TBS||||||||
|RO||||RW||||||RO||RO||||||||
|0||||0||||||1||0x60||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|ERS_EN|FLASH擦除使能。默认为0。0:关闭擦除1:开启擦除|
|\[27\]|PRG_EN|FLASH编程使能。默认为0。0:关闭编程1:开启编程|
|\[23\]|ADR_INC|FLASH地址递增使能。默认为0。此寄存器，只能读取不能修改。0:关闭递增使能1:开启递增使能当执行FLASH连续读写访问时，可以开启此功能减少对地址的操作。|
|\[19\]|PREF|FLASH预取加速使能。默认为0。0:关闭加速1:开启加速|
|\[15\]|ERS_TYPE|FLASH擦除类型选择。默认为0。此寄存器，只能读取不能修改。0:Sector1:FULL|
|\[11\]|REGION|访问FLASH区域选择。默认为0。修改此寄存器，无论写入值是0还是1，最终，只能被强制写成1。0:MAIN1:NVR|
|\[7\]|WAIT|读取FLASH数据，等待开关。默认为1。此寄存器，只能读取不能修改。0:读取，等待一个周期1:读取，等待两个周期|
|\[6:0\]|TBS|编程/擦除时间基数寄存器,默认值为0x60。此寄存器，只能读取不能修改。0x60:96MHz系统频率下，FLASH编程/擦除时间基数配置值。0x47:72Mhz系统频率下，FLASH编程/擦除时间基数配置值。0x30:48Mhz系统频率下，FLASH编程/擦除时间基数配置值。0x17:24Mhz系统频率下，FLASH编程/擦除时间基数配置值。|

### FLASH_NADDR 地址寄存器

地址:0x0002_0024

复位值:0x0

表7-14
FLASH_NADDR地址寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||ADDR|||||||||||||||
||RW|||||||||||||||
||0|||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:15\]||未使用|
|\[14:0\]|ADDR|地址寄存器。读/写/擦除操作对应的地址寄存器。因按照WORD操作，最低两位会被FLASH控制器忽略。执行擦除操作时，需要根据擦除类型，地址需要对齐。一个Sector是512-Byte。若执行Sector擦除，地址需要是512的整数倍（若带偏移，偏移量会被忽略）。全芯片擦除，不会参考这个寄存器的值|

### FLASH_NWDATA 写数据寄存器

地址:0x0002_0028

复位值:0x0

表7-15
FLASH_NWDATA写数据寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|WDATA||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|WDATA||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|WDATA|执行写入操作，写入FLASH的值|

### FLASH_NRDATA 读数据寄存器

地址:0x0002_002C

复位值:0x0

表7-16
FLASH_NRDATA读数据寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|RDATA||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|RDATA||||||||||||||||
|RO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|RDATA|执行读取操作，读出FLASH的值|

### FLASH_NERASE 擦除控制寄存器

地址:0x0002_0030

复位值:0x0

表7-17
FLASH_NERASE擦除控制寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|ERASE||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|ERASE||||||||||||||||
|WO||||||||||||||||
|0||||||||||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:0\]|ERASE|写入0x7654DCBA，触发擦除操作|

### FLASH_NKEY 密钥寄存器

地址:0x0002_0034

复位值:0x0

表7-18 FLASH_NKEY密钥寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|||||||||||||KEY||||
|||||||||||||WO||||
|||||||||||||0||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:4\]||未使用|
|\[3:0\]|KEY|当FLASH处于保护状态时，无法通过SWD读取，编程和擦除FLASH。此时，用户可以对此寄存器写入特殊值（0x0000_000F），使能开关，配置FLASH_NCFG/NADDR/NWDATA/NRDATA/NERASE寄存器，对NVR Sector 2进行读取，编程和擦除。|

### FLASH_EPSM Main区域Sector 擦除保护寄存器

地址:0x0002_0038

复位值:0x0

表7-19 FLASH_EPSM FLASH
Main区域Sector擦除保护寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|31|30|29|28|27|26|25|24|23|22|21|20|19|18|17|16|
|EPS_255_248|EPS_247_240|EPS_239_232|EPS_231_224|EPS_223_216|EPS_215_208|EPS_207_200|EPS_199_192|EPS_191_184|EPS_183_176|EPS_175_168|EPS_167_160|EPS_159_152|EPS_151_144|EPS_143_136|EPS_135_128|
|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|EPS_127_120|EPS_119_112|EPS_111_104|EPS_103_96|EPS_95_88|EPS_87_80|EPS_79_72|EPS_71_64|EPS_63_56|EPS_55_48|EPS_47_40|EPS_39_32|EPS_31_24|EPS_23_16|EPS_15_8|EPS_7_0|
|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31\]|EPS_255_248|Main区域Sector 248~255擦除保护，0:可擦除，1:不可擦除|
|\[30\]|EPS_247_240|Main区域Sector 247~240擦除保护，0:可擦除，1:不可擦除|
|\[29\]|EPS_239_232|Main区域Sector 239~232擦除保护，0:可擦除，1:不可擦除|
|\[28\]|EPS_231_224|Main区域Sector 231~224擦除保护，0:可擦除，1:不可擦除|
|\[27\]|EPS_223_216|Main区域Sector 223~216擦除保护，0:可擦除，1:不可擦除|
|\[26\]|EPS_215_208|Main区域Sector 215~208擦除保护，0:可擦除，1:不可擦除|
|\[25\]|EPS_207_200|Main区域Sector 207~200擦除保护，0:可擦除，1:不可擦除|
|\[24\]|EPS_199_192|Main区域Sector 199_192擦除保护，0:可擦除，1:不可擦除|
|\[23\]|EPS_191_184|Main区域Sector 191_184擦除保护，0:可擦除，1:不可擦除|
|\[22\]|EPS_183_176|Main区域Sector 183_176擦除保护，0:可擦除，1:不可擦除|
|\[21\]|EPS_175_168|Main区域Sector 175_168擦除保护，0:可擦除，1:不可擦除|
|\[20\]|EPS_167_160|Main区域Sector 167_160擦除保护，0:可擦除，1:不可擦除|
|\[19\]|EPS_159_152|Main区域Sector 159_152擦除保护，0:可擦除，1:不可擦除|
|\[18\]|EPS_151_144|Main区域Sector 151_144擦除保护，0:可擦除，1:不可擦除|
|\[17\]|EPS_143_136|Main区域Sector 143_136擦除保护，0:可擦除，1:不可擦除|
|\[16\]|EPS_135_128|Main区域Sector 135_128擦除保护，0:可擦除，1:不可擦除|
|\[15\]|EPS_127_120|Main区域Sector 127_120擦除保护，0:可擦除，1:不可擦除|
|\[14\]|EPS_119_112|Main区域Sector 119_112擦除保护，0:可擦除，1:不可擦除|
|\[13\]|EPS_111_104|Main区域Sector 111_104擦除保护，0:可擦除，1:不可擦除|
|\[12\]|EPS_103_96|Main区域Sector 103_96擦除保护，0:可擦除，1:不可擦除|
|\[11\]|EPS_95_88|Main区域Sector 95_88擦除保护，0:可擦除，1:不可擦除|
|\[10\]|EPS_87_80|Main区域Sector 87_80擦除保护，0:可擦除，1:不可擦除|
|\[9\]|EPS_79_72|Main区域Sector 79_72擦除保护，0:可擦除，1:不可擦除|
|\[8\]|EPS_71_64|Main区域Sector 71_64擦除保护，0:可擦除，1:不可擦除|
|\[7\]|EPS_63_56|Main区域Sector 62_56擦除保护，0:可擦除，1:不可擦除|
|\[6\]|EPS_55_48|Main区域Sector 55_48擦除保护，0:可擦除，1:不可擦除|
|\[5\]|EPS_47_40|Main区域Sector 47_40擦除保护，0:可擦除，1:不可擦除|
|\[4\]|EPS_39_32|Main区域Sector 39_32擦除保护，0:可擦除，1:不可擦除|
|\[3\]|EPS_31_24|Main区域Sector 31_24擦除保护，0:可擦除，1:不可擦除|
|\[2\]|EPS_23_16|Main区域Sector 23_16擦除保护，0:可擦除，1:不可擦除|
|\[1\]|EPS_15_8|Main区域Sector 8~15擦除保护，0:可擦除，1:不可擦除|
|\[0\]|EPS_7_0|Main区域Sector 0~7擦除保护，0:可擦除，1:不可擦除|

FLASH_EPSM在上电时由硬件从NVR区域加载，软件只可读。NVR同时存储FLASH_EPSM的反码，如果NVR存储的原码与反码的反码不一致，则FLASH_EPSM对应位加载为0，允许Sector被擦除。

### FLASH_EPSN NVR区域Sector 擦除保护寄存器

地址:0x0002_003C

复位值:0x0

表7-20 FLASH_EPSN FLASH
NVR区域Sector擦除保护寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
||EPS_14|EPS_13|EPS_12|EPS_11|EPS_10|EPS_9|EPS_8|EPS_7|EPS_6|EPS_5|EPS_4|EPS_3|EPS_2|EPS_1|EPS_0|
|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|RO|
|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|

||||
|---|---|---|
|位置|位名称|说明|
|\[31:15\]||未使用|
|\[14\]|EPS_14|NVR区域Sector 14擦除保护，0:可擦除，1:不可擦除|
|\[13\]|EPS_13|NVR区域Sector 13擦除保护，0:可擦除，1:不可擦除|
|\[12\]|EPS_12|NVR区域Sector 12擦除保护，0:可擦除，1:不可擦除|
|\[11\]|EPS_11|NVR区域Sector 11擦除保护，0:可擦除，1:不可擦除|
|\[10\]|EPS_10|NVR区域Sector 10擦除保护，0:可擦除，1:不可擦除|
|\[9\]|EPS_9|NVR区域Sector 9擦除保护，0:可擦除，1:不可擦除|
|\[8\]|EPS_8|NVR区域Sector 8擦除保护，0:可擦除，1:不可擦除|
|\[7\]|EPS_7|NVR区域Sector 7擦除保护，0:可擦除，1:不可擦除|
|\[6\]|EPS_6|NVR区域Sector 6擦除保护，0:可擦除，1:不可擦除|
|\[5\]|EPS_5|NVR区域Sector 5擦除保护，0:可擦除，1:不可擦除|
|\[4\]|EPS_4|NVR区域Sector 4擦除保护，0:可擦除，1:不可擦除|
|\[3\]|EPS_3|NVR区域Sector 3擦除保护，0:可擦除，1:不可擦除|
|\[2\]|EPS_2|NVR区域Sector 2擦除保护，0:可擦除，1:不可擦除|
|\[1\]|EPS_1|NVR区域Sector 1擦除保护，0:可擦除，1:不可擦除|
|\[0\]|EPS_0|NVR区域Sector 0擦除保护，0:可擦除，1:不可擦除|

FLASH_EPSN在上电时由硬件从NVR区域加载，软件只可读。NVR同时存储FLASH_EPSN的反码，如果NVR存储的原码与反码的反码不一致，则FLASH_EPSN对应位加载为0，允许Sector被擦除。

FLASH_EPSN可以用于保护flash在NVR中的配置字。NVR存储的

### FLASH_LIB_ADDR 库代码区域寄存器

地址:0x0002_0040

复位值:0xFF

表7-21 FLASH_LIB_ADDR 库代码区域寄存器

|||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|15|14|13|12|11|10|9|8|7|6|5|4|3|2|1|0|
|LIB_END_SEC||||||||LIB_START_SEC||||||||
|RO||||||||RO||||||||
|0xFF||||||||0xFF||||||||

||||
|---|---|---|
|位置|位名称|说明|
|\[31:16\]||未使用|
|\[15:8\]|LIB_END_SEC|库代码终止Sector，0~255对应Sector 0~255|
|\[7:0\]|LIB_START_SEC|库代码起始Sector，0~255对应Sector 0~255|

FLASH_LIB_ADDR上电后由硬件由NVR加载，软件只可读。

LIB_START_SEC和LIB_END_SEC之间的Sector存放的代码和数据只允许区域内的代码进行读取，不允许调试时读取，不允许Flash其他区域或SRAM中运行的代码读取，也不允许DMA进行读取。LIB_START_SEC==0xFF且LIB_END_SEC==0xFF时，不启用库代码保护，其他值则启用保护。当LIB_START_SEC==
LIB_END_SEC，且LIB_START_SEC!=0xFF保护一个Sector。

库代码区域通常用于存放方案商的核心代码。启用库区域保护后，此区域代码只可执行和自我读取，不允许其他区域代码读取或调试读取。

为了防止终端客户改下NVR中存放的START_SEC和END_SEC数据，可以通过启用FLASH_EPSN对相应NVR区域进行擦除保护。注意，一旦FLASH_EPSN区域启用了NVR擦除保护，则此NVR
Sector将变为只读，无法再进行擦除修改。

