实验步骤
/ ?" g2 g2 P! Q' z' C1、CubeMx中芯片选择STM32G071RBTx,新建工程
5 q# P& K+ N% o0 W: o: D6 L2 n* F
( g( T' j4 ^; O. M, A- _9 [- b2 e2、开启SWD调试、HSE, k0 g) X- X' f* ?; z9 F/ ?# _
7 n7 B- R# u+ p% e( t. B
# _9 V: e" ~' X: t( d8 D
9 r9 V. Z/ }/ B( z" Q! @8 j6 T
' i6 u6 w% g# y% ?- J7 U/ c3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
: j+ c$ N( n: ^0 X
9 N: U8 u8 } E& H8 {: T
1 n- j* P8 t& [0 Q' `! V6 R
K; L# I) ]! f4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚
* d8 o% r o5 @2 U6 e. a
4 y7 l, i' C. x; w# @* R
& C% p5 n$ w& Y$ ?- x! P5 U
3 a; P x- ?3 \2 I. B3 g5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
' \& H8 ?% K/ q% @" L9 J/ ]" x0 Y, P' b" C% |6 \# E* a# R
# @! u) A V+ K( e) v F& M$ @8 m% w3 K* m' X; _6 Z2 X" y( I4 h
6、设置时钟树,HCLK=64MHz$ W( b. x, L3 Y9 A) ~
( V# c' v- G0 R$ _) q% K: T
2 x& B6 j: ^7 U8 ^- m: s
& L- W" s. d5 a; J! n9 O6 \
7、在工程管理里面,设置好参数,生成代码使用MDK打开。' h+ W( q1 m0 W0 F7 v% \/ D
- O, x* Z7 x; ~& u1 t
5 |9 G& S9 b* |4 M7 ~
% ]3 j' n7 @2 f* U( v+ X
- O1 |! G5 m, l0 P( |: b1 e3 X
4 W" B8 U5 r2 k' B9 n. g/ M) C3 r
代码部分7 |+ X5 Y# [" \$ N( l: ^5 P! p: l( u1 i
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
2 r. D. `$ }. V) k0 L& T, A" ?" v2 l3 u. i
2、添加printf打印代码,在usart.c文件添加如下代码
" p: u' u! b1 ~8 H' N, D8 g+ o8 ]! A. h( B; S* T
- /* USER CODE BEGIN 0 */8 ?. ~0 ^! s. A1 ?
- #include <stdio.h>
7 {% T' \1 z' A D, K. A - /* USER CODE BEGIN 0 */
? i7 F* r5 z7 l5 @ - #ifdef __GNUC__& ]# Y% t& o) A1 M3 ] s
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
% r `$ K; _1 j, U - set to 'Yes') calls __io_putchar() */! a. E: m# l! ]: p( N
- #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)7 d4 l0 g. @$ d1 e% Z! J1 R; K7 p. S
- #else
6 p1 e9 l8 S$ k( P8 E" q$ \ - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)3 Q9 k2 h7 I$ X& A1 E; `7 H9 B
- #endif /* __GNUC__ */
* d/ Z6 m7 L5 f; o `+ u' f8 I$ t! N - /**5 }% A f$ z6 D. c- f
- * @brief Retargets the C library printf function to the USART.8 p7 v a: r3 R6 F& Q5 H Y
- * @param None# m- k/ K- Y/ F M/ o. @: Q! w7 X
- * @retval None
* I) _* z/ x- j# S2 M! [ - */) k& ~+ d2 i. [' e I' |0 Y
- PUTCHAR_PROTOTYPE
2 y6 b( R; D9 Z - {
1 \" d0 k; T4 H4 @; o9 ?: p$ K5 e - /* Place your implementation of fputc here */
8 ~/ W. V- r! U9 A7 h9 a, W1 @ - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */$ N A O$ b6 Z+ D" j- [) W% |
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
1 p6 s p: @6 z1 G8 _( A - + ? L, r. U0 {& f" K1 W+ Y
- return ch;1 S9 H6 ]+ M: [4 u/ P2 l
- }* {0 I8 [0 ^' n% u [2 ~! y* d
- /* USER CODE END 0 */
) b0 x1 e0 c; F) Y: ]" @0 Z5 a
复制代码
! d9 k( D' x; `0 G- J3、设置24C08A的地址7 V2 u0 `& k' n
; o, k8 N+ a) R) W) T这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
6 x' r( X* E. @ C0 O
# s: A/ k- H1 k5 P# I
2 F% \) T) C4 w& B9 D8 q& A2 c1 E% O+ `, ~) |+ l1 {( |% }
在i2c.h文件中添加如下代码
, l' t2 [) v8 S# \- X& b) y5 `# G2 j4 }. i- Q6 f
- /* USER CODE BEGIN Includes */
0 T. {7 f6 r/ i - ) V$ v7 Y/ a5 |. [2 ` X
- #define ADDR_24LC08_WRITE 0XA0 //设备地址和写指令
( P. [% ~0 l( g: p; r/ ^ - #define ADDR_24LC08_READ 0XA1 //设备地址和读指令
2 h0 J% F" Z( v4 }! u% M; {! ]6 b( B - #define BufferSize 15
+ @) C6 N8 l( e$ `) z2 M
# p& |4 v8 ~: s5 V& y3 \* d2 T- /* USER CODE END Includes */
复制代码 : w9 x6 O- Q$ C' k+ [
4、在main.c文件中添加如下代码
2 f+ G0 ^* t2 v" z$ Z% i% ]2 H/ o& _+ E! E0 s* Z
- /* USER CODE BEGIN Includes */3 Q. S, Q0 y7 y& F" t
- #include <stdio.h>6 A( S8 L! H$ u4 H
- #include <string.h>
8 E5 u$ M% x" ?7 M5 j - uint16_t i;! Y$ z0 [6 J* }1 W
- /* USER CODE END Includes */
0 O8 M0 D( m& J3 G$ H3 a
' ]9 X6 q! U/ S2 U+ {: e- int main(void)( I9 b ?% l. a8 O0 |9 X% t
- {
8 \" A# d- k/ [2 [. B+ | - *
7 z7 _- E' U8 { - *
! V {" Z" I# V% E; ? - *
% D* g5 \3 f1 z) G9 {1 f7 |" t: X* ? - /* USER CODE BEGIN 2 */
K8 V8 B" a# n# X) y( s - uint8_t writerbuff[BufferSize]="This is a test.";! h! {- M: u( A, y5 N5 F
- uint8_t readbuff[BufferSize];
: @. p6 Y( g: g2 b0 Y$ `8 H - HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //下拉引脚,激活eeprom芯片
) l2 a( C7 S& P3 x
( v1 p: O( \/ |+ ^- if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
0 B) I# t) O" M: O M5 \- E, B6 k - printf("Write succeeded.\r\n");: z# o1 }4 e# ?1 D8 u+ k
- else4 N( D N8 V G& {, U" }+ K
- printf("Write failed.\r\n");3 |5 O! W- I9 E7 Q/ W% x
- HAL_Delay(5); //等待芯片写周期完成% ^. B* `9 p0 q# t8 n6 s* g9 m
- HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
; H- T* `- |. U, |" w4 [( Z' R - printf("The data in the chip is as follows:\r\n");
! _( U) `+ Q: Y4 t, R2 \ - for(i=0;i<BufferSize;i++) //读取的数据通过串口打印出来; M" s2 k" ]) h C, q
- {! O. G0 d# A( O9 y# B" M
- printf("%c",readbuff<i>);/ O9 V3 p- R- c) }" ^4 V9 Z
- }
' _% k, m% l4 ~/ R( j" i - if(memcmp(writerbuff,readbuff,BufferSize)==0) //对比写入数据与读取数据是否一致
" z H" T+ O& d% X Z - printf("\r\nVerification succeeded.\r\n");. y3 C; ]6 I: Z" G7 ? ]. n
- else
$ d& |; u! a! W: {! } - printf("\r\nVerification failed.\r\n");; C$ D& t1 g; x8 O ~
- *0 x. `% u& C4 X! a
- *
" d \+ H6 K' Z3 h+ _ - *: l; O: e4 v0 Y; y
- }</i>
复制代码 b3 Z( g# F5 o8 G: Q/ a, I+ B; w
% y9 I" S8 {4 `" |1 Y
5、编译好固件后,烧录进去芯片。串口输出如下1 U( {6 c5 B; A9 f6 o/ ^( }5 w
1 |) p' C8 O# U: |6 z! x7 |
$ W+ ? r3 A1 x! Z8 {, C
: _+ B9 ^; T' k9 P& l
————————————————/ O1 j b: I! K
版权声明:SCCELE$ j9 O6 l9 ^& |% a
6 b7 ?9 d) ~5 }( C8 Y
2 E4 j; L, A( u o% `$ _
|