stm32按键配置

Posted 菜头大大

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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灯灭
        }
     }
 }

 

 

 

以上是关于stm32按键配置的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32的外围系统设计

基于STM32的外围系统设计

STM32Cubemx——外部中断

Stm32CubeMX5 配置使用ADC

stm32外部按键中断无法退出中断问题

stm32按键控制的蜂鸣器为啥不响?帮小白看看代码