更新了CUBEMX配置,添加了所有引脚和外部中断.

This commit is contained in:
NeoZng
2023-02-02 15:21:22 +08:00
parent 2576befb80
commit 73cdc66de5
57 changed files with 5843 additions and 323 deletions

View File

@@ -5,12 +5,28 @@
static uint8_t idx;
static GPIOInstance* gpio_instance[GPIO_MX_DEVICE_NUM] = {NULL};
/**
* @brief EXTI中断回调函数,根据GPIO_Pin找到对应的GPIOInstance,并调用模块回调函数(如果有)
* @note 如何判断具体是哪一个GPIO的引脚连接到这个EXTI中断线上?
* 一个EXTI中断线只能连接一个GPIO引脚,因此可以通过GPIO_Pin来判断,PinX对应EXTIX
* 一个Pin号只会对应一个EXTI,详情见gpio.md
* @param GPIO_Pin 发生中断的GPIO_Pin
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
// 如有必要,可以根据pinstate和HAL_GPIO_ReadPin来判断是上升沿还是下降沿/rise&fall等
static GPIOInstance *gpio;
for (size_t i = 0; i < idx; i++)
{
gpio=gpio_instance[i];
if(gpio->GPIO_Pin==GPIO_Pin && gpio->gpio_model_callback!=NULL)
{
gpio->gpio_model_callback(gpio);
return;
}
}
}
GPIOInstance *GPIORegister(GPIO_Init_Config_s *GPIO_config)
{
GPIOInstance *ins=(GPIOInstance*)malloc(sizeof(GPIOInstance));
@@ -18,6 +34,8 @@ GPIOInstance *GPIORegister(GPIO_Init_Config_s *GPIO_config)
ins->GPIOx=GPIO_config->GPIOx;
ins->GPIO_Pin=GPIO_config->GPIO_Pin;
ins->pin_state=GPIO_config->pin_state;
ins->exti_mode=GPIO_config->exti_mode;
ins->id=GPIO_config->id;
ins->gpio_model_callback=GPIO_config->gpio_model_callback;

View File

@@ -4,35 +4,82 @@
#define GPIO_MX_DEVICE_NUM 10
/**
* @brief GPIO实例结构体定义
*
* @brief 用于判断中断来源,注意和CUBEMX中配置一致
*
*/
typedef struct tmpgpio
typedef enum
{
GPIO_TypeDef *GPIOx;
uint16_t GPIO_Pin;
void* id;
void (*gpio_model_callback)(struct tmpgpio*); // 随便取个名字当临时声明
GPIO_EXTI_MODE_RISING,
GPIO_EXTI_MODE_FALLING,
GPIO_EXTI_MODE_RISING_FALLING,
GPIO_EXTI_MODE_NONE,
} GPIO_EXTI_MODE_e;
/**
* @brief GPIO实例结构体定义
*
*/
typedef struct tmpgpio
{
GPIO_TypeDef *GPIOx; // GPIOA,GPIOB,GPIOC...
GPIO_PinState pin_state; // 引脚状态,Set,Reset;not frequently used
GPIO_EXTI_MODE_e exti_mode; // 外部中断模式 not frequently used
uint16_t GPIO_Pin; // 引脚号
// 随便取个名字当临时声明
void (*gpio_model_callback)(struct tmpgpio *); // exti中断回调函数
void *id; // 区分不同的GPIO实例
} GPIOInstance;
/**
* @brief GPIO初始化配置结构体定义
*
*
*/
typedef struct
{
GPIO_TypeDef *GPIOx;
uint16_t GPIO_Pin;
void* id;
void (*gpio_model_callback)(GPIOInstance*);
GPIO_TypeDef *GPIOx; // GPIOA,GPIOB,GPIOC...
GPIO_PinState pin_state; // 引脚状态,Set,Reset not frequently used
GPIO_EXTI_MODE_e exti_mode; // 外部中断模式 not frequently used
uint16_t GPIO_Pin; // 引脚号
void (*gpio_model_callback)(GPIOInstance *); // exti中断回调函数
void *id; // 区分不同的GPIO实例
} GPIO_Init_Config_s;
GPIOInstance* GPIORegister(GPIO_Init_Config_s* GPIO_config);
/**
* @brief 注册GPIO实例
*
* @param GPIO_config
* @return GPIOInstance*
*/
GPIOInstance *GPIORegister(GPIO_Init_Config_s *GPIO_config);
void GPIOToggel(GPIOInstance* _instance);
/**
* @brief GPIO API,切换GPIO电平
*
* @param _instance
*/
void GPIOToggel(GPIOInstance *_instance);
void GPIOSet(GPIOInstance* _instance);
/**
* @brief 设置GPIO电平
*
* @param _instance
*/
void GPIOSet(GPIOInstance *_instance);
void GPIOReset(GPIOInstance* _instance);
/**
* @brief 复位GPIO电平
*
* @param _instance
*/
void GPIOReset(GPIOInstance *_instance);
GPIO_PinState GPIORead(GPIOInstance* _instance);
/**
* @brief 读取GPIO电平
*
* @param _instance
* @return GPIO_PinState
*/
GPIO_PinState GPIORead(GPIOInstance *_instance);

View File

@@ -0,0 +1,3 @@
![image-20230202151939109](../../assets/image-20230202151939109.png)
![img](../../assets/00937839b59a4c039ee8ecb8a5136e3c.png)