STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。 不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括: - 支持不同大小数据(字符数组、结构体等)的混合存储;
- 增加对数据的校验和(Checksum)检查。
0 B0 D; L" u1 E, d" C, Y0 p( D: J. l
附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体: - #include "eeprom.h"4 G# p8 o0 c0 b* v2 V
-
$ [' t0 I+ U/ k2 a6 b4 `5 d0 G - #define TITLE_SIZE 80' L8 ~0 R7 k5 ^; W4 c: V
- #define TITLE_KEY 1
: C( f1 H4 F; J6 [/ ? W6 P - #define POINT_KEY 2
* R7 h# N l+ w* A- o# R( K -
# P6 N2 o3 S7 M3 ]! K- q0 F/ _ - typedef struct {( e1 M# o$ \( t( k9 M
- float x ;9 `: f& F2 v, x+ B' q" @
- float y ;
0 e# h% M: l& @4 w$ Y3 \ - float z ;
# x U D+ d2 e4 f) U - } Point ;/ y0 p; j5 G2 ~4 @% L5 o, b( ?* C
-
! \5 V( ?9 w( p4 _ - char title [ TITLE_SIZE ] = "eeprom test string." ;0 h! w0 G0 i5 B6 s4 h( R: s
- Point point ;
复制代码
% k+ n. e, I; h执行必要的初始化操作后,就可以进行写入和读取: - uint16_t result = 0 ;
3 L- \ y6 e9 i5 p% X& y - . v5 q' J L) u' K" w
- 4 g2 G4 e3 c% Y4 S
- FLASH_Unlock ( ) ;: T0 t8 A* Q: o4 \/ l: B
-
n L2 l, {, P7 U3 Q - ! ~: S3 B: X- y6 a
- EE_Init ( ) ;
/ H1 p* o1 R8 u j- q2 Q5 a -
1 f% j+ d, Q2 T - 7 J3 _* f2 B+ j# @7 @: K% W
- result = memcpy_to_eeprom_with_checksum ( TITLE_KEY , title , TITLE_SIZE ) ;
: z3 ~3 Y0 U. U) u2 x, Q& w. ]% V# G - result = memcpy_to_eeprom_with_checksum ( POINT_KEY , & point , sizeof ( point )) ;* w- n3 W6 Q c% c$ e1 w0 e
- & O1 E( x5 M: p7 L
7 X# r& S: u, l2 w8 Q- result = memcpy_from_eeprom_with_checksum ( title , TITLE_KEY , TITLE_SIZE ) ;- E5 y& E, r' }7 M6 C
- result = memcpy_from_eeprom_with_checksum ( & point , POINT_KEY , sizeof ( point )) ;
复制代码
" B" D% V/ n' q) j8 k8 s) `5 U, o. V1 @5 m5 D6 }/ |
实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:
% ^9 k, Q% u0 t! Y% J7 `- #define EEPROM_START_ADDRESS ((uint32_t)0x0807F000)
复制代码
7 m3 l. f; n* N: V! R! ]
$ ]4 Y J2 r! {1 e( E ^* t
- Y! @) y. [* n |