一、介绍" H$ Z! R% F0 R. M; C- w
1.1 片上eeprom介绍
& u, I& J) o' a! W9 z# `. X$ FL0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。- [( A. t4 C3 y# P$ m& f* l
0 D& u/ O: ?% c9 m
1.2 写eeprom操作6 Z# r3 W" ?( n8 J' P- C2 l
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。" @( b# c9 D8 w* e8 [$ c
注意的是
6 q; N2 x s" ~0 |2 w一般flash擦除后是0xff,而片上eeprom擦除后是0x00; p4 ]0 S {9 w$ C
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。
; `1 W1 a: D1 g; H
6 U1 G" H: ]8 z" ]二、编程
: s" T) V! R& o# I2 @ B- //eeprom地址& ~, W3 N7 G4 `0 a3 ~' J2 G9 S
- #define EEPROM_BASE_ADDR 0x08080000% x! B2 _7 K6 w2 e H
- //向偏移地址写入len个字节
5 j1 ~0 u9 V* I( @. I - void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
- M$ H/ K8 B6 C+ C6 {2 y0 Z: A - {7 a8 X# S& a- f8 y* ?! |% ^' ]7 |+ p5 e
- uint16_t i;( y2 d; ]/ e! T
- HAL_StatusTypeDef status = HAL_OK;- M; B5 a' V1 p2 X" j3 W1 @
- ! ?6 d# d/ h6 Z
- HAL_FLASHEx_DATAEEPROM_Unlock();
7 W' D& _' g0 m5 y# _ - for(i=0;i<len;i++)- g& Z- G. \ f! F: H7 ?) b2 z
- {* h4 T8 W4 ~- s, Z- b* ~5 C
- status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
* ^6 W$ l- ^+ X$ \ - Data++;
" C- o3 S) ^! W! u; y" {' y - }& K9 _2 r9 O4 Y; _# d- P
- HAL_FLASHEx_DATAEEPROM_Lock();! M* ^( _/ P* |6 \; V4 C7 \& W/ J
- }# }: ?. z1 F2 [# w# e
- //向偏移地址读取len个字节/ g s3 M) g X( m
- void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)' I( p( O" t/ _% y
- {
" [$ ~# d P) b$ p- G$ W - uint8_t *wAddr; ~ T5 R2 G4 `" K3 L; u& a
- wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);- F. X% N& C9 x4 Q. g) K
- while(Len--)
6 `2 }! \6 W- T" m: Y! s" m* C" e - {( e: m! B1 f2 P' J" y6 E
- *Buffer++=*wAddr++;/ d- ?8 m& e) S# b6 ~, S! [# V
- }
, t) p- f! s4 v" V: d - }
复制代码
7 L+ G# @* z) O# K# H; z( o( Y$ e/ k+ h( j. A
三、测试
4 _* q1 r- l" B8 s3.1 测试代码
$ t+ i: I% d7 @' V( Q- //测试
9 X$ V+ Y' @( o$ ?- |6 O - printf("开始测试\r\n");, d/ M' X2 W! | I- `" j+ A
- printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
, }) V3 R+ u$ j- a2 Y - eeprom_write(0,eeprom_write_data,2);
' r0 r& }# g/ P6 L7 D- v - HAL_Delay(10);
- s8 F- [/ W6 [ - eeprom_read(0,eeprom_read_data,2);; Y+ ?) | c: m- R6 q
- printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);/ V3 @/ d9 I% e9 L |& l
- printf("片上eeprom测试完成\r\n");
复制代码
, u! _# G' g, I0 E% t- J3.2测试结果+ F5 E' ]2 y9 f% O
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。# V0 c3 ^5 H- e
6 Y# L% z) ]; D K8 @$ f5 ]
, Q8 S. F: S( w* O ]/ q; A! {
" A! ]* \+ ^) C8 q" Q
9 y$ h* {. s: I/ O) n+ r |