⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lpc11xx_gpio.c

📁 基于MDK的LPC1100处理器开发应用例程
💻 C
字号:
/***********************************************************************//**
 * @file	: lpc11xx_GPIO.c
 * @brief	: Contains all functions support for GPIO firmware library on LPC11xx
 * @version	: 1.0
 * @date	: 22. Jan. 2010
 * @author	: Coocox
 **********************************************************************/

/* Peripheral group ----------------------------------------------------------- */
/** @addtogroup GPIO
 * @{
 */

/* Includes ------------------------------------------------------------------- */
#include "lpc11xx_gpio.h"
#include "lpc11xx_syscon.h"
#include "lpc11xx_libcfg.h"


#if _GPIO

/* Public Functions ---------------------------------------------------------- */
/** @defgroup GPIO_Public_Functions
 * @{
 */

/*********************************************************************//**
 * @brief		Get pointer to GPIO peripheral due to GPIO port
 * @param[in]	portNum		Port Number value, should be in range from 0 to 4.
 * @return		Pointer to GPIO peripheral
 **********************************************************************/
static GPIO_TypeDef *GPIO_GetPointer(uint8_t port)
{
	GPIO_TypeDef *pGPIO = NULL;

	switch (port) {
	case PORT0:
		pGPIO = LPC_GPIO0;
		break;
	case PORT1:
		pGPIO = LPC_GPIO1;
		break;
	case PORT2:
		pGPIO = LPC_GPIO2;
		break;
	case PORT3:
		pGPIO = LPC_GPIO3;
		break;
	default:
		break;
	}

	return pGPIO;
}


/********************************************************************//**
 * @brief 		Set Direction for GPIO port.
 * @param[in]	port specifies the port, it can be
 *                    -PORT0 : GPIO0
 *                    -PORT1 : GPIO1
 *                    -PORT2 : GPIO2
 *                    -PORT3 : GPIO3
 * @param[in]	pins specifies the port bits to be written (0 - 11)
 * @param[in]	dir  Direction value, should be:
 *                    -0: Input.
 *                    -1: Output.
 * @return		None
 *********************************************************************/
void GPIO_SetDir (uint8_t port, uint32_t pins, uint8_t dir)
{
    GPIO_TypeDef *pGPIO;

    CHECK_PARAM (PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
    
    if(dir == 0) {
        pGPIO->DIR &= (~pins) & GPIO_PINS_MASK;
    } else {
        pGPIO->DIR |= pins & GPIO_PINS_MASK;
    }  
}


/********************************************************************//**
 * @brief 		Sets the selected data port bits.
 * @param[in]	specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3
 * @param[in]	specifies the port bits to be written (0 - 11)
 * @return		None
 *********************************************************************/
void GPIO_SetBits (uint8_t port, uint32_t pins)
{    
    GPIO_TypeDef *pGPIO;

    CHECK_PARAM (PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
    
    pGPIO->MASKED_ACCESS[pins & GPIO_PINS_MASK] = pins & GPIO_PINS_MASK;        
}


/********************************************************************//**
 * @brief 		Resets the selected data port bits.
 * @param[in]	specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3
 * @param[in]	specifies the port bits to be written (0 - 11)
 * @return		None
 *********************************************************************/
void GPIO_ResetBits (uint8_t port, uint32_t pins)
{    
    GPIO_TypeDef *pGPIO;        
    
    CHECK_PARAM (PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);        
    
    pGPIO->MASKED_ACCESS[pins & GPIO_PINS_MASK] = 0;            
}


/********************************************************************//**
 * @brief 		Reads the specified GPIO input data port.
 * @param[in]	specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @return		GPIO input data port value
 *********************************************************************/
uint32_t GPIO_ReadInput (uint8_t port)
{  
    GPIO_TypeDef *pGPIO;
    
    CHECK_PARAM(PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
    
    return (pGPIO->DATA & GPIO_PINS_MASK);
}


/********************************************************************//**
 * @brief 		Reads the specified input port pin.
 * @param[in]	port specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @param[in]   pin specifies the port bit (0-11) to read 
 * @return		The input port pin value
 *********************************************************************/
FlagStatus GPIO_ReadInputPin(uint8_t port, uint32_t pin)
{      
    FlagStatus bitSta = RESET;
    GPIO_TypeDef *pGPIO = GPIO_GetPointer(port);
    
    CHECK_PARAM(PARAM_PORT(port));
    
    if(pGPIO->DATA & pin) {
        bitSta = SET;
    } else {
        bitSta = RESET;
    }   
    
    return bitSta; 
}


/********************************************************************//**
 * @brief 		Initializes the port event according to the specified
 *              parameters in the Event_InitStruct.
 * @param[in]	Event_InitStruct pointer to a EVENT_InitTypeDef structure
 *
 * @return		None
 *********************************************************************/
void GPIO_EventInit(EVENT_InitTypeDef *Event_InitStruct)
{    
    GPIO_TypeDef *pGPIO;

    CHECK_PARAM(PARAM_PORT(Event_InitStruct->port));
    CHECK_PARAM(PARAM_EVENT_TYPEDEF(Event_InitStruct->EVENT_Mode));

    pGPIO = GPIO_GetPointer(Event_InitStruct->port);

    /* Select the trigger for the selected pins interrupt */
    switch(Event_InitStruct->EVENT_Mode) {
    case EVENT_HIGH_LEVEL:        
    case EVENT_LOW_LEVEL:
        pGPIO->IS |= Event_InitStruct->pins;
        if(Event_InitStruct->EVENT_Mode == EVENT_HIGH_LEVEL) {
             pGPIO->IEV |= Event_InitStruct->pins & GPIO_PINS_MASK;  
        } else {
            pGPIO->IEV &= ~Event_InitStruct->pins & GPIO_PINS_MASK;        
        }
        break;
    case EVENT_RISING_EDGE:        
    case EVENT_FALLING_EDGE:
    case EVENT_BOTH_EDGE:
        pGPIO->IS &= ~Event_InitStruct->pins & GPIO_PINS_MASK;
        if(Event_InitStruct->EVENT_Mode == EVENT_BOTH_EDGE) {
            pGPIO->IBE |= Event_InitStruct->pins & GPIO_PINS_MASK;
        } else if (Event_InitStruct->EVENT_Mode == EVENT_RISING_EDGE) {
            pGPIO->IEV |= Event_InitStruct->pins & GPIO_PINS_MASK;  
        } else {
            pGPIO->IEV &= ~Event_InitStruct->pins & GPIO_PINS_MASK;        
        }           
        break;
    };

    /* Enable or Disable the pins interrupt */
    if (Event_InitStruct->INTCmd == ENABLE) {
        pGPIO->IE |= Event_InitStruct->pins & GPIO_PINS_MASK;
    } else {
        pGPIO->IE &= ~Event_InitStruct->pins & GPIO_PINS_MASK;    
    }
}


/********************************************************************//**
 * @brief 		Get event status of the selected port  
 * @param[in]	specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @return		The event status
 *********************************************************************/
uint32_t GPIO_GetEventStatus(uint8_t port) 
{
    GPIO_TypeDef *pGPIO;
    
    CHECK_PARAM(PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
        
    return (pGPIO->RIS & GPIO_PINS_MASK);   
}


/********************************************************************//**
 * @brief 		Get interrupt status of the selected port 
 * @param[in]	specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @return		The interrupt status
 *********************************************************************/
uint32_t GPIO_GetIntStatus(uint8_t port)
{
    GPIO_TypeDef *pGPIO;

    CHECK_PARAM(PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
    
    return (pGPIO->MIS & GPIO_PINS_MASK);    
}


/********************************************************************//**
 * @brief 		Clear the pins interrupt status flag
 * @param[in]	port specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @param[in]	pins specifie the selected pins
 * @return		None
 *********************************************************************/
void GPIO_ClearInt(uint8_t port, uint32_t pins) 
{
    GPIO_TypeDef *pGPIO;

    CHECK_PARAM(PARAM_PORT(port));

    pGPIO = GPIO_GetPointer(port);
    
    pGPIO->IC = pins & GPIO_PINS_MASK;  
}


/********************************************************************//**
 * @brief 		Enable or Disable the port interrupt in NVIC
 * @param[in]	port specifies the port, it can be
 *               -PORT0 : GPIO0
 *               -PORT1 : GPIO1
 *               -PORT2 : GPIO2
 *               -PORT3 : GPIO3 
 * @param[in]	cmd, it can be:
 *               -ENABLE  : ENABLE the selected port interrupt
 *               -DISABLE : DISABLE the selected port interrupt
 * @return		None
 *********************************************************************/
void GPIO_PortIntCmd(uint8_t port, FunctionalState cmd)
{
    IRQn_Type IRQn;

    CHECK_PARAM(PARAM_PORT(port));
    
    switch(port) {
    case PORT0:
        IRQn = EINT0_IRQn; break;
    case PORT1:
        IRQn = EINT1_IRQn; break;
    case PORT2:
        IRQn = EINT2_IRQn; break;        
    case PORT3:
        IRQn = EINT3_IRQn; break;
    default: return;
    }  

    if(cmd == DISABLE) {        
        NVIC_DisableIRQ(IRQn);        
    } else {
#include <LPC11xx.h>
        NVIC_EnableIRQ(IRQn);        
    }
}


/**
 * @}
 */

#endif   /* _GPIO */

/**
 * @}
 */
/* --------------------------------- End Of File ------------------------------ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -