20230731_XiaoFuZi_emb/ZheDaXiaoFuZi/Src/Usr/Bsp/McuBspGpio.c
Rjh913828050 a8560d741e 类型:重构
内容:重新整理项目文件分类
人员:任家豪
2023-10-08 16:10:23 +08:00

223 lines
6.8 KiB
C

#include "McuBspGpio.h"
#define MCU_BSP_GPIO_DISABLE 0
#define MCU_BSP_GPIO_ENABLE 1
static GpioTypeCallback gMcuBspGpioExtiCallback[MCU_BSP_GPIO_ALL_EXTI] = {NULL,NULL,NULL,NULL,NULL,NULL,NULL};
static uint8_t gMcuBspGpioExitEnableFlag = 0; // 记录中断IO口时钟使用情况
int McuBspGpioInit(GPIO_TypeDef *GPIOx, unsigned short GpioPin, unsigned int GpioMode,
unsigned int GpioSpeed, unsigned int GpioPull, unsigned char ExitMode,
GpioTypeCallback Callback)
{
GPIO_InitTypeDef GPIO_Init;
if (GPIOx == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
} else if (GPIOx == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
} else if (GPIOx == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
} else if (GPIOx == GPIOD) {
__HAL_RCC_GPIOD_CLK_ENABLE();
} else if (GPIOx == GPIOE) {
__HAL_RCC_GPIOE_CLK_ENABLE();
} else if (GPIOx == GPIOF) {
__HAL_RCC_GPIOF_CLK_ENABLE();
} else if (GPIOx == GPIOG) {
__HAL_RCC_GPIOG_CLK_ENABLE();
} else {
return -1;
}
GPIO_Init.Pin = GpioPin;
GPIO_Init.Mode = GpioMode;
GPIO_Init.Speed = GpioSpeed;
GPIO_Init.Pull = GpioPull;
HAL_GPIO_Init(GPIOx, &GPIO_Init);
if (Callback != NULL && ExitMode < MCU_BSP_GPIO_ALL_EXTI) {
gMcuBspGpioExtiCallback[ExitMode] = Callback;
if (ExitMode == MCU_BSP_GPIO_EXTI0) {
HAL_NVIC_SetPriority(EXTI0_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI1) {
HAL_NVIC_SetPriority(EXTI1_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI2) {
HAL_NVIC_SetPriority(EXTI2_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI3) {
HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI4) {
HAL_NVIC_SetPriority(EXTI4_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI9_5) {
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
} else if (ExitMode == MCU_BSP_GPIO_EXTI15_10) {
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
if (GPIOx == GPIOA) {
gMcuBspGpioExitEnableFlag |= 0x01;
} else if (GPIOx == GPIOB) {
gMcuBspGpioExitEnableFlag |= 0x02;
} else if (GPIOx == GPIOC) {
gMcuBspGpioExitEnableFlag |= 0x04;
} else if (GPIOx == GPIOD) {
gMcuBspGpioExitEnableFlag |= 0x08;
} else if (GPIOx == GPIOE) {
gMcuBspGpioExitEnableFlag |= 0x10;
} else if (GPIOx == GPIOF) {
gMcuBspGpioExitEnableFlag |= 0x20;
} else if (GPIOx == GPIOG) {
gMcuBspGpioExitEnableFlag |= 0x40;
}
}
return 0;
}
/* 设置GPIO输出电平 */
void McuBspGpioSetLevel(GPIO_TypeDef *GPIOx, unsigned short Pin, unsigned char Status)
{
if (Status == MCU_BSP_GPIO_OUT_HIGH) {
HAL_GPIO_WritePin(GPIOx, Pin, GPIO_PIN_SET);
} else {
HAL_GPIO_WritePin(GPIOx, Pin, GPIO_PIN_RESET);
}
}
/* 读取GPIO电平 */
int McuBspGpioGetLevel(GPIO_TypeDef *GPIOx, unsigned short Pin)
{
GPIO_PinState bitstatus = HAL_GPIO_ReadPin(GPIOx, Pin);
if (bitstatus == GPIO_PIN_SET) {
return MCU_BSP_GPIO_OUT_HIGH;
}
return MCU_BSP_GPIO_OUT_LOW;
}
/* GPIO Sleep */
void McuBspGpioSleep(void)
{
/* 关闭GPIO时钟 */
if ((gMcuBspGpioExitEnableFlag & 0x01) != 0x01) {
__HAL_RCC_GPIOA_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x02) != 0x02) {
__HAL_RCC_GPIOB_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x04) != 0x04) {
__HAL_RCC_GPIOC_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x08) != 0x08) {
__HAL_RCC_GPIOD_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x10) != 0x10) {
__HAL_RCC_GPIOE_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x20) != 0x20) {
__HAL_RCC_GPIOF_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x40) != 0x40) {
__HAL_RCC_GPIOG_CLK_DISABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x7f) != 0x7f) {
__HAL_RCC_AFIO_CLK_DISABLE();
}
}
/* GPIO WakeUp */
void McuBspGpioWakeUp(void)
{
if ((gMcuBspGpioExitEnableFlag & 0x7f) != 0x7f) {
__HAL_RCC_AFIO_CLK_ENABLE();
}
/* 开启GPIO时钟 */
if ((gMcuBspGpioExitEnableFlag & 0x01) != 0x01) {
__HAL_RCC_GPIOA_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x02) != 0x02) {
__HAL_RCC_GPIOB_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x04) != 0x04) {
__HAL_RCC_GPIOC_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x08) != 0x08) {
__HAL_RCC_GPIOD_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x10) != 0x10) {
__HAL_RCC_GPIOE_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x20) != 0x20) {
__HAL_RCC_GPIOF_CLK_ENABLE();
}
if ((gMcuBspGpioExitEnableFlag & 0x40) != 0x40) {
__HAL_RCC_GPIOG_CLK_ENABLE();
}
}
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void EXTI1_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
}
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2);
}
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void EXTI4_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4);
}
void EXTI9_5_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
}
/* 下面的中断函数随项目设计的变化而变化 */
void EXTI15_10_IRQHandler(void)
{
/* 特例代码 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_3) {
if (gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI3] != NULL) {
gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI3]();
}
}
if (GPIO_Pin == GPIO_PIN_4) {
if (gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI4] != NULL) {
gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI4]();
}
}
if ((GPIO_Pin == GPIO_PIN_10) || (GPIO_Pin == GPIO_PIN_11) ||
(GPIO_Pin == GPIO_PIN_12) || (GPIO_Pin == GPIO_PIN_13)) {
if (gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI15_10] != NULL) {
gMcuBspGpioExtiCallback[MCU_BSP_GPIO_EXTI15_10]();
}
}
}