这篇文章给大家介绍一下STM32G0的FLASH模块。
STM32G0是支持指令缓存的,有16个字节的指令缓存,OTP区有1K字节,支持快速烧录、PCROP+安全存储区域和ECC纠错,安全存储区域目前只在H7和G0两个系列中存在。
STM32G0一个bank就嵌入了高达128KB的FLASH。FLASH接口管理所有访问存储保护,安全和选项字节编程。
运用优势:高性能低功耗、小的擦除粒度、短的烧录时间、安全和保护。
主要特性:
单bank高达128K字节;
2K字节的页面粒度;
快速擦除(22ms)和快速烧录时间(85µs双字);
预取指和指令缓存;
ECC纠错:每64位双字就有8位纠错码对应
单错误检测和纠错
双错误检测会产生一个NIMI中断
FLASH的组织结构如下:
一个主内存块包含64个页面,每个页面2K字节;
一个信息块包含:
为ST bootloader保留的系统内存
OTP(一次性可编程)1K字节(128双字)用于用户数据
OTP区域中的数据无法擦除,只能写入一次
选项字节用于用户配置;
闪存保持
FLASH加速器
黑色线最下面表示的是预取指关闭、cache关闭,它的性能是最低的;
蓝色线是预取指打开、cache打开的情况,它的性能是最好的。
由于预取指和缓存的关系,FLASH性能几乎和频率呈线性关系,在缓存和预取指都打开的情况下是支持2.23 CoreMark/MHz。
FLASH保护
读保护:当从SRAM启动或者选择Bootloader时,禁止通过调试接口(SWD)去访问FLASH/SRAM/备份寄存器。
专有代码保护:2个区域512字节粒度,用于保护特定代码区域免受任何读取或写入访问,代码只能被执行。
写保护:2个区域2K字节粒度,用于保护特定代码区域免受不必要的写访问和擦除。
安全存储区域:激活后,对安全存储区的任何访问都将被拒绝,从而产生总线错误。
禁止内核调试访问:在安全存储区中运行代码时,暂时停止调试访问。
用户选项字节
电源复位后,在OBL_LAUNCH位在FLASH控制寄存器中设置
用户选项字节(安全性)
Boot配置
BOOT_LOCK强制从Main FLASH启动,并且无论启动选项如何配置都可以强制从Main FLASH
启动。
中断
当出现操作结束、操作出错、读保护错误、写保护错误、大小错误、烧录序列错误等的时候
都会产生中断事件。
操作结束:当一个或多个闪存操作(烧录/擦除)成功完成时由硬件置位。
操作出错:当一个闪存操作(烧录/擦除)没有成功完成时由硬件置位。
读保护错误:当要读取的数据属于读保护的区域时(PCROP保护)由硬件置位。
写保护错误:当要擦除/烧录的地址属于闪存的写保护区域时(通过WRP、PCROP或RDP level 1设置),由硬件置位。
大小错误:当烧录或快速烧录序列中访问的大小时字节或半字时由硬件置位,只允许双字编
程。
烧录序列错误:当要烧录的双字地址在烧录之前包含与“0XFFFF FFFF”不同的值时,由硬件置位,除非要写入的数据位“0x0000 0000”。
烧录对齐错误:在标准烧录的情况下,如果要烧录的数据不能包含在相同的双字闪存中或者在快速烧录期间页面发生变化时由硬件设置置位。
快速烧录期间数据丢失错误:当新数据没有及时出现时,MISSERR位由硬件设置置位。
快速烧录错误:当快速烧录序列(由FSTPG激活)由于错误而被中断时由硬件设置置位。
ECC纠错:检测到并纠正1个ECC错误时由硬件设置置位。
ECC检测:检测到2个ECC错误时由硬件设置置位。
ECC检测出错时会产生一个不可屏蔽的中断。
低功耗模式
FLASH接口时钟可以在Run/LP Run/Sleep /LP Sleep模式下关闭,FLASH时钟的配置是在RCC寄存器,它默认是使能的。
在LP Sleep,LP Run和Stop模式,FLASH可以配置为Power-down模式。
各个低功耗模式下FLASH的状态