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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍
2 c& l/ N5 R" p9 G1.1 片上eeprom介绍
9 x5 t$ W) N0 c# t& kL0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
! P! U. K. G8 w2 w) s
+ l& |1 `- y- v) x$ x5 @0 F1.2 写eeprom操作
; c* w$ f# Z3 r9 w此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。* ]/ C$ y, c+ O* _
注意的是; @2 ?  w2 o3 ~# i
一般flash擦除后是0xff,而片上eeprom擦除后是0x00, X" W$ |* Y) @4 Z) r  @# B
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。9 W1 u; a- H: r; E6 v) |

: y0 j# a6 p6 X8 R" G, k4 ~6 q* b; e( G二、编程/ q" D4 p! p# ~* O2 H* o
  1. //eeprom地址
    3 u9 C7 E8 m" z+ n& F+ @
  2. #define EEPROM_BASE_ADDR        0x080800007 `" [- Q3 V/ y* N( t  M. d
  3. //向偏移地址写入len个字节
    - R# m  ^5 {# V8 w
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    ' J7 O; l0 i4 B( F  q
  5. {5 t1 f0 {, w; C0 d: D  I
  6.         uint16_t i;+ }4 i' f, w- u0 k" R7 W
  7.         HAL_StatusTypeDef status = HAL_OK;
    / {/ Y8 c2 G- g, f

  8. - [* t, h4 S2 B2 g$ @
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();
    5 h+ I+ Z/ b( m
  10.         for(i=0;i<len;i++)
    * x: L& v8 D+ v
  11.         {) E# f* B1 e0 `
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
    ( U/ S4 c8 G. f4 W) m
  13.                 Data++;: p( r; H1 L/ P1 K
  14.         }
    ) O/ K8 f7 b' k$ _0 o' g. p9 K
  15.         HAL_FLASHEx_DATAEEPROM_Lock();
    + f8 x' E3 {& ?4 y% @$ T5 e$ Y
  16. }
    & ~* P4 e7 g3 `2 B, s
  17. //向偏移地址读取len个字节
    * s% _$ N# D/ A5 Q
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
    % L" K: ~; [2 M% _! I# Y* z* j
  19. {8 O- |& m% {4 c+ x( m
  20.         uint8_t *wAddr;, I7 j* m$ F! ^/ ~$ e# K
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
      o( N0 F! U% C8 S9 x& _, v
  22.         while(Len--)
    3 i; z! K& s% L% h8 ]
  23.         {3 l+ R: p7 t1 N6 \) Z) v. U# F+ s1 k
  24.                 *Buffer++=*wAddr++;
    2 H7 m! I7 `- E
  25.         }, C/ E" P6 [, i9 A7 U1 }! d7 r
  26. }
复制代码

1 X( Q+ k0 T! B5 k2 o# _  Q; R4 u# F
三、测试
! y0 f2 N- a8 R9 U3.1 测试代码& a! J- O: f7 N: z/ N) X
  1. //测试
    . a9 Q6 V' c. c8 G$ U
  2.         printf("开始测试\r\n");) j6 B; o5 ^) m% ?7 V
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
    ) R5 d0 Z8 f6 H% i1 `4 I2 x1 J
  4.         eeprom_write(0,eeprom_write_data,2);
    + E0 m- d; v, N- K9 ^& i3 o2 g
  5.         HAL_Delay(10);7 O2 Z7 d9 V. j* S4 f# B
  6.         eeprom_read(0,eeprom_read_data,2);7 O3 _6 _, G- l0 J3 U3 D1 E
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);# n# R: F7 `: ]  Z5 ?1 t
  8.         printf("片上eeprom测试完成\r\n");
复制代码
' ^7 Q: q8 |8 Z/ o
3.2测试结果
& c$ g- f. G3 u9 o, K2 r向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。) D8 V. y! C- `9 _2 }8 m
& `6 }6 V5 M2 }  r
6 W: u! W( D( ~0 z" |

; F: b  e9 I+ ~; N/ X5 U; ]# f- ^# l4 b4 O- w
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 手机版