STM32-按键扫描配置
问题引入
由于在使用例程中的按键时,发现按键无效,经过Debug发现程序进入按键扫描死循环中。
由于初始按键引脚时,按键引脚上拉,按下为高电平。给的引脚配置为浮空输入(不确定高低电平),导致初始按键引脚电平初始就为高,所以导致无论按键按下与否,按键引脚一直为高。
使得按键扫描函数,一直在while中,无法退出,程序无法往下运行。
经过改正,初始按键引脚下拉即可解决上述问题。
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
/**
* @brief 检测是否有按键按下
* @param 具体的端口和端口位
* @arg GPIOx: x可以是(A...G)
* @arg GPIO_PIN 可以是GPIO_PIN_x(x可以是1...16)
* @retval 按键的状态
* @arg KEY_ON:按键按下
* @arg KEY_OFF:按键没按下
*/
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON )
{
/*等待按键释放 */
while(HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else
return KEY_OFF;
}
/**
* @brief 配置按键用到的I/O口
* @param 无
* @retval 无
*/
void Key_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启按键GPIO口的时钟*/
KEY1_GPIO_CLK_ENABLE();
KEY2_GPIO_CLK_ENABLE();
/*设置引脚为输入模式*/
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
/*设置引脚不上拉也不下拉*/
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
/*选择按键的引脚*/
GPIO_InitStructure.Pin = KEY1_PIN;
/*使用上面的结构体初始化按键*/
HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
/*选择按键的引脚*/
GPIO_InitStructure.Pin = KEY2_PIN;
/*使用上面的结构体初始化按键*/
HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);
}
知识扩展
1.理论分析
理论情况按键的电压波形应该为方波
但是实际按键电压波形,会有电压抖动,我们需要通过延时来进行按键消抖,这里需要用到延时函数delay_ms()
。
1.2按键扫描程序逻辑
通过分析,我们可以知道。
- 第一步,判断是否有按键按下,有按键按下时,将继续执行,没有按键按下时,将返回0,即没有按键按下。
- 第二步,当判断为有按键按下时,判断为key0还是key1,当为key0时,返回1,即为按键1按下;当为key1时,返回为2,即为按键2按下。
2.程序编写
如上所示。