一、介绍3 _& @# l8 n- Y7 p4 M8 l
1.1 片上eeprom介绍3 M1 j7 m. T2 [. G% L# ?' x
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。+ Y; h# z* Q4 j/ g) o2 S1 i- T/ D3 o
8 T8 D6 Z9 n, n H( r( z1.2 写eeprom操作1 ~9 |* ~ }3 G' Q8 O7 M, U; w4 n# m
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。& u0 n) z4 B1 O2 H
注意的是6 h1 M n; E5 \ g
一般flash擦除后是0xff,而片上eeprom擦除后是0x00
2 n9 n" h0 R) W# t# b一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。
- L. X) Y8 P: J
4 w& U; }4 n- o6 }2 K6 Y8 _二、编程: K. W) w( w, P7 T$ z
- //eeprom地址
3 g) O/ @9 i, N# `0 ] - #define EEPROM_BASE_ADDR 0x08080000. d( \: b; V! @' ?
- //向偏移地址写入len个字节
& C( @' W- F9 R) B H B2 ~6 q - void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
5 Z7 n5 T" p* ^7 W$ v - {7 b6 B3 K3 y, z; W3 T) @6 Z4 r
- uint16_t i;
8 g& F4 _0 h5 c! f& ? - HAL_StatusTypeDef status = HAL_OK;
1 x' d9 T0 V r- u- ]7 m/ B1 |6 ~
5 m6 o$ L- Z* Z ^- HAL_FLASHEx_DATAEEPROM_Unlock();8 _; t% \$ @/ g
- for(i=0;i<len;i++)( ?3 ~3 h; T: u2 K% B! n
- {8 h* J# @1 P$ E8 l( E; q t3 e- v
- status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
1 I" t3 \7 M }$ p - Data++;; k' G- r6 B5 J' @' x" q* i
- }
" { [5 g7 ~; F% K0 T - HAL_FLASHEx_DATAEEPROM_Lock();1 M! M$ C, B1 j* f/ c, K
- }8 l/ X% g0 t5 F6 D- q
- //向偏移地址读取len个字节% e. p# a& b4 c% j2 f
- void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)3 B ]" m8 G6 ?/ {
- {9 o7 z& x/ J8 Z" M4 M P5 D
- uint8_t *wAddr;
4 Y6 r/ [+ s% T; O1 R' Q+ W5 ^6 V - wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);/ E9 [: h7 N1 D V: H" F
- while(Len--)' z# d6 H# i2 h+ \
- {* h5 k" ~* V# V4 w& Z1 W E
- *Buffer++=*wAddr++;
' H. d* `, c& x! i' O - }& |# P4 h1 M0 c- ?
- }
复制代码
5 k% x6 {% g; x
+ {1 n4 w- `& E$ L1 x三、测试
" _+ t ^8 P- n- q% T+ i3.1 测试代码2 y |' O ^/ U- E- A6 E
- //测试8 l+ J- @+ d) }: z3 V. {
- printf("开始测试\r\n");
2 c. ^" c/ a& B( v5 ]1 _/ ]/ i# k* I - printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
) j% H- A H: ` - eeprom_write(0,eeprom_write_data,2);; F/ E1 G6 I& X6 ?4 a
- HAL_Delay(10);
5 f+ P5 B% V" y: I/ N, P8 {6 b - eeprom_read(0,eeprom_read_data,2);4 O) G' D* O* y, x% v3 F, L
- printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);4 Q- R, O6 V- Q& ?' H6 k
- printf("片上eeprom测试完成\r\n");
复制代码
1 |0 }0 k, d' i, d3.2测试结果" U& ^* G9 D$ K/ R% O" m
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。
a1 V+ u5 r2 B1 F8 N
N" }# J: M, V3 e3 Y8 k' s7 W& l" T6 v
& \6 E) X$ d1 S( l8 s5 N- {' q0 r5 u( }; @
|