?? gpio.c
字號:
//! - \b GPIO_PIN_TYPE_OD_WPU
//! - \b GPIO_PIN_TYPE_OD_WPD
//! - \b GPIO_PIN_TYPE_ANALOG
//!
//! where \b GPIO_PIN_TYPE_STD* specifies a push-pull pin, \b GPIO_PIN_TYPE_OD*
//! specifies an open-drain pin, \b *_WPU specifies a weak pull-up, \b *_WPD
//! specifies a weak pull-down, and \b GPIO_PIN_TYPE_ANALOG specifies an
//! analog input (for the comparators).
//!
//! The pins are specified using a bit-packed byte, where each bit that is
//! set identifies the pin to be accessed, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPadConfigSet(unsigned long ulPort, unsigned char ucPins,
unsigned long ulStrength, unsigned long ulPinType)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
ASSERT((ulStrength == GPIO_STRENGTH_2MA) ||
(ulStrength == GPIO_STRENGTH_4MA) ||
(ulStrength == GPIO_STRENGTH_8MA) ||
(ulStrength == GPIO_STRENGTH_8MA_SC));
ASSERT((ulPinType == GPIO_PIN_TYPE_STD) ||
(ulPinType == GPIO_PIN_TYPE_STD_WPU) ||
(ulPinType == GPIO_PIN_TYPE_STD_WPD) ||
(ulPinType == GPIO_PIN_TYPE_OD) ||
(ulPinType == GPIO_PIN_TYPE_OD_WPU) ||
(ulPinType == GPIO_PIN_TYPE_OD_WPD) ||
(ulPinType == GPIO_PIN_TYPE_ANALOG))
//
// Set the output drive strength.
//
HWREG(ulPort + GPIO_O_DR2R) = ((ulStrength & 1) ?
(HWREG(ulPort + GPIO_O_DR2R) | ucPins) :
(HWREG(ulPort + GPIO_O_DR2R) & ~(ucPins)));
HWREG(ulPort + GPIO_O_DR4R) = ((ulStrength & 2) ?
(HWREG(ulPort + GPIO_O_DR4R) | ucPins) :
(HWREG(ulPort + GPIO_O_DR4R) & ~(ucPins)));
HWREG(ulPort + GPIO_O_DR8R) = ((ulStrength & 4) ?
(HWREG(ulPort + GPIO_O_DR8R) | ucPins) :
(HWREG(ulPort + GPIO_O_DR8R) & ~(ucPins)));
HWREG(ulPort + GPIO_O_SLR) = ((ulStrength & 8) ?
(HWREG(ulPort + GPIO_O_SLR) | ucPins) :
(HWREG(ulPort + GPIO_O_SLR) & ~(ucPins)));
//
// Set the pin type.
//
HWREG(ulPort + GPIO_O_ODR) = ((ulPinType & 1) ?
(HWREG(ulPort + GPIO_O_ODR) | ucPins) :
(HWREG(ulPort + GPIO_O_ODR) & ~(ucPins)));
HWREG(ulPort + GPIO_O_PUR) = ((ulPinType & 2) ?
(HWREG(ulPort + GPIO_O_PUR) | ucPins) :
(HWREG(ulPort + GPIO_O_PUR) & ~(ucPins)));
HWREG(ulPort + GPIO_O_PDR) = ((ulPinType & 4) ?
(HWREG(ulPort + GPIO_O_PDR) | ucPins) :
(HWREG(ulPort + GPIO_O_PDR) & ~(ucPins)));
HWREG(ulPort + GPIO_O_DEN) = ((ulPinType & 8) ?
(HWREG(ulPort + GPIO_O_DEN) | ucPins) :
(HWREG(ulPort + GPIO_O_DEN) & ~(ucPins)));
}
//*****************************************************************************
//
//! Gets the pad configuration for the specified pin of the selected GPIO
//! port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param ucPin pin number of the specified pin, relative to the selected
//! GPIO port.
//! \param pulStrength pointer to storage for the output drive strength
//! \param pulPinType pointer to storage for the output drive type
//!
//! This function gets the pad configuration for a specified pin on the
//! selected GPIO port. The values returned in \e eStrength and \e eOutType
//! correspond to the values used in GPIOPadConfigSet(). This function also
//! works for pins configured as input pins; however, the only meaningful
//! data returned is whether the pin is terminated with a pull-up or
//! down resistor.
//!
//! \return None
//
//*****************************************************************************
void
GPIOPadConfigGet(unsigned long ulPort, unsigned char ucPin,
unsigned long *pulStrength, unsigned long *pulPinType)
{
unsigned long ulTemp1, ulTemp2, ulTemp3, ulTemp4;
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
ASSERT(ucPin < 8);
//
// Convert from a pin number to a bit position.
//
ucPin = (1 << ucPin);
//
// Get the drive strength for this pin.
//
ulTemp1 = HWREG(ulPort + GPIO_O_DR2R);
ulTemp2 = HWREG(ulPort + GPIO_O_DR4R);
ulTemp3 = HWREG(ulPort + GPIO_O_DR8R);
ulTemp4 = HWREG(ulPort + GPIO_O_SLR);
*pulStrength = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) |
((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0));
//
// Get the pin type.
//
ulTemp1 = HWREG(ulPort + GPIO_O_ODR);
ulTemp2 = HWREG(ulPort + GPIO_O_PUR);
ulTemp3 = HWREG(ulPort + GPIO_O_PDR);
ulTemp4 = HWREG(ulPort + GPIO_O_DEN);
*pulPinType = (((ulTemp1 & ucPin) ? 1 : 0) | ((ulTemp2 & ucPin) ? 2 : 0) |
((ulTemp3 & ucPin) ? 4 : 0) | ((ulTemp4 & ucPin) ? 8 : 0));
}
//*****************************************************************************
//
//! Enables interrupts for the specified pins of the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param ucPins bit-packed representation of the specified pins
//!
//! Unmasks the interrupt for the specified pins.
//!
//! The pins are specified using a bit-packed byte, where each bit that is
//! set identifies the pin to be accessed, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPinIntEnable(unsigned long ulPort, unsigned char ucPins)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Enable the interrupts.
//
HWREG(ulPort + GPIO_O_IM) |= ucPins;
}
//*****************************************************************************
//
//! Disables interrupts for the specified pins of the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param ucPins bit-packed representation of the specified pins
//!
//! Masks the interrupt for the specified pins.
//!
//! The pins are specified using a bit-packed byte, where each bit that is
//! set identifies the pin to be accessed, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPinIntDisable(unsigned long ulPort, unsigned char ucPins)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Disable the interrupts.
//
HWREG(ulPort + GPIO_O_IM) &= ~(ucPins);
}
//*****************************************************************************
//
//! Gets interrupt status for all the pins of the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param bMasked specifies whether masked or raw interrupt
//! status is returned
//!
//! If \e bMasked is set as \b true, then the masked interrupt status is
//! returned; otherwise, the raw interrupt status will be returned.
//!
//! \return Returns a bit-packed byte, where each bit that is set identifies
//! an active masked or raw interrupt, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc. Bits
//! 31:8 should be ignored.
//
//*****************************************************************************
long
GPIOPinIntStatus(unsigned long ulPort, tBoolean bMasked)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Return the interrupt status.
//
if(bMasked)
{
return(HWREG(ulPort + GPIO_O_MIS));
}
else
{
return(HWREG(ulPort + GPIO_O_RIS));
}
}
//*****************************************************************************
//
//! Clears the interrupt for the specified pins of the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param ucPins bit-packed representation of the specified pins
//!
//! Clears the interrupt for the specified pins.
//!
//! The pins are specified using a bit-packed byte, where each bit that is
//! set identifies the pin to be accessed, and where bit 0 of the byte
//! represents GPIO port pin 0, bit 1 represents GPIO port pin 1, etc.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPinIntClear(unsigned long ulPort, unsigned char ucPins)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Clear the interrupts.
//
HWREG(ulPort + GPIO_O_ICR) = ucPins;
}
//*****************************************************************************
//
//! Registers an interrupt.handler for the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//! \param pfIntHandler pointer to the GPIO port interrupt.handling function
//!
//! This function will ensure that the interrupt.handler specified by \e
//! pfIntHandler is called when an interrupt is detected from the selected
//! GPIO port. This function will also enable the corresponding GPIO
//! interrupt in the interrupt controller; individual pin interrupts and
//! interrupt sources must be enabled with GPIOPinIntEnable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPortIntRegister(unsigned long ulPort, void (*pfIntHandler)(void))
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Get the interrupt number associated with the specified GPIO.
//
ulPort = GPIOGetIntNumber(ulPort);
//
// Register the interrupt.handler.
//
IntRegister(ulPort, pfIntHandler);
//
// Enable the GPIO interrupt.
//
IntEnable(ulPort);
}
//*****************************************************************************
//
//! Removes an interrupt.handler for the selected GPIO port.
//!
//! \param ulPort base address of the selected GPIO port
//!
//! This function will unregister the interrupt.handler for the specified
//! GPIO port. This function will also disable the corresponding
//! GPIO port interrupt in the interrupt controller; individual GPIO interrupts
//! and interrupt sources must be disabled with GPIOPinIntDisable().
//!
//! \sa IntRegister() for important information about registering interrupt
//! handlers.
//!
//! \return None.
//
//*****************************************************************************
void
GPIOPortIntUnregister(unsigned long ulPort)
{
//
// Check the arguments.
//
ASSERT((ulPort == GPIO_PORTA_BASE) || (ulPort == GPIO_PORTB_BASE) ||
(ulPort == GPIO_PORTC_BASE) || (ulPort == GPIO_PORTD_BASE) ||
(ulPort == GPIO_PORTE_BASE));
//
// Get the interrupt number associated with the specified GPIO.
//
ulPort = GPIOGetIntNumber(ulPort);
//
// Disable the GPIO interrupt.
//
IntDisable(ulPort);
//
// Unregister the interrupt.handler.
//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -