STM32F103ZET6中I2C、SPI和USART

以下是STM32F103ZET6中I2C、SPI和USART(以UART为例)的库函数配置方法,基于标准库(STD库)实现:

一、I2C配置(以I2C1为例)

  1. 时钟与GPIO初始化

#include "stm32f10x.h"

void I2C1_Init(void) {

GPIO_InitTypeDef GPIO_InitStructure;

I2C_InitTypeDef I2C_InitStructure;

// 使能GPIOB和I2C1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

// 配置PB6(SCL)和PB7(SDA)为复用开漏输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // 复用开漏

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

// I2C参数配置

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; // 占空比2:1

I2C_InitStructure.I2C_OwnAddress1 = 0x00; // 主机模式无需自身地址

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; // 使能应答

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; // 7位地址

I2C_InitStructure.I2C_ClockSpeed = 400000; // 400kHz高速模式

I2C_Init(I2C1, &I2C_InitStructure);

// 使能I2C1

I2C_Cmd(I2C1, ENABLE);

}

关键库函数: I2C_Init() 初始化通信参数, I2C_Cmd() 使能外设。

二、SPI配置(以SPI1为主机模式)

  1. 时钟与GPIO初始化

void SPI1_Init(void) {

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;

// 使能GPIOA和SPI1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_SPI1, ENABLE);

// 配置PA5(SCLK)、PA6(MISO)、PA7(MOSI)为复用推挽输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// PA6(MISO)配置为浮空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// SPI参数配置(主机模式)

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // 全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主机模式

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 8位数据

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // 时钟极性:空闲时高电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // 时钟相位:第二个边沿采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // 软件控制片选

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 波特率分频(APB2=72MHz→9MHz)

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 高位先发送

SPI_Init(SPI1, &SPI_InitStructure);

// 使能SPI1

SPI_Cmd(SPI1, ENABLE);

}

关键库函数: SPI_Init() 配置通信模式, SPI_SendData() / SPI_ReceiveData() 用于数据收发。

三、USART配置(以USART1为例,异步模式)

  1. 时钟与GPIO初始化

void USART1_Init(uint32_t baudrate) {

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

// 使能GPIOA和USART1时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

// 配置PA9(TX)为复用推挽输出,PA10(RX)为浮空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// USART参数配置

USART_InitStructure.USART_BaudRate = baudrate; // 波特率(如9600、115200)

USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位数据

USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位

USART_InitStructure.USART_Parity = USART_Parity_No; // 无校验

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收发模式

USART_Init(USART1, &USART_InitStructure);

// 使能USART1

USART_Cmd(USART1, ENABLE);

}

关键库函数: USART_Init() 配置串口参数, USART_SendData() 发送数据, USART_ReceiveData() 接收数据。

四、配置要点总结

外设 时钟使能 GPIO模式 核心初始化函数

I2C APB1(如I2C1)+ GPIO时钟 复用开漏(AF_OD) I2C_Init()

SPI APB2(如SPI1)+ GPIO时钟 复用推挽(AF_PP)+ 浮空输入 SPI_Init()

USART APB2(如USART1)+ GPIO时钟 复用推挽(TX)+ 浮空输入(RX) USART_Init()

如果需要更详细的通信示例(如I2C读写EEPROM、SPI驱动Flash),可以告诉我具体场景哦!

相关推荐
莫浅子19 小时前
day01-USB架构与枚举
c++·单片机·嵌入式驱动
Hello_Damon_Nikola21 小时前
INMP441从入门到精通
单片机·嵌入式硬件·物联网
ye1501277745521 小时前
12V转3V-5V2A电位器无极调光调速WT7027
stm32·单片机·嵌入式硬件
无损检测小白白1 天前
STM32F407 串口3 DMA收发-标准库
stm32·单片机·嵌入式硬件
greatriver0071 天前
e2studio R7FA6M5 卡死 rtc 需要如何配置时钟
单片机·瑞萨单片机
恒锐丰小瑞1 天前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
嵌入式阿蔡1 天前
传感器_02:MPU6050 六轴 IMU 姿态入门——从一串看不懂的数,到一个不漂的角度
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库
恒锐丰小瑞1 天前
率能SS6811H 38V/1.6A/双通道H桥驱动芯片,PWM控制接口与低功耗睡眠模式,用于舞台灯光/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
国科安芯1 天前
ASM232 单电源 RS-232 收发器——技术深读:原理、安全机制与抗辐照视角
网络·单片机·嵌入式硬件·架构·低轨卫星星座
怀民民民1 天前
开篇:基于 Cortex-M7、OpenMV 与双频 GNSS 的智能派件 AGV 设计与实现
单片机·嵌入式硬件·gnss·openmv·智能车