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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. $ [' t0 I+ U/ k2 a6 b4 `5 d0 G
  3. #define  TITLE_SIZE    80' L8 ~0 R7 k5 ^; W4 c: V
  4. #define  TITLE_KEY     1
    : C( f1 H4 F; J6 [/ ?  W6 P
  5. #define  POINT_KEY     2
    * R7 h# N  l+ w* A- o# R( K

  6. # P6 N2 o3 S7 M3 ]! K- q0 F/ _
  7. typedef  struct  {( e1 M# o$ \( t( k9 M
  8.         float  x ;9 `: f& F2 v, x+ B' q" @
  9.         float  y ;
    0 e# h% M: l& @4 w$ Y3 \
  10.         float  z ;
    # x  U  D+ d2 e4 f) U
  11. }  Point ;/ y0 p; j5 G2 ~4 @% L5 o, b( ?* C

  12. ! \5 V( ?9 w( p4 _
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;0 h! w0 G0 i5 B6 s4 h( R: s
  14. Point  point ;
复制代码

% k+ n. e, I; h
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    3 L- \  y6 e9 i5 p% X& y
  2. . v5 q' J  L) u' K" w
  3. 4 g2 G4 e3 c% Y4 S
  4. FLASH_Unlock ( ) ;: T0 t8 A* Q: o4 \/ l: B

  5.   n  L2 l, {, P7 U3 Q
  6. ! ~: S3 B: X- y6 a
  7. EE_Init ( ) ;
    / H1 p* o1 R8 u  j- q2 Q5 a

  8. 1 f% j+ d, Q2 T
  9. 7 J3 _* f2 B+ j# @7 @: K% W
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;
    : z3 ~3 Y0 U. U) u2 x, Q& w. ]% V# G
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;* w- n3 W6 Q  c% c$ e1 w0 e
  12. & O1 E( x5 M: p7 L

  13. 7 X# r& S: u, l2 w8 Q
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;- E5 y& E, r' }7 M6 C
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码

" B" D% V/ n' q) j8 k8 s) `5 U, o. V1 @5 m5 D6 }/ |
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:

% ^9 k, Q% u0 t! Y% J7 `
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码

7 m3 l. f; n* N: V! R! ]
$ ]4 Y  J2 r! {1 e( E  ^* t
- Y! @) y. [* n
收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版