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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. % E* [. \5 ]$ T6 H  l8 _  M
  3. #define  TITLE_SIZE    80
    6 t, @% e$ J* v+ @. c
  4. #define  TITLE_KEY     1! g9 S2 S: d/ H( `
  5. #define  POINT_KEY     2* U' d+ k  }& g3 E% ]

  6. : v- i& j8 J' W7 W. U' _8 N" v7 X' Y
  7. typedef  struct  {
    9 X: b$ {& U' Q" `) ]$ {
  8.         float  x ;
    8 b6 _( ^" ~+ }: [1 M" d8 y6 N
  9.         float  y ;
    ( E; Q9 q* Q% m1 ^% e  m2 B5 F& I
  10.         float  z ;
    ( s% `+ h, R1 E) x; t3 y8 I
  11. }  Point ;
      c+ J% i. {% E  E

  12. - b" o+ }  j  `0 `4 K( \
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;& M" h! y+ e- v, |. d% w' o
  14. Point  point ;
复制代码
0 _; e$ T, A: M2 L  l# K7 O1 q
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    7 F& L* p7 w& _7 b
  2. ' z* m  V$ Z0 Z& k6 s5 D) y

  3. - ~4 n8 J4 Z! a5 t6 q* P" {
  4. FLASH_Unlock ( ) ;
    9 n  \5 h8 [! F! i3 Q$ l% t( \7 T' }

  5. ! h) F: t' {. r) Q. J

  6. # Z# f4 {4 Q: x: R! _
  7. EE_Init ( ) ;
    # {( [  q+ ]. U, w
  8. & t8 }5 ]- j2 o* ?% ~7 G/ B7 u

  9. : b1 y9 ^+ I5 Z
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;7 j# E( t  r+ N% |* c
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;0 Q! K0 X9 k# |; x0 q

  12. & ?: M) ~2 V0 e, L( x/ C

  13. 4 v# p8 d0 U% u! V7 X
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;
    6 w& J  q) o7 o7 |, S7 q! w
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码

! I% I9 A) q* R. {, ]: g5 v: n  z, M9 k. n) z+ V* K5 e2 P; k
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:

' l) m6 r# L/ H  l; A" Q
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码
: `$ s1 D: A0 B/ |6 i/ N' K7 N! Q& S
& f" q- |9 x* {) K% _8 J6 G0 Z$ g
  n4 c; a( t' T7 f+ U
收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答

所属标签

相似技术帖

官网相关资源

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