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

STM32G0-Platformio+libopencm3-EEPROM M24C02使用

[复制链接]
STMCU小助手 发布时间:2023-2-22 17:27
使用Platformio平台的libopencm3开发框架来开发STM32G0,以下为EEPROM M24C02的使用方法。
7 @# j! [- b" q' r" H2 i* z' W, @
1 新建项目
  • 建立eeprom项目

    0 B2 `) f5 x0 |
在PIO的Home页面新建项目,项目名称eeprom,选择开发板为 MonkeyPi_STM32_G070RB,开发框架选择libopencm3;

# }! N+ W5 d+ |+ J( K% P
  • 项目建立完成后在src目录下新建main.c主程序文件;
  • 修改下载和调试方式,这里开发板使用的是DAPLink仿真器,因此修改platformio.ini文件如下:

    ; y( h5 A9 m% {6 ?% r$ D0 y5 o# K
  1. 1upload_protocol = cmsis-dap. s9 J  E: X& }( {2 H
  2. 2debug_tool = cmsis-dap
复制代码
8 E, ^; l5 T9 M, }  n6 Z( ]4 Z0 q$ V. @

5 p1 @6 Q) N7 ^$ ^- A
2 编写程序
首先从之前的I2C项目中拷贝sw_i2c库文件夹到当前项目的lib目录下:
3 X/ M( G. x$ e- q4 V4 f
微信图片_20230222172701.png
; k8 R- N" r$ K8 x
+ o6 }- e4 d/ j  l6 p; Y
本次不使用串口打印,直接使用SEGGER rtt打印,因此将SEGGER RTT也放置在lib目录下,便于调试打印:
  1. 1void log(const char* fmt, ...)
    8 ^/ Q- L/ P) Q8 h7 P! t* s$ a
  2. 2{3 g- s5 ~4 K# S9 N7 W
  3. 3    va_list va;
    - A  ]$ [& `; h+ K0 C
  4. 4    va_start(va, fmt);
    & \. j# \0 j- l$ \: t
  5. 5    SEGGER_RTT_vprintf(0,fmt,&va);% c: j  |) \) v" ?" s
  6. 6    va_end(va);
    9 ^% |7 V" ~$ e
  7. 7}
复制代码
8 A1 O, t, b' n- C4 D# K
2.1 EEPROM 写数据
  1. 1static inline bool m24cxx_write_one_byte(uint8_t addr, uint8_t data)
    ) g5 B+ L9 M% f" U6 z) D4 i, t
  2. 2{6 a3 E3 f. R+ V- D0 Q3 H. n0 l
  3. 3    uint8_t buffer[2];0 }2 |2 @8 [( D& h7 A
  4. 4
    / @/ I" h. c: g# \( [
  5. 5    buffer[0] = addr;
    7 Y1 q( l1 ^2 I* f
  6. 6    buffer[1] = data;. v$ i, y( D; v
  7. 7    return sw_i2c_transfer(M24CXX_DEVICE_ADDR, buffer, 2, 0, 0);
    ( N3 n1 p5 Y$ V9 z) q# |! `& Q7 g/ O
  8. 8}
复制代码

7 P! S1 `/ x2 w) U' O! }& [  `, D: X1 ^) k
2.2 EEPROM 读数据
5 b3 \( ^5 F/ d; P5 A1 T
  1. 1static inline bool m24cxx_read_one_byte(uint8_t addr, uint8_t *ptr)
    - @! w3 F4 {( c
  2. 2{
    1 c' m& ?' g! s8 G' d# }
  3. 3    return sw_i2c_transfer(M24CXX_DEVICE_ADDR, &addr, 1, ptr, 1);
    0 M% S7 f1 b1 x
  4. 4}
复制代码

6 D- v% N" O& i7 V; X# e7 q; @' R- }9 |: T7 _& w6 ^- i
3 连接硬件进行测试
将EEPROM模块与开发的I2C引脚连接好:
; E# {/ \- q/ `. u" V3 Z
微信图片_20230222172654.png
, o. d% \& p+ W2 G+ n
( O+ e3 z3 ]$ u2 J1 J
先执行程序进行写入:
  1. 1int main(void)
    . s3 n+ a/ P3 I( [
  2. 2{
    6 Z1 V5 _2 m' p' W* E. ?
  3. 3    sys_clock_setup();
    % `+ X1 P5 v  J4 H# Q
  4. 4. T7 D7 N. {+ _! V2 o2 M9 c
  5. 5    log("init sw i2c.\r\n");' |+ W8 ]7 s- C; O3 a
  6. 6* v/ z2 }7 K8 m& ?4 m8 x
  7. 7    sw_i2c_init();( o9 S4 ~- l; M5 Z* v
  8. 8" h! V( ?) O4 r6 y$ M! X; ?# c6 c
  9. 9    log("eeprom read testing.\r\n");
    2 S6 b4 u! u- D4 B2 N; |
  10. 101 i; i1 n3 {/ Y. z% B
  11. 11    uint8_t addr = 0x01;, M; @% n4 W3 q' W+ X7 Z' J: g
  12. 12    uint8_t read_data=0;
    . U7 \" B4 C9 A7 m+ b; X
  13. 13    uint8_t write_data = 0x88;+ ?" r% O0 p' Q5 e( W. P5 F
  14. 148 ?9 {5 Y# e" C+ T5 s
  15. 15    #if 00 W: `* R0 ~- n7 U: _8 D1 W
  16. 16        m24cxx_read_one_byte(addr,&read_data);
    , O3 M: D- @# f! ^
  17. 17* k: a; Q4 }! q' A2 P' K1 W
  18. 18        if(read_data == write_data){
    ' {  r  M$ _( j7 D
  19. 19            log("eeprom write ok\r\n");
    * q% \( q. R. c1 n% q$ c: z+ C
  20. 20        }else{3 l$ t5 g- _9 h8 B; t4 r1 b
  21. 21            log("ERR:EEPROM write failed.\r\n");' ~  B# L0 y3 j) c
  22. 22        }
    & o7 _" c2 {% h7 C* S6 a4 ?  l
  23. 23" x" }: z9 A  ~! M8 y
  24. 24    #endif& B  l# Q; A* [. n4 r
  25. 25( w( Z! l0 V! a% l; V3 O' h4 ^8 S
  26. 26    log("eeprom write.\r\n");
    - u) |" s3 E) L. q+ m! k
  27. 277 A! H! D$ T+ Q1 b
  28. 28    m24cxx_write_one_byte(addr, write_data);6 }! d, v; P; P  s% o+ _
  29. 29
    ' V" }( f" E$ b0 j( n
  30. 30    delay_ms(5);//wait write done
    4 ?5 `- E6 q. q
  31. 31
    * p  o9 n/ I0 b0 ?4 b
  32. 32    while(1){/*do nothing*/}///!!!not go here.0 h& {. R+ _5 N2 E, I/ o. Q) Y
  33. 33    return 0;8 A1 D2 Q% N+ s, m, p# B/ ^
  34. 34}
复制代码

( _, `/ V1 E7 X
然后将读取部分的程序注释打开:
  1. 1    #if 1" ?% {) k: `( |7 O: R
  2. 2        m24cxx_read_one_byte(addr,&read_data);
    5 I1 k# V% ?" n. d
  3. 3; g6 S: m6 }  ?. d7 |
  4. 4        if(read_data == write_data){+ `! B6 ?% T. X) u) P- v
  5. 5            log("eeprom write ok\r\n");
    $ C" f, |- V5 s0 B# S
  6. 6        }else{
    * V; h( ^; G/ O$ }+ b' T
  7. 7            log("ERR:EEPROM write failed.\r\n");$ x4 v# {/ U* P% j9 W
  8. 8        }) k% Y! j5 ^: P& e9 B$ i
  9. 9
    0 ?0 I* s8 k9 q% ?8 U3 q
  10. 10    #endif
复制代码
将开发板断电后重新上电可以看到测试正确:

" Y( ^$ F) Z0 ~6 F4 `% J, L" q" |- c" |" w8 p
微信图片_20230222172648.png

7 B. p" x* p/ x, _
注:写入数据根据M24C02的数据手册,其 Write time 为5ms,因此写入后要进行等待其写入完成;
, j; \+ m: n6 G- g

2 q9 {/ ]. i; D1 D8 v$ {/ a
赞 收藏 评论0 发布时间:2023-2-22 17:27

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版