stm32按键配置
前言:我们都知道开发板上除了有经典的流水灯之外,还有一个必备的练习硬件--按键(key),下面继续来完成按键的配置。
1、通过查看原理图,找出按键(key)的管脚名字和对应芯片上的I/O口,四个I/O分别为PA0、PE2、PE3和PE4。
2、配置按键I/O口这里要注意的是工作模式要改成输入模式,不是led的输出模式,并且不需要设置输出模式。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
3、获取按键的按下和释放的状态
//读取PA0引脚的电平,低电平,按钮按下 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0 //高电平,按钮释放 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1
4、下面是具体代码,实现了按下一个按键对应的led灯亮,释放之后led灯灭
#include "stm32f4xx.h" GPIO_InitTypeDef GPIO_InitStructure; void delay(void) { unsigned int i=0x500000; while(i--); } /*初始化led灯*/ void init_led(void) { /* GPIOG Peripheral clock enable ,使能外设时钟GPIOF、GPIOE,也就是让GPIOF、GPIOE工作*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); /* 配置PF9引脚为推挽输出模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //第PF9和PF10号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出模式,增加输出电流 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻 GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化端口F GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //第PE13和PE14号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出模式,增加输出电流 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻 GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口E } /*初始化按键*/ void init_key(void) { /* GPIOG Peripheral clock enable ,使能外设时钟GPIOA和GPIOE,也就是让GPIOA和GPIOE工作*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); /* 配置PA0引脚为输入模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //第PA0号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口A /* 配置PA0引脚为输入模式 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //第PE2、PE3和PE4号引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻 GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口E } int main(void) { init_led(); init_key(); GPIO_SetBits(GPIOF,GPIO_Pin_9); //PF9引脚为高电平,led灯灭 GPIO_SetBits(GPIOF,GPIO_Pin_10); //PF10引脚为高电平,led灯灭 GPIO_SetBits(GPIOE,GPIO_Pin_13); //PE13引脚为高电平,led灯灭 GPIO_SetBits(GPIOE,GPIO_Pin_14); //PE14引脚为高电平,led灯灭 while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //读取PA0引脚的电平,低电平,按钮按下 { GPIO_ResetBits(GPIOF,GPIO_Pin_9);//PF9引脚为低电平,led灯亮 } if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) ==1) //读取PA0引脚的电平,高电平,按钮按释放 { GPIO_SetBits(GPIOF,GPIO_Pin_9); //PF9引脚为高电平,led灯灭 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0) //读取PE2引脚的电平,低电平,按钮按下 { GPIO_ResetBits(GPIOF,GPIO_Pin_10);//PF10引脚为低电平,led灯亮 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 1) //读取PE2引脚的电平,高电平,按钮按释放 { GPIO_SetBits(GPIOF,GPIO_Pin_10); //PF10引脚为高电平,led灯灭 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //读取PE3引脚的电平,低电平,按钮按下 { GPIO_ResetBits(GPIOE,GPIO_Pin_13);//PF10引脚为低电平,led灯亮 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 1) //读取PE3引脚的电平,高电平,按钮按释放 { GPIO_SetBits(GPIOE,GPIO_Pin_13); //PF10引脚为高电平,led灯灭 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0) //读取PE4引脚的电平,低电平,按钮按下 { GPIO_ResetBits(GPIOE,GPIO_Pin_14);//PF10引脚为低电平,led灯亮 } if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 1) //读取PE4引脚的电平,高电平,按钮按释放 { GPIO_SetBits(GPIOE,GPIO_Pin_14); //PF10引脚为高电平,led灯灭 } } }
鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。