一、介绍
5 T0 E' d3 t/ Y# ~' ?1.1 片上eeprom介绍 i' i: Q5 z6 j
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。$ }3 S+ o' j$ P; |9 |3 Z( ]" y4 X
% e, Y( P" v. r0 \9 C- Z' S1.2 写eeprom操作& z7 s$ R" s& D! ^1 s5 o
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
; I! g* v0 @# Q3 b. U# c: }注意的是
3 ~$ |' Z* [1 H7 {一般flash擦除后是0xff,而片上eeprom擦除后是0x00' E5 B) [" {$ L+ C3 v: j
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。 O* C8 n4 T; y( v: b
2 O) s+ `* o0 u- i4 J
二、编程, ^& Z6 W+ ^: H! R
- //eeprom地址
& ]- S" f! Q3 W1 C* [" x0 A" E - #define EEPROM_BASE_ADDR 0x08080000
% L5 H2 l0 h; }# C8 M/ e7 | - //向偏移地址写入len个字节6 M' t- C( S/ Z7 J
- void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
" D A8 w& |$ t. q - {8 S, y+ V2 t1 _4 Z
- uint16_t i;' d* @' ]7 I" E, s% B
- HAL_StatusTypeDef status = HAL_OK;
4 I6 S8 J9 _; `& ]* y* Z - ! W" G4 v1 e; F7 _+ C7 n
- HAL_FLASHEx_DATAEEPROM_Unlock();! V5 B" M# p( ^5 _+ X8 [
- for(i=0;i<len;i++)
' H" c# m2 |: `' J" q3 N; j1 Z - {
: {9 d3 j7 P7 w5 |$ ~6 v - status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
8 p# q+ O$ j: N2 {( T - Data++;/ f2 d+ w, ]6 \: Z! @
- }8 _4 u: c, T* b. h& d T) c
- HAL_FLASHEx_DATAEEPROM_Lock();
$ N" H3 d4 j- I1 S& M - }
8 Y6 n4 G5 J* Y; Y - //向偏移地址读取len个字节* ?6 F. j9 m$ G8 K s3 P: ]
- void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
( p1 v2 u6 ]: I( _5 a& y - {( q' Z/ ~- B/ {' \0 m) U
- uint8_t *wAddr;
+ F( R/ D9 m' d - wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
8 a; G& e/ k3 x' p8 i$ p- l8 f! P - while(Len--)2 J& X( d3 O; I. I1 @; Z8 I
- {- t0 L d- W6 ~% X( w1 O( v5 O
- *Buffer++=*wAddr++;
5 ~5 s9 w- N4 x9 `+ C' u# e - }
2 _$ r( k2 [! x6 |$ \# z - }
复制代码 ' B' v0 E) F; F' `' D8 {
: G" g" \+ H+ _! w% E! e5 D l
三、测试
$ V3 G0 V5 P' r+ M* _# }2 Q3.1 测试代码
+ D+ K% G! ]' b, ]- //测试
. a& a- \2 |0 y6 C - printf("开始测试\r\n");
' c4 R! M5 z5 H4 z3 [4 R/ c - printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
1 x- x" r) j7 P) C - eeprom_write(0,eeprom_write_data,2);
1 C) m4 \' T$ I( a, L5 f* h4 g, e - HAL_Delay(10);" |/ G+ J$ v3 d0 [4 C
- eeprom_read(0,eeprom_read_data,2);
0 S7 Q- ~7 i. F3 Y - printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);% a* W3 K$ r+ k1 k. R* N) n
- printf("片上eeprom测试完成\r\n");
复制代码 . l9 b& a% R" p0 ^7 c% {
3.2测试结果" y& s# @7 Y6 |0 x5 ^
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。
! k; M" V( z+ f ]9 H; q
' `% C n$ v ?& S* j/ E! L8 W4 D9 |* D) @! L8 L: \; K
% d' H! N+ W$ Q, i" ` f! L7 b% ` n6 T2 u1 T. \. y: u; |
|