文章目录
- 一、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);// 初始化GPIOAGPIO初始化函数
第一个参数为初始化的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灯的闪烁了。