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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍
5 T0 E' d3 t/ Y# ~' ?1.1 片上eeprom介绍  i' i: Q5 z6 j
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。$ }3 S+ o' j$ P; |9 |3 Z( ]" y4 X

% e, Y( P" v. r0 \9 C- Z' S1.2 写eeprom操作& z7 s$ R" s& D! ^1 s5 o
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
; I! g* v0 @# Q3 b. U# c: }注意的是
3 ~$ |' Z* [1 H7 {一般flash擦除后是0xff,而片上eeprom擦除后是0x00' E5 B) [" {$ L+ C3 v: j
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。  O* C8 n4 T; y( v: b
2 O) s+ `* o0 u- i4 J
二、编程, ^& Z6 W+ ^: H! R
  1. //eeprom地址
    & ]- S" f! Q3 W1 C* [" x0 A" E
  2. #define EEPROM_BASE_ADDR        0x08080000
    % L5 H2 l0 h; }# C8 M/ e7 |
  3. //向偏移地址写入len个字节6 M' t- C( S/ Z7 J
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    " D  A8 w& |$ t. q
  5. {8 S, y+ V2 t1 _4 Z
  6.         uint16_t i;' d* @' ]7 I" E, s% B
  7.         HAL_StatusTypeDef status = HAL_OK;
    4 I6 S8 J9 _; `& ]* y* Z
  8. ! W" G4 v1 e; F7 _+ C7 n
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();! V5 B" M# p( ^5 _+ X8 [
  10.         for(i=0;i<len;i++)
    ' H" c# m2 |: `' J" q3 N; j1 Z
  11.         {
    : {9 d3 j7 P7 w5 |$ ~6 v
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
    8 p# q+ O$ j: N2 {( T
  13.                 Data++;/ f2 d+ w, ]6 \: Z! @
  14.         }8 _4 u: c, T* b. h& d  T) c
  15.         HAL_FLASHEx_DATAEEPROM_Lock();
    $ N" H3 d4 j- I1 S& M
  16. }
    8 Y6 n4 G5 J* Y; Y
  17. //向偏移地址读取len个字节* ?6 F. j9 m$ G8 K  s3 P: ]
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
    ( p1 v2 u6 ]: I( _5 a& y
  19. {( q' Z/ ~- B/ {' \0 m) U
  20.         uint8_t *wAddr;
    + F( R/ D9 m' d
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
    8 a; G& e/ k3 x' p8 i$ p- l8 f! P
  22.         while(Len--)2 J& X( d3 O; I. I1 @; Z8 I
  23.         {- t0 L  d- W6 ~% X( w1 O( v5 O
  24.                 *Buffer++=*wAddr++;
    5 ~5 s9 w- N4 x9 `+ C' u# e
  25.         }
    2 _$ r( k2 [! x6 |$ \# z
  26. }
复制代码
' B' v0 E) F; F' `' D8 {
: G" g" \+ H+ _! w% E! e5 D  l
三、测试
$ V3 G0 V5 P' r+ M* _# }2 Q3.1 测试代码
+ D+ K% G! ]' b, ]
  1. //测试
    . a& a- \2 |0 y6 C
  2.         printf("开始测试\r\n");
    ' c4 R! M5 z5 H4 z3 [4 R/ c
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
    1 x- x" r) j7 P) C
  4.         eeprom_write(0,eeprom_write_data,2);
    1 C) m4 \' T$ I( a, L5 f* h4 g, e
  5.         HAL_Delay(10);" |/ G+ J$ v3 d0 [4 C
  6.         eeprom_read(0,eeprom_read_data,2);
    0 S7 Q- ~7 i. F3 Y
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);% a* W3 K$ r+ k1 k. R* N) n
  8.         printf("片上eeprom测试完成\r\n");
复制代码
. l9 b& a% R" p0 ^7 c% {
3.2测试结果" y& s# @7 Y6 |0 x5 ^
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。
! k; M" V( z+ f  ]9 H; q
' `% C  n$ v  ?& S* j/ E! L8 W4 D9 |* D) @! L8 L: \; K

% d' H! N+ W$ Q, i" `  f! L7 b% `  n6 T2 u1 T. \. y: u; |
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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版