STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。 不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括: - 支持不同大小数据(字符数组、结构体等)的混合存储;
- 增加对数据的校验和(Checksum)检查。. S) F5 D, S% q7 V
附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体: - #include "eeprom.h". t* p4 W4 V, e) T# O& j7 k
-
/ p5 m l( t A: U) q" k - #define TITLE_SIZE 80
5 j2 \0 b- A/ K2 D1 { - #define TITLE_KEY 1% U, v0 ~' d! T! I
- #define POINT_KEY 27 m" |8 l0 U ?! {. ~
-
7 s' c- ?2 P q L4 |7 W, V* K3 | - typedef struct {
/ l0 L2 m" A% H ?: u - float x ;
; i/ Z1 S4 _; p. @: Y. {# m+ l - float y ;: P: X$ d7 ^5 e4 A+ s9 P6 _7 P. O
- float z ;
/ N, j8 e9 i- R - } Point ;0 Q% \$ A q3 d/ Q" P
- ) `9 @1 u0 f2 @, w+ `
- char title [ TITLE_SIZE ] = "eeprom test string." ;
% G$ P# K1 m$ L$ ]5 p+ s( M - Point point ;
复制代码
+ ]" ^0 n' V" m0 G( ^执行必要的初始化操作后,就可以进行写入和读取: - uint16_t result = 0 ;
$ \9 O2 ~5 ?7 K1 {; v - 3 v5 F N0 s \1 |: Q3 g
5 R* z& c0 E1 H- V- FLASH_Unlock ( ) ;" J" m: J/ e6 r0 Y! h
-
9 L/ [, d0 L& K7 ]9 L9 |
! M7 u9 |% `# y. X- EE_Init ( ) ;
* i/ L0 O+ J. s! C& D/ ]/ s -
) t! z$ q |5 [ T6 ]. T
* F5 F1 | z% o. T* I- result = memcpy_to_eeprom_with_checksum ( TITLE_KEY , title , TITLE_SIZE ) ;
. K; w; \% k: [- c, @% S" C, S - result = memcpy_to_eeprom_with_checksum ( POINT_KEY , & point , sizeof ( point )) ;2 s* O' m+ ~# n x
-
/ ~- M/ Q# m7 ?* b, y7 ~* k
" @# D- V4 \6 T! F2 [* B! D- result = memcpy_from_eeprom_with_checksum ( title , TITLE_KEY , TITLE_SIZE ) ;1 e! V8 E2 S, g' Z! w$ }" ]4 C( L
- 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
- #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
|