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