找回密码
 注册
关于网站域名变更的通知
查看: 1217|回复: 3
打印 上一主题 下一主题

关于单片机EEPROM数据保存的若干经验总结 附带stc单片机程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-1-14 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
关于单片机EEPROM数据保存的若干经验总结 附带stc单片机程序$ w; C0 a" D5 B  g7 A2 a
/ k5 i" w1 m6 k/ N& M

% g( v' T" u* ^# Z# K8 Q. B因为要保存的数据可能是千变万化的,字长可能从8位到32位,其中包括char(8)、short int(16)、 int(32)、float(32),而不同数据类型在不同体系架构上字长各不相同,复杂点的甚至包括结构体Struct,, Y/ y  o; a8 d" R, S
因为结构体包含数据大小未知,完成由用户定义,如果保存数据时要考虑到这么多的变化,那能把人都搞晕,因此设计一个以不变应万变的数据保存机制就很好了,好比是复杂平台中的数据串行化保存。
9 f3 G2 Q3 {2 a+ p+ p在单片机里面不可能实现这么高级的技术,但是也可以通过一个小小的技巧实现类似功能,方式就是通过联合体来保存,比如下面所示) A5 @( E. C2 b6 _$ C
; d8 V  D1 z! u3 O7 s. d# p( V
        struct         e2prom_data+ j0 B/ A5 {# [- F1 j
        {
/ Y5 Y! L* W; a3 t  Q% b/ ^" f        char TEM_compensate;  T1 Y$ R' `! }- O4 s+ V: |" _. ?
        unsigned int sterilization_temperature[10];//0.1. Q) E6 O: q0 p& L  S4 P
        unsigned char sterilization_time_min[10];
2 _3 W' u" y1 i0 C- ^  j        unsigned char exhaust_times;
3 ~! g2 R2 c: Z4 _        unsigned char prebalance_time_min;
1 j( E: t4 u! Q) k# K3 V        };
8 _& B0 {, |6 s6 q& ^/ ^. r! a3 U5 o( D! U$ [7 y; V2 i
union sector
5 Y2 p. p# A" @4 j" @) j5 G{. I$ F9 k3 q; i9 Y! w1 Y# N+ \
        struct e2prom_data sterlization_data;
9 \0 j" R3 S+ w$ N' ~7 u        unsigned char storage[ sizeof(struct e2prom_data) ];7 ^5 M5 u1 r9 ~) F" E; @
} e2prom;3 \+ s* G, J; z4 `; F2 _7 b$ @0 ^( e

8 v; X( L+ J. L, `, t' Q+ [
/ `+ ]. Z& C5 x   联合sector代表实际的扇区,大小不能超过扇区大小,而上面的结构体就用来保存真正要用到的变量,然后通过联合体sector里面的unsigned char storage,统一转换成1个字节来保存实际数据,极其方便。
: b+ l$ @6 b& H' O, ?而要读取数据的时候可以通过下面的  void read_sector(char secn)函数来统一操作,把数据统一读取到内存中,确认保存后再通过void write_sector(char secn)统一保存。+ W  q5 ?, x2 }6 s
效率很高,用内存来缓存数据,可以减小EEPROM擦写次数,提高寿命。

7 B! \$ c0 d# s3 w2 |0 c2 n6 m. V
/ p4 a% @8 e( |2 N! n3 e

3 C7 [4 y/ i2 j8 W1 |3 i" }: u4 @ void read_sector(char secn)
% k+ w) N! u3 A3 c* ^7 N6 e{
( s. Y: }5 D% d6 J8 C+ A          int i;* C3 q1 Q9 r+ `( N/ A* A3 Y; N- Y8 `
        int E2prom_sector_start_addr=(secn-1)*512;
+ x( c' J# H. w1 u        for(i=0;i< sizeof(struct        e2prom_data);i++)
7 X/ L2 v( G) C6 C        {
2 X+ f# V% O+ ]: L        e2prom.storage=Byte_Read( i+ E2prom_sector_start_addr);4 j3 y4 e& u% G
        }
. R  J7 _: E3 G3 [0 D! a          IAP_Disable();
$ x2 f- k; a( e& k4 Y5 }& v}) x) {" {! R, d7 \

, b% n$ W5 v' g! P

7 J6 ~, O1 j' g$ L! @void write_sector(char secn)( T/ P! z! G, Z9 |! _' A
{
2 ~$ |& S: N2 u) w        + L$ O/ r4 Y4 M+ R9 ?% V0 v+ H
        int i;
2 u% ?: G1 X$ L5 T: g9 Y        int E2prom_sector_start_addr=(secn-1)*512;, n4 H: u* ^: N0 E7 J( Q. p

+ S0 `* o5 s& x  F
+ I! O$ Y3 j) i) G" h2 P
        Sector_Erase(E2prom_sector_start_addr);' V) ]) h3 u0 a. ~
        for(i=0;i< sizeof( struct         e2prom_data );i++)
  b7 j" N: J! ^3 B2 g        {
* m& P( C; Y, Q5 _% q0 w" r        Byte_Program(i + E2prom_sector_start_addr, e2prom.storage);! a% `4 p2 P5 }- D. i/ C8 o% E
        }
8 g1 j4 r9 h$ D8 P& ~8 [" L           IAP_Disable();
1 m0 q6 ]& @1 K/ j. K}
% n# A1 ^2 g7 q- }# y
* F2 y4 W$ u/ L$ k+ p
* l8 K' Z! S- P5 i) r
唯一不足的地方是实际数据地址是固定的,如果常年累月读写次数多了的话,EEPROM还是有可能出问题的,下一步改进的地方就是通过实际一个虚拟存储空间来延长EEPROM寿命,0 z& \; T0 A0 X# M1 z
实际方案是比如一个扇区是1K字节,那么把1k分成256个单元,每个单元4个字节,扇区首单元保存扇区状态,剩余255个单元作为实际存储单元,而每个存储单元又分成2+2布局,前两字节保存实际数据,后两字节保存虚拟地址,1.写入时写入数据紧跟后面写入虚地址VirtAddVarTab(0<=i<NumbOfVar)' t$ U3 N1 w5 f5 v
2.每个Page第一个地址写入该页状态(Earse,Reveice,Vild)
7 }8 ]" }3 D/ v: _, b$ ?7 n7 d) C4 \: n0 e
相同地址再次写入时不会把上次写的擦掉,而是在模拟EEPROM区尾部未写过的地方再次写入数据、虚地址, ! ]% I# }" h/ t5 j. k  m  L
3、 读的时候是从尾部开始匹配地址,也就是读取最后一次写的内容。
$ B: c; U& Z9 R+ s6 B4、模拟EEPROM区分为2页,如果一页满了把这一页内地址不重复的数据复制到另一页后擦除,2页交替使用。% q* l7 J1 [: q

4 c' `* k) Y$ Y1 e& i一个代码:
: \; l- ~( D" q) F; }6 Q% e
游客,如果您要查看本帖隐藏内容请回复

: k8 L9 }  A6 n- ]# P$ e9 g! K& _9 b: F

& I" w# p9 k$ P0 [2 Q4 h  K. |

8 Z5 I5 b" z( b4 v$ U# P: w5 d' _

该用户从未签到

4#
发表于 2022-5-14 16:09 | 只看该作者
很想学习学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-5 21:04 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表