//******************************************************************** // Ver 1.0 // 2021.11.19 1、新建文件。 //******************************************************************** #ifndef __GPIO__H #define __GPIO__H //私有函数 enum{ SOURCE_GPIO_Pin_0 = 0, SOURCE_GPIO_Pin_1, SOURCE_GPIO_Pin_2, SOURCE_GPIO_Pin_3, SOURCE_GPIO_Pin_4, SOURCE_GPIO_Pin_5, SOURCE_GPIO_Pin_6, SOURCE_GPIO_Pin_7, SOURCE_GPIO_Pin_8, SOURCE_GPIO_Pin_9, SOURCE_GPIO_Pin_10, SOURCE_GPIO_Pin_11, SOURCE_GPIO_Pin_12, SOURCE_GPIO_Pin_13, SOURCE_GPIO_Pin_14, SOURCE_GPIO_Pin_15, }; #define GPIO_ModeSet(GPIOx, GPIO_Pin, GPIO_Mode) do{ \ GPIOx->MODER &= ~((uint32_t)GPIO_MODER_MODER0 << ((SOURCE_##GPIO_Pin) << 1)); \ GPIOx->MODER |= (((uint32_t)GPIO_Mode) << ((SOURCE_##GPIO_Pin) << 1)); \ }while(0) #define GPIO_Init(GPIOx, PINx, Value, Mode, Speed, Otype, PuPd) do{ \ GPIO_InitTypeDef GPIO_InitStructure; \ GPIO_InitStructure.GPIO_Pin = PINx; \ GPIO_InitStructure.GPIO_Mode = Mode; \ GPIO_InitStructure.GPIO_Speed = Speed; \ GPIO_InitStructure.GPIO_OType = Otype; \ GPIO_InitStructure.GPIO_PuPd = PuPd; \ GPIO_Init1(GPIOx, &GPIO_InitStructure); \ if(Value == 0) GPIO_ResetBits(GPIOx, PINx);\ else GPIO_SetBits(GPIOx, PINx); \ }while(0) #define GPIO_SetBit(GPIOx, PINx) GPIO_SetBits(GPIOx, PINx) #define GPIO_ClrBit(GPIOx, PINx) GPIO_ResetBits(GPIOx, PINx) #define GPIO_WritePin(GPIOx, PINx, Value) do{ \ if(Value == 0) GPIO_ResetBits(GPIOx, PINx); \ else GPIO_SetBits(GPIOx, PINx); \ }while(0) #define GPIO_ReadPin(GPIOx, PINx) GPIO_ReadInputDataBit(GPIOx, PINx) enum{ EXTI_GPIO_Pin_0_IRQn = 5, EXTI_GPIO_Pin_1_IRQn = 5, EXTI_GPIO_Pin_2_IRQn = 6, EXTI_GPIO_Pin_3_IRQn = 6, EXTI_GPIO_Pin_4_IRQn = 7, EXTI_GPIO_Pin_5_IRQn = 7, EXTI_GPIO_Pin_6_IRQn = 7, EXTI_GPIO_Pin_7_IRQn = 7, EXTI_GPIO_Pin_8_IRQn = 7, EXTI_GPIO_Pin_9_IRQn = 7, EXTI_GPIO_Pin_10_IRQn = 7, EXTI_GPIO_Pin_11_IRQn = 7, EXTI_GPIO_Pin_12_IRQn = 7, EXTI_GPIO_Pin_13_IRQn = 7, EXTI_GPIO_Pin_14_IRQn = 7, EXTI_GPIO_Pin_15_IRQn = 7, }; #define GPIO_IrqConfig(enPort, enPin, edge, NewState) do{ \ EXTI_InitTypeDef EXTI_InitStructure; \ NVIC_InitTypeDef NVIC_InitStructure; \ uint8_t EXTI_PortSourceGPIOx = GPIO_PortSource(enPort); \ uint8_t EXTI_PinSourcex = GPIO_PinSource(enPin); \ EXTI_InitStructure.EXTI_Line = enPin; \ EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; \ EXTI_InitStructure.EXTI_Trigger = edge; \ EXTI_InitStructure.EXTI_LineCmd = ENABLE; \ EXTI_Init(&EXTI_InitStructure); \ NVIC_InitStructure.NVIC_IRQChannel = EXTI_##enPin##_IRQn;\ NVIC_InitStructure.NVIC_IRQChannelPriority = 0x02; \ NVIC_InitStructure.NVIC_IRQChannelCmd = NewState; \ NVIC_Init(&NVIC_InitStructure); \ if(NewState != DISABLE) \ { \ SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] |= (((uint32_t)EXTI_PortSourceGPIOx) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03))); \ } \ else \ { \ SYSCFG->EXTICR[EXTI_PinSourcex >> 0x02] &= ~((uint32_t)0x0F) << (0x04 * (EXTI_PinSourcex & (uint8_t)0x03)); \ } \ EXTI_ClearITPendingBit(enPin); \ }while(0) #define GPIO_GetIrqStatus(enPort, enPin) GPIO_GetITStatus(enPin) #define GPIO_ClearIrq(enPort, enPin) GPIO_ClearITFlag(enPin) #define GPIO_SetAfMode(enPort, enPin, enAf) do{ \ if((enAf & 0xf0) == 0x60) PORT_InputCfg((PortInput_CfgType)(enAf & 0x0f), PORTINPUT_CFG_##enPort##enPin); \ else PORT_OutputCfg((IO_CfgType)(enPort##enPin##_CFG), (IO_CfgDef)(enAf & 0x7f)); \ }while(0) //SWD作为普通IO使用 #define GPIO_SWDFunction(NewState) do{ \ if(NewState == DISABLE) DBG->DBGSTOPCR |= DBG_DBGSTOPCR_SWDIS_Msk; \ else DBG->DBGSTOPCR &= ~DBG_DBGSTOPCR_SWDIS_Msk; \ }while(0) #endif