【经验】一招教你延长单片机的Flash擦写寿命
在单片机开发应用中,工程师经常会遇到需要在单片机内部Flash的某个区域保存和读取一些数据,而这些数据在应用中可能会经常变化,因而需要对Flash的数据经常更新。但是单片机的Flash都是有擦除次数要求的,并且擦除是按照“页”为单位操作的,频繁擦除超过一定次数后,Flash就会失效。那么,如何才能延长单片机的Flash擦写寿命呢?本文就以SILICON LABS的8位单片机EFM8SB10F8G为例,教大家如何延长单片机的Flash擦写寿命。
EFM8SB10F8G的Datasheet上Table4.4标称Flash擦除次数典型值是100K次,一个Flash Page是512字节,也就是在执行擦除指令时,一次至少擦除512字节的数据。EFM8SB10F8G提供了Flash自编程的读、写和擦除函数以及对Flash操作的参考例程。Flash支持单字节读和写,但是每次在更新数据之前必须要先擦除原来的数据,不能在原数据基础上直接写新数据内容。假设每次需要更新的数据长度是16个字节,最简单的方法就是在每次更新数据之前执行擦除指令,然后写入新数据。但是更新数据频率比较高的应用场合,这种方法显然是不行的。此时需要采取“空间换时间”的方法了,擦写的次数和存储数据长度的大小成反比。“空间换时间”就是指利用相对多的Flash空间来换取相对多的擦写时间(次数)。在第一次执行擦除指令后,可以依次将数据写入Flash的这一页,当写满一页后再进行擦除操作。这样的话,一页512字节空间,每次写入16字节长度的数据,一页就可以写32个数据块,写满后再全部擦除,而不用每次写数据前都擦除,该页的擦除次数就可以提高32倍,也就是100K*32=320万次了。
既然思路清晰了,那么软件实现起来就相对比较简单。首先需要选取数据块中的某一字节作为地址INDEX,更新数据时第一个写入Flash。Flash的编程原理都是只能将1写为0,而不能将0写为1。所以在Flash编程之前,必须将对应的页擦除,而擦除的过程就是把所有位都写为1的过程,页内的所有字节变为0xFF。
写入数据实现过程:每次写入数据时,从低地址到高地址依次(以16位步进)判断INDEX的内容,为了防止实际数据中包含0xFF内容,从而出现误判的情况,建议判断INDEX和INDEX+1两个地址的内容。如果都为0xFF,表示该地址空间未被写过数据,写入需要更新的数据;如果至少有一个不为0xFF,表示该地址空间已被写过数据,继续查询,直到查到内容都为0xFF为止;如果所有的INDEX(32个)和INDEX+1都至少有一个不为0xFF,表示该页已经写满,执行擦除指令后从首地址写入数据。
读取数据实现过程:每次读取数据时,从高地址到低地址依次(以16为步进)判断INDEX的内容,这样是为了查询到最新的数据。同样为了防止实际数据中包含0xFF内容,从而出现误判的情况,建议判断INDEX和INDEX+1两个地址的内容。如果至少有一个不为0xFF,表示该地址已写过数据,读取数据;如果所有的INDEX(32个)和INDEX+1都为0xFF,表示该页还未写入数据。
通过上面的方式,并不是真正的提升了单片机Flash的擦写次数,但是却延长了Flash的擦写寿命,实现了需要频繁更新数据的应用。
- |
- +1 赞 0
- 收藏
- 评论 3
本文由Carol提供,版权归世强硬创平台所有,非经授权,任何媒体、网站或个人不得转载,授权转载时须注明“来源:世强硬创平台”。
评论
全部评论(3)
-
古月工 Lv8. 研究员 2018-12-21学习
-
z24656 Lv6. 高级专家 2018-12-21好
-
LouBing Lv7. 资深专家 2018-04-06谢谢经验分享
相关推荐
【经验】芯科科技单片机EFM32PG22的ADC采样如何使用LDMA传输大于2048个数据?
EFM32PG22使用LDMA传输ADC的采样数据,可以在MCU休眠下进行,从而降低MCU功耗,是比较好的应用方式。但是LDMA的计数器最多只能计数2048,限制了LDMA的一次性传输数据大小,本文介绍如何打破LDMA传输大小的限制。
设计经验 发布时间 : 2023-07-01
【经验】如何使用芯科的单片机EFM32PG23的内部温度传感器
EFM32PG23内部集成一个温度传感器,可以采集芯片的温度,用于时钟、ADC等校准,也可以用于过温报警等功能。由于手册对温度传感器的介绍比较少,并没有详细介绍温度传感器的使用步骤,导致研发时,不清楚怎么使用EFM32PG23内部的温度传感器。本文将详细介绍。
设计经验 发布时间 : 2023-04-17
【经验】PCB布线技巧:8位单片机端口Crossbar功能的使用及配置
如果单片机自带Crossbar功能,只要软件配置调整一下各端口功能,PCB布线就会畅通。
设计经验 发布时间 : 2017-08-09
8位单片机EFM8的烧录器有哪些?
8位单片机EFM8系列采用C2调试接口,常见的烧录器有:1,官方的EFM8 STK、USB Debug Adapter、ToolStick。2,第三方的U-EC2/6、WizPro200EFM(支持EFM8和EFM32)等。
技术问答 发布时间 : 2016-10-25
EFR32MG21单片机pwm如何配置的,这样可以么,没有输出,IO如何映射过去呢?
Silicon Labs 无线SOC EFR32MG21的PWM的输出需要将TIMER的CC端口配置到GPIO上,如下: GPIO->TIMERROUTE[0].ROUTEEN = GPIO_TIMER_ROUTEEN_CC0PEN | GPIO_TIMER_ROUTEEN_CC1PEN; GPIO->TIMERROUTE[0].CC0ROUTE = (LED0_PORT << _GPIO_TIMER_CC0ROUTE_PORT_SHIFT) | (LED0_PIN << _GPIO_TIMER_CC0ROUTE_PIN_SHIFT); GPIO->TIMERROUTE[0].CC1ROUTE = (LED1_PORT << _GPIO_TIMER_CC1ROUTE_PORT_SHIFT) | (LED1_PIN << _GPIO_TIMER_CC1ROUTE_PIN_SHIFT);具体可以参考MG21的BT MESH的程序。
技术问答 发布时间 : 2019-11-13
Silicon Labs 单片机程序烧写接口探讨
本文总体介绍了Silicon Labs 产品编程烧录选择,对于一个空白器件最常用的编程方法主要有两种,系统编程和预编程,对于这两种方法的选择,主要考虑两方面,一方面看需编程的器件数量,另一方面考虑需编程的器件上是否预留调试引脚(JTAG或C2),一旦器件被编程一次,器件即可通过UART或其他接口升级固件。
技术探讨 发布时间 : 2016-05-26
【应用】芯科科技高性能8位单片机EFM8BB31F32G用于音频放大器,集成多达四个12位DAC
本文介绍Silicon Labs 8位单片机EFM8BB31F16G-D-QFN24R用于音频放大器,优势:最高工作频率50MHz,稳定性好;集成一个12位ADC、四个具备同步和PWM功能的12位DAC;FLASH从16KB~64KB可选等。
应用方案 发布时间 : 2022-09-20
【经验】C8051F410单片机快速可视化编程代码产生的使用方法
Silicon Labs为了帮助工程师快速编程,提供了一个配置向导软件,名称为”Configuration Wizard 2”,这个软件的主要功能是对各个模块初始化的配置和工程师设计原理图前对外设进行设置。本文主要介绍C8051F410单片机初始化代码快速产生的使用方法和技巧,这是Silicon Labs 可视化编程独有的特性,使用简单缩短开发时间。
设计经验 发布时间 : 2020-06-29
【经验】Silicon Labs EFM32系列单片机在使用KEIL编译时如何生成BIN文件?
Silicon Labs的32位单片机在集成开发环境中,默认情况下编译可以生成*.axf格式的调试文件和*.hex格式的可执行文件。这两个格式的文件支持市面上大部分仿真器的下载和调试,但是有些用户的下载器软件需要支持*.bin格式的文件,在现有的开发工具利用集成开发环境的优势,如何将*.axf格式文件或*.hex格式文件转换成*.bin格式的文件。
设计经验 发布时间 : 2021-06-03
系统硬件要求: 系统控制三个2相4线5v的微信步进电机,和一段0.25mm x 60mm的电热丝,两对反射式光电开关,配合工作。 1.电路板及其附属元器件总成(不包括电源)需能放置于80*20*7mm的空间中,越小越好,主板加元件的厚度不能超过8mm,宽度20mm可以调整,高度最高不能超过84mm。 2.电热丝及步进电机均采用引线焊接于主板的链接方式,(如果可以做到像苹果手机主板上那样的mini 排线,可采用之)。 3.由于步进电机是2相4线5v的,所以采用5v直流动力电池供电。 4.主板应带有电池过冲放电控制模块,接口采用安卓手机充电接口或苹果手机充电接口。 5.电热丝的供电不能随电池的电压变化而变化,应具有恒定的功率输出。 请问选什么单片机和驱动芯片
单片机可以选择Silicon Labs的EFM8BB系列的芯片,芯片的体积小,运算速度快,集成度高。驱动芯片可以使用MOS管组成全桥驱动,也可以选择集成全桥驱动的专用集成芯片。
技术问答 发布时间 : 2020-02-10
8位单片机EFM8系列中芯片上的UID是什么?
UID是芯片中新加的全球唯一ID,即每个芯片的ID都是不一样的,EFM8系列的MCU上都包含此ID。有两类获取UID的方式,一种通过读取RAM的特定地址获得,一种通过读取Flash的特定地址获得。在早期引入此ID的MCU上(比如EFM8BB1/SB1/SB2)这个ID为32位,在芯片复位时(PC指针被复位至0之前)被复制至RAM中特定位置,用户程序可以读取其值。此位置的RAM仍然可以由用户使用。需要注意的是如果此位置被编译器分配了变量,那么当函数执行至main()时此位置的内容会被初始化代码覆盖。EFM8UB2的UID也是此类,但其位数为128位。在新的EFM8系列MCU上(比如EFM8BB3/LB1/UB1),UID位数为128位,存储在Flash上。
技术问答 发布时间 : 2017-05-05
【经验】如何对EFM8系列8位单片机进行一次性下载两个HEX文件操作?
Silicon Labs(芯科实验室)推出的EFM8系列8位单片机被大量使用在光模块、电机控制等产量巨大的产品上。正因为量大,客户经常会问“如何提高下载效率?”的问题,尤其是用了EFM8LB的光模块客户,甚至还希望能一次性下载“bootloader HEX”+“APP HEX”两个HEX文件,可以这样操作吗?答案是肯定的,本文将为你详细讲解方法。
设计经验 发布时间 : 2020-06-22
Silicon Labs C8051单片机如何读写FLASH?有没有程序案例?
可以安装 Simplicity Studio软件,就有C8051单片机读写FLASH的例程,可以参考下面的文章:如何将EFM8系列MCU的FLASH用作EEPROM?
技术问答 发布时间 : 2019-01-10
使用J-link调试工具调试EFM8系列8bit单片机时,Jlink和EFM8单片机之间需要连接哪些接口线?
在使用JLink调试工具调试EFM8系列单片机时,使用到的调试接口是C2接口,正确的连线如下:1、JLink的pin1引脚VTARGET连接到目标板的VDD;2、JLink的pin2引脚C2D连接到目标板的C2D引脚;3、JLink的pin4引脚C2CK连接到目标板的C2CK;4、JLink的GND引脚连接到目标板的GND;5、目标板在调试的时候,VDD引脚需要上电。
技术问答 发布时间 : 2016-10-25
电子商城
现货市场
服务
支持微型计算机 、便携式计算机显示设备、投影仪、打印设备、绘图仪、多用途打印复印机、扫描仪、计算机内置电源、电源适配器、充电器、服务器、收款机等产品中国强制性产品认证。
提交需求>
提供7~27寸工控机定制,支持嵌⼊式/ 壁挂式 /桌⾯式/悬挂式等安装方式,采用纯平⾯板IP65防尘防⽔等级,莫⽒7级硬度触摸屏,兼容多种操作系统:组态软件/安卓/XP/win7/8/10/Linux等,支持主板、接⼝、外观、⽀架、刷卡器、⾝份证阅读器、LOGO、⻨克⻛、系统、电池、蓝⽛、4G/5G、摄像头、GPS系统、⼆维码扫描器、指纹等特殊应⽤场景定制
最小起订量: 1台 提交需求>
登录 | 立即注册
提交评论