#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](); } } }