📄 iooperate.c
字号:
#include "config.h"
/*********************************************************************************************************
** 函数名称: SetIO_Func
** 功能描述: 设置IO口引脚的功能
** 输 入: IoPort:高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬空,3:下拉
),其中低8位表示IO口在IO组中的位置, InOut当作为IO口时的输入输出控制 0:输入 1:输出)
** 输 出: ERR_OP //操作失败 NO_ERR //操作成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-21
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 SetIO_Func(uint16 IoPort ,uint8 Fuct,uint8 InOut)
{
uint8 PortNum,err;
uint32 Pull,Sift;
// OS_ENTER_CRITICAL();
err=NO_ERR;
PortNum=IoPort>>12; //取出IO口选项
Pull=(IoPort&0x0F00)>>8; //取出连续IO口上下拉状态
if(Pull==1) Pull=0x02; //禁止设置保留状态
IoPort=IoPort&0x001F; //取出IO的位置
switch(PortNum)
{
case 0: //P0口
{
// SCS |= FAST_PORT; //设定为高速口
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE0=(PINMODE0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL0=(PINSEL0 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE1=(PINMODE1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL1=(PINSEL1 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO0DIR =FIO0DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO0DIR =FIO0DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 1: //P1口
{
// SCS |= FAST_PORT; //设定为高速口
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE2=(PINMODE2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL2=(PINSEL2 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE3=(PINMODE3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL3=(PINSEL3 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO1DIR =FIO1DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO1DIR =FIO1DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 2: //P2口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE4=(PINMODE4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL4=(PINSEL4 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE5=(PINMODE5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL5=(PINSEL5 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO2DIR =FIO2DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO2DIR =FIO2DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 3: //P3口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE6=(PINMODE6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL6=(PINSEL6 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE7=(PINMODE7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL7=(PINSEL7 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO3DIR =FIO3DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO3DIR =FIO3DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
case 4: //P4口
{
if(IoPort<16) //低16个IO口
{
Sift=IoPort<<1;
PINMODE8=(PINMODE8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL8=(PINSEL8 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
else
{
Sift=(IoPort-16)<<1;
PINMODE9=(PINMODE9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Pull&0x03)<<Sift); //上下拉状态
PINSEL9=(PINSEL9 &(~((uint32)(0x3)<<Sift)))| ((uint32)(Fuct&0x03)<<Sift); //IO 功能
}
if(Fuct==0)
{
if(InOut==DIR_IN)
{
FIO4DIR =FIO4DIR&(~((uint32)(0x1)<<IoPort));
}
else
{
FIO4DIR =FIO4DIR|((uint32)(0x1)<<IoPort);
}
}
}break;
default: //错误设置
{
err=ERR_OP;
}break;
}
// OS_EXIT_CRITICAL();
return err;
}
/*********************************************************************************************************
** 函数名称: SetIO
** 功能描述: 置位IO口引脚的 高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬
空,3:下拉),其中低8位表示IO口在IO组中的位置
** 输 入:
** 输 出: ERR_OP //操作失败 NO_ERR //操作成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-22
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 SetIO(uint16 IoPort)
{
uint8 PortNum,err;
PortNum=IoPort>>12;
IoPort&=0x1F;
err=NO_ERR;
switch(PortNum)
{
case 0:
{
FIO0SET=(uint32)(0x01)<<IoPort;
}break;
case 1:
{
FIO1SET=(uint32)(0x01)<<IoPort;
}break;
case 2:
{
FIO2SET=(uint32)(0x01)<<IoPort;
}break;
case 3:
{
FIO3SET=(uint32)(0x01)<<IoPort;
}break;
case 4:
{
FIO4SET=(uint32)(0x01)<<IoPort;
}break;
default:
{
err=ERR_OP;
}break;
}
return err;
}
/*********************************************************************************************************
** 函数名称: ClrIO
** 功能描述: 清零IO口引脚的 高8位中高4字节表示该IO口在P口为Pn,低4位表示该定义包含IO口上下拉状态(0:上拉,1:保留,2:悬
空,3:下拉),其中低8位表示IO口在IO组中的位置
** 输 入:
** 输 出: ERR_OP //操作失败 NO_ERR //操作成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 单长城
** 日 期: 2007-6-22
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -