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

📄 gpio.c

📁 philips arm7 lpc2103的常用功能的库函数第二部分
💻 C
字号:
/***********************************************Copyright (c)*********************************************
**                                Guangzou ZLG-MCU Development Co.,LTD.
**                                     
**                                       http://www.zlgmcu.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name:			    Gpio.c
** Last modified Date:      2007-10-15
** Last Version:		    1.0
** Descriptions:		    Gpio函数实现,采用设备描述符来操作
**
**--------------------------------------------------------------------------------------------------------
** Created by:			    wengshujie
** Created date:		    2007-10-15
** Version:				    1.0
** Descriptions:		    无
**
**--------------------------------------------------------------------------------------------------------
** Modified by:			    
** Modified Date:		    
** Version:				    
** Descriptions:		    
**
*********************************************************************************************************/
#include "Config.h"
#include "Gpio.h"
#include "GpioPrivate.h"

/*********************************************************************************************************
   定义操作GPIO器件的结构体
*********************************************************************************************************/
static __GPIO_INFO  __GGpioinfoDate;

/*********************************************************************************************************
   定义一个数组存储四组GPIO口的基址
*********************************************************************************************************/
const uint32    __GuiGpioBaseAddrTab[__GPIO_MAX_NUM] = {GPIO_BASE_ADDR, GPIO1_BASE_ADDR};
                                                         
/*********************************************************************************************************
** Function name:           __gpioSet
** Descriptions:            GPIO设备输出高电平
** Input parameters:        uiId   GPIO设备号
**                          uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31                      
** Output parameters:       NONE
** Returned value:          NONE                                       
*********************************************************************************************************/
static void __gpioSet (uint32 uiId, uint32 uiArg) 
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;
	
	__GGpioinfoDate.puiAddrBase = (uint32*)__GuiGpioBaseAddrTab[uiId];  /*  初始化GPIO结构体参数        */
	__GGpioinfoDate.uiOffBase   = 0;
	
	puiAddrBase = __GGpioinfoDate.puiAddrBase;                          /*  获取结构体参数              */
	uiOffBase   = __GGpioinfoDate.uiOffBase;
	
	uiArg &= 0xff;                                                      /*  取低8位做为识别GPIO口       */
    puiAddrBase[__B_IO_DIR << uiOffBase] |= (1 << uiArg);               /*  设置为输出                  */
    puiAddrBase[__B_IO_SET << uiOffBase] |= (1 << uiArg);               /*  输出高电平                  */
}     
                                                   
/*********************************************************************************************************
** Function name:           gpioSet
** Descriptions:            GPIO设备输出高电平
** Input parameters:        uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          OPERATE_SUCCESS    
**                          OPERATE_FAIL                        
** Example:                 gpioSet( P0_00 );                       
*********************************************************************************************************/
int32 gpioSet (uint32 uiArg)
{	
    if ((uiArg <= P0_31) ||                                             /*  输入参数检测                */
	 	(uiArg >= P1_16 && uiArg <= P1_31)) {

        if (uiArg <= P0_31) {                                           /*  P0口                        */
            __gpioSet( 0, uiArg);      
        }   
        else {                                                          /*  P1口                        */
            __gpioSet(1, uiArg);  
        }
        return GPIO_OK;	
    }
    else {
        return GPIO_NOK;
    }    	    
}

/*********************************************************************************************************
** Function name:           __gpioClr
** Descriptions:            GPIO设备输出低电平
** Input parameters:        uiId   GPIO设备号
**                          uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          NONE                 
*********************************************************************************************************/
static void __gpioClr (uint32 uiId, uint32 uiArg) 
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;
	
	__GGpioinfoDate.puiAddrBase = (uint32*)__GuiGpioBaseAddrTab[uiId];  /*  初始化GPIO结构体参数        */
	__GGpioinfoDate.uiOffBase   = 0;
	
	puiAddrBase = __GGpioinfoDate.puiAddrBase;                          /*  获取结构体参数              */
	uiOffBase   = __GGpioinfoDate.uiOffBase;
	
	uiArg &= 0xff;                                                      /*  取低8位做为识别GPIO口       */
    puiAddrBase[__B_IO_DIR << uiOffBase] |= (1 << uiArg);               /*  设置为输出                  */
    puiAddrBase[__B_IO_CLR << uiOffBase] |= (1 << uiArg);               /*  输出低电平                  */
}

/*********************************************************************************************************
** Function name:           gpioClr
** Descriptions:            GPIO设备输出低电平
** Input parameters:        uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          OPERATE_SUCCESS
**                          OPERATE_FAIL
** Example:                 gpioClr( P0_00 );                       
*********************************************************************************************************/
int32 gpioClr (uint32 uiArg)
{	
    if ((uiArg <= P0_31) ||                                             /*  输入参数检测                */
	 	(uiArg >= P1_16 && uiArg <= P1_31)) {
	
        if (uiArg <= P0_31) {                                           /*  P0口                        */
            __gpioClr(0, uiArg); 
        }  
        else {                                                          /*  P1口                        */
            __gpioClr(1, uiArg);
        }
        return GPIO_OK;	
    }
    else {
        return GPIO_NOK;
    }
}

/*********************************************************************************************************
** Function name:           __gpioGet
** Descriptions:            获取GPIO设备端口电平
** Input parameters:        uiId   GPIO设备号
**                          uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          1高电平
**                          0低电平                     
*********************************************************************************************************/
static int32 __gpioGet (uint32 uiId, uint32 uiArg)
{
    volatile uint32 *puiAddrBase;
	volatile uint32  uiOffBase;
	
	__GGpioinfoDate.puiAddrBase = (uint32*)__GuiGpioBaseAddrTab[uiId];  /*  初始化GPIO结构体参数        */
	__GGpioinfoDate.uiOffBase   = 0;
	
	puiAddrBase = __GGpioinfoDate.puiAddrBase;                          /*  获取结构体参数              */
	uiOffBase   = __GGpioinfoDate.uiOffBase;
	
	uiArg &= 0xff;                                                      /*  取低8位做为识别GPIO口       */
    puiAddrBase[__B_IO_DIR << uiOffBase] &= (~(1 << uiArg));            /*  设置为输入                  */
    if ((puiAddrBase[__B_IO_PIN << uiOffBase] & (1 << uiArg)) != 0) {
        return(1);                                                      /*  返回1                       */
    }
    else {
        return(0);                                                      /*  返回0                       */
    }
}

/*********************************************************************************************************
** Function name:           gpioGet
** Descriptions:            获取GPIO设备端口电平
** Input parameters:        uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          1高电平
**                          0低电平
**                          OPERATE_SUCCESS
** Example:                 gpioGet( P0_00 );                       
*********************************************************************************************************/
int32 gpioGet (uint32 uiArg)
{	
    if ((uiArg <= P0_31) ||                                             /*  输入参数检测                */
	 	(uiArg >= P1_16 && uiArg <= P1_31)) {
	
        if (uiArg <= P0_31) {                                           /*  P0口                        */
            return(__gpioGet(0, uiArg));
        }  
        else {                                                          /*  P1口                        */
            return(__gpioGet(1, uiArg));
        }
    }
    else {
        return GPIO_NOK;
    }
}

/*********************************************************************************************************
** Function name:           __gpioCpl
** Descriptions:            取反GPIO设备端口电平
** Input parameters:        uiId   GPIO设备号
**                          uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          NONE                     
*********************************************************************************************************/
static void __gpioCpl (uint32 uiId, uint32 uiArg)
{
    volatile uint32  *puiAddrBase;
	volatile uint32   uiOffBase;
	
	uint32 uicopyarg;
	
	uicopyarg = uiArg;
	
	__GGpioinfoDate.puiAddrBase = (uint32*)__GuiGpioBaseAddrTab[uiId];  /*  初始化GPIO结构体参数        */
	__GGpioinfoDate.uiOffBase   = 0;
	
	puiAddrBase = __GGpioinfoDate.puiAddrBase;                          /*  获取结构体参数              */
	uiOffBase   = __GGpioinfoDate.uiOffBase;
	
	uiArg &= 0xff;                                                      /*  取低8位做为识别GPIO口       */
    if ((puiAddrBase[__B_IO_PIN << uiOffBase] & (1 << uiArg)) != 0) {
        gpioClr(uicopyarg);                                             /*  输出低电平                  */
    } 
    else {
        gpioSet(uicopyarg);                                             /*  输出高电平                  */
    }	
	
}

/*********************************************************************************************************
** Function name:           gpioCpl
** Descriptions:            取反GPIO设备端口电平
** Input parameters:        uiArg  GPIO设备引脚宏定义(端口引用名称)
**                                 P0_00 ~ P0_31        
**                                 P1_16 ~ P1_31 
** Output parameters:       NONE
** Returned value:          OPERATE_SUCCESS
**                          OPERATE_FAIL 
** Example:                 gpioCpl( P0_00 );                       
*********************************************************************************************************/
int32 gpioCpl (uint32 uiArg)
{
    if ((uiArg <= P0_31) ||                                             /*  输入参数检测                */
	 	(uiArg >= P1_16 && uiArg <= P1_31)) {
	    
        if (uiArg <= P0_31) {                                           /*  P0口                        */
            __gpioCpl(0, uiArg);
        }  
        else {                                                          /*  P1口                        */
            __gpioCpl(1, uiArg);
        }
        return GPIO_OK;	
    }
    else {
        return GPIO_NOK;
    }
}

/*********************************************************************************************************
   END FILE
*********************************************************************************************************/

⌨️ 快捷键说明

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