STM32F7学习笔记8:按键检测
1. 硬件设计
硬件原理图如下:
两个按键加了防抖动功能,原理如下图
2. 软件设计
2.1按键宏定义
//引脚定义
/*******************************************************/
#define KEY1_PIN GPIO_Pin_0
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_CLK () __GPIOA_CLK_ENABLE()
#define KEY2_PIN GPIO_Pin_13
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_CLK() __GPIOC_CLK_ENABLE()
/*******************************************************/
2.2 GPIO初始化
代码如下:
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_G_GPIO_Port, LED_G_Pin, GPIO_PIN_SET);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY2_PIN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY2_PIN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = KEY1_PIN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY1_PIN_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PtPin */
GPIO_InitStruct.Pin = LED_G_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_G_GPIO_Port, &GPIO_InitStruct);
}
2.3 GPIO按键状态检测
定义按键状态宏
/** 按键按下标置宏
* 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0
* 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可
*/
#define KEY_ON 1
#define KEY_OFF 0
定义检测按键函数
/**
* @brief 检测是否有按键按下
* @param GPIOx:具体的端口, x可以是(A...K)
* @param GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
* @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;
}
主函数
while (1)
{
/* USER CODE END WHILE */
if (Key_Scan(KEY1_PIN_GPIO_Port,KEY1_PIN_Pin) == KEY_ON) {
HAL_GPIO_TogglePin(LED_G_GPIO_Port,LED_G_Pin);
}
/* USER CODE BEGIN 3 */
}