You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
1.8 KiB
84 lines
1.8 KiB
//
|
|
// Created by iflyt on 2025/3/2.
|
|
//
|
|
|
|
#ifndef EXTI_KEY_MANAGER_H
|
|
#define EXTI_KEY_MANAGER_H
|
|
|
|
#include <stm32f4xx_hal.h>
|
|
#include <cmsis_os2.h>
|
|
|
|
#define X_ORIGIN_PIN GPIO_PIN_6
|
|
#define X_LIMIT_PIN GPIO_PIN_7
|
|
#define X_PORT GPIOB
|
|
|
|
#define Y_ORIGIN_PIN GPIO_PIN_9
|
|
#define Y_LIMIT_PIN GPIO_PIN_10
|
|
#define Y_PORT GPIOB
|
|
|
|
#define Z_ORIGIN_PIN GPIO_PIN_13
|
|
#define Z_LIMIT_PIN GPIO_PIN_14
|
|
#define Z_PORT GPIOB
|
|
|
|
#define EXTI_PIN_COUNT 8
|
|
/*
|
|
* 按键信息管理类
|
|
*/
|
|
typedef struct {
|
|
GPIO_TypeDef *port;
|
|
uint16_t pin;
|
|
GPIO_PinState activeLevel; // 有效电平
|
|
} B_PinInfo;
|
|
|
|
/**
|
|
* 外部按键 key 信息
|
|
*/
|
|
struct EXITKeyInfo {
|
|
uint16_t gpio_pin;
|
|
GPIO_PinState pin_state;
|
|
};
|
|
|
|
// 外部中断按键管理类类
|
|
class ExtiKeyManager {
|
|
|
|
public:
|
|
// 获取单例实例的静态方法
|
|
static ExtiKeyManager* ins();
|
|
// 删除拷贝构造函数和赋值运算符,防止复制实例
|
|
ExtiKeyManager(const ExtiKeyManager&) = delete;
|
|
ExtiKeyManager& operator=(const ExtiKeyManager&) = delete;
|
|
|
|
static void handleInterrupt(uint16_t gpio_pin, GPIO_PinState pin_state);
|
|
|
|
static bool isPinTriggered(uint16_t targetPin);
|
|
|
|
static GPIO_TypeDef* getPortByPin(uint16_t pin);
|
|
private:
|
|
ExtiKeyManager();
|
|
~ExtiKeyManager();
|
|
|
|
static bool isPinStateTriggered(const uint16_t pin, const bool state);
|
|
|
|
static void handleKeyInterrupts(void* arg);
|
|
void processKeyEvent(const uint16_t gpio_pin, const bool is_triggerd);
|
|
|
|
private:
|
|
static ExtiKeyManager* s_instance;
|
|
osMessageQueueId_t keyQueue_;
|
|
|
|
|
|
static EXITKeyInfo exit_key_info_;
|
|
const static B_PinInfo pinInfos[EXTI_PIN_COUNT];
|
|
};
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void EX_GPIO_Init(void);
|
|
uint16_t getORIGINPin(uint32_t motor_index);
|
|
uint16_t getAxisLimitPin(uint32_t motor_index);
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif //BUTTON_MANAGER_H
|