首页 > 代码库 > STM32单片机学习心得——GPIO(2)使用GPIO做输入

STM32单片机学习心得——GPIO(2)使用GPIO做输入

以探索者板载按键为例,以下是板载按键的电路图,此文章不包括RESET按键的相关内容

技术分享

其中,KEY_UP -> PA1

   KEY_0  -> PE4

        KEY_1  -> PE3

    KEY_2  -> PE2

 

事实上,按键相当于一个开关,按下时开关导通,两端电平相同,GPIO接口电平发生变化,通过库函数读取后触发一系列操作。

对于按键的初始化,以上图为例,代码如下(为节约时间,只放上关键代码)

 1 void KEY_Init(void)
 2 {
 3     
 4   GPIO_InitTypeDef  GPIO_InitStructure;
 5 
 6   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA和GPIOE
 7  
 8   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4; //KEY0 KEY1 KEY2对应PE4/3/2
 9   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//设置为输入模式 
10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M 11 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//电平由高到低对应上拉 12 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE
13 14 15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//WK_UP按键对应PA0
16 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN ;//电平由高到低对应下拉 17 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA 18 19 }

关于输入读取函数

#include "stm32f4xx_gpio.h"

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//官方标准库定义

 

初始化完成后,就可以进行按键扫描了,按键扫描主要是为了读取按键对应IO接口的电平变化,为方便起见,我们使用宏定义来写

 

 1 #define KEY0         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
 2 #define KEY1         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)    //PE3 
 3 #define KEY2         GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
 4 #define WK_UP     GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)    //PA0
 5 
 6 #define KEY0_PRES     1
 7 #define KEY1_PRES    2
 8 #define KEY2_PRES    3
 9 #define WKUP_PRES   4
10 
11 u8 KEY_Scan(u8 mode)
12 {     
13     static u8 key_up=1;//按键松开标志
14 if(mode)key_up=1; //支持连按 15 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1)) 16 { 17 delay_ms(10);//延迟,防止纹波干扰 18 key_up=0; 19 if(KEY0==0) 20 return 1; 21 else if(KEY1==0) 22 return 2; 23 else if(KEY2==0) 24 return 3; 25 else if(WK_UP==1) 26 return 4; 27 } 28 else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0) 29 key_up=1; 30 return 0;//没有按键按下 31 }

 

此后,就可以在主函数中调用按键扫描函数进行按键扫描,可以用if-else语句或者switch语句进行判断并执行后续操作,至于按键中断的相关内容,敬请期待

STM32单片机学习心得——GPIO(2)使用GPIO做输入