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

【经验分享】STM32F1x系列——Flash 模拟 EEPROM

[复制链接]
STMCU小助手 发布时间:2021-11-29 22:02
STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。ST网站有个Flash模拟EEPROM的范例:AN2594: EEPROM emulation in STM32F10x microcontrollers(包括源码和文档)。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。
/ u/ m8 H& N4 h3 L, j- {7 S; H6 s& z4 ]. _9 B. C- o$ J: t
  不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括:+ L1 I0 h+ E, o" D  P( n. ^& }' Z
- E. m2 Q" w, |% d! H6 i' c7 D
支持不同大小数据(字符数组、结构体等)的混合存储;+ m! H: P$ X' o1 N
增加对数据的校验和(Checksum)检查。
6 N: e) b: R4 ^4 w, z  附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体:
2 A9 q3 S9 [3 f) m
  1. #include "eeprom.h"
    % _; c, k5 l( a+ J" Z' Z

  2. ' I' P3 @- g  C8 V
  3. #define TITLE_SIZE    802 v7 p3 u3 x  L+ b9 T8 ~2 Y
  4. #define TITLE_KEY     1
    " l$ J/ g) x% _) a, [: C/ }
  5. #define POINT_KEY     2
    / F2 X' e0 m+ `6 m. U' E
  6. 0 V3 l3 F" K8 L
  7. typedef struct {
    ) S; \- C1 ~8 z
  8.     float x;
    1 ^! y2 {$ M7 Y2 T; V* ^
  9.     float y;: i* `1 E* l3 h; v8 o3 o
  10.     float z;, b5 n& I5 Z8 o
  11. } Point;$ o- a4 C' g( g/ S4 f/ w
  12. $ q- x& H2 f$ Q9 G" V, M) [
  13. char title[TITLE_SIZE] = "eeprom test string.";8 y& a3 v, j  U$ _+ u
  14. Point point;
复制代码

  x+ a% ?- F8 c执行必要的初始化操作后,就可以进行写入和读取:
: D+ L6 f  }/ N
  1. uint16_t result = 0;7 D) K7 g2 [( u( ]2 S

  2. & Y1 x$ v* H9 L/ a9 X6 i
  3. FLASH_Unlock();5 m  n) `- L9 X2 n8 C; J8 e) x
  4. ! X5 r5 L8 X. f' M
  5. EE_Init();) v- T9 S) X, `+ O" O% |
  6. ( q! E' f* R+ ?! J, z1 c8 y
  7. result = memcpy_to_eeprom_with_checksum(TITLE_KEY, title, TITLE_SIZE);3 m' j( t$ R9 P  L2 s5 P
  8. result = memcpy_to_eeprom_with_checksum(POINT_KEY, &point, sizeof(point));
    ; }6 F% E3 P. V7 C1 d
  9. * p- a6 a1 b# ?* Z3 R
  10. result = memcpy_from_eeprom_with_checksum(title, TITLE_KEY, TITLE_SIZE);
    & H/ X' ?! S" p/ ~. z8 u. K' ^& g
  11. result = memcpy_from_eeprom_with_checksum(&point, POINT_KEY, sizeof(point));
复制代码

# Y% a% [; p/ u  \实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:! T; V# |+ T) h* x  Q
  1. #define EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)
复制代码

/ ?5 s4 v4 D- C2 I+ o/ v6 ?2 s7 \4 ~4 s8 Y/ v. B
( x; R0 c6 M+ O
收藏 评论0 发布时间:2021-11-29 22:02

举报

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