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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍
& O- K, _. ~2 e1.1 片上eeprom介绍
6 h  }( z# z& XL0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。& Y3 m. ^8 ?$ ?/ l) g* U" O
' a  `6 T: z$ v: b0 o
1.2 写eeprom操作
; S8 h' O, P3 Q- s; e此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。$ U+ k1 h9 h. e
注意的是- t5 e4 b) \' n% m( e
一般flash擦除后是0xff,而片上eeprom擦除后是0x00
9 v0 K! `8 u. [# d一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。
  Z$ c. w* b4 i% e5 z. l( @' _" S. M! D- Y3 y
二、编程
8 }- [+ B/ d9 `1 x7 s
  1. //eeprom地址; Y  @1 w  o* _) W/ v3 W4 i
  2. #define EEPROM_BASE_ADDR        0x08080000% E+ G7 |3 ^, w- o0 Z( P* Z  U# E
  3. //向偏移地址写入len个字节
    ) L2 [; }8 E3 u6 e
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)
    ) @) M/ R9 j7 n: e" {' N
  5. {" r; ]2 L4 f- R! Y6 k: e7 T
  6.         uint16_t i;
    2 j! t" V' P3 O& \
  7.         HAL_StatusTypeDef status = HAL_OK;% Y* G  S2 H1 _1 M
  8.   p6 x% y$ _8 j3 |1 G5 x6 T
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();
    + k# l8 z+ B( v0 i7 i0 p, P
  10.         for(i=0;i<len;i++)* e5 [+ F6 s. Q8 t, j6 y% |* ?
  11.         {2 |0 V" K* S# M. w8 e+ y
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);9 B: P* j9 J0 \" W  {1 @
  13.                 Data++;
    % S5 i0 T' B& O
  14.         }& y) d1 U5 _( Y% M, z: H) O/ c5 E8 e
  15.         HAL_FLASHEx_DATAEEPROM_Lock();2 N- Z  V  P9 n! V+ @
  16. }4 S! \" o9 E8 U; |! X! [
  17. //向偏移地址读取len个字节
    ! ?# S; D# C* m0 y% \
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len)
    1 [! e7 E3 }" D/ p
  19. {. W! V1 x. x0 ]+ Y# [
  20.         uint8_t *wAddr;
    ( x1 E: m; n& M0 n! Z' V+ h" \
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);
    ! i/ ~) t" _# e0 D( i+ R) [. O
  22.         while(Len--)8 c; l+ l0 G3 E4 w6 K3 \8 K* U
  23.         {. g$ o3 q0 r6 H+ m
  24.                 *Buffer++=*wAddr++;
    1 Q! o" V7 p) R% |! h
  25.         }! ]: Z% O2 g6 t& j& U( s. ^! d) O# b
  26. }
复制代码

0 r  B  g% p" Q& _0 `9 G
0 ?, \0 H" L$ m( ?2 y: q三、测试
6 w% Y5 h) x1 z* }8 m" W8 B3.1 测试代码
& Q. k# g' Z3 X/ x, ^4 r3 x" J% r
  1. //测试1 n3 B: U8 \! O/ x+ ]: |! H7 s
  2.         printf("开始测试\r\n");
    + e* |& m: p( X  K5 M2 P
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);2 ~5 t0 G8 g, n
  4.         eeprom_write(0,eeprom_write_data,2);, t* k" ~! J% M- X- F# V' _
  5.         HAL_Delay(10);$ F/ Z& v2 P7 G7 }
  6.         eeprom_read(0,eeprom_read_data,2);
    . ^6 Z& l' I+ Q, X5 O) @1 y
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);& U1 [' J: i% `6 F4 D2 K
  8.         printf("片上eeprom测试完成\r\n");
复制代码
" s8 S, ~1 V( ^; G0 ]8 }: k2 {+ Q
3.2测试结果* x, v- `4 d: [
向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。& P! {' O0 S2 E. T6 ?* n' S- y
; Q( W8 L5 J; m0 z
  E& I) A# ^5 n5 @3 S9 V

! ^4 I0 ~+ e& O8 h* `9 r
4 h$ o, D; z. l9 ]) K2 T4 N' [8 |
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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版