你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】stm32l0片上eeprom的读写操作

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍" 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
  1. //eeprom地址& ~, W3 N7 G4 `0 a3 ~' J2 G9 S
  2. #define EEPROM_BASE_ADDR        0x08080000% x! B2 _7 K6 w2 e  H
  3. //向偏移地址写入len个字节
    5 j1 ~0 u9 V* I( @. I
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    - M$ H/ K8 B6 C+ C6 {2 y0 Z: A
  5. {7 a8 X# S& a- f8 y* ?! |% ^' ]7 |+ p5 e
  6.         uint16_t i;( y2 d; ]/ e! T
  7.         HAL_StatusTypeDef status = HAL_OK;- M; B5 a' V1 p2 X" j3 W1 @
  8. ! ?6 d# d/ h6 Z
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();
    7 W' D& _' g0 m5 y# _
  10.         for(i=0;i<len;i++)- g& Z- G. \  f! F: H7 ?) b2 z
  11.         {* h4 T8 W4 ~- s, Z- b* ~5 C
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
    * ^6 W$ l- ^+ X$ \
  13.                 Data++;
    " C- o3 S) ^! W! u; y" {' y
  14.         }& K9 _2 r9 O4 Y; _# d- P
  15.         HAL_FLASHEx_DATAEEPROM_Lock();! M* ^( _/ P* |6 \; V4 C7 \& W/ J
  16. }# }: ?. z1 F2 [# w# e
  17. //向偏移地址读取len个字节/ g  s3 M) g  X( m
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)' I( p( O" t/ _% y
  19. {
    " [$ ~# d  P) b$ p- G$ W
  20.         uint8_t *wAddr;  ~  T5 R2 G4 `" K3 L; u& a
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);- F. X% N& C9 x4 Q. g) K
  22.         while(Len--)
    6 `2 }! \6 W- T" m: Y! s" m* C" e
  23.         {( e: m! B1 f2 P' J" y6 E
  24.                 *Buffer++=*wAddr++;/ d- ?8 m& e) S# b6 ~, S! [# V
  25.         }
    , t) p- f! s4 v" V: d
  26. }
复制代码

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
  1. //测试
    9 X$ V+ Y' @( o$ ?- |6 O
  2.         printf("开始测试\r\n");, d/ M' X2 W! |  I- `" j+ A
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
    , }) V3 R+ u$ j- a2 Y
  4.         eeprom_write(0,eeprom_write_data,2);
    ' r0 r& }# g/ P6 L7 D- v
  5.         HAL_Delay(10);
    - s8 F- [/ W6 [
  6.         eeprom_read(0,eeprom_read_data,2);; Y+ ?) |  c: m- R6 q
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);/ V3 @/ d9 I% e9 L  |& l
  8.         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
20210316142526351.png
收藏 评论1 发布时间:2021-11-19 22:00

举报

1个回答
STM1024 回答时间:2021-11-20 13:37:25
感谢分享~~ TS1 - 副本 (6).jpg TS1 - 副本 (5).jpg TS1 - 副本 (4).jpg TS1 - 副本 (3).jpg TS1 - 副本 (2).jpg

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版