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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
关于单片机EEPROM数据保存的若干经验总结 附带stc单片机程序
$ e# G% b; i2 ^3 F
- v- w3 g, W* K3 b- N9 r) n, D
* Y) f& p5 E% u
因为要保存的数据可能是千变万化的,字长可能从8位到32位,其中包括char(8)、short int(16)、 int(32)、float(32),而不同数据类型在不同体系架构上字长各不相同,复杂点的甚至包括结构体Struct,
& L# n  V: s1 G! x+ |: Z8 u' S* S5 S因为结构体包含数据大小未知,完成由用户定义,如果保存数据时要考虑到这么多的变化,那能把人都搞晕,因此设计一个以不变应万变的数据保存机制就很好了,好比是复杂平台中的数据串行化保存。4 f  i9 o' d8 S$ u8 m
在单片机里面不可能实现这么高级的技术,但是也可以通过一个小小的技巧实现类似功能,方式就是通过联合体来保存,比如下面所示
( n( ^+ k* N3 g4 S, E  m
. B  K" p( P5 a6 C% L2 l        struct         e2prom_data
8 X" p: R% u) [; r! E; W        {
/ H' n- m0 @. G# c2 A5 }% g        char TEM_compensate;
. o' k  t7 w# ?! D2 O0 U        unsigned int sterilization_temperature[10];//0.1
, \1 w: |5 T5 ^- }" E        unsigned char sterilization_time_min[10];
* }/ o6 U: G4 ]; I  h6 a        unsigned char exhaust_times;" [4 ]2 U2 n  e6 C3 w2 y* Y
        unsigned char prebalance_time_min;
! Y6 K4 @7 Q/ O3 o  }1 o        };3 G$ S) f- k1 ^

( N+ D* g- I! @; wunion sector
% M0 C6 M% V! {0 W; G- V{" m+ _3 O# L" r' C# S$ l4 S
        struct e2prom_data sterlization_data;
; P$ v2 N, Q# _  l2 U% L6 ?7 `. Y- B- ~        unsigned char storage[ sizeof(struct e2prom_data) ];
% N! H) h5 c: t: B} e2prom;/ I# n$ p+ N0 t! f

+ V8 W8 v+ x2 N' j' m6 G# l2 P8 ?: F. K. c3 ]9 @4 V
   联合sector代表实际的扇区,大小不能超过扇区大小,而上面的结构体就用来保存真正要用到的变量,然后通过联合体sector里面的unsigned char storage,统一转换成1个字节来保存实际数据,极其方便。
& R- q; K/ N4 P# R; ^- ?  c$ U7 X而要读取数据的时候可以通过下面的  void read_sector(char secn)函数来统一操作,把数据统一读取到内存中,确认保存后再通过void write_sector(char secn)统一保存。# i6 f/ V1 \8 G0 W
效率很高,用内存来缓存数据,可以减小EEPROM擦写次数,提高寿命。
' @( B& j8 z' `2 G

5 [# ^! C! J4 E" [; J1 E6 `

% m7 [4 o/ b0 f- e4 j1 I+ d void read_sector(char secn)3 ~/ ~) A- a$ N0 i9 W( N3 C
{% S/ j, j/ _! X
          int i;, y) p& e' I1 [
        int E2prom_sector_start_addr=(secn-1)*512;
; D8 q0 A2 E' d! Q/ h. H& \, Y: @2 h        for(i=0;i< sizeof(struct        e2prom_data);i++)
) q$ q( P7 P0 \        {4 m1 s2 U* T' Q' Z4 ^2 a
        e2prom.storage=Byte_Read( i+ E2prom_sector_start_addr);3 G) A2 }0 q8 y! E* O* _3 f$ F
        }
/ i. s: k! W% }3 g* d# _          IAP_Disable();. Z  ?) ]9 t  x- \7 F' T7 F
}
/ y. c3 f1 A: q* A0 v. `. l/ P) J; P% A0 ~6 {7 n0 @

# o6 @/ F3 ?2 k, L$ Pvoid write_sector(char secn)
; \6 y  [4 Z4 j8 ]; G+ y4 C{) F, c' i/ o' e: S9 R! m; M! E+ p
        
- p. D$ a; l5 u  o$ r        int i;- b5 Y; o' c: v2 B
        int E2prom_sector_start_addr=(secn-1)*512;: F" ?+ B$ o# R& t' u
9 a* x. a$ P6 w! b. v; D6 Y
0 t5 t) u/ N6 s$ G- J0 W. H
        Sector_Erase(E2prom_sector_start_addr);
! ~& ]$ j' l2 d        for(i=0;i< sizeof( struct         e2prom_data );i++)
+ j2 Z) v8 `" V  O        {
. G, x& q9 W# g% V. c        Byte_Program(i + E2prom_sector_start_addr, e2prom.storage);, F+ Z& ?8 D8 Q6 r( I3 K
        }
; f( P; a, [5 m& j           IAP_Disable();
: y9 U0 F8 |9 m$ L  z# [+ S. u; m}' B' L( H6 ^3 g$ ^+ Q+ J7 ?
% t7 ^0 `1 |$ j9 i6 N" Y+ J
2 |6 e6 q; g4 H7 }, k# R* n
唯一不足的地方是实际数据地址是固定的,如果常年累月读写次数多了的话,EEPROM还是有可能出问题的,下一步改进的地方就是通过实际一个虚拟存储空间来延长EEPROM寿命,6 Z, T  Q/ I' }" m" {% k$ i
实际方案是比如一个扇区是1K字节,那么把1k分成256个单元,每个单元4个字节,扇区首单元保存扇区状态,剩余255个单元作为实际存储单元,而每个存储单元又分成2+2布局,前两字节保存实际数据,后两字节保存虚拟地址,1.写入时写入数据紧跟后面写入虚地址VirtAddVarTab(0<=i<NumbOfVar)2 g  A5 j: l0 R/ G
2.每个Page第一个地址写入该页状态(Earse,Reveice,Vild)+ t" E9 d+ P! Z( Q. n: K& ?
- V* v$ Y9 u; _0 l9 |
相同地址再次写入时不会把上次写的擦掉,而是在模拟EEPROM区尾部未写过的地方再次写入数据、虚地址,
+ v: J4 I$ I4 C7 L3、 读的时候是从尾部开始匹配地址,也就是读取最后一次写的内容。
5 R+ P9 y5 Y0 p& N0 R+ s( T4、模拟EEPROM区分为2页,如果一页满了把这一页内地址不重复的数据复制到另一页后擦除,2页交替使用。" z6 e5 z6 f5 P/ C8 d  N
7 n/ R4 H0 C. @% `& Y
一个代码:
1 e$ I7 x9 O, F) t  y
游客,如果您要查看本帖隐藏内容请回复
# ?  c4 F0 a) i$ ]" X1 l" q

  j+ T- E, p" `. s, i, `0 F0 r- v# y2 \# ~" p) R' @  f: @
2 B$ j6 S& Q. l: @; Y. l

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-3 10:47 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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