一、介绍
' a& w+ [. M( I- d. q: b/ h1.1 片上eeprom介绍4 n# V! E/ [. N/ E
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
# R" \* K1 h5 `. M, ~+ p
$ {& M4 ~) A, w, N z4 d1.2 写eeprom操作4 c, ^% {8 m' [3 f8 R
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
6 n( M, E2 V; j) O) x注意的是
, f5 G( M: l+ t一般flash擦除后是0xff,而片上eeprom擦除后是0x00( I8 v, [0 J1 M& ?2 G
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。; [; O |2 z& W% L% K8 y/ A8 Q
, `! ?4 a$ ~( Q0 T& `$ h二、编程
W# z; g/ Z- i& @) F3 d) T- //eeprom地址
/ R& l% x+ E/ n; T+ }* c! V3 ^ - #define EEPROM_BASE_ADDR 0x08080000
# n" E3 l. {6 J - //向偏移地址写入len个字节1 p' m& p: I% I r
- void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)# \* f* [; f( s! y5 E
- {6 S3 F! P0 R( j0 X
- uint16_t i;$ g+ Y. |. K2 O, w2 Y0 A j
- HAL_StatusTypeDef status = HAL_OK;
# b Z1 I" t( G7 h- @# c6 n1 Q9 ? @ - 8 d9 X, R O* b/ F& x8 F- H. J5 X# m
- HAL_FLASHEx_DATAEEPROM_Unlock();
8 T' B" w( g/ V. x2 a - for(i=0;i<len;i++)" ~$ Q- p9 x, X/ ~+ U/ T, t, t
- {5 T% J0 k4 E6 v/ S; J: o
- status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
: p/ u# n) c" T0 D" T - Data++;
2 V8 k' U/ d5 w, M6 @+ X - }8 L- C4 g. _8 }- L* g
- HAL_FLASHEx_DATAEEPROM_Lock();
% {* x g( P+ c/ \ r9 ]/ o, Y4 a8 a4 q - }
: Y4 g: z4 m4 P4 O4 F. a - //向偏移地址读取len个字节
, r- G/ k: c' t* P0 L4 a6 m9 Z - void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
. g J, b. `; s9 _$ n% x( {* e, g - {
) I8 x% c6 S) D - uint8_t *wAddr;6 j) D+ H, t) q
- wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
& y# P3 |; L( w) N/ i - while(Len--)- e/ q$ O0 z. b) F& k4 d) [( G% a/ e
- {2 X# |% N' o" h
- *Buffer++=*wAddr++;0 j1 d1 h, _5 f1 A9 S9 q
- }
5 Q& N1 R. c5 `0 Q0 L# h# A3 V& L - }
复制代码 % Q F& b% r ~- B7 O7 p
% ~& d4 Q0 [2 I9 ?. c) ] s6 C
三、测试
2 w$ u( y& ]& k. c3 U6 S$ X- V9 S3.1 测试代码. p$ y( M9 P* u
- //测试
) @0 [. {- D% S' E4 j - printf("开始测试\r\n");
) Y& H0 J' R: i" J( J* [% ? d" Q d - printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);7 ?3 x4 V# k1 B1 l( X8 x# @
- eeprom_write(0,eeprom_write_data,2);
3 h$ c8 P8 }8 R9 W. _( h - HAL_Delay(10);
& C" Y" Q: \6 ]; x) g6 r P/ u - eeprom_read(0,eeprom_read_data,2);5 p) O6 ~7 I$ Y# w2 A5 r* g
- printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);
% O& Z9 o6 K5 x6 l - printf("片上eeprom测试完成\r\n");
复制代码
' J/ C# q# x6 E# ~ r; H2 ]3.2测试结果
; L0 H7 i% N) [, X P5 o7 W% a8 O向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。+ z, A C/ F% m5 G- I
" K, M6 @4 H6 H. i4 J: I2 i7 |
3 \2 Q# W4 E6 C/ m- c7 d+ {# b' R4 t+ R) f6 F+ A
I) g. }6 E; e* e/ {, U |