实验步骤- f/ {0 d- u- O$ C% {$ w3 H) q
1、CubeMx中芯片选择STM32G071RBTx,新建工程
3 @+ W/ F9 J8 }9 p% A5 I; N
n0 J2 L3 r: [% w, E/ ?: u2、开启SWD调试、HSE
7 w$ U) n# ?" n0 s9 f A9 r, _" T
% \8 z7 K) u, T& M, N
9 @) K& c! `& z( n c V, {7 C* Q! J2 s6 r1 }# O+ s
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
& N6 b+ Q" y; P6 y: F& W# `* Y, Q8 {$ z( H: E p
6 D" J; g I& x4 O5 m k; [! j# i3 r: T& u) X
4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚' U' ^7 x0 \* Z0 z! f# v
) i, e; k) I; p0 M) ?
! m+ Y# D# j1 ]. E% A( M4 \% a
5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数
# v* T2 ~. f& z! e8 |- G$ \4 `# E/ ~2 f& @3 P; j% [6 D! C
4 X! O7 }$ ^ z7 M2 x, |7 E
: \5 X- b3 @& D) ] o9 v" O/ T2 }+ _6、设置时钟树,HCLK=64MHz
/ N; }6 L( i, b" d4 e7 i: R) M
4 |/ K0 K. s8 K9 {2 D- \
6 h0 l+ ~' j/ O* G& T/ M0 U
4 S8 u. m! m7 a- x2 L; A4 C9 v 7、在工程管理里面,设置好参数,生成代码使用MDK打开。
$ `7 K7 F2 A# V P- W& ]/ B
$ V! t1 `$ w/ T; f' ?1 s
d8 t6 M$ d: L, L" m
' ^. n; N- ]" K9 V& b: H! y, u
% N( l/ ~7 J* w
4 N% Q y( k; ?
代码部分# a; W' w: a0 G1 b. e% q6 ?) A
1、在Debug选项卡中,Flash Download勾上“Reset and Run”/ e1 x$ ?) ?" N+ |" v# h+ g' `
2 a$ M V3 B- W: D" w' Z
2、添加printf打印代码,在usart.c文件添加如下代码
9 l7 f: `! T$ F+ |. k5 \
$ |9 X" d2 G8 g; n$ k$ {- /* USER CODE BEGIN 0 */
+ Q! O6 _* i. y) K ]4 ^! J - #include <stdio.h>3 P* ~, Q, ?$ Q7 A( f+ e
- /* USER CODE BEGIN 0 */% b. b$ e4 d* @3 L
- #ifdef __GNUC__
0 E0 J5 i* q, a - /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
; V3 n! w- J! \7 K' ]1 ] - set to 'Yes') calls __io_putchar() */
, M# S+ D2 T) ?) e$ u - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)' |( b. i2 \- I' L7 Z
- #else4 a9 M0 v- n9 I( _5 J% x
- #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
* \* ?8 P {5 h: ^3 l; Q - #endif /* __GNUC__ */: g1 E. U7 ]/ e4 s
- /**
. E9 F9 v, {2 Z, I$ R9 ^ - * @brief Retargets the C library printf function to the USART.
% a$ L' O" T. a$ |0 ^, u) Z - * @param None" e2 i: H( r0 F, L6 ]
- * @retval None
& G& @# j. w8 w" @0 Y - */
3 Z r6 e. `! a, q - PUTCHAR_PROTOTYPE7 B5 D5 t5 |( W/ |; X/ |: k9 o
- {4 S/ D }7 P/ J( g
- /* Place your implementation of fputc here */
4 d+ V4 I) A2 p$ c# A7 V3 U - /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
6 r* c: k" L; j# t0 K( V - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
5 s1 t2 ~% V! C. E# g e - ; A$ ~; N. u4 v& @2 e2 ~& V$ P
- return ch;8 U+ ?$ _2 i' U( c6 |
- }
) o, F; N. ~! E: ^ - /* USER CODE END 0 */
. C7 y3 L% o, C7 O% ]) |
复制代码
% \8 l2 V1 k- z) G( Z3、设置24C08A的地址
* v! I* y+ E! u3 Z( {; e- B/ C
5 M1 s! k2 e: K这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址
% d* s B7 Z9 D) ]& d( k5 d( y+ ^& l$ z# E K4 o$ P' o5 A
" w0 r2 S0 f5 K; a$ [% s
) j; D6 \3 _7 T0 D在i2c.h文件中添加如下代码
* g) h$ \! N, g7 _1 C
. [; b! m/ n+ l- /* USER CODE BEGIN Includes */! L9 S! C% y( N% l* @
- ; ~7 ?) f+ _/ q' J3 {6 W
- #define ADDR_24LC08_WRITE 0XA0 //设备地址和写指令8 d+ c' a- |7 H7 G2 X* j
- #define ADDR_24LC08_READ 0XA1 //设备地址和读指令1 {3 K* h9 |+ q* m' s
- #define BufferSize 15
, }: T" ~% w5 M$ [9 K5 t+ O - 7 u2 Q8 {. y5 K7 Y7 h! W
- /* USER CODE END Includes */
复制代码 , Q- {' w4 o: G
4、在main.c文件中添加如下代码
! I: M/ B# ?) ~1 A y( K3 v1 C0 ~7 S
- /* USER CODE BEGIN Includes */ u, I% J' |% w9 ^2 H1 _0 Y7 M& x
- #include <stdio.h>% f) c0 x6 j- ` l& [9 O+ J
- #include <string.h>
$ Y- _: J8 `$ H! ~ - uint16_t i;! a- ^0 L5 K) d( b( ?. K
- /* USER CODE END Includes */
0 o% N1 E+ y! q
7 e0 a7 B: |/ [1 S: W! z. D- int main(void)+ |7 a* z1 d% K0 B |4 w: S7 @0 j
- {2 a3 X: \1 y+ T. k4 ]
- *
5 U- {5 s9 i. }* C6 G - * |( H; ?( b, [
- *8 |* @9 Q+ x% s
- /* USER CODE BEGIN 2 */
/ i2 c+ S) }& H/ ?6 [+ r( k$ p - uint8_t writerbuff[BufferSize]="This is a test.";
* U8 a V' U% m# g; I; W- u# p - uint8_t readbuff[BufferSize];
+ e3 [8 J4 k i P8 y: c - HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //下拉引脚,激活eeprom芯片
1 }+ W& V! a) r) F
# q$ L7 d% _( w+ X) }- if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)
7 u) ^* n9 `9 v ~( @7 f - printf("Write succeeded.\r\n");
% @3 X2 ^/ p) r5 k9 O - else
- s( Q9 \1 X# P3 N: i. g- K8 B4 n9 E - printf("Write failed.\r\n");1 o3 ^% g) P$ s, s$ r
- HAL_Delay(5); //等待芯片写周期完成
2 `2 t3 o6 S% W V- j$ g3 Y6 X - HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);
+ W0 V5 s5 G4 r% _1 S% L - printf("The data in the chip is as follows:\r\n");5 s- T( C* X; T2 t/ K3 P
- for(i=0;i<BufferSize;i++) //读取的数据通过串口打印出来
* H5 _8 a, m X) |( I' ~ - {) W1 p0 R/ O9 N0 r( o! @0 ~) a
- printf("%c",readbuff<i>);
2 h# `1 h7 u. T' W0 o - }
; L- Q+ \- A4 k% f$ p - if(memcmp(writerbuff,readbuff,BufferSize)==0) //对比写入数据与读取数据是否一致
1 `6 T8 `& E- l7 h6 J - printf("\r\nVerification succeeded.\r\n");! E* Q. {- `/ ~2 \# v7 e
- else
9 p9 o5 t( }" ~+ b - printf("\r\nVerification failed.\r\n");
3 u( E l/ Y' K' F2 y+ \ - *
7 U+ P( |% S1 e6 `! t8 q - *
0 ?0 _! M5 z! Z - *
4 M) I- p5 F+ {! I0 S% A - }</i>
复制代码
8 B. w' T* H% B m0 g4 U" Q- E# o9 |$ v7 c4 \
5、编译好固件后,烧录进去芯片。串口输出如下& {% d) I- [6 u3 c. a; q
! ?0 X) C' P# Q' m& `
& Y2 w) S! j" w3 `
/ C" k" Z" M+ T8 J* [————————————————
! b1 U7 o$ f7 e; M: Z. {6 o( M版权声明:SCCELE; i3 }/ r0 Q1 g
|! N/ D1 u# X" A' C2 k
3 |6 P5 ^2 w4 Z& F) k: `0 a |