添加gpio中断bsp

This commit is contained in:
RB 2025-05-05 00:02:24 +08:00
parent af69d030fe
commit 52acfaf20c
6 changed files with 109 additions and 84 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
User/bsp/.DS_Store vendored Normal file

Binary file not shown.

72
User/bsp/gpio_exti.c Normal file
View File

@ -0,0 +1,72 @@
/* Includes ----------------------------------------------------------------- */
#include "bsp\gpio.h"
#include <gpio.h>
#include <main.h>
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */
static void (*GPIO_Callback[BSP_GPIO_NUM][BSP_GPIO_CB_NUM])(void);
/* Private function -------------------------------------------------------- */
static BSP_GPIO_t GPIO_Get(uint16_t pin) {
switch (pin) {
case USER_KEY_Pin:
return BSP_GPIO_USER_KEY;
/* case XXX_Pin:
return BSP_GPIO_XXX; */
default:
return BSP_GPIO_ERR;
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
BSP_GPIO_t gpio = GPIO_Get(GPIO_Pin);
if (gpio != BSP_GPIO_ERR) {
if (GPIO_Callback[gpio][BSP_GPIO_EXTI_CB]) {
GPIO_Callback[gpio][BSP_GPIO_EXTI_CB]();
}
}
}
/* Exported functions ------------------------------------------------------- */
int8_t BSP_GPIO_RegisterCallback(BSP_GPIO_t gpio, BSP_GPIO_Callback_t type, void (*callback)(void)) {
if (callback == NULL || gpio >= BSP_GPIO_NUM || type >= BSP_GPIO_CB_NUM) return BSP_ERR_NULL;
GPIO_Callback[gpio][type] = callback;
return BSP_OK;
}
int8_t BSP_GPIO_EnableIRQ(BSP_GPIO_t gpio) {
switch (gpio) {
case BSP_GPIO_USER_KEY:
HAL_NVIC_EnableIRQ(USER_KEY_EXTI_IRQn);
break;
/* case BSP_GPIO_XXX:
HAL_NVIC_EnableIRQ(XXX_IRQn);
break; */
default:
return BSP_ERR;
}
return BSP_OK;
}
int8_t BSP_GPIO_DisableIRQ(BSP_GPIO_t gpio) {
switch (gpio) {
case BSP_GPIO_USER_KEY:
HAL_NVIC_DisableIRQ(USER_KEY_EXTI_IRQn);
break;
/* case BSP_GPIO_XXX:
HAL_NVIC_DisableIRQ(XXX_IRQn);
break; */
default:
return BSP_ERR;
}
return BSP_OK;
}

37
User/bsp/gpio_exti.h Normal file
View File

@ -0,0 +1,37 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ----------------------------------------------------------------- */
#include <stdint.h>
#include "bsp/bsp.h"
/* Exported constants ------------------------------------------------------- */
/* Exported macro ----------------------------------------------------------- */
/* Exported types ----------------------------------------------------------- */
/* GPIO设备枚举与设备对应 */
typedef enum {
BSP_GPIO_USER_KEY,
/* BSP_GPIO_XXX, */
BSP_GPIO_NUM,
BSP_GPIO_ERR,
} BSP_GPIO_t;
/* GPIO支持的中断回调函数类型 */
typedef enum {
BSP_GPIO_EXTI_CB,
BSP_GPIO_CB_NUM,
} BSP_GPIO_Callback_t;
/* Exported functions prototypes -------------------------------------------- */
int8_t BSP_GPIO_RegisterCallback(BSP_GPIO_t gpio, BSP_GPIO_Callback_t type, void (*callback)(void));
int8_t BSP_GPIO_EnableIRQ(BSP_GPIO_t gpio);
int8_t BSP_GPIO_DisableIRQ(BSP_GPIO_t gpio);
#ifdef __cplusplus
}
#endif

View File

@ -1,48 +0,0 @@
/* Includes ----------------------------------------------------------------- */
#include "key_gpio.h"
#include "bsp.h"
#include <gpio.h>
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */
static uint32_t key_stats; // 使用位掩码记录每个通道的状态最多支持32LED
/* 按键配置表(根据实际硬件修改) */
static const BSP_Key_Config_t KEY_CONFIGS[] = {
{GPIOA, GPIO_PIN_7, GPIO_PIN_SET}, // KEY1按下时电平为高
{GPIOA, GPIO_PIN_9, GPIO_PIN_SET}, // KEY2按下时电平为低
// 添加更多按键...
};
#define KEY_COUNT (sizeof(KEY_CONFIGS)/sizeof(KEY_CONFIGS[0])
//读取按键状态(带消抖)
int8_t BSP_Key_Read(BSP_Key_Channel_t ch) {
static uint32_t last_press_time[BSP_KEY_COUNT] = {0}; //上次按下时间
const uint32_t debounce_ms = 20; //按键消抖时间
const uint32_t long_press_ms = 2000; //按键长按时间
if(ch >= BSP_KEY_COUNT) return BSP_KEY_RELEASED ;
const BSP_Key_Config_t *cfg = &KEY_CONFIGS[ch];
GPIO_PinState state = HAL_GPIO_ReadPin(cfg->port, cfg->pin);
if(state == cfg->active_level) {
uint32_t now = HAL_GetTick(); //用于记录按键按下时间这里比较state是为了方便适应不同有效电平做出修改的也可以改成直接检测电平高低
//消抖检测(只有按下超过20ms才被认为按下
if((now - last_press_time[ch]) > debounce_ms) {
//长按检测只有被按下超过2000ms才被认为是长按根据实际情况可做出修改
if((now - last_press_time[ch]) > long_press_ms) {
return BSP_KEY_LONG_PRESS;
}
return BSP_KEY_PRESSED;
}
} else {
last_press_time[ch] = HAL_GetTick();
}
return BSP_KEY_RELEASED;
}

View File

@ -1,36 +0,0 @@
#pragma once
/* Includes ----------------------------------------------------------------- */
#include <stdint.h>
#include "main.h"
//#include "key_gpio.h"
/* Exported constants ------------------------------------------------------- */
/* Exported macro ----------------------------------------------------------- */
/* Exported types ----------------------------------------------------------- */
/* KEY按键状态设置用 */
typedef enum
{
BSP_KEY_RELEASED, //按键释放
BSP_KEY_PRESSED, //按键按下
BSP_KEY_LONG_PRESS, //按键长按
} BSP_KEY_Status_t;
/* 按键通道定义 */
typedef enum {
BSP_KEY_1,
BSP_KEY_2,
/* 可根据需要扩展 */
BSP_KEY_COUNT
} BSP_Key_Channel_t;
/* 按键硬件配置结构体 */
typedef struct {
GPIO_TypeDef *port; // GPIO端口
uint16_t pin; // 引脚编号
uint8_t active_level; // 有效电平GPIO_PIN_SET/RESET
} BSP_Key_Config_t;
int8_t BSP_Key_Read(BSP_Key_Channel_t ch);