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

📄 gio270.c

📁 dm270 source code
💻 C
字号:
/*
    DM270 ARM Evaluation Software

    (c)Texas Instruments 2003
*/

/**
    \file gio270.c
    \brief GIO Related APIs
*/
#include <gio270.h>

static void GIO_REG_SET( Uint32 address, Uint16 shift, Uint8 value ) {
    Uint16 reg_value;

    reg_value = REG16(address);
    if(value)
        reg_value |= (1<<shift);
    else
        reg_value &= ~(1<<shift);
    REG16(address) = reg_value;
}

static Uint8 GIO_REG_GET( Uint32 address, Uint16 shift) {
    return ( ( REG16(address) & (1<<shift) ) >> shift );
}

/**
    \brief  Set GIO pin configuration

    For GIO25, use GIO_setGio25Mode() to set GIO25 in alternate mode

    \param  gioID       GIO pin ID
    \param  gioConfig   GIO pin configuration paramters

    \return if success, \c E_PASS, else error code

    \see GIO_ConfigData, GIO_ID
*/
STATUS GIO_setConfig( GIO_ID gioID, GIO_ConfigData *gioConfig ) {
    STATUS status=E_PASS;

    if( gioID >= GIO_MAX || gioConfig == NULL)
        return E_INVALID_INPUT;

    if( gioID >= GIO32 ) {

        GIO_REG_SET( GIO_ADDR(DIR2), gioID - 32, gioConfig->dir == GIO_INPUT ? 1 : 0 );
        if(gioConfig->dir == GIO_INPUT) {
            GIO_REG_SET( GIO_ADDR(INV2), gioID - 32, gioConfig->invert ==  TRUE ? 1 : 0 );
            GIO_REG_SET( GIO_ADDR(CHAT2), gioID - 32, gioConfig->chatterInvalid ==  TRUE ? 1 : 0 );
        } else
            GIO_REG_SET( GIO_ADDR(INV2), gioID - 32, 0 );
    } else
    if( gioID >=16 ) {

        GIO_REG_SET( GIO_ADDR(DIR1), gioID - 16, gioConfig->dir == GIO_INPUT ? 1 : 0 );
        if(gioConfig->dir == GIO_INPUT) {
            GIO_REG_SET( GIO_ADDR(INV1), gioID - 16, gioConfig->invert ==  TRUE ? 1 : 0 );
            GIO_REG_SET( GIO_ADDR(CHAT1), gioID - 16, gioConfig->chatterInvalid ==  TRUE ? 1 : 0 );
        } else
            GIO_REG_SET( GIO_ADDR(INV1), gioID - 16, 0 );

    } else {

        GIO_REG_SET( GIO_ADDR(DIR0), gioID , gioConfig->dir == GIO_INPUT ? 1 : 0 );
        if(gioConfig->dir == GIO_INPUT) {
            GIO_REG_SET( GIO_ADDR(INV0), gioID , gioConfig->invert ==  TRUE ? 1 : 0 );
            GIO_REG_SET( GIO_ADDR(CHAT0), gioID , gioConfig->chatterInvalid ==  TRUE ? 1 : 0 );
        }
        else
            GIO_REG_SET( GIO_ADDR(INV0), gioID , 0 );
    }

    if( gioID >= GIO26)
        GIO_REG_SET( GIO_ADDR(FSEL1), gioID - GIO26 + 3 , gioConfig->altUse ==  TRUE ? 1 : 0 );
    else if( gioID == GIO24 )
        GIO_REG_SET( GIO_ADDR(FSEL1), gioID - 24 , gioConfig->altUse ==  TRUE ? 1 : 0 );
    else if(gioID >= GIO8 )
        GIO_REG_SET( GIO_ADDR(FSEL0), gioID - 8 , gioConfig->altUse ==  TRUE ? 1 : 0 );

    return status;
}

/**
    \brief  Set GIO for use as an interrupt

    Valid only for GIO0-GIO15 \n
    No need call GIO_setConfig(), since this routine sets GIO in input mode  \n

    \param  gioID       GIO pin ID
    \param  gioAsInt    TRUE:Use GIO as interrupt, FALSE: Disable use of GIO as interrupt
    \param  intEdge     0:GIO_INT_EDGE_RISE_SIDE, 0:GIO_INT_EDGE_FALL_SIDE, 2:GIO_INT_EDGE_BOTH_SIDE

    \return if success, \c E_PASS, else error code

    \see GIO_ID
*/
STATUS GIO_setAsInt( GIO_ID gioID, BOOL gioAsInt, Uint8 intEdge) {
    STATUS status=E_PASS;

    if(gioID>=GIO16)
        return E_INVALID_INPUT;

    GIO_REG_SET( GIO_ADDR(IRQPORT), gioID, gioAsInt == TRUE ? 1 : 0 );

    if(gioAsInt==FALSE)
        return status;

    GIO_REG_SET( GIO_ADDR(DIR0), gioID, 1);     // set GIO as input

    switch(intEdge) {
        case GIO_INT_EDGE_RISE_SIDE:
            GIO_REG_SET( GIO_ADDR(IRQEDGE), gioID, 0);
            GIO_REG_SET( GIO_ADDR(INV0), gioID, 1);
            break;
        case GIO_INT_EDGE_FALL_SIDE:
            GIO_REG_SET( GIO_ADDR(IRQEDGE), gioID, 0);
            GIO_REG_SET( GIO_ADDR(INV0), gioID, 0);
            break;
        case GIO_INT_EDGE_BOTH_SIDE:
            GIO_REG_SET( GIO_ADDR(IRQEDGE), gioID, 1);
            break;
        default:
            status=E_INVALID_INPUT;
            break;
    }
    return status;
}


/**
    \brief  Set GIO25 in alternate mode

    Valid only for GIO25

    \param  gio25Mode       0:GIO25_MODE_NORMAL, 1:GIO25_MODE_MIRQ, 2:GIO25_MODE_MRST

    \return if success, \c E_PASS, else error code
*/
STATUS GIO_setGio25Mode( Uint8 gio25Mode ) {
    GIO_FSET( FSEL1, GIO25SEL, gio25Mode);
    return E_PASS;
}

/**
    \brief  Set GIO pin to high

    Make sure GIO pin is configured as output by using GIO_setConfig()

    \param gioID        GIO ID

    \return if success, \c E_PASS, else error code
*/
STATUS GIO_setBit( GIO_ID gioID ) {
    STATUS status=E_PASS;

    if( gioID >= GIO_MAX)
        return E_INVALID_INPUT;

    if( gioID >= GIO32 ) {
        GIO_RSET( BITSET2, 1<< (gioID - GIO32) );
    } else
    if( gioID >=16 ) {
        GIO_RSET( BITSET1, 1<< (gioID - GIO16) );
    } else {
        GIO_RSET( BITSET0, 1<< (gioID) );
    }

    return status;
}

/**
    \brief  Set GIO pin to low

    Make sure GIO pin is configured as output by using GIO_setConfig()

    \param gioID        GIO ID

    \return if success, \c E_PASS, else error code
*/
STATUS GIO_clearBit( GIO_ID gioID ) {
    STATUS status=E_PASS;

    if( gioID >= GIO_MAX)
        return E_INVALID_INPUT;

    if( gioID >= GIO32 ) {
        GIO_RSET( BITCLR2, 1<< (gioID - GIO32) );
    } else
    if( gioID >=16 ) {
        GIO_RSET( BITCLR1, 1<< (gioID - GIO16) );
    } else {
        GIO_RSET( BITCLR0, 1<< (gioID) );
    }

    return status;
}

/**
    \brief  Get GIO pin status

    Make sure GIO pin is configured as input by using GIO_setConfig()

    \param gioID        GIO ID

    \return GIO pin status,  0 (low) or 1 (high)
*/
Uint8  GIO_getBit( GIO_ID gioID ) {

    if( gioID >= GIO_MAX)
        return 0;

    if( gioID >= GIO32 ) {
        return GIO_REG_GET( GIO_ADDR(BITSET2), gioID - GIO32);
    } else
    if( gioID >=16 ) {
        return GIO_REG_GET( GIO_ADDR(BITSET1), gioID - GIO16);
    } else {
        return GIO_REG_GET( GIO_ADDR(BITSET0), gioID);
    }
}

/**
    \brief  Set GIO invalid chatter width

    See register NCHAT (0x305A2) for details.

    \param  width       1..16, unit: ARM CLK cycle

    \return if success, \c E_PASS, else error code
*/
STATUS GIO_setChatterWidth( Uint8 width) {
    STATUS status=E_PASS;

    if(width>0 && width <=16) {
        GIO_RSET( NCHAT, width-1);
    } else
        status = E_INVALID_INPUT;

    return status;
}

/**
    \brief  Check if GIO is configured in normal mode

    \param  gioID       GIO ID

    \return TRUE: GIO is configured as normal GIO, \n FALSE: GIO is configured as alternate function
*/
BOOL GIO_isNormalMode( GIO_ID gioID ) {
    Uint8 value=TRUE;

    if( gioID >= GIO_MAX)
        return (BOOL)value;

    if( gioID >= GIO26)
        value = GIO_REG_GET( GIO_ADDR(FSEL1), gioID - GIO26 + 3 );
    else if( gioID == GIO25)
        value = GIO_FGET( FSEL1, GIO25SEL );
    else if( gioID == GIO24 )
        value = GIO_REG_GET( GIO_ADDR(FSEL1), gioID - 24 );
    else if(gioID >= GIO8 )
        value = GIO_REG_GET( GIO_ADDR(FSEL0), gioID - 8 );

    return (BOOL)value ? TRUE : FALSE;
}




⌨️ 快捷键说明

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