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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍
$ ~; `7 U3 i8 [5 _# L; o& ]% N1.1 片上eeprom介绍# \8 n/ ?% L/ M; y. r4 Z8 ]) a  {
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
  r+ J  ?' A5 u# W# L! W2 C7 F+ I5 S9 D$ _; j# R
1.2 写eeprom操作0 T6 a! |/ A+ [6 `; f
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。6 E4 G+ ]# }! H8 {, n
注意的是! R& |8 A7 ^/ B
一般flash擦除后是0xff,而片上eeprom擦除后是0x00% ^' \4 X) n, O$ ^5 @' x0 {
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。5 J! S- Q& S8 h! Q1 a( z4 ^5 j1 P
2 f( V1 W# f2 N6 C& _. R
二、编程- R( U/ L) Z3 i0 z7 E; ^' G
  1. //eeprom地址2 p/ c& o) i% e4 ?, \2 t
  2. #define EEPROM_BASE_ADDR        0x08080000
    / Q1 a7 Z2 C7 M& s
  3. //向偏移地址写入len个字节
    $ V& X7 K# L7 U* n4 O' b9 ?- Y9 q
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    ' U: f9 N5 Z- t& k0 Z9 n; _
  5. {% ?% D( S3 Q9 p1 I- N
  6.         uint16_t i;: L8 |, D  J3 Z8 s6 {
  7.         HAL_StatusTypeDef status = HAL_OK;1 \. w* h1 |/ g5 H) E1 ~

  8. & `' H0 @9 E+ z# b( R
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();
    9 s# w; V) W% w
  10.         for(i=0;i<len;i++)
    * m  Q& d6 i' ]/ s4 W3 j+ u' t
  11.         {
    ; l0 ]1 g8 n5 [! ~. c
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);" ?8 Y5 U/ @. T1 e  G( \& I
  13.                 Data++;
    2 b' `# i. S' I( n5 v
  14.         }" J6 i: L1 A6 h/ h9 L) k3 J
  15.         HAL_FLASHEx_DATAEEPROM_Lock();5 q* H3 J6 |5 G- {% E  D
  16. }" O) C0 S# N; i3 R4 n+ Y/ J+ o
  17. //向偏移地址读取len个字节4 b7 s* b0 C! |9 D
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)$ a& E; t3 X9 N( p# ]6 T1 m
  19. {( N- _" |6 @* V% V2 \
  20.         uint8_t *wAddr;8 @- [" E. O4 r' K
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);5 J: M1 i& }7 ~- g* c) N' l+ n
  22.         while(Len--)
    5 y* I' r5 a+ |  o
  23.         {
    " I+ S! `; |# [0 t8 E. g
  24.                 *Buffer++=*wAddr++;1 u7 U  C) F) s: t  T% I2 H3 F
  25.         }$ k5 k4 y, T2 v2 j
  26. }
复制代码

* D. q" F1 n. E) i( C2 b
# N4 o& \, k( L3 z三、测试6 k2 {- _3 A/ B
3.1 测试代码
1 z3 _5 H& L1 b4 f3 G9 l" e
  1. //测试4 k) u1 }6 A3 z/ o* Q" G2 _* r
  2.         printf("开始测试\r\n");( G  g: L5 M$ B  T; T8 x
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
    . N+ _8 C/ C1 |8 z9 i5 X4 C
  4.         eeprom_write(0,eeprom_write_data,2);
    0 W1 W7 L2 L& R2 h5 u7 _% i3 `
  5.         HAL_Delay(10);
    / k' x3 j; G2 X% D  J+ `
  6.         eeprom_read(0,eeprom_read_data,2);
    . \! R$ G. g& k( \! r* Z  _+ {
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);. j9 Y- ^4 G, b! Z5 U
  8.         printf("片上eeprom测试完成\r\n");
复制代码
. _3 h4 ?4 O, C4 ?% i9 ?8 G) w
3.2测试结果
1 S/ e5 w5 a: Q) k8 R2 `+ K向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。; J7 N4 O4 r8 f1 {1 e

6 y& u  T2 M7 \* d0 _: Q- M4 f6 u
4 }6 l' ^8 M+ s! ?7 z
- u& R" \  u, L- N5 ^. x, K; m+ V, G5 _' i4 P
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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版