实验步骤3 ^7 p! `5 n5 D! P. P) O
1、CubeMx中芯片选择STM32G071RBTx,新建工程
9 U5 t. W/ e4 Z+ z- D0 r9 u7 z" u) I3 K! J. F
2、开启SWD调试、HSE
5 z1 [2 i: E- L: F# A8 }' o% o1 o n8 q: v: L; x
) `% }6 W2 G. t# W" J! v4 O6 ]
2 k* Y/ m' M# J+ e* T9 e$ f9 n/ B: c4 U. f( K
3、开启USART1 ,设置波特率115200、8bit、None(无奇偶检验)、停止位1
# a7 Z$ a1 W- f5 v5 W2 P3 w0 h8 g( S# @# M( \; o$ y
7 r0 Q+ u7 S8 Y! r! d
" O$ u3 V' V2 O$ ]# B7 s4、 设置PB5为推挽输出模式,默认上拉,用于控制eeprom的WP引脚* j+ t' b+ R, {4 |( Q6 O
6 ~0 U& F+ F2 g _. T& L
, R' R3 [/ _2 l; Q: G' o0 C4 O! n$ ]
" y) O" p$ F; ^2 w: V0 C5、 选择PB7引脚,设置为I2C1_SDA,PB6设置为I2C_SCL,再激活I2C1,I2C Speed Moed选择:Standard Mode(标准模式),其他保持默认参数6 I. m" k# t( L" K9 P8 b
4 h5 W5 P+ Y+ K- [4 c
. ]! R4 a( k5 c$ g. @3 \$ n6 Y$ ?! i
+ O) C5 w6 x8 n6、设置时钟树,HCLK=64MHz
# D W# O" m7 J* ]2 p5 e; J; ]& B, ?& K" L- a# B
+ B% B" Y$ n* L* p. b
3 G/ x, D& M( Y" {' h7 ]' n 7、在工程管理里面,设置好参数,生成代码使用MDK打开。
1 L, [( i# [! j* E' d- L( e. w5 ]' N( [; e
( V8 X& E, a7 `( y4 Q4 `3 p
1 L# s- ~. R G3 p5 w4 p/ {) i3 m
5 |+ F& W$ P) w% A. W2 J4 U B
: s. R$ r/ L$ B* s代码部分5 U6 U F# y! O l( l# J5 o1 W
1、在Debug选项卡中,Flash Download勾上“Reset and Run”
* V# V2 `8 x5 h: l* h/ L
4 J; o/ \/ J {4 K2、添加printf打印代码,在usart.c文件添加如下代码
+ s8 G( E$ z( I% X6 k" G; c3 G
2 P$ @$ k4 t, L' i5 R- /* USER CODE BEGIN 0 */
9 Y3 T+ Z$ P/ @: K- X h - #include <stdio.h>
$ G) e0 O3 I( W$ s: C - /* USER CODE BEGIN 0 */$ W3 a; C3 p3 V' ?# i
- #ifdef __GNUC__; _, S7 X1 m* Z7 S
- /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf1 C* g; S. k% d8 W! E
- set to 'Yes') calls __io_putchar() */
: Q% T" K$ T4 q8 w+ k* ]5 z, X' N - #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
- s& w! h& u5 N+ \8 k6 i7 E - #else
* E& {( }) `/ q1 d0 A. k - #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)+ j$ f4 C( K9 g/ ^" R( [" `
- #endif /* __GNUC__ */
% m8 P3 z. m6 K" w- p; o - /**
0 K t" _5 |7 _+ f4 b - * @brief Retargets the C library printf function to the USART.5 ^- ^6 B/ I6 ]
- * @param None
- D: r/ m" H# J3 e' l3 y: g. o - * @retval None
5 N' _) a1 t; g2 R( E. ?: Y - */: h& [* ^" T$ w l: ^: r+ ~% c
- PUTCHAR_PROTOTYPE
3 }! h2 R! y: U$ X ^5 a* } - {* h1 F2 _6 l, e! `: Z8 V$ y
- /* Place your implementation of fputc here */& R# j$ N5 c: e5 w( G" U
- /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
7 n: ^! y5 M% ?6 j. C- g' ^7 O - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
9 B/ M7 p( o, a% z5 D3 q - ( A6 E0 X+ ^1 J. S% Z
- return ch;
* y* f% B, z6 l5 s/ a - }" a8 n9 R9 n) R, E" {' f2 _
- /* USER CODE END 0 */
5 G; H6 X7 U% X" R) c4 R
复制代码
3 T1 j7 ?+ H7 D3、设置24C08A的地址
b, s# i: R/ C, p
$ A: {9 A: q" X8 ]$ O7 t5 H这里用的是8K的芯片,所以有P1,P0位(),有4个块区域,每个区域有256字节。,这就是8K芯片。A0表示第一块256字节的设备地址,A2表示第二块256字节的设备地址,A4表示第三块256字节的设备地址,A6表示第四块256字节的设备地址1 E' r# e! R. D4 F' I' f! }; b
' ?5 p8 `# b* j' B, U5 A' N1 i6 a
! Z* b+ V8 U S8 n$ r: y
) L- d) z- J( A) ^# R( G
在i2c.h文件中添加如下代码* X! a# |* c& x6 D) z# M0 O) o
4 J* g' j6 T. P( I5 d6 @* |9 B- /* USER CODE BEGIN Includes */' @: H# c5 D5 b& U
- , ?$ q/ R/ O1 L9 ~9 W
- #define ADDR_24LC08_WRITE 0XA0 //设备地址和写指令
0 r9 p# E' p+ o* k6 z - #define ADDR_24LC08_READ 0XA1 //设备地址和读指令9 Z" H( F+ M N5 w' X, I! ?, q7 P
- #define BufferSize 15
* g Y& V5 x+ R$ D
; }: j$ x t. b7 t- /* USER CODE END Includes */
复制代码 + S" T% {: x3 j) R" V6 y. O/ k
4、在main.c文件中添加如下代码
' K9 ?! a9 t# |5 J& v, L; J' O" t! q7 E3 r" `
- /* USER CODE BEGIN Includes */
+ [+ W3 h1 l4 n4 S% K/ u5 T - #include <stdio.h>; M7 d1 t9 Q ^; G1 }% b/ \
- #include <string.h>
0 u1 ]* o ?2 {9 d: Z+ X+ S! R - uint16_t i;/ P& y5 P( D/ O S. A4 c# w
- /* USER CODE END Includes */7 Q" u% Y4 j+ `; R4 s
- C8 h1 X+ G6 ]. T
- int main(void)( y. y3 f3 i2 G
- {0 X; K7 [0 u3 q" N5 N- G: v9 Z
- *
% m& u+ ], q9 N3 N$ M - *! c% A/ D$ B- b6 v0 D! c5 Z: _
- *: s% g6 C7 |5 j9 V- z/ y
- /* USER CODE BEGIN 2 */) @3 i- f! n+ f" d
- uint8_t writerbuff[BufferSize]="This is a test.";. F9 {+ A% X+ k% f: I/ f
- uint8_t readbuff[BufferSize];
" M0 a6 O |. d; L - HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET); //下拉引脚,激活eeprom芯片
! N: m3 @- l, C& i$ f/ O
; ^2 y# D( n" [8 `- if(HAL_I2C_Mem_Write(&hi2c1,ADDR_24LC08_WRITE,0,I2C_MEMADD_SIZE_8BIT,writerbuff,BufferSize,0x10)==HAL_OK)8 ^' b+ V% z$ R
- printf("Write succeeded.\r\n");. `' ?+ e0 P* k7 m' F" G: h
- else
) q4 l3 p* l# V' B- J% @1 x - printf("Write failed.\r\n");
. q% {0 L0 Z" h - HAL_Delay(5); //等待芯片写周期完成
; \: o; b; p8 j6 `0 O - HAL_I2C_Mem_Read(&hi2c1,ADDR_24LC08_READ,0,I2C_MEMADD_SIZE_8BIT,readbuff,BufferSize,0x10);. c9 A% L) h5 O3 z. ~
- printf("The data in the chip is as follows:\r\n");
3 ^! t% g4 z! f8 J, q - for(i=0;i<BufferSize;i++) //读取的数据通过串口打印出来
3 ?# p4 ~1 j. [' {# S7 g4 f3 J$ j - {
, _ S' Y8 p! P, c) g8 F& u - printf("%c",readbuff<i>);( ?* Y5 z5 x/ t6 F& ` C
- }1 {& X! d! b* |' T
- if(memcmp(writerbuff,readbuff,BufferSize)==0) //对比写入数据与读取数据是否一致
/ ~' q* h3 J d3 F) e$ t - printf("\r\nVerification succeeded.\r\n");# a3 P$ @7 G6 B& a* f* S2 g& y
- else( {$ S7 D( a7 T
- printf("\r\nVerification failed.\r\n");( T2 s4 u! ^; V3 v: |& b
- *
" s0 k/ i" k$ C. n/ m2 F( ~2 I. N - *
4 l; l' W9 [0 B; ?* l0 F7 [ - *
6 ?/ h& j+ @' [7 r - }</i>
复制代码 ) ~. V. {" v0 g2 G0 n* c* \; {
* }8 b0 Q; G- Y5 o9 D. ?5、编译好固件后,烧录进去芯片。串口输出如下
# `( Y! h* Z4 Z) N* I2 U" f3 j
. ~7 S: ]: E* J4 G7 Q
# u3 ~. X' a3 o2 f
" F5 t) d7 I; y( o" K6 {4 W
————————————————2 k N2 z( X @ T
版权声明:SCCELE
3 W0 b) x0 m) }( x9 ]" S# F) v" B3 ~5 x1 i; S
8 d: k" N4 t* l, X# p, |
|