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

📄 gpio.bak

📁 蓝宇BBPC-SOM2496嵌入式主板 GPIO实例代码与函数库
💻 BAK
字号:
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "GPIO.h"

/***************************************************************************
片上通用IO方向配制函数:		PIODirCfg
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Dir		=0,表示输入,=1表示输出,=2表示正常功能
返回值	:	char		=0,表示成功,非零表示失败

****************************************************************************/
char 	 PIODirCfg(int PIO_BIT_INDEX,  char Dir )
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;		
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
	}
	if(Dir==0)	/*表示配制为输入*/
	{		  
    		 outport( PIOModeR,inport (PIOModeR)& ~PIOBitMask);/*模式寄存器相应的位清零*/
    		 outport( PIODirR ,inport (PIODirR) |  PIOBitMask);/*模式寄存器相应的位置1*/
	}	
	else if(Dir==1)
	{
			 outport( PIOModeR,inport (PIOModeR)|PIOBitMask);/*模式寄存器相应的位置1*/
			 outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相应的位清零*/
	}
	else if(Dir==2)
	{
			 outport( PIOModeR,inport (PIOModeR)&~PIOBitMask);/*模式寄存器相应的位清零*/
			 outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相应的位清零*/
	}		
	return 0;	
}               
/***************************************************************************
片上通用IO写函数:		PIOWrite
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Val		=0,表示输出低电平,非零表示输出高电平
返回值	:	char		=0,表示成功,非零表示失败,方向设置有错
注意:		函数功能,只有在相应的位方向设置为输出时,才是有效的 		
****************************************************************************/
char 	PIOWrite(int PIO_BIT_INDEX,  char Val ) 
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	unsigned int PIODataR;				/*数据口寄存器*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;	
		PIODataR=OFFS_PIODATA1+CTL_OFF;
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
		PIODataR=OFFS_PIODATA0+CTL_OFF;
	}	
	if((inport (PIOModeR)&PIOBitMask)==0)	/*检查有效性*/
	{
		return 1;		/*表示方向不对*/	
    	}	 
	if((inport (PIODirR)&PIOBitMask)!=0)	/*检查有效性*/
	{
		return 1;		/*表示方向不对*/	
    	}	     	
	if(Val==0)
		outport( PIODataR,inport (PIODataR)& ~PIOBitMask);/*模式寄存器相应的位清零*/
	else
		outport( PIODataR,inport (PIODataR)|PIOBitMask);/*模式寄存器相应的位置1*/
	return 0;	

}
/***************************************************************************
片上通用IO读函数:		PIORead
入口参数:	int		PIO_BIT_INDEX  cpu 上双向IO索引号
		char		Val		
返回值	:	char		=0,表示输入为低电平,=1表示输入高电平,=3,表示失败,方向设置有错
注意:		函数功能,只有在相应的位方向设置为输入时,才是有效的 		
****************************************************************************/
char PIORead(int PIO_BIT_INDEX ) 
{
	unsigned int PIOBitMask=1;			/*PIO_BIT_INDEX,对应的掩码*/
	unsigned int PIOModeR;				/*模式寄存器的IO地址*/
	unsigned int PIODirR;				/*方向寄存器的IO地址*/
	unsigned int PIODataR;				/*数据口寄存器*/
	char val;					/*读的值*/
	if(PIO_BIT_INDEX>15)
	{
		PIO_BIT_INDEX-=16;
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE1+CTL_OFF;
		PIODirR =OFFS_PIODIR1 +CTL_OFF;	
		PIODataR=OFFS_PIODATA1+CTL_OFF;
	}	
	else
	{	
		PIOBitMask<<=PIO_BIT_INDEX;
		PIOModeR=OFFS_PIOMODE0+CTL_OFF;
		PIODirR =OFFS_PIODIR0 +CTL_OFF;
		PIODataR=OFFS_PIODATA0+CTL_OFF;
	}	
	if((inport (PIOModeR)&PIOBitMask)!=0)	/*检查有效性*/
	{
		return 3;		/*表示方向不对*/	
    	}	 
	if((inport (PIODirR)&PIOBitMask)==0)	/*检查有效性*/
	{
		return 3;		/*表示方向不对*/	
    	}	     	
	if(inport (PIODataR)& PIOBitMask)
		val=1;				/*输入高电平*/
	else		
		val=0;				/*输入低电平*/		
	return val;	
}
/***************************************************************************
扩展板上单向IO读函数:		EXTGPIORead
扩展IO输入,对应信号线GP17,GP16,GP15,GP14,GP13,GP12,GP11,GP10
入口参数:	
返回值	:	char		相应数据位等于0,表示输入为低电平,=1表示输入高电平
****************************************************************************/
unsigned char EXTGP1Read(void) 
{
	return inportb (GPIO1_PORT);
}
/***************************************************************************
扩展板上单向IO读函数:		EXTGP2WRITE
扩展IO输出,对应信号线GP25,GP24,GP23,GP22,GP21,GP20的数据位BIT5.....BIT0
入口参数:	
返回值	:	VOID
****************************************************************************/
void  EXTGP2WRITE(unsigned char Val)
{
	 outportb(GPIO2_PORT, (inportb (GPIO2_PORT)&0xC0)|Val);	
}
 
/***************************************************************************
使能看门狗:		EnableWDT
入口参数:	
返回值	:	VOID
****************************************************************************/
void EnableWDT(void)
{
	unsigned int WchCon;		
	WchCon=(
		(inport(CTL_OFF+OFFS_WCHDOGCON)|WCHDOG_EN)
		&(~WCHDOG_WRST)
		&(~WCHDOG_NMIFLAG)
		&(~WCHDOG_RSTFLAG)
		);
	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD1);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD2);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, WchCon);	/* Enable Watch-dog timer */
	
}
/***************************************************************************
禁止看门狗:		DisableWDT
入口参数:	
返回值	:	VOID
****************************************************************************/
void DisableWDT(void)
{
	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD1);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD2);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, 0x0000);	/* Disable Watch-dog timer */
}
/***************************************************************************
喂狗:		FeedWDT
入口参数:	
返回值	:	VOID
****************************************************************************/
void FeedWDT(void ) 
{	
     	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_RSTCMD1);	/* Watch-dog Timer reset sequence */
      	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_RSTCMD2);	/* Watch-dog Timer reset sequence */
}
/***************************************************************************
设看门狗的时间间隔:SetWDT
入口参数:	Idan ;Idan设时间间隔,
-----------------------------------------------------------------------
参数:	0       1     2       3        4        5        6        7 

cpu主频:  
50  MHz 41   us 42 ms 83.8 ms 167.8 ms 335.5 ms 671   ms 1.34   s  2.68 s
75  MHz 27.3 us 28 ms 55.9 ms 111.8 ms 223.7 ms 447.4 ms 894.8  ms 1.79 s
100 MHz 20.5 us 21 ms 41.9 ms 83.9 ms  167.8 ms 335.5 ms 671    	ms  1.34 s

返回值	:	VOID
****************************************************************************/
void SetWDT(char Idan)
{
	unsigned int watcon=1;
	if(Idan>7)		/*超出表示最大时间间隔*/
		Idan=7;
	watcon<<=Idan;
 	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD1);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD2);	/* Watch-dog Timer write sequence */
  	outport(CTL_OFF+OFFS_WCHDOGCON, watcon);
  	return;	
}
/***************************************************************************
冷启动系统:
入口参数:	
返回值	:	VOID
****************************************************************************/
void  ColdResetSystem(void)
{
  /* enable watch dog to reset system */
  disable();
  outport(BIOS_PAGE_REG,0xff);
  outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD1);	/* Watch-dog Timer write sequence */
  outport(CTL_OFF+OFFS_WCHDOGCON, WCHDOG_CMD2);	/* Watch-dog Timer write sequence */
  outport(CTL_OFF+OFFS_WCHDOGCON, 0xC001);
  while(1);		//等看门狗超时
  enable();		//永远执行不到
}

⌨️ 快捷键说明

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