【嵌入式】手把手教你入门STM32的GPIO:使用GPIO输入
目录
GPIO 输入的基本概念
STM32 GPIO 输入配置步骤
注意事项
总结
GPIO 输入的基本概念
GPIO引脚可以配置为输入或输出模式。在输入模式下,GPIO用于读取外部信号,比如开关、传感器等。以下是关于STM32 GPIO输入的一些基本知识点:
- 引脚配置:每个GPIO引脚可以独立配置为输入或输出,支持多种输入模式。
- 输入模式:GPIO输入引脚可以配置为上拉、下拉或浮空输入,以适应不同的电路设计。
- 中断功能:GPIO输入支持外部中断,可以在信号变化时触发中断处理程序,增强实时响应能力。
STM32 GPIO 输入配置步骤
配置STM32的GPIO输入一般需要以下几个步骤:
选择GPIO引脚:
- 确定要使用的GPIO引脚,参考STM32的引脚图,确保该引脚支持输入功能
启用时钟:
使用RCC
(时钟控制器)启用对应GPIO端口的时钟。每个GPIO端口(如GPIOA、GPIOB等)都有各自的时钟,使得该端口能够正常工作。
函数原型:
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
参数说明
-
RCC_APB1Periph
:指定需要使能时钟的APB1外设,可以是以下值之一或组合(使用“按位或”操作):RCC_APB1Periph_TIM2
:定时器2RCC_APB1Periph_TIM3
:定时器3RCC_APB1Periph_TIM4
:定时器4RCC_APB1Periph_USART2
:USART2RCC_APB1Periph_USART3
:USART3RCC_APB1Periph_I2C1
:I2C1RCC_APB1Periph_I2C2
:I2C2RCC_APB1Periph_CAN1
:CAN1RCC_APB1Periph_PWR
:电源接口RCC_APB1Periph_BKP
:备份接口RCC_APB1Periph_WWDG
:独立看门狗- 其他设备按需设置。
-
NewState
:指定外设时钟的新状态,可选值:ENABLE
:使能该外设的时钟。DISABLE
:禁用该外设的时钟。
使用示例
例如,要使能USART2的时钟,可以使用如下代码:
#include "stm32f10x_rcc.h"
void RCC_Config(void) {
// 启用USART2的时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_GPIOA, ENABLE);
}
配置引脚模式:
使用GPIO_InitTypeDef
结构体设置引脚模式、上拉/下拉电阻等属性。引脚模式包括输入模式、输出模式等,具体可根据需要进行设置。
在调用GPIO_Init()
函数前,需先定义并设置 GPIO_InitTypeDef
结构体的成员变量。该结构体通常包含以下成员:
typedef struct
{
uint16_t GPIO_Pin; // GPIO引脚,可以是GPIO_Pin_0~GPIO_Pin_15
GPIOMode_TypeDef GPIO_Mode; // GPIO模式,如输入、输出、复用等
GPIOSpeed_TypeDef GPIO_Speed; // GPIO速度,仅在输出模式下有效
} GPIO_InitTypeDef;
GPIO_Pin
:指定要配置的GPIO引脚,可以是GPIO_Pin_0
到GPIO_Pin_15
。可以用|
运算符选择多个引脚。GPIO_Mode
:指定GPIO模式,具体如下:GPIO_Mode_AIN
:模拟输入模式。GPIO_Mode_IN_FLOATING
:浮空输入模式。GPIO_Mode_IPD
:下拉输入模式。GPIO_Mode_IPU
:上拉输入模式。GPIO_Mode_Out_OD
:开漏输出模式。GPIO_Mode_Out_PP
:推挽输出模式。GPIO_Mode_AF_OD
:复用功能开漏输出模式。GPIO_Mode_AF_PP
:复用功能推挽输出模式。
GPIO_Speed
:指定输出速度,仅在输出模式有效:GPIO_Speed_10MHz
:10 MHz速度。GPIO_Speed_2MHz
:2 MHz速度。GPIO_Speed_50MHz
:50 MHz速度。
假设我们要将GPIOA
的PA0
配置为上拉输入模式,代码如下:
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
void GPIO_Config(void) {
// 启用GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
// 配置PA0为上拉输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置速度,不影响输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
初始化引脚:
调用GPIO_Init()
函数完成引脚的初始化,确保引脚配置生效。
参数说明
GPIOx
:指定GPIO端口,可以是GPIOA
、GPIOB
等(视具体芯片而定)。GPIO_InitStruct
:指向GPIO_InitTypeDef
结构体的指针,该结构体定义了引脚的初始化设置。
读取引脚状态:
使用GPIO_ReadInputDataBit()函数读取引脚的状态,以获取外部信号的当前状态。
参数说明
GPIOx
:指定GPIO端口,可以是GPIOA
、GPIOB
等(具体端口视芯片不同而变化)。GPIO_Pin
:指定GPIO引脚,可以是GPIO_Pin_0
、GPIO_Pin_1
等。
返回值
1
:表示引脚为高电平。0
:表示引脚为低电平。
uint8_t pinState = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if (pinState) {
// 引脚状态为高电平
} else {
// 引脚状态为低电平
}
注意事项
在进行GPIO输入配置时,以下注意事项值得关注:
- 确保时钟启用:在配置GPIO之前,必须正确启用时钟。没有启用时钟的GPIO引脚将无法正常工作。
- 外部中断配置:使用外部中断时,除了配置GPIO引脚外,还需要正确配置NVIC(中断控制器),以处理相应的中断服务例程(ISR)。
- 信号去抖动:在读取开关等机械信号时,可能会出现抖动现象。可以通过软件去抖动或硬件滤波器来提高信号的稳定性。
总结
STM32的GPIO输入功能为外部设备交互提供了灵活的解决方案。通过正确配置GPIO引脚,开发者可以有效地读取外部信号,并在需要时触发中断,增强系统的响应能力。希望本文能够帮助您更好地理解和使用STM32的GPIO输入功能。在实际应用中,根据具体需求灵活配置GPIO将极大提升系统的性能与可靠性。