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