/**
******************************************************************************
* @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 */