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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. / p5 m  l( t  A: U) q" k
  3. #define  TITLE_SIZE    80
    5 j2 \0 b- A/ K2 D1 {
  4. #define  TITLE_KEY     1% U, v0 ~' d! T! I
  5. #define  POINT_KEY     27 m" |8 l0 U  ?! {. ~

  6. 7 s' c- ?2 P  q  L4 |7 W, V* K3 |
  7. typedef  struct  {
    / l0 L2 m" A% H  ?: u
  8.         float  x ;
    ; i/ Z1 S4 _; p. @: Y. {# m+ l
  9.         float  y ;: P: X$ d7 ^5 e4 A+ s9 P6 _7 P. O
  10.         float  z ;
    / N, j8 e9 i- R
  11. }  Point ;0 Q% \$ A  q3 d/ Q" P
  12. ) `9 @1 u0 f2 @, w+ `
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;
    % G$ P# K1 m$ L$ ]5 p+ s( M
  14. Point  point ;
复制代码

+ ]" ^0 n' V" m0 G( ^
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    $ \9 O2 ~5 ?7 K1 {; v
  2. 3 v5 F  N0 s  \1 |: Q3 g

  3. 5 R* z& c0 E1 H- V
  4. FLASH_Unlock ( ) ;" J" m: J/ e6 r0 Y! h

  5. 9 L/ [, d0 L& K7 ]9 L9 |

  6. ! M7 u9 |% `# y. X
  7. EE_Init ( ) ;
    * i/ L0 O+ J. s! C& D/ ]/ s

  8. ) t! z$ q  |5 [  T6 ]. T

  9. * F5 F1 |  z% o. T* I
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;
    . K; w; \% k: [- c, @% S" C, S
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;2 s* O' m+ ~# n  x

  12. / ~- M/ Q# m7 ?* b, y7 ~* k

  13. " @# D- V4 \6 T! F2 [* B! D
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;1 e! V8 E2 S, g' Z! w$ }" ]4 C( L
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码
, c  b4 o: Q# X8 x* `) |: t% e
4 R' `- _8 H, P$ q* ]& z# L& T
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:
4 w4 S5 W: e) ?1 C
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码
9 E% b( @4 x4 `) p& X% V8 E3 ?4 o
7 y& j8 H2 u$ M4 \( D( Z
1 i- d* l( c$ `# y* c% B8 O
收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版