news 2026/6/15 13:23:44

STM32F103ZET6中I2C、SPI和USART

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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),可以告诉我具体场景哦!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:47:31

图解说明STM32CubeMX在PLC逻辑控制中的实现路径

用STM32CubeMX打造软PLC:从配置到逻辑控制的实战路径你有没有遇到过这样的场景?客户要一个小型自动化控制系统,功能不复杂——几路输入、几路输出、带点延时和互锁,再加个Modbus通信上传数据。按传统思路,买个微型PLC&…

作者头像 李华
网站建设 2026/6/14 6:20:12

八大网盘极速下载全攻略:直链解析技术深度解析

八大网盘极速下载全攻略:直链解析技术深度解析 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用,去推广,…

作者头像 李华
网站建设 2026/6/9 22:18:45

AI全身感知部署案例:从照片到3D骨骼的一站式解决方案

AI全身感知部署案例:从照片到3D骨骼的一站式解决方案 1. 技术背景与核心价值 随着虚拟现实、数字人和元宇宙应用的快速发展,对全维度人体动作捕捉的需求日益增长。传统方案往往依赖多传感器设备或高性能GPU集群,成本高、部署复杂。而基于轻…

作者头像 李华
网站建设 2026/5/30 22:45:33

DLSS Swapper终极指南:5步掌握游戏画质与性能平衡

DLSS Swapper终极指南:5步掌握游戏画质与性能平衡 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否遇到过游戏更新后DLSS效果变差的问题?或者想为不同游戏配置最适合的DLSS版本&#xff1f…

作者头像 李华
网站建设 2026/5/28 15:07:31

DLSS Swapper完整指南:轻松管理游戏DLSS版本的终极工具

DLSS Swapper完整指南:轻松管理游戏DLSS版本的终极工具 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的开源工具,能够智能管理NVIDIA DLSS技术在不同游戏中…

作者头像 李华
网站建设 2026/6/12 11:42:03

DLSS版本管理终极指南:7个技巧让游戏性能飞升

DLSS版本管理终极指南:7个技巧让游戏性能飞升 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否在为游戏更新后DLSS效果变差而烦恼?🤔 是否想要在不同DLSS版本间自由切换&#x…

作者头像 李华