diff --git a/.DS_Store b/.DS_Store index 8edf24a..b3388df 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/User/bsp/.DS_Store b/User/bsp/.DS_Store new file mode 100644 index 0000000..d0dc709 Binary files /dev/null and b/User/bsp/.DS_Store differ diff --git a/User/bsp/gpio_exti.c b/User/bsp/gpio_exti.c new file mode 100644 index 0000000..d260fe1 --- /dev/null +++ b/User/bsp/gpio_exti.c @@ -0,0 +1,72 @@ +/* Includes ----------------------------------------------------------------- */ +#include "bsp\gpio.h" + +#include +#include + +/* 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; +} \ No newline at end of file diff --git a/User/bsp/gpio_exti.h b/User/bsp/gpio_exti.h new file mode 100644 index 0000000..03f431b --- /dev/null +++ b/User/bsp/gpio_exti.h @@ -0,0 +1,37 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ----------------------------------------------------------------- */ +#include + +#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 \ No newline at end of file diff --git a/User/bsp/key_gpio.c b/User/bsp/key_gpio.c deleted file mode 100644 index d3cfb88..0000000 --- a/User/bsp/key_gpio.c +++ /dev/null @@ -1,48 +0,0 @@ -/* Includes ----------------------------------------------------------------- */ -#include "key_gpio.h" -#include "bsp.h" -#include - -/* 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Ϊ˷ӦͬЧƽ޸ĵģҲԸijֱӼƽߵͣ - - //(ֻа³20msűΪ£ - if((now - last_press_time[ch]) > debounce_ms) { - //⣨ֻб³2000msűΪdzʵ޸ģ - 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; -} diff --git a/User/bsp/key_gpio.h b/User/bsp/key_gpio.h deleted file mode 100644 index c6fe1de..0000000 --- a/User/bsp/key_gpio.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -/* Includes ----------------------------------------------------------------- */ -#include -#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); \ No newline at end of file