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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍
' a& w+ [. M( I- d. q: b/ h1.1 片上eeprom介绍4 n# V! E/ [. N/ E
L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。
# R" \* K1 h5 `. M, ~+ p
$ {& M4 ~) A, w, N  z4 d1.2 写eeprom操作4 c, ^% {8 m' [3 f8 R
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
6 n( M, E2 V; j) O) x注意的是
, f5 G( M: l+ t一般flash擦除后是0xff,而片上eeprom擦除后是0x00( I8 v, [0 J1 M& ?2 G
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。; [; O  |2 z& W% L% K8 y/ A8 Q

, `! ?4 a$ ~( Q0 T& `$ h二、编程
  W# z; g/ Z- i& @) F3 d) T
  1. //eeprom地址
    / R& l% x+ E/ n; T+ }* c! V3 ^
  2. #define EEPROM_BASE_ADDR        0x08080000
    # n" E3 l. {6 J
  3. //向偏移地址写入len个字节1 p' m& p: I% I  r
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)# \* f* [; f( s! y5 E
  5. {6 S3 F! P0 R( j0 X
  6.         uint16_t i;$ g+ Y. |. K2 O, w2 Y0 A  j
  7.         HAL_StatusTypeDef status = HAL_OK;
    # b  Z1 I" t( G7 h- @# c6 n1 Q9 ?  @
  8. 8 d9 X, R  O* b/ F& x8 F- H. J5 X# m
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();
    8 T' B" w( g/ V. x2 a
  10.         for(i=0;i<len;i++)" ~$ Q- p9 x, X/ ~+ U/ T, t, t
  11.         {5 T% J0 k4 E6 v/ S; J: o
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);
    : p/ u# n) c" T0 D" T
  13.                 Data++;
    2 V8 k' U/ d5 w, M6 @+ X
  14.         }8 L- C4 g. _8 }- L* g
  15.         HAL_FLASHEx_DATAEEPROM_Lock();
    % {* x  g( P+ c/ \  r9 ]/ o, Y4 a8 a4 q
  16. }
    : Y4 g: z4 m4 P4 O4 F. a
  17. //向偏移地址读取len个字节
    , r- G/ k: c' t* P0 L4 a6 m9 Z
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
    . g  J, b. `; s9 _$ n% x( {* e, g
  19. {
    ) I8 x% c6 S) D
  20.         uint8_t *wAddr;6 j) D+ H, t) q
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
    & y# P3 |; L( w) N/ i
  22.         while(Len--)- e/ q$ O0 z. b) F& k4 d) [( G% a/ e
  23.         {2 X# |% N' o" h
  24.                 *Buffer++=*wAddr++;0 j1 d1 h, _5 f1 A9 S9 q
  25.         }
    5 Q& N1 R. c5 `0 Q0 L# h# A3 V& L
  26. }
复制代码
% Q  F& b% r  ~- B7 O7 p
% ~& d4 Q0 [2 I9 ?. c) ]  s6 C
三、测试
2 w$ u( y& ]& k. c3 U6 S$ X- V9 S3.1 测试代码. p$ y( M9 P* u
  1. //测试
    ) @0 [. {- D% S' E4 j
  2.         printf("开始测试\r\n");
    ) Y& H0 J' R: i" J( J* [% ?  d" Q  d
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);7 ?3 x4 V# k1 B1 l( X8 x# @
  4.         eeprom_write(0,eeprom_write_data,2);
    3 h$ c8 P8 }8 R9 W. _( h
  5.         HAL_Delay(10);
    & C" Y" Q: \6 ]; x) g6 r  P/ u
  6.         eeprom_read(0,eeprom_read_data,2);5 p) O6 ~7 I$ Y# w2 A5 r* g
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);
    % O& Z9 o6 K5 x6 l
  8.         printf("片上eeprom测试完成\r\n");
复制代码

' J/ C# q# x6 E# ~  r; H2 ]3.2测试结果
; L0 H7 i% N) [, X  P5 o7 W% a8 O向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。+ z, A  C/ F% m5 G- I

" K, M6 @4 H6 H. i4 J: I2 i7 |
3 \2 Q# W4 E6 C/ m- c7 d+ {# b' R4 t+ R) f6 F+ A

  I) g. }6 E; e* e/ {, 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 手机版