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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. $ f' n# D/ |. ~% {6 t! R  U
  3. #define  TITLE_SIZE    80
    & u0 h/ `* N! L( ]1 P1 Q( d
  4. #define  TITLE_KEY     1
    5 `+ J. [) p% p9 K- C
  5. #define  POINT_KEY     2, C" S$ B7 F( y' _6 b, i- I, M4 @
  6. 7 n# R$ O( z/ C9 y$ j& Q
  7. typedef  struct  {1 H! i9 J! m! m' d2 T
  8.         float  x ;( Z7 k8 C7 b- q8 _" A) F/ W- m
  9.         float  y ;. O- m" \0 X3 `, _; |( c9 [" {
  10.         float  z ;
    8 r# ^$ _. u# r- U! I
  11. }  Point ;( S; i) [) t% n5 L& B

  12. " ]% l, t% S2 A6 }+ |
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;
    - t4 \- _. k5 b0 T" _: Y9 U# e: M; |' r
  14. Point  point ;
复制代码

4 }( Q) w9 c5 j8 Y
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    % R$ I2 H1 n) F+ T
  2. + O# i% I, P* ~/ m) z
  3. % [" b4 O. V# J
  4. FLASH_Unlock ( ) ;
    7 z" r8 y: |8 \1 s2 [1 M, V+ \
  5. - d- K( C1 Q( B  d

  6. % u" k9 `: j% R1 `
  7. EE_Init ( ) ;
    0 {2 }4 D9 ~3 U
  8. ' R5 A" e7 k2 I  s& w

  9. . f( E) O2 b9 o
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;
    5 r1 l3 P& |7 U! L. R
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;
    ) o" u  g0 w' \
  12. . p2 |" R0 B1 l' z) D6 E: n2 p% f

  13. ' v! g' F# g9 ?1 `, \9 w- x
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;
    ' V6 W. M3 ?7 t
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码
  R! T- P; H& {4 e: C9 @- m3 o
* u* b9 C# i. x6 T* p6 L, ]" _
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:

: J/ ?# ^$ s# a
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码

! j. {! W4 C8 Y- W5 U+ k+ @
+ L4 C6 J6 u+ P  R6 f0 o
4 d1 H6 A) }4 ^  X' n
赞 收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版