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

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

[复制链接]
STMCU小助手 发布时间:2021-11-19 22:00
一、介绍* R2 V0 h- K' n# M, v
1.1 片上eeprom介绍
  |" n0 B+ F/ x% J7 Z2 ~+ ]L0的片上eeprom特性主要用来存储系统的配置信息,f103如果需要存储配置信息,还需要额外的一颗eeprom芯片,片上eeprom的机制也符合这系列的低功耗的属性。+ v8 L3 M+ I$ R9 `* g, U& z
3 B! _+ d6 M" w1 M, E$ o
1.2 写eeprom操作. _9 x  v% c+ T. Q
此操作旨在将字或字的一部分写入数据EEPROM。用户必须在正确的地址和大小写正确的值。内存接口在必要时自动执行擦除操作(如果所有位当前都设置为0,则无需在写入之前删除旧内容)。类似地,如果要写入的数据为0,则只执行擦除操作。当只执行写操作或擦除操作时,持续时间为Tprog(3.2 ms);如果两者都执行,则持续时间为2 x Tprog(6.4 ms)。每次擦除和写入操作都将FIX标志设置为1时,可以强制内存接口执行。
: x9 Z: N7 c% l0 @' [% H注意的是
2 ~5 v' R- i- i# X一般flash擦除后是0xff,而片上eeprom擦除后是0x003 B7 p1 m+ B% N4 p8 y1 i
一般flash在编程前需要先擦除,而stm32的内存接口自动的执行了擦除操作,无需用户执行额外的擦除指令。( ?) z" c8 d# r. v/ r( I9 B

! D+ F5 r7 N! ~5 w+ M9 G二、编程
- _8 }" v5 e# ?
  1. //eeprom地址
    " s: [; c  L; X; y% O$ a, N
  2. #define EEPROM_BASE_ADDR        0x080800006 {- r7 s0 S5 \" @3 i; ]  w
  3. //向偏移地址写入len个字节
    % r% ]# F8 i* \, ?) }# U! `3 X
  4. void eeprom_write(uint16_t BiasAddress, uint8_t *Data, uint16_t len)# B6 p/ z5 [" K, I: i
  5. {/ D2 @# m" `* |  z3 n9 j* P. c
  6.         uint16_t i;
    . L/ @" U3 c; C9 `+ V- O7 \
  7.         HAL_StatusTypeDef status = HAL_OK;
    ( P- C5 K& ^2 r, h3 F

  8. $ \3 j# j; a& @& h: {# T$ T5 z* u. t
  9.         HAL_FLASHEx_DATAEEPROM_Unlock();7 e2 B. O6 y; }" T6 S* K; }  K+ C
  10.         for(i=0;i<len;i++)
      Y- J3 @! R0 U$ t2 V* b4 Q# @+ T* U
  11.         {& t$ x; I- c4 J% L8 ~
  12.                 status +=HAL_FLASHEx_DATAEEPROM_Program(FLASH_TYPEPROGRAMDATA_BYTE, EEPROM_BASE_ADDR+BiasAddress+i, *Data);8 n( J; w) o5 M4 T+ M
  13.                 Data++;; ?9 d  ~+ U) [( B' p7 ^8 B- D
  14.         }
      f6 J; F% H1 [" \
  15.         HAL_FLASHEx_DATAEEPROM_Lock();/ W2 j5 M( j; o
  16. }
      Q( m. F8 R' D( U; e
  17. //向偏移地址读取len个字节
    ; v0 D! g  D2 U' {  e) N. r6 Z
  18. void eeprom_read(uint16_t BiasAddress,uint8_t *Buffer,uint16_t Len), T- H: x6 f: x1 X8 }4 d: c
  19. {
    , x  G, c1 b! `. E, I5 W: k9 x
  20.         uint8_t *wAddr;
    8 O9 {: V! ^& `
  21.         wAddr=(uint8_t *)(EEPROM_BASE_ADDR+BiasAddress);! R/ U( J, o9 M: a
  22.         while(Len--)7 k  q/ v! h( m# h" Z
  23.         {
    + T' A6 X# D% v$ n
  24.                 *Buffer++=*wAddr++;
    , V. q( f: x" O/ |
  25.         }' ?7 x. t5 e- n2 T( @3 @
  26. }
复制代码
- G+ [  E  w; b; ]" X2 M

) V4 O) o. _% ]( T$ K- g  H三、测试+ i; Y5 @9 D, p9 w
3.1 测试代码
" G$ g( S" H. H0 ?6 z5 F
  1. //测试
    4 M" r0 D- W" Q9 R6 ?5 ~
  2.         printf("开始测试\r\n");
      j7 \$ L+ n; v+ m0 M6 Q5 \
  3.         printf("写入eeprom数据:[0]:%x [1]:%x\r\n",eeprom_write_data[0],eeprom_write_data[1]);
      Q- ?3 X9 {) P7 Y4 d
  4.         eeprom_write(0,eeprom_write_data,2);
    - `" Y7 ]6 o2 S) t3 p  R
  5.         HAL_Delay(10);
    * a4 G+ Q( p& u1 i0 a5 |% g( T9 t  y
  6.         eeprom_read(0,eeprom_read_data,2);
    $ o* {! C- s0 B" [9 c
  7.         printf("读取的eeprom数据:[0]:%x [1]:%x\r\n",eeprom_read_data[0],eeprom_read_data[1]);
    8 J( Q, X: i" m5 D  ?; ^
  8.         printf("片上eeprom测试完成\r\n");
复制代码

6 S% t: t4 K. S; a) O5 B3.2测试结果
' D/ B) `; W$ t3 B6 @向0x08080000写入两个字节和从改该地址读取两个的内容一致,测试成功。" ^$ ^+ y1 v3 Q3 x. s5 c

% M, v; u, z7 g- ]+ l, M- N) e: U/ X* ~3 q4 h/ g- p9 L1 C. s8 k! r
! }  C& `* T, ^4 D0 a
( b8 ^  q, {0 `$ Y, u5 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版