223 lines
6.8 KiB
C
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]();
|
|
}
|
|
}
|
|
}
|