STM32 GPIO输入 按键 初学笔记

  • 按键的硬件电路

默认是高电平,按键按下是低电平,所以是下降沿输入。

电容是硬件消抖,按下时产生抖动电流流向电容,电流稳定后电容释放电给GND,产生低电平。

浮空就是 浮在空中.也就是没有什么把他拉下来,也没有什么把它拉上去. 浮空最大的特点就是电压的不确定性,它可能是0V,也可能是VCC,还可能是介于两者之间的某个值(最有可能). 浮空一般用来做ADC输入用,这样可以减少上下拉电阻对结果的影响。

  • 读取GPIO输入库函数

  • GPIO_ReadInputDataBit:读取某位输入

GPIOx(A...E)的IDR寄存器与上对应引脚(例如GPIO_Pin_5就是100000,对应寄存器第5位,与操作后第5位保留,其他位为0)

  • GPIO_ReadInputData:读取全部16个位的输入

  • 代码

/*********************************************************************************************************
* 函数名称: ConfigKeyOneGpio
* 函数功能: 配置KEYONE的GPIO 
* 输入参数: void 
* 输出参数: void
* 返 回 值: void
* 创建日期: 2020年04月11日
* 注    意:
*********************************************************************************************************/
static  void  ConfigKeyGpio(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能时钟
    
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

    GPIO_Init(GPIOB,&GPIO_InitStruct);  //PB3 LED1
}

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称: InitKeyOne
* 函数功能: 初始化KeyOne
* 输入参数: void
* 输出参数: void
* 返 回 值: void
* 创建日期: 2020年04月11日
* 注    意:
*********************************************************************************************************/
void InitKeyOne(void)
{
    ConfigKeyGpio();
}

/*********************************************************************************************************
* 函数名称: ScanKeyOne
* 函数功能: 按键扫描
* 输入参数: 
* 输出参数: void
* 返 回 值: void
* 创建日期: 2020年04月11日
* 注    意:
*********************************************************************************************************/
uint8_t ScanKeyOne(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin)
{
    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)== KEY_DOWN)
    {
        while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)== KEY_DOWN);
        return KEY_DOWN;
    }
    else
    {
        return KEY_UP;
    }
}

 

posted on 2020-07-06 16:21  谢嘉敏  阅读(820)  评论(0编辑  收藏  举报

导航