CM_DOG/User/bsp/gpio.c
2025-06-24 10:28:20 +08:00

103 lines
2.4 KiB
C

/* Includes ----------------------------------------------------------------- */
#include "bsp/gpio.h"
#include <gpio.h>
#include <main.h>
/* Private define ----------------------------------------------------------- */
/* Private macro ------------------------------------------------------------ */
/* Private typedef ---------------------------------------------------------- */
/* Private variables -------------------------------------------------------- */
static void (*GPIO_Callback[16])(void);
/* Private function -------------------------------------------------------- */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
for (uint8_t i = 0; i < 16; i++) {
if (GPIO_Pin & (1 << i)) {
if (GPIO_Callback[i]) {
GPIO_Callback[i]();
}
}
}
}
/* Exported functions ------------------------------------------------------- */
int8_t BSP_GPIO_RegisterCallback(uint16_t pin, void (*callback)(void)) {
if (callback == NULL) return BSP_ERR_NULL;
for (uint8_t i = 0; i < 16; i++) {
if (pin & (1 << i)) {
GPIO_Callback[i] = callback;
break;
}
}
return BSP_OK;
}
int8_t BSP_GPIO_EnableIRQ(uint16_t pin) {
switch (pin) {
case ACCL_INT_Pin:
HAL_NVIC_EnableIRQ(ACCL_INT_EXTI_IRQn);
break;
case GYRO_INT_Pin:
HAL_NVIC_EnableIRQ(GYRO_INT_EXTI_IRQn);
break;
case USER_KEY_Pin:
HAL_NVIC_EnableIRQ(USER_KEY_EXTI_IRQn);
break;
default:
return BSP_ERR;
}
return BSP_OK;
}
int8_t BSP_GPIO_DisableIRQ(uint16_t pin) {
switch (pin) {
case ACCL_INT_Pin:
HAL_NVIC_DisableIRQ(ACCL_INT_EXTI_IRQn);
break;
case GYRO_INT_Pin:
HAL_NVIC_DisableIRQ(GYRO_INT_EXTI_IRQn);
break;
case USER_KEY_Pin:
HAL_NVIC_DisableIRQ(USER_KEY_EXTI_IRQn);
break;
default:
return BSP_ERR;
}
return BSP_OK;
}
int8_t BSP_GPIO_SetPin(BSP_GPIO_t gpio, BSP_GPIO_Switch_t state) {
GPIO_TypeDef *port;
uint16_t pin;
switch (gpio) {
case BSP_GPIO_24V_EN1:
port = POWER_24V_1_GPIO_Port;
pin = POWER_24V_1_Pin;
break;
case BSP_GPIO_24V_EN2:
port = POWER_24V_2_GPIO_Port;
pin = POWER_24V_2_Pin;
break;
case BSP_GPIO_5V_EN:
port = POWER_5V_GPIO_Port;
pin = POWER_5V_Pin;
break;
default:
return BSP_ERR;
}
HAL_GPIO_WritePin(port, pin, (state == BSP_GPIO_ON) ? GPIO_PIN_SET : GPIO_PIN_RESET);
return BSP_OK;
}