关于STM32闪存擦写次数与数据保存期限的重要说明

合集下载

一般tf卡可以擦写的次数

一般tf卡可以擦写的次数

一般tf卡可以擦写的次数一般TF卡可以擦写的次数随着科技的不断进步,存储设备也在不断更新换代。

TF卡是一种小型存储设备,广泛应用于手机、相机、音乐播放器等电子设备中。

这篇文章将围绕一般TF卡可以擦写的次数展开讨论,以便读者对其了解更加全面。

一般TF卡是由闪存芯片和控制器芯片组成的,其内部结构复杂且精细。

闪存芯片是TF卡的核心部件,决定了TF卡的性能和寿命。

而闪存芯片的擦写次数是衡量一张TF卡寿命的重要指标之一。

现代的闪存芯片通常使用的是NAND闪存技术,它具有高速度、高稳定性和高可靠性等特点。

然而,由于闪存芯片的制造工艺和材料的限制,每个闪存单元只能擦写有限次数。

这个有限次数被称为闪存芯片的擦写寿命。

一般来说,闪存芯片的擦写寿命是以“擦写次数”来衡量的。

不同类型的闪存芯片具有不同的擦写寿命,一般可分为SLC、MLC和TLC 三种。

SLC(Single-Level Cell)是闪存芯片中最高级别的产品,它每个存储单元只能保存一个二进制位,因此具有最高的擦写寿命。

一般而言,SLC闪存芯片的擦写寿命可以达到10万次以上。

MLC(Multi-Level Cell)是一种比SLC更为常见的闪存芯片,每个存储单元可以保存多个二进制位,因此存储密度更高,成本更低。

然而,由于每个存储单元保存的数据更多,所以擦写寿命相对较低。

一般情况下,MLC闪存芯片的擦写寿命在1万次左右。

TLC(Triple-Level Cell)是目前市场上最常见的闪存芯片,它的存储密度更高,成本更低,但擦写寿命相对最低。

一般而言,TLC 闪存芯片的擦写寿命在1000次左右。

需要注意的是,以上提到的擦写次数只是一般情况下的寿命指标,并非绝对。

实际上,擦写寿命受到多种因素的影响,包括温度、湿度、使用频率、擦写方式等。

如果在极端环境下使用TF卡,擦写寿命可能会大大减少。

为了延长TF卡的使用寿命,我们可以采取一些措施。

首先,避免频繁擦写和格式化TF卡,尽量减少对TF卡的操作次数。

STM32片内FLASH特定地址写入数据不被擦除方法

STM32片内FLASH特定地址写入数据不被擦除方法

STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。

其中:RAM为常说的存,比如手机的2G存4G存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。

ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。

ROM又包含:EEPROM和flash。

作为ROM的一份子,flash的特点自然是掉电数据不丢失。

但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以避免不必要的问题。

1、STM32 FLASH操作流程Flash操作已经属于嵌入式设备中很底层的操作了,直接对地址进行存取,简单描述,Flash操作大致需要以下流程:1、确定要写入Flash的首地址(稍后介绍确定地址的方法)2、解锁Flash3、对Flash进行操作(写入数据)4、对Flash重新上锁1.1 如何查找并选定要写入Flash十六进制地址值的方法要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。

(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)我此次操作Flash使用的MCU是STM32103C8T6,所以以该型号MCU为例进行描述:在数据手册中,可以看到STM32103C8T6的flash起始地址是0x0800 0000(如下图所示),而STM32103C8T6的Flash大小为64K,可以计算出STM32103C8T6的Flash地址围是:0x0800 0000——0x0800 FFFF(计算方法参考另一篇博客:STM32存大小与地址的对应关系以及计算方法)。

这里选取0x0800 F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的围了。

用stm32的flash保存数据的优化方法

用stm32的flash保存数据的优化方法

⽤stm32的flash保存数据的优化⽅法最开始⽤stm32的flash保存数据的⽅法都是⽤原⼦的例程,STM32F1的话,原⼦的⽅法⼤概是创建⼀个1K或者2K的缓存,修改数据的时候,先把该扇区的所有数据写到该缓存,然后查看是否需要擦除整个扇区,⼀般在⼀个地⽅写的话,必须要擦除,要想不擦除,就需要⼀个变量记录下⼀次要写的地址,和数据⼀块保存。

STM32F4的话,因为其最⼩扇区为16K,最⼤128K,写个稍⼤点的程序,就得⽤⼤扇区,原⼦的做法⼲脆不缓存了,直接擦了扇区,重写!(吐个槽,原⼦的⼀些程序可以再优化⼀下,感觉有些源码就是应付事⼉,可以向更实⽤的更有效的⽅向发展发展嘛!!)回归正题,有⼀天,有⼀个项⽬⽤的屏幕不是静态显⽰的,需要不停的扫,每次保存数据的时候屏都会闪⼀次,原来是保存数据的时候,要擦除扇区,1K的扇区⼤概要15ms的时间才能擦除完成,⽽且这段时间单⽚机什么都不能⼲。

为了解决这个问题,发现了⽹上有stm32flash模拟EEPROM的程序,学习后发现,⽐原⼦的例程更实⽤,更有效,既提⾼了存取速度,⼜能平均磨损flash,延长flash改写寿命。

⼤家可百度stm32flash模拟EEPROM,还有⼈优化了官⽅给的demo。

优化过后,加⼊了CurWrAddress,意在提⾼读写速度,但是正是这个CurWrAddress,引起了⼀些bug。

1/* Global variable used to store variable value in read sequence */2 uint16_t DataVar = 0;3 uint32_t CurWrAddress;4/* Virtual address defined by the user: 0xFFFF value is prohibited */5extern uint16_t VirtAddVarTab[NumbOfVar];第3⾏把CurWrAddress初始化为0,就是⼀个bug。

关于STM32的FLASH操作

关于STM32的FLASH操作

关于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。

STM32L15x —— Flash和EEPROM

STM32L15x —— Flash和EEPROM
系统外设
Flash和数据EEPROM(存储器)
1
存储区—— 概述
存储区特性: 内置高达128K字节,支持ECC的Flash 内置高达 4K字节,支持ECC的数据EEPROM Flash擦除次数:10K次 存储区包括:主Flash / 数据EEPROM / 信息块 访问时间:62.5ns(Range1) / 125ns(Range2) / 500ns(Range3) 字(32位)/半页(128字节) 的编程时间:3.2ms(典型值) 页擦除:3.2ms(典型值) ,整片擦除:9.6ms(典型值)
ERRIE
其他标志位 READY BSY
Flash模块准备好(退出低功耗模式)
EOPIE ERRIE
66
存储区 —— 信息块
4K字节的系统存储区 —— 内置了Bootloader代码,通过 USART1或USART2更新固件。
16字节的SIF区 —— 保存用户设置的Option Byte
31
地址
0x1FF8 0008 0x1FF8 000C
[31:24]
nWRP1 nWRP3
[23:16]
nWRP0 nWRP2
[15:8]
WRP1 WRP3
[7:0]
WRP0 WRP2
当读保护的LEVEL1或LEVEL2使能时,从调试接口或者 SRAM写/擦除Flash或数据EEPROM都是被禁止的。但写 保护仅仅用于保护Flash。
Flash接口 (FLITF) 特性: 支持预取指缓冲的读操作 Option Bytes 的装载 多种保护机制: 读保护:Level 1 和 Level 2 (JTAG Fuse) 写保护
2 2
存储区—— 架构

闪存的制式与寿命

闪存的制式与寿命

闪存的制式与擦除寿命目前.我所知道的如下.基本接近. 速度问题我们就不讨论了。

同级制程的SLC基本都是比MLC快的。

50NM的SLC=100000次的写入寿命读无限制MLC=10000次的写入寿命读无限制34NM的SLC=50000次的写入寿命读无限制MLC=5000次的写入寿命读无限制TLC=不用说大家也知道,.这个直接无视25NM的SLC=30000次的写入寿命读无限制MLC=3000次的写入寿命读无限制TLC=不用说大家也知道,.这个直接无视那么现在很多其实是34和25的SLC.大家还以为它有10W次的写入吗????????还有种EMLC 会好些.不过少见.甚至还有种SLC可以达到30W的.是IM公司的FLASH不过非常昂贵.我们基本见不到.我们常见的就是这些饿.大家要买SLC还要看清制程啊闪存寿命是个妖怪:很恐怖但不真实王振发表于:13年07月09日 10:25 [编译] 存储在线闪存∙分享:∙∙∙[导读]大家都知道,固态硬盘有个缺点就是写入寿命太短。

我以前写过文章曾浅显地分析过受限于写入寿命的基于闪存的固态硬盘怎样在基于RAID的数据保护系统中出现问题。

大家都知道,固态硬盘有个缺点就是写入寿命太短。

我以前写过文章曾浅显地分析过受限于写入寿命的基于闪存的固态硬盘怎样在基于RAID的数据保护系统中出现问题。

从理论上来说,多个拥有相同写入寿命问题的固态硬盘可能会在同一时刻出现问题,引起数据损失。

但是我个人并不觉得这是个大问题。

下面我就进一步分析一下闪存写入寿命的问题,以及它深层的原因。

一个闪存单元是由一个浮置栅极来控制的,在浮置栅极旁边则是两层硅氧化物电介质和绝缘层。

当对浮置栅极充电或放电来写入或擦除信息时,单元通道内的电荷会通过电介质层,会对其造成一定的损害。

久而久之,电介质层就会出现一些问题,要不就是不允许通道通过,导致数据存储在闪存单元中保持0状态,要不就是高电压使得氧化层被破坏,数据无法存储,一直保持1状态。

STM32闪存编程手册

STM32闪存编程手册

页2/21
术语
下面列出了本文档中所用到的术语和缩写的简要说明:
z 小容量产品是指闪存存储器容量在16K~32K字节之间的STM32F101xx,STM32F102xx和 STM32F103xx微控制器产品。
z 中容量产品是指闪存存储器容量在64K~128K字节之间的STM32F101xx,STM32F102xx 和STM32F103xx微控制器产品。
PM0042 编程手册
STM32F10xxx闪存编程
简介
本编程手册介绍了如何烧写STM32F101xx、STM32F102xx和STM32F103xx微控制器的闪存存 储器。为方便起见,在本文中出特别说明外,统称它们为STM32F10xxx。 STM32F10xxx内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(IAP)烧写。 在线编程(In-Circuit Programming – ICP)方式用于更新闪存存储器的全部内容,它通过JTAG、 SWD协议或系统加载程序(Bootloader)下载用户应用程序到微控制器中。ICP是一种快速有效的 编程方法,消除了封装和管座的困扰。 与ICP方式对应,在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任 一种通信接口(如I/O端口、USB、CAN、UART、I2C、SPI等)下载程序或数据到存储器中。IAP 允许用户在程序运行时重新烧写闪存存储器中的内容。然而,IAP要求至少有一部分程序已经 使用ICP烧到闪存存储器中。 闪存接口是在AHB协议上实现了对指令和数据的访问,它通过对存储器的预取缓存,加快了存 储器的访问;闪存接口还实现了在所有工作电压下对闪存编程和擦除所需的逻辑电路,这里还 包括访问和写入保护以及选项字节的控制。

stm32手册中芯片的读写次数

stm32手册中芯片的读写次数

一、概述STM32是一款常用的微控制器,广泛应用于各种嵌入式系统中。

在使用STM32芯片进行开发时,我们经常需要进行对芯片的读写操作。

然而,对于芯片的读写次数,很多开发者并不太清楚具体的限制和注意事项。

本文将围绕STM32手册中芯片的读写次数展开讨论,希望能够为开发者提供一些有用的信息和建议。

二、STM32芯片的读写次数限制1. 测量次数根据STM32的手册,每个芯片都有其自己的读写次数限制。

通常,这个限制是以“eFlash”或“Flash”写入次数来衡量的。

这个次数取决于芯片的具体型号,一般在几万次到几百万次不等。

这意味着,一旦达到了这个极限,芯片就不能再被正常地进行写入操作了。

2. 放电保护为了确保芯片在达到写入次数限制后仍能正常工作,STM32芯片通常会配备放电保护电路。

当达到限制次数后,该电路会自动禁止写入操作,以防止电子元件被损坏。

这也是为了保障芯片的长时间稳定运行。

三、延长读写次数的措施1. 使用Bootloader通过使用Bootloader的方式,可以尽可能减少对芯片的烧录操作。

Bootloader可以在芯片内部建立一个小型的操作系统,用于更新固件或程序。

这种方式可以大大降低对芯片的写入次数,延长其使用寿命。

2. 使用外部存储器对于一些需要频繁写入数据的应用,可以考虑使用外部存储器来减轻芯片内部Flash的读写负担。

外部存储器通常有更大的读写次数限制,可以作为芯片内部Flash的补充,帮助延长芯片的使用寿命。

3. 良好的编程习惯在进行软件开发时,可以通过编写优化的代码来减少对芯片的写入次数。

避免频繁的写入操作,合理利用缓存机制等方法,都可以减少对芯片读写次数的损耗。

四、总结在使用STM32芯片进行开发时,读写次数的限制是需要重视的一个问题。

通过合理的策略和措施,可以延长芯片的使用寿命,提高系统的稳定性和可靠性。

开发者需要根据具体的应用需求和芯片型号,选择合适的措施来减少对芯片的读写负担,从而更好地发挥其性能和功能。

STM32片内FLASH特定地址写入数据不被擦除方法

STM32片内FLASH特定地址写入数据不被擦除方法

STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。

其中:RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。

ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。

ROM又包含:EEPROM和flash。

作为ROM的一份子,flash的特点自然是掉电数据不丢失。

但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以避免不必要的问题。

1、STM32 FLASH操作流程Flash操作已经属于嵌入式设备中很底层的操作了,直接对地址进行存取,简单描述,Flash操作大致需要以下流程:1、确定要写入Flash的首地址(稍后介绍确定地址的方法)2、解锁Flash3、对Flash进行操作(写入数据)4、对Flash重新上锁1.1 如何查找并选定要写入Flash十六进制地址值的方法要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。

(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)我此次操作Flash使用的MCU是STM32103C8T6,所以以该型号MCU为例进行描述:在数据手册中,可以看到STM32103C8T6的flash起始地址是0x0800 0000(如下图所示),而STM32103C8T6的Flash大小为64K,可以计算出STM32103C8T6的Flash地址范围是:0x0800 0000——0x0800 FFFF(计算方法参考另一篇博客:STM32内存大小与地址的对应关系以及计算方法)。

这里选取0x0800 F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的范围了。

关于STM32闪存擦写次数与数据保存期限的重要说明

关于STM32闪存擦写次数与数据保存期限的重要说明

关于STM32闪存擦写次数与数据保存期限的重要说明
ST在2008年3月21日更新了STM32增强型(STM32F103)和STM32基本型(STM32F101)的数据手册。

在最新的数据手册中,再次确认STM32的闪存存储器的擦写次数指标,在整个工作温度范围超过10,000次,即STM32F101基本型的-40摄氏度至+85摄氏度,STM32F103增强型的-40摄氏度至+85摄氏度,或部分型号的-40摄氏度至+105摄氏度。

(关于芯片的工作温度范围请参考下述数据手册的第七章)
新手册给出了更多数据保存期限的测试条件。

因为数据保存期限是一个非常重要的指标,客户需要了解更加全面的信息,因此ST比其他MCU厂家给出了更多的细节。

闪存存储器的数据保存期限随擦写次数的增加而变化,手册中数据保存期限是指1000次和10,000次闪存擦写后的保存期限。

在所有的工作温度范围内经1000次擦写后,在+85摄氏度的保存环境下,STM32的数据保存期限可达业界领先的30年;在所有的工作温度范围内经10,000次擦写后,在+55摄氏度的保存环境下(通常这是汽车工业要求的保存环境),STM32的数据保存期限可惊人地达到20年。

当与其他MCU产品比较时,十分必要去检查闪存擦写周期是在什么温度环境下检测的数据保存期限。

例如,“在+85摄氏度时数据保存期限为10年”,因为没有给出闪存擦写周期,这样的描述是不完整的。

可在ST的网站免费下载最新的STM32数据手册:
STM32F103x数据手册第6版
STM32F101x数据手册第6版
下图是STM32F103x数据手册中的相关参数表:
STM32/STM8
意法半导体/ST/STM。

关于STM32的FLASH操作

关于STM32的FLASH操作

关于STM32的FLASH操作STM32是STMicroelectronics公司开发的一系列32位ARM Cortex-M微控制器。

在STM32微控制器中,FLASH (快闪存储器)是用于存储应用程序和数据的重要组件。

在本文中,我们将详细介绍STM32的FLASH操作。

1.FLASH简介:FLASH是一种可擦除可编程的非易失性存储器,常用于存储应用程序代码和数据。

STM32微控制器的FLASH存储器由多个扇区组成。

每个扇区的大小可以是1KB、2KB、4KB或16KB,具体取决于所使用的芯片型号。

FLASH的主要特点包括可擦除、可编程和快速存取。

2.FLASH的特点:2.1 可擦除:FLASH存储器中的数据可以通过擦除操作来清除。

擦除操作可以是扇区擦除(Sector Erase)或全片擦除(Mass Erase)。

扇区擦除只清除指定的扇区,而全片擦除则清除整个FLASH存储器。

2.2 可编程:FLASH存储器中的数据可以通过编程操作来写入。

编程操作可以是半字编程(Half-Word Program)或字编程(Word Program)。

半字编程一次可以写入16位的数据,而字编程一次可以写入32位的数据。

2.3快速存取:FLASH存储器具有快速存取速度,使得应用程序可以在很短的时间内从FLASH中读取数据。

3.FLASH操作注意事项:在进行STM32的FLASH操作时,需要注意以下几个方面:3.1对于每个扇区的擦除操作,只能在原来数据全为‘1’的情况下进行。

因此,在进行擦除操作之前,应该先将该扇区的数据写为全‘1’。

3.2进行编程操作时,只能将数据从‘1’写为‘0’,而不能将数据从‘0’写为‘1’。

因此,在进行编程操作之前,应该先将该数据所在的字节或半字擦除为全‘1’。

3.3FLASH存储器的数据写入操作需要采取双字节对齐的方式。

如果数据不是双字节对齐,则必须先将数据拷贝到对齐的缓冲区中,再进行编程操作。

STM32模拟EEPROM的使用和优化

STM32模拟EEPROM的使用和优化

保存数据是 16 位的,后面 16 位是该数据的虚拟地址,注意:1 个数据有唯 1 个虚拟地址,地址必须为:0~0xfffe 范围内(每页将按 4 字节分块,1 块保存 1 个 16 位数据)。下面继续说明 16 位虚拟地址的作用。
Figure 3 显示了数据更新的过程: 1. 写数据 假设保存的数据虚拟地址是 0X7777,那么程序写数据是从当前有效页页首地址开始查询虚 拟地址位置为 0XFFFF 的空间,如果是 0XFFFF 那么该位置可以保存数据;如果不是,那 么继续找下 1 个位置,如果本页无 0XFFFF 的空间那么表示本页已满,那么将本页【有效 数据】复制到另外 1 页继续保存数据。 当两次保存同一虚拟地址的数据时如右图所示:从上到下,第 2 个虚拟地址是 0X7777 对应 的数据 1245 才是有效的。清楚了这点,那么读数据要怎么处理基本就明白了。 2. 读数据 读数据时是从有效页的末尾地址开始检测是否是有效数据,如果是那么立即返回,程序是通过虚拟地址判断有 效数据的,第 1 个匹配的虚拟地址的数据才是有效的 3. 页满时处理数据 说到这里,看到不少使用例子程序不成功的问题,那么就请注意下面了,他们的错误估计是下面的原因造成的。 当 1 页写满时其实里面有很多无效数据,你只需要将【有效数据】复制到另外 1 页就成。如何复制有效数据呢? 我想很多人估计忽略了 【#define NumbOfVar ((uint8_t)0x03) /* Variables' number */】,NumbOfVar 就是你程 序中实际要保存的数据量,这个必须与实际保持一致,不能多也不能少,这个如果不一致,那么在换页时将出 错,没换页之前倒是没问题的,原因在于:程序在换页时将根据 NumbOfVar 的值复制有效数据的个数,如果比 实际少,那么换页时将丢失数据,如果比实际多那么将出现旧数据覆盖最新数据

STM32:Flash擦除与读写操作(HAL库)

STM32:Flash擦除与读写操作(HAL库)

STM32:Flash擦除与读写操作(HAL库)应⽤平台:STM32F030F4P6ST官⽅库:STM32Cube_FW_F0_V1.9.0背景知识绝⼤多数的单⽚机和微控制器(ARM,x86),地址空间都是以字节为单位的,也就是说⼀个地址是⼀个字节。

Flash存储器有个特点,就是只能写0,不能写1。

所以如果原来的地址有数据了,意味着有⼀些位为0,这些位就相当于⽆效了。

所以必须写之前确保他们都为1,只有擦除才可以。

另外每次擦除都必须擦除⼀个4K⼤⼩的扇区,这是flash的特性所决定的。

对Flash操作前必需打开内部振荡器。

STM32F030F4P6的Flash存储简介STM32F030F4P6硬件配置: FLASH (16KB) RAM (4KB)(包含4个扇区,1个扇区包含4个页,每页有1Kbyte空间)⽤户可以对Flash进⾏program 和 erase 操作。

Main Flash memory programmingThe main Flash memory can be programmed 16 bits at a time.Flash memory eraseThe Flash memory can be erased page by page or completely (Mass Erase).Flash memory addresses Size(byte)Name Description0x0800 0000 - 0x0800 03FF 1 Kbyte Page 0Sector 00x0800 0400 - 0x0800 07FF 1 Kbyte Page 1Sector 00x0800 0800 - 0x0800 0BFF 1 Kbyte Page 2Sector 00x0800 0C00 - 0x0800 0FFF 1 Kbyte Page 3Sector 00x0800 1000 - 0x0800 13FF 1 Kbyte Page 4Sector 10x0800 1400 - 0x0800 17FF 1 Kbyte Page 5Sector 10x0800 1800 - 0x0800 1BFF 1 Kbyte Page 6Sector 10x0800 1C00 - 0x0800 1FFF 1 Kbyte Page 7Sector 10x0800 2000 - 0x0800 23FF 1 Kbyte Page 8Sector 20x0800 2400 - 0x0800 27FF 1 Kbyte Page 9Sector 20x0800 2800 - 0x0800 2BFF 1 Kbyte Page 10Sector 20x0800 2C00 - 0x0800 2FFF 1 Kbyte Page 11Sector 20x0800 3000 - 0x0800 33FF 1 Kbyte Page 12Sector 30x0800 3400 - 0x0800 37FF 1 Kbyte Page 13Sector 30x0800 3800 - 0x0800 3BFF 1 Kbyte Page 14Sector 3Flash memory addresses Size(byte)Name Description0x0800 3C00 - 0x0800 3FFF 1 Kbyte Page 15Sector 3 STM32F030F4P6的Flash读写参考代码(HAL库)/* Base address of the Flash sectors */#define ADDR_FLASH_PAGE_0 ((uint32_t)0x08000000) /* Base @ of Page 0, 1 Kbyte */#define ADDR_FLASH_PAGE_1 ((uint32_t)0x08000400) /* Base @ of Page 1, 1 Kbyte */#define ADDR_FLASH_PAGE_2 ((uint32_t)0x08000800) /* Base @ of Page 2, 1 Kbyte */#define ADDR_FLASH_PAGE_3 ((uint32_t)0x08000C00) /* Base @ of Page 3, 1 Kbyte */#define ADDR_FLASH_PAGE_4 ((uint32_t)0x08001000) /* Base @ of Page 4, 1 Kbyte */#define ADDR_FLASH_PAGE_5 ((uint32_t)0x08001400) /* Base @ of Page 5, 1 Kbyte */#define ADDR_FLASH_PAGE_6 ((uint32_t)0x08001800) /* Base @ of Page 6, 1 Kbyte */#define ADDR_FLASH_PAGE_7 ((uint32_t)0x08001C00) /* Base @ of Page 7, 1 Kbyte */#define ADDR_FLASH_PAGE_8 ((uint32_t)0x08002000) /* Base @ of Page 8, 1 Kbyte */#define ADDR_FLASH_PAGE_9 ((uint32_t)0x08002400) /* Base @ of Page 9, 1 Kbyte */#define ADDR_FLASH_PAGE_10 ((uint32_t)0x08002800) /* Base @ of Page 10, 1 Kbyte */#define ADDR_FLASH_PAGE_11 ((uint32_t)0x08002C00) /* Base @ of Page 11, 1 Kbyte */#define ADDR_FLASH_PAGE_12 ((uint32_t)0x08003000) /* Base @ of Page 12, 1 Kbyte */#define ADDR_FLASH_PAGE_13 ((uint32_t)0x08003400) /* Base @ of Page 13, 1 Kbyte */#define ADDR_FLASH_PAGE_14 ((uint32_t)0x08003800) /* Base @ of Page 14, 1 Kbyte */#define ADDR_FLASH_PAGE_15 ((uint32_t)0x08003C00) /* Base @ of Page 15, 1 Kbyte *//* Private define ------------------------------------------------------------*/#define FLASH_USER_START_ADDR ADDR_FLASH_PAGE_15 /* Start @ of user Flash area */#define FLASH_USER_END_ADDR ADDR_FLASH_PAGE_15 + FLASH_PAGE_SIZE /* End @ of user Flash area */#define DATA_32 ((uint32_t)0x12345678)/*Variable used for Erase procedure*/static FLASH_EraseInitTypeDef EraseInitStruct;uint32_t Address = 0;/*** @brief Main program* @param None* @retval None*/int main(void){/* STM32F0xx HAL library initialization:- Configure the Flash prefetch- Systick timer is configured by default as source of time base, but usercan eventually implement his proper time base source (a general purposetimer for example or other time source), keeping in mind that Time baseduration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined andhandled in milliseconds basis.- Low Level Initialization*/HAL_Init();/* Configure the system clock to48 MHz */SystemClock_Config();/* Unlock the Flash to enable the flash control register access *************/HAL_FLASH_Unlock();/* Erase the user Flash area(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********//* Fill EraseInit structure*/EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;EraseInitStruct.PageAddress = FLASH_USER_START_ADDR;EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;EraseInitStruct.NbPages = (FLASH_USER_END_ADDR - FLASH_USER_START_ADDR) / FLASH_PAGE_SIZE;if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK){/*Error occurred while page erase.User can add here some code to deal with this error.PageError will contain the faulty page and then to know the code error on this page,user can call function 'HAL_FLASH_GetError()'*//* Infinite loop */while (1){/* User doing something here */}}/* Program the user Flash area word by word(area defined by FLASH_USER_START_ADDR and FLASH_USER_END_ADDR) ***********/Address = FLASH_USER_START_ADDR;while (Address < FLASH_USER_END_ADDR){if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, DATA_32) == HAL_OK){Address = Address + 4;}else{/* Error occurred while writing data in Flash memory.User can add here some code to deal with this error */while (1){/* User doing something here */}}}/* Lock the Flash to disable the flash control register access (recommendedto protect the FLASH memory against possible unwanted operation) *********/HAL_FLASH_Lock();/* Check if the programmed data is OKMemoryProgramStatus = 0: data programmed correctlyMemoryProgramStatus != 0: number of words not programmed correctly ******/Address = FLASH_USER_START_ADDR;MemoryProgramStatus = 0x0;while (Address < FLASH_USER_END_ADDR){data32 = *(__IO uint32_t *)Address;if (data32 != DATA_32){MemoryProgramStatus++;}Address = Address + 4;}/*Check if there is an issue to program data*/if (MemoryProgramStatus == 0){/* User doing something here */}elseelse{while (1){/* User doing something here */ }}/* Infinite loop */while (1){}}。

STM32用户闪存编程

STM32用户闪存编程

用户选择字节, 则一般用于配置写保护、 读保护等功能, 本章不作介绍。 闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块 的控制机构。 对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管 理;编程与擦除的高电压由内部产生。 在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完 成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码 或数据的读取操作。
能访问闪存模块的内容并得到相应的数据。读接口在闪存端包含一个读 控制器,还包含一个AHB接口与CPU衔接。这个接口的主要工作是产生读 闪存的控制信号并预取CPU要求的指令块,预取指令块仅用于在I-Code (I-Instruct, 命令) 总线上的取指操作, 数据常量是通过D-Code (Data, 数据)总线访问的。这两条总线的访问目标是相同的闪存模块,访问 D-Code将比预取指令优先级高。由此可见,c语言简单的一句读取数据 代码,其实在CPU硬件设计上是很复杂的。 这里要特别留意一个闪存等待时间,因为CPU运行速度比FLASH快得 多,STM32F103的FLASH最快访问速度≤24Mhz,如果CPU频率超过 这个速度,那么必须加入等待时间,比如我们一般使用72Mhz的主频, 那么FLASH等待周期就必须设置为2,该设置通过FLASH_ACR寄存器 设置。 例如,我们要从地址addr,读取一个半字(半字为16为,字为32位) , 可以通过如下的语句读取: data=*(vu16*)addr; 将addr强制转换为vu16指针,然后取该指针所指向的地址的值,即得到 了addr地址的值。类似的,将上面的vu16该位vu8,即可读取指定地址 STM32 FLASH的写就复杂一点了, 的一个字节。 相对FLASH读取来说, 下面我们介绍STM32闪存的编程和擦除。 * 闪存的编程(即写入)和擦除: STM32的闪存的写入是由FPEC (闪存编程和擦除控制器) 模块处理的, 这个模块包含7个32位寄存器,他们分别是: FPEC键寄存器(FLASH_KEYR) 选择字节键寄存器(FLASH_OPTKEYR) 闪存控制寄存器(FLASH_CR) 闪存状态寄存器(FLASH_SR) 闪存地址寄存器(FLASH_AR) 选择字节寄存器(FLASH_OBR) 写保护寄存器(FLASH_WRPR) 其中FPEC键寄存器总共有3个键值: RDPRT键=0X0000 00A5 KEY1=0X4567 0123 KEY2=0XCDEF 89AB

stm32片上闪存

stm32片上闪存

3
片上闪存读接口的两个特性
取指令和取数据都在同一条总线上执行 预取指令缓冲和预取指令控制器
预取指缓冲:3个块,每个块4个字节 预取指控制器上电默认是开启的
上电内核默认跑在HCLK =SYSCLK =HSI =8MHz
要更改预取指使能或关闭,必须在特定条件下
SYSCLK <24MHz 并且SYSCLK =HCLK
[..] Any operation of erase or program should follow these steps: (#) Call the FLASH_Unlock() function to enable the flash control register and program memory access (#) Call the desired function to erase page or program data (#) Call the FLASH_Lock() to disable the flash program memory access (recommended to protect the FLASH memory against possible unwanted operation)
13
选项字节上锁
======================================================================= ##### Option Bytes Programming functions ##### ======================================================================= [..] The FLASH_Option Bytes Programming_functions, includes the following functions: (+) void FLASH_OB_Unlock(void); (+) void FLASH_OB_Lock(void); (+) void FLASH_OB_Launch(void); (+) FLASH_Status FLASH_OB_Erase(void); (+) FLASH_Status FLASH_OB_EnableWRP(uint32_t OB_WRP); (+) FLASH_Status FLASH_OB_RDPConfig(uint8_t OB_RDP); (+) FLASH_Status FLASH_OB_UserConfig(uint8_t OB_IWDG, uint8_t OB_STOP, uint8_t OB_STDBY); (+) FLASH_Status FLASH_OB_BOOTConfig(uint8_t OB_BOOT1); (+) FLASH_Status FLASH_OB_VDDAConfig(uint8_t OB_VDDA_ANALOG); (+) FLASH_Status FLASH_OB_SRAMParityConfig(uint8_t OB_SRAM_Parity); (+) FLASH_Status FLASH_OB_WriteUser(uint8_t OB_USER); (+) FLASH_Status FLASH_ProgramOptionByteData(uint32_t Address, uint8_t Data); (+) uint8_t FLASH_OB_GetUser(void); (+) uint32_t FLASH_OB_GetWRP(void); (+) FlagStatus FLASH_OB_GetRDP(void); [..] Any operation of erase or program should follow these steps:

STM32片内FLASH特定地址写入数据不被擦除方法

STM32片内FLASH特定地址写入数据不被擦除方法

STM32中存储区分为:随机存取存储器RAM和只读存储器ROM。

其中:RAM为常说的内存,比如手机的2G内存4G内存等,就是程序跑起来的时候所占用的存储空间,特点是掉电数据丢失。

ROM为常说的硬盘,比如手机的64G和128G等,可以简单的理解为硬盘的存储空间,特点是掉电数据不丢失,所以又叫“非易失性存储器件”。

ROM又包含:EEPROM和flash。

作为ROM的一份子,flash的特点自然是掉电数据不丢失。

但是,flash在STM32中比较重要,程序也是保存在这个地方,所以轻易不让用户进行随意的读写,以避免不必要的问题。

1、STM32 FLASH操作流程Flash操作已经属于嵌入式设备中很底层的操作了,直接对地址进行存取,简单描述,Flash操作大致需要以下流程:1、确定要写入Flash的首地址(稍后介绍确定地址的方法)2、解锁Flash3、对Flash进行操作(写入数据)4、对Flash重新上锁1.1 如何查找并选定要写入Flash十六进制地址值的方法要想选定安全的Flash地址进行读写,可以根据自己的STM32 MCU型号,查找数据手册,确定FLASH的地址区段,因为起始段会存储代码,所以一定要避开起始段,以避免数据错误。

(我一般是根据Flash大小计算Flash的最末尾地址,往前推一段地址空间,在这里一般不会对代码中的数据产生覆盖等影响)我此次操作Flash使用的MCU是STM32103C8T6,所以以该型号MCU为例进行描述:在数据手册中,可以看到STM32103C8T6的flash起始地址是0x0800 0000(如下图所示),而STM32103C8T6的Flash大小为64K,可以计算出STM32103C8T6的Flash地址范围是:0x0800 0000——0x0800 FFFF(计算方法参考另一篇博客:STM32内存大小与地址的对应关系以及计算方法)。

这里选取0x0800 F000作为读写操作的起始地址,对于C8T6这款MCU,操作这个起始地址应该算是很安全的范围了。

固态硬盘为何会有寿命限制?闪存到底能擦写多少次

固态硬盘为何会有寿命限制?闪存到底能擦写多少次

固态硬盘为何会有寿命限制?闪存到底能擦写多少次固态硬盘的寿命限制主要来自有限数量的写入-擦除周期,闪存具体能够擦写多少次通常还取决于主控所采用的纠错引擎。

当前我们使用的固态硬盘几乎都采用了NAND闪存,它是由东芝在1987年发明。

闪存依靠保存电荷来记录数据,我们可以把对闪存的写入想象为向电池中充电,而擦除过程就是将电池中的电量迅速放光。

闪存单元中的Floating Gate浮栅结构充当了“电池”的角色,它可以被“放电”或者“充电”。

依据电压的不同,闪存就可以表达出电脑二进制0或1。

固态硬盘能够在电脑关机后继续保存记忆,关键在于位于Floating Gate浮栅下方的Tunnel Layer隧道层。

它起到了防止浮栅中电子流失的作用。

但长期和反复的读写会在闪存隧道氧化物层上产生应力,导致缺陷的出现。

产生缺陷的隧道氧化物层阻挡电子流失的能力下降,在长期不通电的情况下,闪存单元中的电流流失过多,就会改变其电压状态,进而导致数据在读取时出错。

从原理上说,隧道氧化物层的“磨损”是不可逆的,所以固态硬盘终有一死。

不过在闪存从平面转向立体堆叠的过程中,闪存单元的结构也进行了升级。

最早在2007年由东芝提出的BiCS三维闪存结构中使用Charge Trap电荷陷阱取代Floating Gate,前者为绝缘体,对电子的保持能力更强,同时允许使用更薄的隧道氧化物层,进而能够在写入和擦除时使用相对较低的电压,减少对氧化物层的“磨损”。

当然,东芝BiCS闪存的优势还有很多:高密度高容量、更快的写入速度、高可靠性、低功耗等等。

由东芝推动的闪存技术创新允许将固态硬盘作为数据长期存储载体,并提供极高的安全性,正常家用无需担心寿命。

分享STM32FLASH擦除以及防止误擦除程序代码、写入

分享STM32FLASH擦除以及防止误擦除程序代码、写入

分享STM32 FLASH 擦除(以及防止误擦除程序代码)、写入编译环境:我用的是(Keil)MDK4.7.2stm32库版本:我用的是3.5.0一、本文不对FLASH的基础知识做详细的介绍,不懂得地方请查阅有关资料。

对STM32 内部FLASH进行编程操作,需要遵循以下流程:FLASH解锁清除相关标志位擦除FLASH(先擦除后写入的原因是为了工业上制作方便,即物理实现方便)写入FLASH锁定FLASH实例:#define FLASH_PAGE_SIZE ((uint16_t)0x400) //如果一页为1K大小#define WRITE_START_ADDR ((uint32_t)0x08008000)//写入的起始地址#define WRITE_END_ADDR((uint32_t)0x0800C000)//结束地址uint32_t EraseCounter = 0x00, Address = 0x00;//擦除计数,写入地址uint32_t Data = 0x3210ABCD;//要写入的数据uint32_t NbrOfPage = 0x00;//记录要擦除的页数volatile FLASH_Status FLASHStatus =FLASH_COMPLETE;/*FLASH擦除完成标志*/void main(){/*解锁FLASH*/FLASH_Unlock();/*计算需要擦除FLASH页的个数 */NbrOfPage = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE;/* 清除所有挂起标志位 */FLASH_ClearFlag(FLASH_FLAG_EOP |FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);/* 擦除FLASH 页*/for(EraseCounter = 0; (EraseCounter 只要()里面的数是flash第xx页中对应的任何一个地址!就是擦除xx页全部内容!防止误擦除有用程序代码的方法方法一:首先要计算程序代码有多少,把FLASH存取地址设置在程序代码以外的地方,这样就不会破坏用户程序。

如何解决STM32在擦除内部FLASH时间过长导致IWDG复位的问题

如何解决STM32在擦除内部FLASH时间过长导致IWDG复位的问题

如何解决STM32在擦除内部FLASH时间过长导致
IWDG复位的问题
 客户反馈在使用STM32F412的时候,擦除Sector 8~11发现时间过长,从而导致意外触发IWDG复位。

 问题分析
 问题详情
 通过与客户邮件和电话沟通,了解到客户主要是想使用内部FLASH暂时保存IAP升级时的程序数据,在IAP升级的过程中,需要首先擦除内部FLASH中一块足够大的空间,然后再写入升级数据。

客户的工程中有使用到IWDG,喂狗间隔大约1.5s,客户的通过SysTick的方式计算出擦除Sector8大约需要2ms,因此认为若一次擦除Sector8~11大约需要8ms,于是在代码中一次性擦除Sector8~11后最后再来喂狗,但是,这样会触发IWDG复位,这个与预期不一致,固此产生疑问。

 问题重现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于STM32闪存擦写次数与数据保存期限的重要说明
ST 在2008 年3 月21 日更新了STM32 增强型(STM32F103)和STM32 基本型(STM32F101)的数据手册。

在最新的数据手册中,再次确认STM32 的闪存存
储器的擦写次数指标,在整个工作温度范围超过10,000 次,即STM32F101 基
本型的-40 摄氏度至+85 摄氏度,STM32F103 增强型的-40 摄氏度至+85 摄氏度,或部分型号的-40 摄氏度至+105 摄氏度。

(关于芯片的工作温度范围请参考下述
数据手册的第七章)新手册给出了更多数据保存期限的测试条件。

因为数据保
存期限是一个非常重要的指标,客户需要了解更加全面的信息,因此ST 比其
他MCU 厂家给出了更多的细节。

闪存存储器的数据保存期限随擦写次数的增
加而变化,手册中数据保存期限是指1000 次和10,000 次闪存擦写后的保存期限。

在所有的工作温度范围内经1000 次擦写后,在+85 摄氏度的保存环境下,STM32 的数据保存期限可达业界领先的30 年;在所有的工作温度范围内经
10,000 次擦写后,在+55 摄氏度的保存环境下(通常这是汽车工业要求的保存
环境),STM32 的数据保存期限可惊人地达到20 年。

当与其他MCU 产品比较时,十分必要去检查闪存擦写周期是在什么温度环境下检测的数据保存期限。

例如,在+85 摄氏度时数据保存期限为10 年,因为没有给出闪存擦写周期,这
样的描述是不完整的。

可在ST 的网站免费下载最新的STM32 数据手册:
STM32F103x 数据手册第6 版STM32F101x 数据手册第6 版下图是STM32F103x 数据手册中的相关参数表:tips:感谢大家的阅读,本文由我司收
集整编。

仅供参阅!。

相关文档
最新文档