news 2026/6/3 10:54:15

STM32 GPIO无长篇大论:8种工作模式一眼看懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 GPIO无长篇大论:8种工作模式一眼看懂

文章目录

  • 一、GPIO简介
    • 1-1基本概念
    • 1-2功能
  • 二、GPIO的4中输出模式
    • 2-1 通用与复用
    • 2-2 开漏输出与推挽输出
  • 三、GPIO的4种输入模式
    • 3-1 上拉输入和下拉输入
    • 3-2 浮空输入
  • 四、GPIO模块的接口——stm32标准库
  • 五、实验:点亮LED

一、GPIO简介

1-1基本概念

GPIO(General Purpose Input/Output)是单片机上的外设,一个通用输入输出接口,用于与外部设备进行数字信号交互。
STM32标准库中的GPIO模块用于控制通用输入输出引脚。每个GPIO引脚可配置为输入或输出模式,支持多种工作状态,如推挽输出、开漏输出、模拟输入等。

1-2功能

简单说,单片机上的GPIO模块就是用来控制MCU上的引脚的。

GPIO有8个工作模式

输出就是从单片机上的输出数据寄存器里发出高低电平信号;反过来,输入就是从外界收到高低电平信号给输入数据寄存器里。

0代表低电平/电压;1代表高电平/电压。
输出时:单片机通过代码发出的0/1信号,来决定输出的高低电压。
输入时:单片机会自动将收到的电压根据高低将bit位设置成0/1。

二、GPIO的4中输出模式

2-1 通用与复用

下图是一个GPIO端口的结构图


通用:通过编程代码直接命令CPU像寄存器写0或者1,,以此控制IO引脚产生高电压/低电压/高阻抗。

复用:比如通过编码,将想要打印的信息“Hello”写入到串口模块,然后串口模块会转换“Hello”对应的ASCLL码值成二进制0/1信号,以此控制IO引脚以串口数据帧(8~9bit位的二进制格式)的形式输出高低电平。

2-2 开漏输出与推挽输出

推挽


开漏

开漏模式,无论怎样P-MOS管始终是断开的。
信号为0时,与推挽模式差不多,N-MOS闭合,接地,电压为0,输出高电平;
信号为1时,N-MOS断开,产生高阻抗,I/O引脚既不是高电压,也不是低电压。

三、GPIO的4种输入模式

3-1 上拉输入和下拉输入


上拉输入:闭合上拉电阻,上拉电阻的电路接了VCC电源,电压为3.3V,此时由于适合施密特触发器串联,因为触发器的电阻无穷大,所以施密特触发器会分走所有的电压,即高电压,输入 1。

下拉输入:闭合下拉电阻,因为连接了GND,所以电压为0,施密特触发器的电压也是0,即低电压,输入 0。

3-2 浮空输入

如果上拉电阻和下拉电阻都不使能(闭合),那么就是输入浮空。
那么为了防止GPIO端口高阻态,出现浮空现象,需要启用上拉、下拉电阻。

四、GPIO模块的接口——stm32标准库

时钟使能
操作GPIO前需使能对应端口的时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

GPIO初始化配置
使用标准库时,需通过GPIO_InitTypeDef结构体配置引脚参数,例如:

GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;// 选择引脚0GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;// 推挽输出模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;// 输出速度GPIO_Init(GPIOA,&GPIO_InitStructure);// 初始化GPIOA

GPIO初始化函数
第一个参数为初始化的GPIO组别,例如元器件的引脚的属于GPIOA控制,那么第一个参数就填GPIOA; 第二个参数则是GPIO的引脚配置参数结构体对象,不要忘记取地址符号。

voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);

常用工作模式

输入模式输出模式
GPIO_Mode_IN_FLOATING(浮空输入)GPIO_Mode_Out_PP(推挽输出)
GPIO_Mode_IPU(上拉输入)GPIO_Mode_Out_OD(开漏输出)
GPIO_Mode_IPD(下拉输入)
复用功能模拟模式
GPIO_Mode_AF_PP(复用推挽)GPIO_Mode_AIN(模拟输入)
GPIO_Mode_AF_OD(复用开漏)

五、实验:点亮LED

调用GPIO接口,实现LED的点亮。首先找到LED对应的引脚,又知道PC13引脚属于GPIOC组别控制的引脚(通过手册查看)。所以在调用GPIOC时,就需要初始化GPIOC

步骤
1、主函数框架

#include"stm32f10x.h"intmain(void){}

2、调用GPIO时钟使能

#include"stm32f10x.h"intmain(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);}

3、初始化GPIO的引脚配置参数结构体

#include"stm32f10x.h"intmain(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;}

4、初始化GPIOC

#include"stm32f10x.h"intmain(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_OD;GPIO_Init(GPIOC,&GPIO_InitStruct);}


GPIO_WriteBit 是嵌入式开发中常见的函数(如STM32 HAL库),用于控制GPIO引脚的单一位状态。其核心功能是通过寄存器操作将指定引脚设置为高电平(GPIO_PIN_SET)或低电平(GPIO_PIN_RESET)。典型函数原型如下

voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitAction BitVal);

参数说明:
1、GPIOx:GPIO端口(如GPIOA、GPIOB)。
2、GPIO_Pin:目标引脚编号(如GPIO_PIN_5)。
3、BitVal:写入的值(SET或RESET)。

GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//传0Delay(100);GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//传1Delay(100);

以上代码就能实现在STM32单片机上PC13处LED灯的闪烁了。

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

计算思维十年演进:从编程技能到21世纪核心素养的变革之路

1. 从“不可能”到“无处不在”:计算思维的十年演进十年前,如果有人告诉我,计算思维会成为像读写算一样的基础素养,我大概会一笑置之。2009年,我在美国国家科学院举办的一个关于计算思维的研讨会上,面对“计…

作者头像 李华
网站建设 2026/6/3 10:53:45

Linux pcie(2)————增添字符驱动

1:字符设备驱动 整体结构: 1. PCI 驱动骨架→ module_pci_driver→ pci_device_id(匹配 1234:11e8)→ probe / remove2. 设备私有数据 struct edu_pci_dev→ 保存 pci_dev、bar0 映射地址、misc 设备3. 字符设备接口&#xff08…

作者头像 李华
网站建设 2026/6/3 10:48:58

GetQzonehistory:重新定义个人数字记忆管理

GetQzonehistory:重新定义个人数字记忆管理 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数据爆炸的数字时代,我们每天都在创造海量的数字足迹,其…

作者头像 李华
网站建设 2026/6/3 10:42:57

【错误记录】Flutter 编译 Android APK 文件安装包报错 ( 国内镜像源设置 )

文章目录一、错误记录二、问题分析1、阿里云的镜像不能用2、Flutter 社区源可用但是速度慢 ( 可用 )3、上海交大的源不可用4、清华源不可用三、最终解决方案一、错误记录 在 Android Studio 中 编译 Flutter 项目 , 选择 " 菜单栏 | Builder | Flutter | Build APK "…

作者头像 李华