STM32-Flash做为存储器储存数据

2020-03-25来源: eefocus关键字:STM32-Flash  存储器  储存数据

说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。


自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。


FLASH分类  
根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。  系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoader,然后锁死,用户是无法改变这个区域的。 选项字节存储芯片的配置信息及对主存储块的保护信息。   

FLASH的页面  
STM32的FLASH主存储块按页组织,有的产品每页1KB,有的产品每页2KB。页面典型的用途就是用于按页擦除FLASH。从这点来看,页面有点像通用FLASH的扇区。

STM32产品的分类  
STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。  
小容量产品主存储块1-32KB,     每页1KB。系统存储器2KB。 
中容量产品主存储块64-128KB,   每页1KB。系统存储器2KB。 
大容量产品主存储块256KB以上,  每页2KB。系统存储器2KB。 
互联型产品主存储块256KB以上,  每页2KB。系统存储器18KB。 

对于具体一个产品属于哪类,可以查数据手册,或根据以下简单的规则进行区分:  
STM32F101xx、STM32F102xx 、STM32F103xx产品,根据其主存储块容量,一定是小容量、中容量、大容量产品中的一种,STM32F105xx、STM32F107xx是互联型产品。  

互联型产品与其它三类的不同之处就是BootLoader的不同,小中大容量产品的BootLoader只有2KB,只能通过USART1进行ISP,而互联型产品的BootLoader有18KB,能通过USAT1、4、CAN等多种方式进行ISP。小空量产品、中容量产品的BootLoader与大容量产品相同。

关于ISP与IAP 
ISP(In System Programming)在系统编程,是指直接在目标电路板上对芯片进行编程,一般需要一个自举程序(BootLoader)来执行。ISP也有叫ICP(In Circuit Programming)、在电路编程、在线编程。 IAP(In Application Programming)在应用中编程,是指最终产品出厂后,由最终用户在使用中对用户程序部分进行编程,实现在线升级。IAP要求将程序分成两部分:引导程序、用户程序。引导程序总是不变的。IAP也有叫在程序中编程。 ISP与IAP的区别在于,ISP一般是对芯片整片重新编程,用的是芯片厂的自举程序。而IAP只是更新程序的一部分,用的是电器厂开发的IAP引导程序。综合来看,ISP受到的限制更多,而IAP由于是自己开发的程序,更换程序的时候更容易操作。

FPEC 
FPEC(FLASH Program/Erase controller 闪存编程/擦除控制器),STM32通过FPEC来擦除和编程FLASH。FPEC使用7个寄存器来操作闪存: 


FPEC键寄存器(FLASH_KEYR)          写入键值解锁。 
选项字节键寄存器(FLASH_OPTKEYR)   写入键值解锁选项字节操作。 
闪存控制寄存器(FLASH_CR)          选择并启动闪存操作。 
闪存状态寄存器(FLASH_SR)          查询闪存操作状态。 
闪存地址寄存器(FLASH_AR)          存储闪存操作地址。 
选项字节寄存器(FLASH_OBR)         选项字节中主要数据的映象。 
写保护寄存器(FLASH_WRPR)          选项字节中写保护字节的映象。


键值 
为了增强安全性,进行某项操作时,须要向某个位置写入特定的数值,来验证是否为安全的操作,这些数值称为键值。STM32的FLASH共有三个键值: 
      RDPRT键 = 0x000000A5  用于解除读保护 
      KEY1    = 0x45670123  用于解除闪存锁 
      KEY2    = 0xCDEF89AB  用于解除闪存锁

闪存锁 
在FLASH_CR中,有一个LOCK位,该位为1时,不能写FLASH_CR寄存器,从而也就不能擦除和编程FLASH,这称为闪存锁。 


当LOCK位为1时,闪存锁有效,只有向FLASH_KEYR依次写入KEY1、KEY2后,LOCK位才会被硬件清零,从而解除闪存锁。当LOCK位为1时,对FLASH_KEYR的任何错误写操作(第一次不是KEY1,或第二次不是KEY2),都将会导致闪存锁的彻底锁死,一旦闪存锁彻底锁死,在下一次复位前,都无法解锁,只有复位后,闪存锁才恢复为一般锁住状态。 


复位后,LOCK位默认为1,闪存锁有效,此时,可以进行解锁。解锁后,可进行FLASH的擦除编程工作。任何时候,都可以通过对LOCK位置1来软件加锁,软件加锁与复位加锁是一样的,都可以解锁。  

主存储块的擦除 
主存储块可以按页擦除,也可以整片擦除。 

页擦除 
主存储块的任何一页都可以通过FPEC的页擦除功能擦除。 建议使用以下步骤进行页擦除: 
1.检查FLASH_SR寄存器的BSY位。以确认没有其他正在进行的闪存操作。必须等待BSY位为0,才能继续操作。 
2.设置FLASH_CR寄存器的PER位为1。选择页擦除操作。 
3.设置FLASH_AR寄存器为要擦除页所在地址,选择要擦除的页。FLASH_AR的值在哪一页范围内,就表示要擦除哪一页。 
4.设置FLASH_CR寄存器的STRT位为1,启动擦除操作。
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。   
7.读出被擦除的页并做验证。擦完后所有数据位都为1。 

整片擦除 
整片擦除功能擦除整个主存储块,信息块不受此操作影响。 建议使用以下步骤进行整片擦除: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。 
2.设置FLASH_CR寄存器的MER位为1。选择整片擦除操作。   
3.设置FLASH_CR寄存器的STRT位为1。启动整片擦除操作。   
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。   
6.读出所有页并做验证。擦完后所有数据位都为1。

主存储块的编程 
对主存储块编程每次可以写入16位。当FLASH_CR寄存器的PG位为1时,在一个闪存地址写入一个半字(16位)将启动一次编程;写入任何非半字的数据,FPEC都会产生总线错误。在编程过程中(BSY位为1时),任何读写闪存的操作都会使CPU暂停,直到此次闪存编程结束。 建议使用如下步骤对主存储块进行编: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
2.设置FLASH_CR寄存器的PG位为1。选择编程操作。  
3.在指定的地址写入要编程的半字。直接用指针写。 
4.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
5.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。 
6.读出写入的地址并验证数据。

关于主存储块擦除编程操作的一些疑问
1.为什么每次都要检查BSY位是否为0? 
因为BSY位为1时,不能对任何FPEC寄存器执行写操作,所以必须要等BSY位为0时,才能执行闪存操作。 

2.如果没有擦除就进行编程,会出现什么结果? 
STM32在执行编程操作前,会先检查要编程的地址是否被擦除,如果没有,则不进行编程,并置FLASH_SR寄存器的PGERR位为1。唯一例外的是,当要编程的数据为0X0000时,即使未擦除,也会进行编程,因为0X0000即使擦除也可以正确编程。 

3.为什么操作后要读出数据并验证? 
STM32在某些特殊情况下(例如FPEC被锁住),可能根本就没有执行所要的操作,仅通过寄存器无法判断操作是否成功。所以,保险起见,操作后都要读出所有数据检查。 


4.等待BSY位为1的时间以多少为合适? 
请参考STM32固件库中的数据。 

5.FLASH编程手册上说进行闪存操作(擦除或编程)时,必须打开内部的RC振荡器(HSI),是不是一定要用HIS进行闪存的擦除及编程操作? 

对于这点,我的理解是,进行闪存操作时,必须要保证HIS没有被关闭,但是操作时的系统仍然可以是HSE时钟。STM32复位后,HIS默认是开的,只要你不为了低功耗去主动关闭它,则用什么时钟都可以进行闪存操作的。我所编的程序也验证了这一点。 

选项字节 
选项字节用于存储芯片使用者对芯片的配置信息。
目前,所有的STM32101xx、STM32102xx、STM32103xx、STM32105xx、STM32107xx产品,选项字节都是16字节。但是这16字节,每两个字节组成一个正反对,即,字节1是字节0的反码,字节3是字节2的反码,...,字节15是字节14的反码,所以,芯片使用者只要设置8个字节就行了,另外8个字节系统自动填充为反码。因此,有时候,也说STM32的选项字节是8个字节,但是占了16字节的空间。选项字节的8字节正码概述如下: 

RDP   字节0。读保护字节,存储对主存储块的读保护设置。 
USER  字节2。用户字节,配置看门狗、停机、待机。 
Data0  字节4。数据字节0,由芯片使用者自由使用。 
Data1  字节6。数据字节1,由芯片使用者自由使用。 
WRP0  字节8。写保护字节0,存储对主存储块的写保护设置。 
WRP1  字节10。写保护字节1,存储对主存储块的写保护设置。
WRP2  字节12。写保护字节2,存储对主存储块的写保护设置。 
WRP3  字节14。写保护字节3,存储对主存储块的写保护设置。 

选项字节写使能 
在FLASH_CR中,有一个OPTWRE位,该位为0时,不允许进行选项字节操作(擦除、编程)。这称为选项字节写使能。只有该位为1时,才能进行选项字节操作。 该位不能软件置1,但可以软件清零。只有向FLASH_OPTKEYR依次写入KEY1和KEY2后,硬件会自动对该位置1,此时,才允许选项字节操作。这称为解锁(打开)选项字节写使能。该位为1后,可以由软件清零,关闭写使能。复位后,该位为0。错误操作不会永远关闭写使能,只要写入正确的键序列,则又可以打开写使能。写使能已打开时,再次打开,不会出错,并且依然是打开的。 很显然,进行选项字节操作前,先要解开闪存锁,然后打开选项字节写使能,之后,才能进行选项字节操作。 

选项字节擦除 
建议使用如下步骤对选项字节进行擦除: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作。  
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。 
3.设置FLASH_CR寄存器的OPTER位为1。选择选项字节擦除操作。  
4.设置FLASH_CR寄存器的STRT位为1。 
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。
7.读出选项字节并验证数据。 
由于选项字节只有16字节,因此,擦除时是整个选项字节都被擦除了。

选项字节编程 
建议使用如下步骤对选项字节进行编程: 
1.检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作。  
2.解锁FLASH_CR寄存器的OPTWRE位。即,打开写使能。  
3.设置FLASH_CR寄存器的OPTPG位为1。选择编程操作。  
4.写入要编程的半字到指定的地址。启动编程操作。 
5.等待FLASH_SR寄存器的BSY位变为0,表示操作完成。 
6.查询FLASH_SR寄存器的EOP位,EOP为1时,表示操作成功。 
7.读出写入的选项字节并验证数据。 对选项字节编程时,FPEC使用半字中的低字节并自动地计算出高字节(高字节为低字节的反码),并开始编程操作,这将保证选项字节和它的反码始终是正确的。 

主存储块的保护 
可以对主存储块中的数据进行读保护、写保护。 读保护用于保护数据不被非法读出。防止程序泄密。

[1] [2]
关键字:STM32-Flash  存储器  储存数据 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492505.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:stm32在linux编译,远程调试
下一篇:STM32固件库中assert_param的作用——学习笔记

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM32 "flash download failed - Target dll has been cancelled"错误解决办法
在用mdk通过stlink烧写官方例程到stm32f429I discovery时,烧写了十来个程序都没问题,突然在烧写一个程序时,弹出了“flash download failed - Target dll has been cancelled”,然后后续的烧写都失败了。原因可能是其中一个程序将stm32开发板设置成了休眠模式,导致后续的烧写都失败了。从keil论坛帖子中 看到可以通过st-link utility来将flash全部擦除就能烧写了。从http://www.st.com/web/en/catalog/tools/PF258168下载st-link utility并安装,选择Target->Connect
发表于 2020-04-05
STM32
stm32f407学习笔记之flash模拟eeprom
stm32f407zgt6的flash有1M容量,总共分为11个扇区,每个扇区的地址和大小如下所示#define ADDR_FLASH_SECTOR_0     ((u32)0x08000000) //扇区0起始地址, 16 Kbytes  #define ADDR_FLASH_SECTOR_1     ((u32)0x08004000) //扇区1起始地址, 16 Kbytes  #define ADDR_FLASH_SECTOR_2     ((u32)0x08008000) //扇区
发表于 2020-04-04
STM32-Flash的原理与使用(模拟EEPRM)
1、什么是FlashFLASH闪存是属于内存器件的一种,其存储特性相当于硬盘,下图就能看出Flash扇区就等于电脑硬盘分区,但是对Flash进行写数据时必须先进行扇区擦除,然后才能再写入,否则会写入失败,MCU的Flash大小可参考数据手册2、闪存模块存储器组织此为STM32F407ZGT6的FLASH大小为1024K不同容量的STM32F4,拥有的扇区数不一样,比如我们的STM32F407ZGT6,则拥有全部12个扇区。从上图可以看出主存储器的起始地址就是0X08000000, B0、B1都接GND的时候,就是从0X08000000开始运行代码的。STM32F40x的闪存模块由:主存储器、系统存储器、OPT区域和选项字节等4部分
发表于 2020-04-02
STM32-Flash的原理与使用(模拟EEPRM)
让STM8使用cosic编译器时显示ram flash stack占用信息
mapinfo v0.4 for cosmic map功能介绍:1. 对cosmic编译器生成的map文件进行分析,显示ram flash eeprom stack的占用量ps:ram仅指ram变量(全局+静态+局部变量),不包括栈(stack)    eeprom仅能统计由@eeprom定义出的变量或常量2011-03-24:1. 修正_Bool类型定义出的变量占用ram不正确的BUG2010-10-28:1. 增加堆栈占用(stack)显示2. 增加对自定义(未定义)段的显示,一起统计到unknown显示使用方法如下:1. 将附件压缩包中的mapinfo.exe解压并解压到stvd的安装路径
发表于 2020-03-28
让STM8使用cosic编译器时显示ram flash stack占用信息
stm32驱动NOR Flash 之MX25L51245G(64MB)
MX25L51245G 支持SPI的MODE0/MODE3,一般都选择mode3#define FLASH_SECTOR_SIZE (4*1024)#define FLASH_PAGE_SIZE 256引脚定义/** SPI1* @SCK  : PA5* @MISO : PA6* @MOSI : PA7** @CS   : PA0*/读写接口static u8 SPI_Write(u8 byte){ u32 timeout = 0xFFFF; while(!(SPI1->SR & SPI_I2S_FLAG_TXE)) { if(--timeout
发表于 2020-03-23
单片机存储器结构
单片机内部存储结构分析 我们来思考一个问题,当我们在编程器中把一条指令写进单片要内部,然后取下单片机,单片机就可以执行这条指令,那么这条指令一定保存在单片机的某个地方,并且这个地方在单片机掉电后依然可以保持这条指令不会丢失,这是个什么地方呢?这个地方就是单片机内部的只读存储器即ROM(READ ONLY MEMORY)。为什么称它为只读存储器呢?刚才我们不是明明把两个数字写进去了吗?原来在89C51中的ROM是一种电可擦除的ROM,称为FLASH ROM,刚才我们是用的编程器,在特殊的条件下由外部设备对ROM进行写的操作,在单片机正常工作条件下,只能从那面读,不能把数据写进去,所以我们还是把它称为ROM。数的
发表于 2020-03-09
单片机存储器结构
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved