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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. : y+ h7 y7 h4 J* i0 O7 r* R6 c
  3. #define  TITLE_SIZE    80- M. `, O7 I, [5 H
  4. #define  TITLE_KEY     1- I5 x. p/ r; J1 M: [
  5. #define  POINT_KEY     2
    # q) U7 X8 t* h. a( i

  6. 0 P1 C5 e% m! S* R
  7. typedef  struct  {9 d  |- {* J, @1 _' k3 R& C! v
  8.         float  x ;( I- H7 B: f. w; b, E+ {4 O. e
  9.         float  y ;7 Q! X5 D- p* K( B* H
  10.         float  z ;2 X0 Y/ W- K' y  x7 }
  11. }  Point ;
    + X2 H$ I+ j5 I6 k

  12. ! _0 C+ E3 Q" P0 _/ J
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;
    & k& A2 F5 l& n. V6 ]
  14. Point  point ;
复制代码
% q2 t0 h" K4 S6 I- `. G! [
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    " H1 s" B5 x$ i/ c

  2. / F& k) J3 w& j- r$ T

  3. ( y+ K8 a; a, W9 t0 Q. f
  4. FLASH_Unlock ( ) ;9 \. r8 J& d+ D6 ~
  5. 1 q" `7 R9 C& t( m

  6. + m$ \+ ]3 F: y/ N
  7. EE_Init ( ) ;, W  j) W$ i+ }' F5 y5 ]
  8. , q" p0 W# Q0 q* B" u/ h

  9. - M4 b7 w2 D* y0 Y% @
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;
    ' I0 F0 e8 ?, O9 c/ F
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;
    " o# Q" s3 ]3 g1 R: I6 N2 j' |& T

  12. , d0 N0 s: F+ S" d
  13. % _2 L% P8 S6 s/ W0 e$ u
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;3 r$ l/ s4 p/ z' [% G$ k! D
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码
5 \0 t5 l/ f1 `4 I. ]
3 ]( H5 h, p: H1 E+ g4 s) B% Y
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:

9 _4 d+ H* x/ J5 v3 W# }( m! r
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码
2 k6 e5 o% _" \" ~6 w1 T

0 F& N. _7 O$ G& `: s% h& K' G) R2 ]( Y" F9 x- m
赞 收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

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