STM32F4 GPIO输入模式配置
上一节讲GPIO的时候说到了将GPIO设置成输出模式,并通过将GPIO的电平拉高拉低控制LED灯的例程。GPIO除了用作输出功能之外,还可以用作输入功能。最常用的就是检测按键的输入电平。
硬件设计
本章的硬件是基于正点原子的探索者ST32F407开发板进行开发。
可以看到开发板上接了4个按键,其中KEY0,KEY1,KEY2接了GND,当这3个按下时,GPIO将检测到一个低电平。WK_UP接了VCC,当按键按下时,GPIO将检测到一个高电平。
软件设计
GPIO配置成输入模式步骤
1、第一步要先把GPIO的时钟打开
2、将GPIO引脚设置成输入模式
3、读取GPIO电平状态
GPIO 操作函数
/**
函数作用:初始化一个GPIO
GPIOx:GPIO引脚所在的GPIO组
GPIO_InitStruct:GPIO对象的结构体
**/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
/**
函数作用:读取GPIO电平
GPIOx:GPIO引脚所在的GPIO组
GPIO_Pin:GPIO引脚
返回值:GPIO电平状态
**/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO 对象结构体
typedef struct
{
uint32_t GPIO_Pin; // GPIO引脚
GPIOMode_TypeDef GPIO_Mode; // GPIO 模式
GPIOSpeed_TypeDef GPIO_Speed; // GPIO输出速率
GPIOType_TypeDef GPIO_OType; // GPIO输出类型
GPIOPuPd_TypeDef GPIO_PuPd; // GPIO上下拉模式
}GPIO_InitTypeDef;
GPIO 输入例程
首先要先将GPIO初始化成输入模式
#define KEY0_GPIO_CLK RCC_AHB1Periph_GPIOE
#define KEY0_GPIO GPIOE
#define KEY0_GPIO_PIN GPIO_Pin_4
void bsp_key_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(KEY0_GPIO_CLK,ENABLE); // 打开GPIOE时钟
GPIO_InitStruct.GPIO_Pin = KEY0_GPIO_PIN; // GPIO引脚编号
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; // GPIO模式配置成输入模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz; // GPIO输出速度 2MHZ
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; // GPIO设置上拉
GPIO_Init(KEY0_GPIO,&GPIO_InitStruct); // 初始化GPIO
}
设置好GPIO为输入模式后,就可以在main函数中轮询GPIO的状态
int main(void)
{
u8 key_flag = 0;
system_tick_init();
bsp_led_init(); // 初始化led
bsp_key_init(); // 初始化按键
while(1){
// 轮询GPIO状态
if(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) == RESET) // 判断GPIO是否为低电平
{
delay_ms(50); // 延时
if(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) == RESET)
{
GPIO_ToggleBits(LED_RED_GPIO,LED_RED_GPIO_PIN);
}
while(GPIO_ReadInputDataBit(KEY0_GPIO,KEY0_GPIO_PIN) != SET);
}
}
}