📄 gpio.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 + -