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 结构体: - #include "eeprom.h"
9 c8 M% T x* U# J -
- d' V* O9 N) @6 ~4 b, C8 a+ T8 k! D - #define TITLE_SIZE 80
4 W* X" G' y9 _: F - #define TITLE_KEY 1
5 P+ a+ j/ C9 Z5 \1 X - #define POINT_KEY 2
y- V: r' |! X - 5 p9 E( I3 y- `4 T6 n& Y) e% N( y! }; l
- typedef struct {
: p# N i% @0 i- i, g) l4 l - float x ;/ D; X# Z/ U) N. N
- float y ;
* W, `) _% A7 M) j - float z ;
6 w3 H# ?8 `( z6 O - } Point ;3 d9 [, V3 |% x1 v, I- n
- , r/ z9 T; l& p( f% y
- char title [ TITLE_SIZE ] = "eeprom test string." ;" @" J% {- `/ m! C9 n: E4 s
- Point point ;
复制代码 3 q( L- ^& T+ w8 E, w+ L
执行必要的初始化操作后,就可以进行写入和读取: - uint16_t result = 0 ;
/ f8 |2 z/ v( S+ Q -
, J/ j6 M! q/ G) L+ z5 I! w7 y - ) p) d3 u( k d: O: Z! |$ e4 R
- FLASH_Unlock ( ) ; \+ ~) i% [. s7 N* y9 N/ t& y
-
2 O' V2 L' {: K - 1 `) V" r" `% ^5 n) {
- EE_Init ( ) ;# Y8 H% o+ q8 E* j- W# L7 c
-
- u+ ~& J/ G w( b! G$ \2 S
, |& w3 I- v; M: u- result = memcpy_to_eeprom_with_checksum ( TITLE_KEY , title , TITLE_SIZE ) ;& q5 n4 w9 |# @/ D
- result = memcpy_to_eeprom_with_checksum ( POINT_KEY , & point , sizeof ( point )) ;3 n% e* g3 j8 G% d6 d
- 3 t$ f; ~) K2 I; _0 H
, K. q" e' }1 Q- result = memcpy_from_eeprom_with_checksum ( title , TITLE_KEY , TITLE_SIZE ) ;
3 l1 Q V* C% j7 T; T, t, o - 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- #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 |