STM32F407ZG GPIO输入相关实验

STM32F407ZG开发板学习(3)

  • GPIO输入
  • 按键输入控制LED实验
    • 按键原理图
    • 获取按键值
    • main函数

GPIO输入

此介绍在上一篇文章已有总结。

按键输入控制LED实验

按键原理图

KEY的I/O引脚如下:
WK_UP接在PA0,KEY0接在PE4,KEY1接在PE3,KEY2接在PE2。
在这里插入图片描述

IO引脚

电路原理图如下:
STM32F407ZG GPIO输入相关实验_第1张图片
则可以看出,WK_UP是高电平有效,其他则是低电平有效。
在初始化中,WK_UP的引脚则要配置成下拉,其他配置成上拉。
具体如下:

void key_init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    //使能GPIOA和GPIOE时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE); 
    
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //选择输入模式
    //GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //输出类型不用配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //按键KEY0~2的三个引脚
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz,这个不配置也行
    GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //按键KEY_UP的引脚
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
}

获取按键值

没什么好说的,应用了GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_x); 这个函数。
作用是返回选中的引脚的输入值,值为0或1。
由于按键按下会产生电压的抖动,因此这里利用延时函数延时10ms以消除抖动。
而两次延时夹着一个while循环的作用是只有当按下按键并松开后,此次按键才被视为操作成功,若一直不松手,这次按键将没有效果。

/*************************************
      *函数名:key_get
      *函数功能描述:获取按键
      *函数参数:无
      *函数返回值:按下的按键:
                  0 没有按下
                  1 KEY0
                  2 KEY1
                  3 KEY2
                  4 KEY_WKUP
      ***************************************/
u8 KEY_get(void)
{
    uint8_t keyNum = 0;
    
    //PE4即KEY0
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0);
        delay_ms(10);
        keyNum = 1;
    }
    //PE3即KEY1
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0);
        delay_ms(10);
        keyNum = 2;
    }
    //PE2即KEY2
    if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0);
        delay_ms(10);
        keyNum = 3;
    }
    //PA0即KEY_WKUP,且高电平有效
    if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
    {
        delay_ms(10); //消抖
        while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1);
        delay_ms(10);
        keyNum = 4;
    }
    
    return keyNum;
}

main函数

get_LED0以及get_LED1是返回了LED0和LED1两个引脚输出的值,使用GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin_x); 函数,从而做到用一个按键转换一个灯的亮灭状态。

while(1)
    {
        u8 keyNum = KEY_get();
        
        //KEY0控制LED0
        if(keyNum == 1)
        {
            if(get_LED0() == 1)
            {
                LED0_ON();
            }
            else{
                LED0_OFF();
            }
        }
        //KEY1控制LED1
        if(keyNum == 2)
        {
            if(get_LED1() == 1)
            {
                LED1_ON();
            }
            else{
                LED1_OFF();
            }
        }
        //KEY2使LED全灭
        if(keyNum == 3)
        {
            
            LED0_OFF();
            LED1_OFF();
        }
        //KEY_WKUP使LED全亮
        if(keyNum == 4)
        {
            
            LED0_ON();
            LED1_ON();
        }
    }

你可能感兴趣的:(STM32学习,stm32,单片机,arm)