你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F10x Flash 模拟 EEPROM

[复制链接]
STMCU小助手 发布时间:2021-11-30 21:06
STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。
不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括:
  • 支持不同大小数据(字符数组、结构体等)的混合存储;
  • 增加对数据的校验和(Checksum)检查。3 d' G6 h! |. G& P
  附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体:
  1. #include  "eeprom.h"  _0 V4 n+ d& P/ R- f. B6 h, U

  2. / n3 B1 G8 d7 A' Y+ y- @5 E' {
  3. #define  TITLE_SIZE    80
    4 Z) Q3 R; ?2 V& d) F% ?& C: e
  4. #define  TITLE_KEY     1# }, H" X& B% L' Q6 ?$ r
  5. #define  POINT_KEY     24 X3 i" _2 w0 V  [. s% i
  6. ' y$ |9 D. X* j( m
  7. typedef  struct  {# C; @8 n4 q' n" D3 W
  8.         float  x ;
    4 ^7 p; N! Y: S
  9.         float  y ;+ k, A# }1 o* ?# ?% q5 I6 Y
  10.         float  z ;
    ) u! F& B7 t1 {( U% b
  11. }  Point ;
      F# E6 `1 q! `0 ~+ O; b
  12. : y9 s% I. q. V/ e: a
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;
    9 y2 j. _& \" d4 y% E' n
  14. Point  point ;
复制代码
2 H- o* J5 W+ n) L3 `! q
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;1 N7 Z) k+ c# I+ A
  2. 0 v; h& T' Z, F3 u8 Z

  3. / C7 s2 @, m6 ]! p' Q
  4. FLASH_Unlock ( ) ;6 x% u  L. a8 [  E
  5. # ?- o* A" D1 Y& V8 Q3 x7 _
  6. 4 q9 C# C9 j( X8 _" c" C
  7. EE_Init ( ) ;) c! e  W0 M% H/ i* w
  8. ( r+ |! A' C* W* d

  9. , e: o5 x1 R+ S0 E
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;
    2 @' p' a) z: s6 ]  a) N1 K0 O& u7 ~% ^
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;" l6 [: q# u" b( G- Y9 b6 W; `

  12. 3 c! G/ w" [  \

  13. 2 q' g. H( \5 }$ a2 `9 J
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;4 z( [( v! r: E- p
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码

! P/ E. G( h) g, D) r3 q, j
, Z( r) j" H2 @
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:
5 H% a0 O2 t0 V
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码

3 Q5 I3 j( H8 ?% Z7 c5 @# r5 R) ~9 M0 f$ b6 D/ s1 p
( u  B0 m3 ^9 j( V" }: A4 H
收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版