sentry_gimbal_hzz/bsp/gpio/bsp_gpio.c

68 lines
2.0 KiB
C
Raw Normal View History

2023-02-02 14:15:57 +08:00
#include "bsp_gpio.h"
#include "memory.h"
#include "stdlib.h"
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
*/
2023-02-02 14:15:57 +08:00
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;
}
}
2023-02-02 14:15:57 +08:00
}
GPIOInstance *GPIORegister(GPIO_Init_Config_s *GPIO_config)
{
GPIOInstance *ins=(GPIOInstance*)malloc(sizeof(GPIOInstance));
memset(ins,0,sizeof(GPIOInstance));
2023-02-02 14:15:57 +08:00
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;
2023-02-02 14:15:57 +08:00
ins->id=GPIO_config->id;
ins->gpio_model_callback=GPIO_config->gpio_model_callback;
gpio_instance[idx++]=ins;
return ins;
}
// ----------------- GPIO API -----------------
// 都是对HAL的形式上的封装,后续考虑增加GPIO state变量,可以直接读取state
void GPIOToggel(GPIOInstance *_instance)
{
HAL_GPIO_TogglePin(_instance->GPIOx,_instance->GPIO_Pin);
}
void GPIOSet(GPIOInstance *_instance)
{
HAL_GPIO_WritePin(_instance->GPIOx,_instance->GPIO_Pin,GPIO_PIN_SET);
}
void GPIOReset(GPIOInstance *_instance)
{
HAL_GPIO_WritePin(_instance->GPIOx,_instance->GPIO_Pin,GPIO_PIN_RESET);
}
GPIO_PinState GPIORead(GPIOInstance *_instance)
{
return HAL_GPIO_ReadPin(_instance->GPIOx,_instance->GPIO_Pin);
}