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

【经验分享】STM32F10x Flash 模拟 EEPROM

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

  2. - d' V* O9 N) @6 ~4 b, C8 a+ T8 k! D
  3. #define  TITLE_SIZE    80
    4 W* X" G' y9 _: F
  4. #define  TITLE_KEY     1
    5 P+ a+ j/ C9 Z5 \1 X
  5. #define  POINT_KEY     2
      y- V: r' |! X
  6. 5 p9 E( I3 y- `4 T6 n& Y) e% N( y! }; l
  7. typedef  struct  {
    : p# N  i% @0 i- i, g) l4 l
  8.         float  x ;/ D; X# Z/ U) N. N
  9.         float  y ;
    * W, `) _% A7 M) j
  10.         float  z ;
    6 w3 H# ?8 `( z6 O
  11. }  Point ;3 d9 [, V3 |% x1 v, I- n
  12. , r/ z9 T; l& p( f% y
  13. char  title [ TITLE_SIZE ]  =  "eeprom test string." ;" @" J% {- `/ m! C9 n: E4 s
  14. Point  point ;
复制代码
3 q( L- ^& T+ w8 E, w+ L
执行必要的初始化操作后,就可以进行写入和读取:
  1. uint16_t  result  =  0 ;
    / f8 |2 z/ v( S+ Q

  2. , J/ j6 M! q/ G) L+ z5 I! w7 y
  3. ) p) d3 u( k  d: O: Z! |$ e4 R
  4. FLASH_Unlock ( ) ;  \+ ~) i% [. s7 N* y9 N/ t& y

  5. 2 O' V2 L' {: K
  6. 1 `) V" r" `% ^5 n) {
  7. EE_Init ( ) ;# Y8 H% o+ q8 E* j- W# L7 c

  8. - u+ ~& J/ G  w( b! G$ \2 S

  9. , |& w3 I- v; M: u
  10. result  =  memcpy_to_eeprom_with_checksum ( TITLE_KEY ,  title ,  TITLE_SIZE ) ;& q5 n4 w9 |# @/ D
  11. result  =  memcpy_to_eeprom_with_checksum ( POINT_KEY ,  & point ,  sizeof ( point )) ;3 n% e* g3 j8 G% d6 d
  12. 3 t$ f; ~) K2 I; _0 H

  13. , K. q" e' }1 Q
  14. result  =  memcpy_from_eeprom_with_checksum ( title ,  TITLE_KEY ,  TITLE_SIZE ) ;
    3 l1 Q  V* C% j7 T; T, t, o
  15. result  =  memcpy_from_eeprom_with_checksum ( & point ,  POINT_KEY ,  sizeof ( point )) ;
复制代码

& n- Z3 N! P; H5 j
; F  S1 ^( Y5 o# `! `5 F( Z# b1 B
  实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:

6 I( E9 c& n1 M% M7 x( u/ I6 U
  1. #define  EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码

: i) c% f- e' L: b  D9 Y' ?' _" o1 T. d$ k0 \  R

3 A, Y) z3 T1 I( _3 g  k
收藏 评论0 发布时间:2021-11-30 21:06

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版