STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。 不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括: - 支持不同大小数据(字符数组、结构体等)的混合存储;
- 增加对数据的校验和(Checksum)检查。3 d' G6 h! |. G& P
附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体: - #include "eeprom.h" _0 V4 n+ d& P/ R- f. B6 h, U
-
/ n3 B1 G8 d7 A' Y+ y- @5 E' { - #define TITLE_SIZE 80
4 Z) Q3 R; ?2 V& d) F% ?& C: e - #define TITLE_KEY 1# }, H" X& B% L' Q6 ?$ r
- #define POINT_KEY 24 X3 i" _2 w0 V [. s% i
- ' y$ |9 D. X* j( m
- typedef struct {# C; @8 n4 q' n" D3 W
- float x ;
4 ^7 p; N! Y: S - float y ;+ k, A# }1 o* ?# ?% q5 I6 Y
- float z ;
) u! F& B7 t1 {( U% b - } Point ;
F# E6 `1 q! `0 ~+ O; b - : y9 s% I. q. V/ e: a
- char title [ TITLE_SIZE ] = "eeprom test string." ;
9 y2 j. _& \" d4 y% E' n - Point point ;
复制代码 2 H- o* J5 W+ n) L3 `! q
执行必要的初始化操作后,就可以进行写入和读取: - uint16_t result = 0 ;1 N7 Z) k+ c# I+ A
- 0 v; h& T' Z, F3 u8 Z
/ C7 s2 @, m6 ]! p' Q- FLASH_Unlock ( ) ;6 x% u L. a8 [ E
- # ?- o* A" D1 Y& V8 Q3 x7 _
- 4 q9 C# C9 j( X8 _" c" C
- EE_Init ( ) ;) c! e W0 M% H/ i* w
- ( r+ |! A' C* W* d
, e: o5 x1 R+ S0 E- result = memcpy_to_eeprom_with_checksum ( TITLE_KEY , title , TITLE_SIZE ) ;
2 @' p' a) z: s6 ] a) N1 K0 O& u7 ~% ^ - result = memcpy_to_eeprom_with_checksum ( POINT_KEY , & point , sizeof ( point )) ;" l6 [: q# u" b( G- Y9 b6 W; `
-
3 c! G/ w" [ \
2 q' g. H( \5 }$ a2 `9 J- result = memcpy_from_eeprom_with_checksum ( title , TITLE_KEY , TITLE_SIZE ) ;4 z( [( v! r: E- p
- result = memcpy_from_eeprom_with_checksum ( & point , POINT_KEY , sizeof ( point )) ;
复制代码
! P/ E. G( h) g, D) r3 q, j
, Z( r) j" H2 @ 实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义: 5 H% a0 O2 t0 V
- #define EEPROM_START_ADDRESS ((uint32_t)0x0807F000)
复制代码
3 Q5 I3 j( H8 ?% Z7 c5 @# r5 R) ~9 M0 f$ b6 D/ s1 p
( u B0 m3 ^9 j( V" }: A4 H
|