一、介绍* R2 V0 h- K' n# M, v
1.1 片上eeprom介绍
|" n0 B+ F/ x% J7 Z2 ~+ ]L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。+ v8 L3 M+ I$ R9 `* g, U& z
3 B! _+ d6 M" w1 M, E$ o
1.2 写eeprom操作. _9 x v% c+ T. Q
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
: x9 Z: N7 c% l0 @' [% H注意的是
2 ~5 v' R- i- i# X一般flash擦除后是0xff,而片上eeprom擦除后是0x003 B7 p1 m+ B% N4 p8 y1 i
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。( ?) z" c8 d# r. v/ r( I9 B
! D+ F5 r7 N! ~5 w+ M9 G二、编程
- _8 }" v5 e# ?- //eeprom地址
" s: [; c L; X; y% O$ a, N - #define EEPROM_BASE_ADDR 0x080800006 {- r7 s0 S5 \" @3 i; ] w
- //向偏移地址写入len个字节
% r% ]# F8 i* \, ?) }# U! `3 X - void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)# B6 p/ z5 [" K, I: i
- {/ D2 @# m" `* | z3 n9 j* P. c
- uint16_t i;
. L/ @" U3 c; C9 `+ V- O7 \ - HAL_StatusTypeDef status = HAL_OK;
( P- C5 K& ^2 r, h3 F
$ \3 j# j; a& @& h: {# T$ T5 z* u. t- HAL_FLASHEx_DATAEEPROM_Unlock();7 e2 B. O6 y; }" T6 S* K; } K+ C
- for(i=0;i<len;i++)
Y- J3 @! R0 U$ t2 V* b4 Q# @+ T* U - {& t$ x; I- c4 J% L8 ~
- status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);8 n( J; w) o5 M4 T+ M
- Data++;; ?9 d ~+ U) [( B' p7 ^8 B- D
- }
f6 J; F% H1 [" \ - HAL_FLASHEx_DATAEEPROM_Lock();/ W2 j5 M( j; o
- }
Q( m. F8 R' D( U; e - //向偏移地址读取len个字节
; v0 D! g D2 U' { e) N. r6 Z - void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len), T- H: x6 f: x1 X8 }4 d: c
- {
, x G, c1 b! `. E, I5 W: k9 x - uint8_t *wAddr;
8 O9 {: V! ^& ` - wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);! R/ U( J, o9 M: a
- while(Len--)7 k q/ v! h( m# h" Z
- {
+ T' A6 X# D% v$ n - *Buffer++=*wAddr++;
, V. q( f: x" O/ | - }' ?7 x. t5 e- n2 T( @3 @
- }
复制代码 - G+ [ E w; b; ]" X2 M
) V4 O) o. _% ]( T$ K- g H三、测试+ i; Y5 @9 D, p9 w
3.1 测试代码
" G$ g( S" H. H0 ?6 z5 F- //测试
4 M" r0 D- W" Q9 R6 ?5 ~ - printf("开始测试\r\n");
j7 \$ L+ n; v+ m0 M6 Q5 \ - printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
Q- ?3 X9 {) P7 Y4 d - eeprom_write(0,eeprom_write_data,2);
- `" Y7 ]6 o2 S) t3 p R - HAL_Delay(10);
* a4 G+ Q( p& u1 i0 a5 |% g( T9 t y - eeprom_read(0,eeprom_read_data,2);
$ o* {! C- s0 B" [9 c - printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);
8 J( Q, X: i" m5 D ?; ^ - printf("片上eeprom测试完成\r\n");
复制代码
6 S% t: t4 K. S; a) O5 B3.2测试结果
' D/ B) `; W$ t3 B6 @向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。" ^$ ^+ y1 v3 Q3 x. s5 c
% M, v; u, z7 g- ]+ l, M- N) e: U/ X* ~3 q4 h/ g- p9 L1 C. s8 k! r
! } C& `* T, ^4 D0 a
( b8 ^ q, {0 `$ Y, u5 u
|