一、介绍
2 c& l/ N5 R" p9 G1.1 片上eeprom介绍
9 x5 t$ W) N0 c# t& kL0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
! P! U. K. G8 w2 w) s
+ l& |1 `- y- v) x$ x5 @0 F1.2 写eeprom操作
; c* w$ f# Z3 r9 w此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。* ]/ C$ y, c+ O* _
注意的是; @2 ? w2 o3 ~# i
一般flash擦除后是0xff,而片上eeprom擦除后是0x00, X" W$ |* Y) @4 Z) r @# B
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。9 W1 u; a- H: r; E6 v) |
: y0 j# a6 p6 X8 R" G, k4 ~6 q* b; e( G二、编程/ q" D4 p! p# ~* O2 H* o
- //eeprom地址
3 u9 C7 E8 m" z+ n& F+ @ - #define EEPROM_BASE_ADDR 0x080800007 `" [- Q3 V/ y* N( t M. d
- //向偏移地址写入len个字节
- R# m ^5 {# V8 w - void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
' J7 O; l0 i4 B( F q - {5 t1 f0 {, w; C0 d: D I
- uint16_t i;+ }4 i' f, w- u0 k" R7 W
- HAL_StatusTypeDef status = HAL_OK;
/ {/ Y8 c2 G- g, f
- [* t, h4 S2 B2 g$ @- HAL_FLASHEx_DATAEEPROM_Unlock();
5 h+ I+ Z/ b( m - for(i=0;i<len;i++)
* x: L& v8 D+ v - {) E# f* B1 e0 `
- status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
( U/ S4 c8 G. f4 W) m - Data++;: p( r; H1 L/ P1 K
- }
) O/ K8 f7 b' k$ _0 o' g. p9 K - HAL_FLASHEx_DATAEEPROM_Lock();
+ f8 x' E3 {& ?4 y% @$ T5 e$ Y - }
& ~* P4 e7 g3 `2 B, s - //向偏移地址读取len个字节
* s% _$ N# D/ A5 Q - void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
% L" K: ~; [2 M% _! I# Y* z* j - {8 O- |& m% {4 c+ x( m
- uint8_t *wAddr;, I7 j* m$ F! ^/ ~$ e# K
- wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
o( N0 F! U% C8 S9 x& _, v - while(Len--)
3 i; z! K& s% L% h8 ] - {3 l+ R: p7 t1 N6 \) Z) v. U# F+ s1 k
- *Buffer++=*wAddr++;
2 H7 m! I7 `- E - }, C/ E" P6 [, i9 A7 U1 }! d7 r
- }
复制代码
1 X( Q+ k0 T! B5 k2 o# _ Q; R4 u# F
三、测试
! y0 f2 N- a8 R9 U3.1 测试代码& a! J- O: f7 N: z/ N) X
- //测试
. a9 Q6 V' c. c8 G$ U - printf("开始测试\r\n");) j6 B; o5 ^) m% ?7 V
- printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
) R5 d0 Z8 f6 H% i1 `4 I2 x1 J - eeprom_write(0,eeprom_write_data,2);
+ E0 m- d; v, N- K9 ^& i3 o2 g - HAL_Delay(10);7 O2 Z7 d9 V. j* S4 f# B
- eeprom_read(0,eeprom_read_data,2);7 O3 _6 _, G- l0 J3 U3 D1 E
- printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);# n# R: F7 `: ] Z5 ?1 t
- printf("片上eeprom测试完成\r\n");
复制代码 ' ^7 Q: q8 |8 Z/ o
3.2测试结果
& c$ g- f. G3 u9 o, K2 r向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。) D8 V. y! C- `9 _2 }8 m
& `6 }6 V5 M2 } r
6 W: u! W( D( ~0 z" |
; F: b e9 I+ ~; N/ X5 U; ]# f- ^# l4 b4 O- w
|