?? gpio.bak
字號(hào):
#include <dos.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "GPIO.h"
/***************************************************************************
片上通用IO方向配制函數(shù): PIODirCfg
入口參數(shù): int PIO_BIT_INDEX cpu 上雙向IO索引號(hào)
char Dir =0,表示輸入,=1表示輸出,=2表示正常功能
返回值 : char =0,表示成功,非零表示失敗
****************************************************************************/
char PIODirCfg(int PIO_BIT_INDEX, char Dir )
{
unsigned int PIOBitMask=1; /*PIO_BIT_INDEX,對(duì)應(yīng)的掩碼*/
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);/*模式寄存器相應(yīng)的位清零*/
outport( PIODirR ,inport (PIODirR) | PIOBitMask);/*模式寄存器相應(yīng)的位置1*/
}
else if(Dir==1)
{
outport( PIOModeR,inport (PIOModeR)|PIOBitMask);/*模式寄存器相應(yīng)的位置1*/
outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相應(yīng)的位清零*/
}
else if(Dir==2)
{
outport( PIOModeR,inport (PIOModeR)&~PIOBitMask);/*模式寄存器相應(yīng)的位清零*/
outport( PIODirR ,inport (PIODirR) &~PIOBitMask);/*模式寄存器相應(yīng)的位清零*/
}
return 0;
}
/***************************************************************************
片上通用IO寫(xiě)函數(shù): PIOWrite
入口參數(shù): int PIO_BIT_INDEX cpu 上雙向IO索引號(hào)
char Val =0,表示輸出低電平,非零表示輸出高電平
返回值 : char =0,表示成功,非零表示失敗,方向設(shè)置有錯(cuò)
注意: 函數(shù)功能,只有在相應(yīng)的位方向設(shè)置為輸出時(shí),才是有效的
****************************************************************************/
char PIOWrite(int PIO_BIT_INDEX, char Val )
{
unsigned int PIOBitMask=1; /*PIO_BIT_INDEX,對(duì)應(yīng)的掩碼*/
unsigned int PIOModeR; /*模式寄存器的IO地址*/
unsigned int PIODirR; /*方向寄存器的IO地址*/
unsigned int PIODataR; /*數(shù)據(jù)口寄存器*/
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; /*表示方向不對(duì)*/
}
if((inport (PIODirR)&PIOBitMask)!=0) /*檢查有效性*/
{
return 1; /*表示方向不對(duì)*/
}
if(Val==0)
outport( PIODataR,inport (PIODataR)& ~PIOBitMask);/*模式寄存器相應(yīng)的位清零*/
else
outport( PIODataR,inport (PIODataR)|PIOBitMask);/*模式寄存器相應(yīng)的位置1*/
return 0;
}
/***************************************************************************
片上通用IO讀函數(shù): PIORead
入口參數(shù): int PIO_BIT_INDEX cpu 上雙向IO索引號(hào)
char Val
返回值 : char =0,表示輸入為低電平,=1表示輸入高電平,=3,表示失敗,方向設(shè)置有錯(cuò)
注意: 函數(shù)功能,只有在相應(yīng)的位方向設(shè)置為輸入時(shí),才是有效的
****************************************************************************/
char PIORead(int PIO_BIT_INDEX )
{
unsigned int PIOBitMask=1; /*PIO_BIT_INDEX,對(duì)應(yīng)的掩碼*/
unsigned int PIOModeR; /*模式寄存器的IO地址*/
unsigned int PIODirR; /*方向寄存器的IO地址*/
unsigned int PIODataR; /*數(shù)據(jù)口寄存器*/
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; /*表示方向不對(duì)*/
}
if((inport (PIODirR)&PIOBitMask)==0) /*檢查有效性*/
{
return 3; /*表示方向不對(duì)*/
}
if(inport (PIODataR)& PIOBitMask)
val=1; /*輸入高電平*/
else
val=0; /*輸入低電平*/
return val;
}
/***************************************************************************
擴(kuò)展板上單向IO讀函數(shù): EXTGPIORead
擴(kuò)展IO輸入,對(duì)應(yīng)信號(hào)線GP17,GP16,GP15,GP14,GP13,GP12,GP11,GP10
入口參數(shù):
返回值 : char 相應(yīng)數(shù)據(jù)位等于0,表示輸入為低電平,=1表示輸入高電平
****************************************************************************/
unsigned char EXTGP1Read(void)
{
return inportb (GPIO1_PORT);
}
/***************************************************************************
擴(kuò)展板上單向IO讀函數(shù): EXTGP2WRITE
擴(kuò)展IO輸出,對(duì)應(yīng)信號(hào)線GP25,GP24,GP23,GP22,GP21,GP20的數(shù)據(jù)位BIT5.....BIT0
入口參數(shù):
返回值 : VOID
****************************************************************************/
void EXTGP2WRITE(unsigned char Val)
{
outportb(GPIO2_PORT, (inportb (GPIO2_PORT)&0xC0)|Val);
}
/***************************************************************************
使能看門(mén)狗: EnableWDT
入口參數(shù):
返回值 : 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 */
}
/***************************************************************************
禁止看門(mén)狗: DisableWDT
入口參數(shù):
返回值 : 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
入口參數(shù):
返回值 : 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 */
}
/***************************************************************************
設(shè)看門(mén)狗的時(shí)間間隔:SetWDT
入口參數(shù): Idan ;Idan設(shè)時(shí)間間隔,
-----------------------------------------------------------------------
參數(shù): 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) /*超出表示最大時(shí)間間隔*/
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;
}
/***************************************************************************
冷啟動(dòng)系統(tǒng):
入口參數(shù):
返回值 : 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); //等看門(mén)狗超時(shí)
enable(); //永遠(yuǎn)執(zhí)行不到
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -