driver_key.h
#ifndef __DRIVER_KEY_H
#define __DRIVER_KEY_H
#include "stm32f1xx_hal.h"
/*
按键状态宏定义
*/
#define KEY_PRESSED (0)
#define KEY_RELEASED (1)
/*********************
* 引脚宏定义
**********************/
#define KEY1_PIN GPIO_PIN_14
#define KEY2_PIN GPIO_PIN_15
#define KEY1_PORT GPIOE
#define KEY2_PORT GPIOE
/*********************
* 函数宏定义
**********************/
#define KEY1_GPIO_CLK_EN() __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY2_GPIO_CLK_EN() __HAL_RCC_GPIOE_CLK_ENABLE()
#define K1 HAL_GPIO_ReadPin(KEY1_PORT, KEY1_PIN)
#define K2 HAL_GPIO_ReadPin(KEY2_PORT, KEY2_PIN)
/*
* 函数名:KEY_GPIO_ReInit
* 功能描述:按键的GPIO重新初始化为双边沿触发外部中断
* 输入参数:无
* 输出参数:无
* 返回值:无
*/
extern void KEY_GPIO_ReInit(void);
/*
* 函数名:KEY1_Value
* 功能描述:返回按键KEY1的键值
* 输入参数:无
* 输出参数:无
* 返回值:返回按键KEY1的键值
*/
extern uint8_t KEY1_Value(void);
/*
* 函数名:KEY2_Value
* 功能描述:返回按键KEY2的键值
* 输入参数:无
* 输出参数:无
* 返回值:返回按键KEY2的键值
*/
extern uint8_t KEY2_Value(void);
#endif /* __DRIVER_KEY_H */
driver_key.c
#include "driver_key.h"
static volatile uint8_t key1_val = KEY_RELEASED; // 按键KEY1的键值,按下为0松开为1
static volatile uint8_t key2_val = KEY_RELEASED; // 按键KEY2的键值,按下为0松开为1
/*
* 函数名:KEY_GPIO_ReInit
* 功能描述:按键的GPIO重新初始化为双边沿触发外部中断
* 输入参数:无
* 输出参数:无
* 返回值:无
*/
void KEY_GPIO_ReInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
KEY1_GPIO_CLK_EN();
KEY2_GPIO_CLK_EN();
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 双边沿触发中断
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pin = KEY1_PIN;
HAL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
GPIO_InitStruct.Pin = KEY2_PIN;
HAL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 2);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
/*
* 函数名:EXTI15_10_IRQHandler
* 功能描述:外部中断线10~15的中断服务函数
* 输入参数:无
* 输出参数:无
* 返回值:无
*/
void EXTI15_10_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(KEY1_PIN); // 使用HAL库的外部中断统一服务函数,参数是外部中断线
HAL_GPIO_EXTI_IRQHandler(KEY2_PIN);
}
/*
* 函数名:HAL_GPIO_EXTI_Callback
* 功能描述:外部中断回调函数
* 输入参数:GPIO_Pin --> 产生外部中断的引脚
* 输出参数:无
* 返回值:无
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(KEY1_PIN == GPIO_Pin) // 判断进来的外部中断线连接的引脚是不是按键的引脚
{
key1_val = K1; // 读取按键连接的引脚的状态
}
else if(KEY2_PIN == GPIO_Pin)
{
key2_val = K2;
}
}
/*
* 函数名:KEY1_Value
* 功能描述:返回按键KEY1的键值
* 输入参数:无
* 输出参数:无
* 返回值:返回按键KEY1的键值
*/
uint8_t KEY1_Value(void)
{
return key1_val;
}
/*
* 函数名:KEY2_Value
* 功能描述:返回按键KEY2的键值
* 输入参数:无
* 输出参数:无
* 返回值:返回按键KEY2的键值
*/
uint8_t KEY2_Value(void)
{
return key2_val;
}
KEY_GPIO_ReInit();
mian.c
if(KEY1_Value() == KEY_PRESSED)
{
printf("Key 1 is pressed!\r\n");
}
if(KEY2_Value() == KEY_PRESSED)
{
printf("Key 2 is pressed!\r\n");
}
按键外部中断
于 2022-10-27 11:32:30 首次发布