[STM32/8经验] 经验分享——EEPROM读写及数据管理

发布者:画意人生最新更新时间:2018-07-17 来源: eefocus关键字:STM32  EEPROM  读写  数据管理 手机看文章 扫描二维码
随时随地手机看文章

经常有人在QQ群讨论有关E2PROM操作、保护、失效等一些问题,今天闲来没事,简单概括总结一下咯。(才疏学浅,路过的英雄记得补刀)

1)有关 芯片内部自带的E2PROM



有的资深的工程师可能不是很愿意用MCU自带的E2PROM,大概是这些家伙上过什么当、受过骗还是什么的。简单说一下优缺点吧:



(1)片内集成的感觉挺便宜的,和MCU一起卖的,对成本要求严格的,写次数很少的场合一般会考虑,至少能省个2、3毛钱吧;

(2)缺点的话,可能擦写次数、稳定性没有外挂的专用芯片厉害;


2)有关常用的外挂E2PROM


如果是学生或者刚从学生时代走来的人们,大概也就知道ATMEL 24C0X系列吧,就好像我毕业的时候以为世界只有51和AVR,开个玩笑!

工程师主要考察E2PROM的参数无非就是擦写次数、功耗、稳定性、价格,其中10万次擦写次数和 100万次擦写次数正在较量,至于从工程师的角度考虑 擦写次数自然是没有上限最好,太低的擦写次数会让程序员死很多脑细胞。

3)有关E2PROM的数据管理


(1)操作注意事项:分页操作需要有5ms延迟等待时间才可以(以类AT24C04的产品为例),也就是模块化程序设计中,在写数据之前、写数据完毕后、度数据之前、读数据之后都需要考虑加5ms的延时时间。本来IIC的读写速率就不是很高,外加这些延迟一定会势必影响系统设计的实时性,但也不得不从读写性能的角度出发。



(2)上拉电阻的选择:出于稳定性考虑,WP、SDA、SCL引脚都会设置上拉电阻,常用的电阻值为 4.7K 、10K电阻,个人比较推荐4.7K。


(3)硬件IIC与软件模拟IIC的比较:对MCU资源不是很敏感的应用,都会考虑软件模拟的方式,毕竟这个移植起来真的很方便,只有第一做软件部分的时序、保护性设计作为足够好,后面拿过来修改时钟就可以直接,确实方便。


(4)默认参数的写入:设置新E2PROM的时间戳标志,每次系统启动时检查这个时间戳和MCU自身存储的时间戳是否一致,不一致则初始化整个E2PROM为默认参数;当然软件程序的升级,这个时间戳表示也有必要做更改。


(5)数据容错和管理:

把数据以有意义的数据块作分类管理,在数据的块的头、位加固定标识和CS/CRC校验 模式,格式如

  

数据块开始字

  

数据长度

数据

校验

结束

0xA5

Length

Byte0---ByteN

CS/CRC

0x5A


实际用于产品中,可以挑选这个格式内容里面的部分内容使用,比如去掉结束符等。

个人之所以建立写入开始字、结束字,原因是方便最好读出来的数据做数据格式检查,确认写入、读出的数据可靠性最高。

   为增强实际的可靠性,在需要写入的时候,可以在写入后,再读出来进行数据的比对,确认写入是否正确;或者在需要读出的时候,读两次、或者多次,检查每次的数据是否一致。

   对于出现异常的数据,最好有容错机制,可以回到默认状态值,不至于系统此时因为某个参数改变的崩溃。


(6)实际底层操作是否需要关闭主程序的中断:一般按照上述(5)操作,有多次冗余操作设计,可以不关闭主程序中断。而且,IIC为等待型操作,一般不会因为系统延迟导致时钟脉宽拉长,影响字节写入、读出。


(7)E2PROM擦写次数的延长: 如果现在手上的E2PROM的擦鞋次数是10万次,项目要求为100万次,且E2PROM内有很多空闲字节的没有使用。


可以这样操作,将数据整理好,以数据块的方式存储,一组数据分10个块地址存储,每次写完后转移到下一块写,即10次写操作中每个物理的数据存储地址只操作了1次。 注意此时的写块数据的指针不能单独存、操作,不然这个字节的操作频率高,也就受到10万次的限制,这个关键的链子在10万次的时候掉了,其他字节也就挂了。这个表征操作哪个块的指针或者说标示符,当然也需要是移动的,至于具体怎么实现,就是见仁见智的事了。

转自:http://blog.chinaunix.net/uid-20589269-id-1622153.html

最近用Mega16做一个步进电机的项目,以后把项目全部的内容贴上来跟大家分享呵呵,现在讨论一个防止EEPROM读写出错的小办法,我编写熔丝位是用AVRstudio里面的Jtag下载功能来烧熔丝位的,连上Jtag,AVRstudio的Jtag功能fuse选项里,把熔丝位中的Preserve EEPROM memory through the Chip Erase cycle钩上,Brown-out detection level at VCC=4.0V钩上,Brown-out detection enabled钩上,就可以解决读写EEPROM时出错的机会了。

      如果再加上用直接地址访问法,而不用变量定义法,会更好的避免EEPROM读写问题,例如我就定义了
//定义eeprom变量的地址
#define eeprom_step_num 0xA0
#define eeprom_step_r_max 0xB0
#define eeprom_step_l_max 0xC0
然后程序就没有再跑飞了!^_^


      在其它论坛上还有一些讨论EEPROM读写错误的贴,我节选了一些,留作参考:

EEPROM掉电丢数据这个特点可不是AVR独有的。很多年前在89C51+24C02的系统里面就遇到过,我不知道铁电有什么比24C02更牛的地方,居然能保证不丢数据。原因很简单,就是掉电过程中,电压降低到MCU无法正常工作的程度,程序跑飞了,单片机引脚状态完全不可控,某次掉电就可能发出错误的写24C02的指令。上电的时候因为RESET处于有效状态,MCU引脚状态完全确定(对于51来说就是全1),是不可能误操作24C02的。解决方案很简单,加一片MAX813L,当电压低于4.6V就锁定89C51,问题彻底解决。这么多年也没见24C02被误改写。 

最早的一批AVR内置了EEPROM却没有BOD,所以EEPROM被误改写是家常便饭,ATMEL很快发现了这个问题,新推出的AVR全都含有BOD乐。AVR的情况比较复杂,振荡方式和复位方式都有多种,所以不仅掉电会改写EEPROM(原因同上),上电也会!RESET过程结束前,必须有若干XTAL,MCU内部寄存器(包括软件不可见的)才会清零,如果RESET结束了才来时钟,上电就是程序乱飞,同样有可能改写EEPROM。用RC振荡方式问题不大,有电就能振起来,用石英晶体就会出问题,我测过89C51的,上电后20ms才振起来,如果电源上有大的滤波电容,VCC的上升斜率变小,晶体起振时间会变得更长!有存储示波器的朋友可以自己测一下,对晶振的起振有个感性认识。

我遇到过的问题,m8里面有写eeprom的程序段,数据已经写入到eeprom了。 
不停的开关电,eeprom里的值有可能随机改变,不见得是0x00,0xFF 
原因是不是上电时,程序指针跑飞到写eeprom那段,导致往eeprom随机地址写了随机数。 
后来,采用isp下载2次程序,最后版本的程序是删除了写eeprom程序段,保留读eeprom段。 
这样的话,开关电很多次,里面的eeprom没见有改动。 
如果系统实际运行时,需要对eeprom写操作,可考虑存多几次数据,用校验方法来处理数据改变。

偶的应用一般要用到EEPROM存储的数据比较少,一般采取反码冗余备份校验的方式,需要存储的数据按照原码和反码存两份,需要读取时分别读取原码和反码,进行校验,若校验不通过,则根据一定的算法恢复数据或者采取缺省值.

我遇到过的问题,m8里面有写eeprom的程序段,数据已经写入到eeprom了。 
不停的开关电,eeprom里的值有可能随机改变,不见得是0x00,0xFF   



我也是一样BOD使能   就OK了 不过我还是不放心,我用两份数据,最后加校验,启动的时候读eeprom数据   如果有异常 检测出错误数据组,然后用正确的恢复。如果两组数据均遭毒手,用flash里面的默认数据覆盖。

一般我在eeprom里间三分拷贝,位置隔的比较远

以下是马潮老师的解决办法:

作为一个正式的系统或产品,当系统基本功能调试完成后,一旦进行现场测试阶段,请注意马上改写熔丝位的配置,启用AVR的电源检测(BOD)功能。 

对于5V系统,设置BOD电平为4.0V;对于3V系统,设置BOD电平为2.7V。然后允许BOD检测。 

这样,一旦AVR的供电电压低于BOD电平,AVR进入RESET(不执行程序了)。而当电源恢复到BOD电平以上,AVR才正式开始从头执行程序。保证了系统的可靠性! 

原因分析如下: 
AVR是宽电压工作的芯片,当电压跌至2.5V,系统程序还能工作。这是有2个可怕的现象可能出现, 
1。外围芯片工作已经混乱,AVR读到的东西不正确,造成程序的执行发生逻辑错误(不是AVR本身的原因)。 
2。当电源低到临界点,如2.4V时,并且在此互上互下的,AVR本身的程序执行也不正常,取指令、读数据都可能发生错误,或程序乱飞、不稳定(AVR本身的原因,实际任何的单片机都是这样的),非常容易造成EEPROM、FALSH的破坏。有人问51怎么不会?实际上51也是这样,只是51内部没有直接写EEPROM、FLASH的指令,它的程序乱飞留不下痕迹。还有人有疑问:外挂EEPROM,掉电时怎么不会改写?实际是外挂EEPROM,当电压低于4V(2.7V)时,它已经不工作了,程序去改内容也改不了。而AVR内部的东西在临界电压时都能工作,但非常不稳定。 

AVR的BOD功能必须要使用,我早期使用51时,凡是产品外部都要使用电源监测芯片,现在AVR自己本身就有该功能,一定要使用。


关键字:STM32  EEPROM  读写  数据管理 引用地址:[STM32/8经验] 经验分享——EEPROM读写及数据管理

上一篇:I2C通信 读写数据过程
下一篇:EEPROM读写操作常见的陷阱

推荐阅读最新更新时间:2024-03-16 16:09

iPhone 8电池信息大曝光:容量少的让你抓狂
iPhone 8已经曝光到现在,其外形、配置、售价等我们都已经有了大概的了解了,现在另外一个关心问题就是,它内置的电池会不会有所突破?   之前,台湾产业链曾给出消息称,苹果要为iPhone 8换上L形电池设计,这样可以让电池更安全。那么电池容量呢,毕竟在电池技术停滞不前的现在,大的容量始终是解决续航的最有效手段。   有熟悉产业链网友爆料称,iPhone 8和7S的内部代号为D22和D21,其都标配无线充电,并且后者会采用玻璃后盖,而iPhone 8将支持虹膜识别功能(这是接下来不少旗舰手机都会标配的功能),同时双摄像头中间为LED闪光灯。   此外,消息中还提到了iPhone 8的电池容量,其电池则为L形状,里面两块电池用
[手机便携]
STM32定时器---正交编码器模式详解
编码器分类: 按工作原理:光电式、磁电式和触点电刷式 按码盘的刻孔方式:增量式和绝对式两类 由于博主接触面还不是很广,一共就用过两个种类的编码器,都是属于光电的 差分编码器:一般由8根线连接 信号线分别为 A+ A- B+ B- Z+ Z- 以及VCC和GND 这里有一种不需要Z信号的,6线差分A+ A- B+ B- VCC 和GND 正交编码器:一般是5根线连接,信号线分别为A B Z VCC和GND 编码器线数: 就是旋转一圈你的A(B)会输出多少个脉冲 ,这里的A B就是上面的输出脉冲信号线,它们转一圈发出的脉冲数一样的,不过存在90°相位差 通常都是360线的 线数越高代表编码器能够反应的位置精度越高 相位差为90°
[单片机]
STM32 flash读写程序
static void RCC_Configuration(void); /******************************************************************** * 函数名 : main * 函数描述 : Main 函数 * 输入参数 : 无 * 输出结果 : 无 * 返回值 : 无 ********************************************************************/ int main(void) { u32 cnt = 0; u16 data = {0x0001, 0x0002, 0x0003, 0x
[单片机]
STM32裸机编程的基础知识(2)
在前一篇文章中我们已经学习到可以通过直接访问存储地址来读写外设寄存器,下面复习下将 GPIO A3 设为输出模式的代码: * (volatile uint32_t *) (0x40020000 + 0) &= ~(3 6); // CLear bit range 6-7 * (volatile uint32_t *) (0x40020000 + 0) |= 1 6; // Set bit range 6-7 to 1 这段代码有些诡秘,如果不加以注释,很难理解。我们可以把这段代码重写成更易读的形式,方法就是用一个包含 32 位域的结构体来表示整个外设。我们来看一下数据手册 8.4 节中描述的 GPIO 外设的寄存器
[单片机]
单片机做的433遥控解码源程序,带学习功能可存8组遥控码
分享一个最近用STC89C52单片机做的433遥控解码程序,带学习功能的,可以存8组遥控码,如果不够可以自行增加。电路图如下: 单片机源程序如下: 1、EV1527/PT2262 按键解码输出,并有解码有效输出端。 2、程序采用中断嵌套结构,定时时间准确,可轻松集成到您现有程序中,解码精度不受其他程序块影响。 3、通过学习键可学习40个遥控器编码,使用芯片自带EEPROM,无需外挂存储。 4、提供keil5 c代码,有详细注释,提供网络技术支持。 该源码适合初学者研究,或想在原有产品中增加功能又缺乏此类经验的朋友。 !!!按一下学习键指示灯亮一下灭,松开,再按一下遥控器,学习指示灯闪一下,表示学习成功
[单片机]
单片机做的433遥控解码源程序,带学习功能可存<font color='red'>8</font>组遥控码
【STM32H7教程】第6章 STM32H7工程模板建立(IAR8
6.1 初学者重要提示 IAR的工程创建过程还是比较重要的,务必实际上手操作一遍。 6.2 第1步,创建工程文件夹 创建一个文件夹,里面包含如下文件(直接将跑马灯例子的Project文件里面内容全部删除,然后整个工程复制进来即可)。 Doc文件夹 用于记录例程的修改记录和例子简介。 Libraries文件夹 在第一章详细介绍从官网的下载方法。 Project文件夹 这个是本章的重点,在这个文件夹里面再建立两个文件夹,EWARMv8文件夹用于存放IAR工程,MDK-ARM(uV5)文件夹里面用于存放MDK工程,方便以后创建MDK的工程。 User文件夹 这个是要用户提供的,开发板已经都提供
[单片机]
【STM32H7教程】第6章 STM32H7工程模板建立(IAR<font color='red'>8</font>)
基于STM8L的NTC热敏检测
随手小记一下,如果有错误还望大佬指正。 至关重要的就是确定型号,程序其实没多少东西。 首先你要先确定你的热敏电阻的型号,如果你是从淘宝购买,可以去问客服。如果你不知道型号如何,可以列一个表,在STM中利用你的分压公式,计算出你的电阻在温度多少的时候,电阻是多少。程序在下方,如图。要想问参考温度怎么得到的,那就是用另一个温度传感器。 热敏电阻的电阻值是随着温度的变化而变化的,温度越高电阻越小。电阻值与温度对应表在以下网址http://www.thermistors.cn/news/238.html,http://www.mcnic.com/rt/103.html,如果都对应不上那你需要继续百度了,因为本人实力有限,建了个
[单片机]
基于STM<font color='red'>8</font>L的NTC热敏检测
更新换代太快 4K电视尚未普及8K液晶又来了
不过,对于8K标准,坊间微词颇多。最核心观点是:4K尚且受制于内容匮乏,何来有“4倍4K”的8K生存的基础呢?路要一步步走,饭要一口口吃。这种观点成为主流。人们都担心匮乏内容的8K能走多远。 8K时代,面板厂怎么想? 8月31日,夏普在上海、台湾、东京、柏林四地同步发布全球首款消费级8K电视夏普旷视AQUOS LCD-70SX970A,售价68888元。 9月7日,2017年国际冬季运动(北京)博览会,国家会议中心,BOE(京东方)震撼推出全系列8K显示产品阵营,包括27英寸、65英寸、75英寸、98英寸以及110英寸等8K产品。 一个是液晶之父的夏普,一个是本土最大的显示面板制造商,二者不约而同的对8K频做加法。充分显示了面板行
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved