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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍3 _& @# l8 n- Y7 p4 M8 l
1.1 片上eeprom介绍3 M1 j7 m. T2 [. G% L# ?' x
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。+ Y; h# z* Q4 j/ g) o2 S1 i- T/ D3 o

8 T8 D6 Z9 n, n  H( r( z1.2 写eeprom操作1 ~9 |* ~  }3 G' Q8 O7 M, U; w4 n# m
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。& u0 n) z4 B1 O2 H
注意的是6 h1 M  n; E5 \  g
一般flash擦除后是0xff,而片上eeprom擦除后是0x00
2 n9 n" h0 R) W# t# b一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。
- L. X) Y8 P: J
4 w& U; }4 n- o6 }2 K6 Y8 _二、编程: K. W) w( w, P7 T$ z
  1. //eeprom地址
    3 g) O/ @9 i, N# `0 ]
  2. #define EEPROM_BASE_ADDR        0x08080000. d( \: b; V! @' ?
  3. //向偏移地址写入len个字节
    & C( @' W- F9 R) B  H  B2 ~6 q
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    5 Z7 n5 T" p* ^7 W$ v
  5. {7 b6 B3 K3 y, z; W3 T) @6 Z4 r
  6.         uint16_t i;
    8 g& F4 _0 h5 c! f& ?
  7.         HAL_StatusTypeDef status = HAL_OK;
    1 x' d9 T0 V  r- u- ]7 m/ B1 |6 ~

  8. 5 m6 o$ L- Z* Z  ^
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();8 _; t% \$ @/ g
  10.         for(i=0;i<len;i++)( ?3 ~3 h; T: u2 K% B! n
  11.         {8 h* J# @1 P$ E8 l( E; q  t3 e- v
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
    1 I" t3 \7 M  }$ p
  13.                 Data++;; k' G- r6 B5 J' @' x" q* i
  14.         }
    " {  [5 g7 ~; F% K0 T
  15.         HAL_FLASHEx_DATAEEPROM_Lock();1 M! M$ C, B1 j* f/ c, K
  16. }8 l/ X% g0 t5 F6 D- q
  17. //向偏移地址读取len个字节% e. p# a& b4 c% j2 f
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)3 B  ]" m8 G6 ?/ {
  19. {9 o7 z& x/ J8 Z" M4 M  P5 D
  20.         uint8_t *wAddr;
    4 Y6 r/ [+ s% T; O1 R' Q+ W5 ^6 V
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);/ E9 [: h7 N1 D  V: H" F
  22.         while(Len--)' z# d6 H# i2 h+ \
  23.         {* h5 k" ~* V# V4 w& Z1 W  E
  24.                 *Buffer++=*wAddr++;
    ' H. d* `, c& x! i' O
  25.         }& |# P4 h1 M0 c- ?
  26. }
复制代码

5 k% x6 {% g; x
+ {1 n4 w- `& E$ L1 x三、测试
" _+ t  ^8 P- n- q% T+ i3.1 测试代码2 y  |' O  ^/ U- E- A6 E
  1. //测试8 l+ J- @+ d) }: z3 V. {
  2.         printf("开始测试\r\n");
    2 c. ^" c/ a& B( v5 ]1 _/ ]/ i# k* I
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
    ) j% H- A  H: `
  4.         eeprom_write(0,eeprom_write_data,2);; F/ E1 G6 I& X6 ?4 a
  5.         HAL_Delay(10);
    5 f+ P5 B% V" y: I/ N, P8 {6 b
  6.         eeprom_read(0,eeprom_read_data,2);4 O) G' D* O* y, x% v3 F, L
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);4 Q- R, O6 V- Q& ?' H6 k
  8.         printf("片上eeprom测试完成\r\n");
复制代码

1 |0 }0 k, d' i, d3.2测试结果" U& ^* G9 D$ K/ R% O" m
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。
  a1 V+ u5 r2 B1 F8 N
  N" }# J: M, V3 e3 Y8 k' s7 W& l" T6 v

& \6 E) X$ d1 S( l8 s5 N- {' q0 r5 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版