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

📄 hardware.c

📁 ARM得编程实例。很经典。在win ce5.0环境下的编程实例
💻 C
字号:
/*******************************************************************
   
*******************************************************************/
#include "system.h"

#ifdef INTEL_X86_CPU 
    #include <stdio.h>
    #include <conio.h>
    #include <io.h>
    #include <stdlib.h>
#endif

#include "utility.h"
#include "hardware.h"

#ifdef ARM_XSCALE_CPU
    #include "timer.h"
#endif

/***************************** 局部变量定义 ********************************/
static INT8U LEDSTATE = 0;   /* LED输出值,228端口读出值永为0 */
static INT8U LED229 = 0;     /* 229端口输出值,229端口读出值永为0 */

/**************************** 全局函数定义 *********************************/

/* 
    Function Name : getDPRBaseAddr
    Parameter     : None 
    Return Type   : pointer to INT8U (调用时需要强制转换为需要的类型)
    Description   : get Dual-Port Ram Base Address, 0x2000表示双口RAM大小(8K), 
                    双口RAM占用窗口地址的后8K 
*/
LPBYTE  getDPRBaseAddr(void) 
{
#ifdef ARM_XSCALE_CPU
//    return((LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0x2000));
    return((LPBYTE)0x3c0ca000);
#else
    return(LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0x2000);
#endif
}


/* 
    Function Name : getSRAMCPBAddr
    Parameter     : None 
    Return Type   : pointer to INT8U (调用时需要强制转换为需要的类型)
    Description   : get SRAM Current Page's Base Address, SRAM当前页占用窗口
                    地址的前8K,需要访问的SRAM页通过selectPage()设定 
*/
LPBYTE getSRAMCPBAddr(void) 
{
#ifdef ARM_XSCALE_CPU
    return((LPBYTE)0x3c0c8000);
#else
    return(LPBYTE)MK_FP( ReadPort(WINPORT) << 8 , 0);
#endif
}


/* 
    Function Name : selectPage
    Parameter     : npage (INT8U) ,页号, 取值范围 0 -128 
    Return Type   : void
    Description   : select SRAM page to operate
                    SRAM为1024K,每页为8K,共128页
*/
void selectPage(INT8U npage) 
{
    WritePort(PAGEPORT, npage);
}


/* 
    Function Name : getICUslotID
    Parameter     : None 
    Return Type   : INT8U (unsigned char)
    Return Value  : 0表示A系ICU1, 1表示A系ICU2, 2表示COMM1
                    3表示B系ICU1, 4表示B系ICU2, 5表示COMM2 
    Description   : 得到本板ICU所在的槽号
*/
INT8U  getICUslotID(void)
{
    return((INT8U)((ReadPort(ICUPORT) & 0x38) >> 3));
}


/* 
    Function Name : getICU_ID
    Parameter     : None 
    Return Type   : INT8U (unsigned char)
    Return Value  : 1表示ICU1, 2表示ICU2, 0表示故障(COMM槽) 
    Description   : 得到本板的ICU的编号 
*/
INT8U getICU_ID(void) 
{
#ifdef ARM_XSCALE_CPU
    switch (getICUslotID())
    {
    case 0:
    case 3:
        return(1);
    case 1:
    case 4:
        return(2);
    default:
        return(0);
    }
#else
    return(INT8U)((((ReadPort(ICUPORT) & 0x38) >> 3) + 1 ) % 3);
#endif
}


/* 判断系内另一个ICU是否存在  */
BOOL isICUInExist(void) 
{
    return(0x00 == (INT8U)((ReadPort(ICUPORT) & 0x40) >> 6));
}


/* 判断另一个系的ICU1是否存在,对于ICU2永远返回false */
BOOL isICUOutExist(void) 
{
    if (1 == getICU_ID()) 
    {
        return(0x00 == (INT8U)((ReadPort(ICUPORT) & 0x80) >> 7));
    }
    else
    {
        return(0 == 1);
    }
}


/* 闪烁LEDPORT端口bitN位LED */
void flashLed(INT8U bitN)
{
    LEDSTATE ^= (INT8U)bitN;
    WritePort(LEDPORT, LEDSTATE);
}


/* 点亮LEDPORT端口bitN位LED */
void lightenLed(INT8U bitN)
{
    if (bitN == POWER_LED)
    {
        LEDSTATE = (INT8U)(LEDSTATE & (~bitN));
	}
    else
    {
        LEDSTATE = (INT8U)(LEDSTATE | bitN);
	}
        
    WritePort(LEDPORT, LEDSTATE);
}


/* 熄灭LEDPORT端口bitN位LED */
void darkenLed(INT8U bitN)
{
    if (bitN == POWER_LED)
    {
        LEDSTATE = (INT8U)(LEDSTATE | bitN);
	}
    else
    {
        LEDSTATE = (INT8U)(LEDSTATE & (~bitN));
	}
        
    WritePort(LEDPORT, LEDSTATE);
}


/* 
    设置看门狗时间
    看门狗时间 = (nTime - 1) * 26.214ms
    其中, 1 < nTime < 255
 */
void setWDG(INT8U nTime) 
{
    WritePort(WDSETPORT, nTime);
}


/* 打开看门狗 */
void enableWDG(void)
{
    WritePort(WDENPORT, 0x01);
}


/* 清看门狗 */
void clearWDG(void)
{
    ReadPort(WDENPORT);
}


/* 故障条件下系统退出 */
void failureExit(void)
{
    TIMER  delay;
    
    settimer(&delay, 200);
    while (1)
    {
        flashLed(POWER_LED);
        starttimer(&delay);
        while (isTimeout(&delay) != 1);
    }
}


/* 
    Function Name : getSysID
    Parameter     : None 
    Return Type   : INT8U (unsigned char)
    Return Value  : TSYSA表示A系, TSYSB表示B系, TSYSUNKNOWN表示故障 
    Description   : 得到当前系统的系编号 
*/
INT8U getSysID(void)
{
    INT8U rtn = TSYSUNKNOWN;
    
    switch ((ReadPort(ICUPORT) & 0x38) >> 3)
    {
    case 0:  
    case 1:  
    case 2:  setABLED(ASYSTEM); 
             rtn = TSYSA; 
             break;
    case 3:  
    case 4:  
    case 5:  setABLED(BSYSTEM); 
             rtn = TSYSB; 
             break;
    default: break;
    }
    return(rtn);
}         


/* 
    Function Name : setABLED
    Parameter     : state (INT8U) ,LED状态, 取值范围 { ASYSTEM, BSYSTEM } 
    Return Type   : void
    Description   : 设置A,B系指示灯
*/
void setABLED(INT8U state)
{
    LED229 = (INT8U)((LED229 & 0xFE) | state);
    
    WritePort(LEDABSYN, LED229);
}       


/* 
    Function Name : setSYNLED
    Parameter     : state (INT8U) ,LED状态, 取值范围 { INSYN, NOSYN } 
    Return Type   : void
    Description   : 设置SYNCH指示灯的状态
*/
void setSYNLED(INT8U state)
{        
    LED229 = (INT8U)((LED229 & 0xFB) | state);
    
    WritePort(LEDABSYN, LED229);    
}


/* Without OS, we must implement the following functions ourselves. */
#ifdef ARM_XSCALE_CPU
unsigned char inp(unsigned short ioOffset)
{
    return(*(volatile unsigned char*)(ARM_IO_BASE + ioOffset));
}


unsigned char outp(unsigned short ioOffset, unsigned char value)
{
    *(volatile unsigned char*)(ARM_IO_BASE + ioOffset) = value;
    return(value);
}


void* 	memcpy(void* pdest, const void* psrc, unsigned short ulen)
{
    unsigned short i = 0;
    for (i = 0; i < ulen; i++)
    {
        *(LPBYTE)(pdest + i) = *(LPBYTE)(psrc + i);
    }
    
    return(pdest);
}

void ClearLed(void)
{
    LEDSTATE = 0x00;
    LED229 = 0x00;
}
#endif

⌨️ 快捷键说明

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