一、介绍
$ ~; `7 U3 i8 [5 _# L; o& ]% N1.1 片上eeprom介绍# \8 n/ ?% L/ M; y. r4 Z8 ]) a {
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
r+ J ?' A5 u# W# L! W2 C7 F+ I5 S9 D$ _; j# R
1.2 写eeprom操作0 T6 a! |/ A+ [6 `; f
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。6 E4 G+ ]# }! H8 {, n
注意的是! R& |8 A7 ^/ B
一般flash擦除后是0xff,而片上eeprom擦除后是0x00% ^' \4 X) n, O$ ^5 @' x0 {
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。5 J! S- Q& S8 h! Q1 a( z4 ^5 j1 P
2 f( V1 W# f2 N6 C& _. R
二、编程- R( U/ L) Z3 i0 z7 E; ^' G
- //eeprom地址2 p/ c& o) i% e4 ?, \2 t
- #define EEPROM_BASE_ADDR 0x08080000
/ Q1 a7 Z2 C7 M& s - //向偏移地址写入len个字节
$ V& X7 K# L7 U* n4 O' b9 ?- Y9 q - void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
' U: f9 N5 Z- t& k0 Z9 n; _ - {% ?% D( S3 Q9 p1 I- N
- uint16_t i;: L8 |, D J3 Z8 s6 {
- HAL_StatusTypeDef status = HAL_OK;1 \. w* h1 |/ g5 H) E1 ~
& `' H0 @9 E+ z# b( R- HAL_FLASHEx_DATAEEPROM_Unlock();
9 s# w; V) W% w - for(i=0;i<len;i++)
* m Q& d6 i' ]/ s4 W3 j+ u' t - {
; l0 ]1 g8 n5 [! ~. c - status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);" ?8 Y5 U/ @. T1 e G( \& I
- Data++;
2 b' `# i. S' I( n5 v - }" J6 i: L1 A6 h/ h9 L) k3 J
- HAL_FLASHEx_DATAEEPROM_Lock();5 q* H3 J6 |5 G- {% E D
- }" O) C0 S# N; i3 R4 n+ Y/ J+ o
- //向偏移地址读取len个字节4 b7 s* b0 C! |9 D
- void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)$ a& E; t3 X9 N( p# ]6 T1 m
- {( N- _" |6 @* V% V2 \
- uint8_t *wAddr;8 @- [" E. O4 r' K
- wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);5 J: M1 i& }7 ~- g* c) N' l+ n
- while(Len--)
5 y* I' r5 a+ | o - {
" I+ S! `; |# [0 t8 E. g - *Buffer++=*wAddr++;1 u7 U C) F) s: t T% I2 H3 F
- }$ k5 k4 y, T2 v2 j
- }
复制代码
* D. q" F1 n. E) i( C2 b
# N4 o& \, k( L3 z三、测试6 k2 {- _3 A/ B
3.1 测试代码
1 z3 _5 H& L1 b4 f3 G9 l" e- //测试4 k) u1 }6 A3 z/ o* Q" G2 _* r
- printf("开始测试\r\n");( G g: L5 M$ B T; T8 x
- printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
. N+ _8 C/ C1 |8 z9 i5 X4 C - eeprom_write(0,eeprom_write_data,2);
0 W1 W7 L2 L& R2 h5 u7 _% i3 ` - HAL_Delay(10);
/ k' x3 j; G2 X% D J+ ` - eeprom_read(0,eeprom_read_data,2);
. \! R$ G. g& k( \! r* Z _+ { - printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);. j9 Y- ^4 G, b! Z5 U
- printf("片上eeprom测试完成\r\n");
复制代码 . _3 h4 ?4 O, C4 ?% i9 ?8 G) w
3.2测试结果
1 S/ e5 w5 a: Q) k8 R2 `+ K向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。; J7 N4 O4 r8 f1 {1 e
6 y& u T2 M7 \* d0 _: Q- M4 f6 u
4 }6 l' ^8 M+ s! ?7 z
- u& R" \ u, L- N5 ^. x, K; m+ V, G5 _' i4 P
|