/** ****************************************************************************** * @file xl_gpio.c * @author kirk ,xu.wang * @version 4.5.2 * @date Fri Mar 26 17:29:12 2021 * @brief This file provide function about GPIO firmware program ****************************************************************************** * @attention * * 2019 by Chipways Communications,Inc. All Rights Reserved. * This software is supplied under the terms of a license * agreement or non-disclosure agreement with Chipways. * Passing on and copying of this document,and communication * of its contents is not permitted without prior written * authorization. * *

© COPYRIGHT 2019 Chipways

****************************************************************************** */ #if defined(__cplusplus) extern "C" { #endif /* __cplusplus */ /* Includes ---------------------------------------------------------------*/ #include "xl_gpio.h" /** @addtogroup XL6600_StdPeriph_Driver * @{ */ /** @defgroup GPIO GPIO Module * @brief GPIO Driver Modules Library * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** @defgroup GPIO_Private_Functions * @{ */ /** * @brief GPIOÍâÉè»Ö¸´Ä¬ÈÏÖµ. * @param GPIOx: GPIO_TypeÀàÐÍÖ¸Õ룬°üº¬ÁËGPIOËùÓмĴæÆ÷. * @retval None */ void GPIO_DeInit(GPIO_Type *GPIOx) { GPIOx->PDOR = 0x00000000u; GPIOx->PSOR = 0x00000000u; GPIOx->PCOR = 0x00000000u; GPIOx->PTOR = 0x00000000u; GPIOx->PDDR = 0x00000000u; GPIOx->PIDR = 0xFFFFFFFFu; } /** * @brief ÉèÖÃGPIOµÄ·½Ïò * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @param GPIO_Mode: ¶Ë¿ÚÊý¾Ý·½Ïò. * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg GPIO_Direction_Input£ºÊäÈë * @arg GPIO_Direction_Output£ºÊä³ö * @retval None */ void GPIO_SetPinDir(uint8_t gpioPin,GPIO_Direction_Mode GPIO_Mode) { /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { switch (GPIO_Mode) { case GPIO_Direction_Output: GPIOA->PDDR |= ((uint32_t)1 << (uint8_t)gpioPin) ; GPIOA->PIDR |= ((uint32_t)1 << (uint8_t)gpioPin) ; break ; case GPIO_Direction_Input: GPIOA->PDDR &= ~((uint32_t)1 << (uint8_t)gpioPin); GPIOA->PIDR &= ~((uint32_t)1 << (uint8_t)gpioPin) ; break ; case GPIO_Direction_High_Z: default: GPIOA->PDDR &= ~((uint32_t)1 << (uint8_t)gpioPin) ; GPIOA->PIDR |= ((uint32_t)1 << (uint8_t)gpioPin) ; break; } } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { switch (GPIO_Mode ) { case GPIO_Direction_Output: GPIOB->PDDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); GPIOB->PIDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); break ; case GPIO_Direction_Input: GPIOB->PDDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); GPIOB->PIDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); break ; case GPIO_Direction_High_Z: default: GPIOB->PDDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); GPIOB->PIDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); break; } } /* then use GPIOC */ else { switch (GPIO_Mode ) { case GPIO_Direction_Output: GPIOC->PDDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); GPIOC->PIDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); break ; case GPIO_Direction_Input: GPIOC->PDDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); GPIOC->PIDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); break ; case GPIO_Direction_High_Z: default: GPIOC->PDDR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); GPIOC->PIDR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); break; } } } /** * @brief ÉèÖÃGPIOµÄµçƽ * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @param Output: Êä³öµÄµçƽ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg GPIO_Output_Low£ºµÍµçƽ * @arg GPIO_Output_High£º¸ßµçƽ * @retval None */ void GPIO_SetPinOutput(uint8_t gpioPin, GPIO_Output_Level Output) { /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { if(Output != GPIO_Output_Low) { /* output high 1 */ GPIOA->PDOR |= ((uint32_t)1 << (uint8_t)gpioPin) ; } else { /* output low 0 */ GPIOA->PDOR &= ~((uint32_t)1 << (uint8_t)gpioPin); } } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { if(Output != GPIO_Output_Low) { /* output high 1 */ GPIOB->PDOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); } else { /* output high 0 */ GPIOB->PDOR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); } } /* else use GPIOC */ else { if(Output != GPIO_Output_Low) { /* output high 1 */ GPIOC->PDOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); } else { /* output high 0 */ GPIOC->PDOR &= ~((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); } } } /** * @brief GPIOÊä³ö¸ßµçƽ * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval None */ void GPIO_SetPin(uint8_t gpioPin) { /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { GPIOA->PSOR |= ((uint32_t)1 << (uint8_t)gpioPin) ; } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { GPIOB->PSOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); } /* else use GPIOC */ else { GPIOC->PSOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); } } /** * @brief GPIOÊä³öµÍµçƽ * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval None */ void GPIO_ClrPin(uint8_t gpioPin) { /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { GPIOA->PCOR |= ((uint32_t)1 << (uint8_t)gpioPin); } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { GPIOB->PCOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); } /* else use GPIOC */ else { GPIOC->PCOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); } } /** * @brief GPIOÊä³öµçƽ·­×ª * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval None */ void GPIO_TogglePin(uint8_t gpioPin) { /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { GPIOA->PTOR |= ((uint32_t)1 << (uint8_t)gpioPin) ; } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { GPIOB->PTOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)32)); } /* else use GPIOC */ else { GPIOC->PTOR |= ((uint32_t)1 << ((uint8_t)gpioPin - (uint8_t)64)); } } /** * @brief GPIO¶Á¶Ë¿Ú¼Ä´æÆ÷Öµ * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval PDIR¼Ä´æÆ÷µÄÖµ. */ uint32_t GPIO_ReadReg(const GPIO_Type *GPIOx) { uint32_t inputData; inputData = GPIOx->PDIR ; return inputData ; } /** * @brief GPIO¶Á¶Ë¿Úµçƽ * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval GPIO_Pin vlaue£º¶Áµ½µÄµçƽ * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg GPIO_Input_Low :ÊäÈëµÍµçƽ * @arg GPIO_Input_High :ÊäÈë¸ßµçƽ */ GPIO_Input_Def GPIO_ReadPin(uint8_t gpioPin) { GPIO_Input_Def ret; /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { if( ((GPIOA->PDIR>>((uint8_t)gpioPin))& (uint32_t)1) != 0u) { ret = GPIO_Input_High; } else { ret = GPIO_Input_Low; } } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { if(((GPIOB->PDIR>>((uint8_t)gpioPin - (uint8_t)32)) & (uint32_t)1) != 0u) { ret = GPIO_Input_High; } else { ret = GPIO_Input_Low; } } /* else use GPIOC */ else { if(((GPIOC->PDIR>>((uint8_t)gpioPin - (uint8_t)64)) & (uint32_t)1) != 0u) { ret = GPIO_Input_High; } else { ret = GPIO_Input_Low; } } return ret; } /** * @brief GPIO¶Á¶Ë¿Ú·½Ïò * @param gpioPin: GPIO Pin Name(GPIO_PTA0~GPIO_PTI6) * @retval GPIO_Direction_Seclect£º¶Áµ½·½Ïò * Õâ¸ö²ÎÊý¿ÉÒÔÈ¡ÏÂÃæµÄÖµ: * @arg GPIO_Direction_Input :ÊäÈëµÍµçƽ * @arg GPIO_Direction_Output :ÊäÈë¸ßµçƽ */ GPIO_Direction_Mode GPIO_ReadPinDir(uint8_t gpioPin) { GPIO_Direction_Mode ret; /* when gpioPin less than GPIO_PortD7 use GPIOA */ if(gpioPin < (uint8_t)GPIO_PTE0) { if( ((GPIOA->PDDR>>((uint8_t)gpioPin))& (uint32_t)1) != 0u) { ret = GPIO_Direction_Output; } else { if( ((GPIOA->PIDR>>((uint8_t)gpioPin))& (uint32_t)1) != 0u) { ret = GPIO_Direction_High_Z; } else { ret = GPIO_Direction_Input; } } } /* when gpioPin less than GPIO_PortH7 use GPIOB */ else if(gpioPin < (uint8_t)GPIO_PTI0) { if(((GPIOB->PDDR>>((uint8_t)gpioPin - (uint8_t)32)) & (uint32_t)1) != 0u) { ret = GPIO_Direction_Output; } else { if(((GPIOB->PIDR>>((uint8_t)gpioPin - (uint8_t)32)) & (uint32_t)1) != 0u) { ret = GPIO_Direction_High_Z; } else { ret = GPIO_Direction_Input; } } } /* else use GPIOC */ else { if(((GPIOC->PDDR>>((uint8_t)gpioPin - (uint8_t)64)) & (uint32_t)1) != 0u) { ret = GPIO_Direction_Output; } else { if(((GPIOC->PIDR>>((uint8_t)gpioPin - (uint8_t)64)) & (uint32_t)1) != 0u) { ret = GPIO_Direction_High_Z; } else { ret = GPIO_Direction_Input; } } } return ret; } /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif /* __cplusplus */