Hello,
Hello, I'm trying to use UART1, UART3 on my stellaris launchpad but UART3 interrupt is not working.
I can send and receive messages on UART1 but on UART3 I can only send the messages.
I use CCS.
Here is my code:
void UART1IntHandler(void)
{
volatile unsigned long ulStatus;
volatile unsigned char fromUART;
ulStatus = UARTIntStatus(UART1_BASE, true);
UARTIntClear(UART1_BASE, ulStatus);
while(UARTCharsAvail(UART1_BASE))
{
fromUART = UARTCharGetNonBlocking(UART1_BASE);
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);
SysCtlDelay(SysCtlClockGet() / 5 / 3);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);
SysCtlDelay(SysCtlClockGet() / 5 / 3);
}
void UART3IntHandler(void)
{
volatile unsigned long ulStatus;
volatile unsigned char fromUART;
ulStatus = UARTIntStatus(UART3_BASE, true);
UARTIntClear(UART3_BASE, ulStatus);
if (command.exCmd==FALSE)
{
while(UARTCharsAvail(UART3_BASE))
{
fromUART = UARTCharGetNonBlocking(UART3_BASE);
}
}
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, GPIO_PIN_3);
SysCtlDelay(SysCtlClockGet() / 5 / 3);
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0);
SysCtlDelay(SysCtlClockGet() / 5 / 3);
}
void main(void) {
unsigned long Debug;
unsigned long ulStatus;
//
// Enable lazy stacking for interrupt handlers. This allows floating-point
// instructions to be used within interrupt handlers, but at the expense of
// extra stack usage.
//
FPUEnable();
FPULazyStackingEnable();
//
// Set the clocking to run directly from the crystal.
//
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_16MHZ);
//
// Enable the GPIO port that is used for the on-board LED.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
//
// Enable the GPIO pins for the LED (PF2).
//
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3);
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1);
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_4);
//
// Enable the peripherals used by this example.
//
// SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART3);
IntMasterEnable();
// SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
//
// Set GPIO A0 and A1 as UART pins.
//
GPIOPinConfigure(GPIO_PB0_U1RX);
GPIOPinConfigure(GPIO_PB1_U1TX);
GPIOPinTypeUART(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
GPIOPinConfigure(GPIO_PC6_U3RX);
GPIOPinConfigure(GPIO_PC7_U3TX);
GPIOPinTypeUART(GPIO_PORTC_BASE, GPIO_PIN_6 | GPIO_PIN_7);
//
// Configure the UART for 115,200, 8-N-1 operation.
//
UARTConfigSetExpClk(UART3_BASE, SysCtlClockGet(), 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
UARTConfigSetExpClk(UART1_BASE, SysCtlClockGet(), 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//
// Enable the UART interrupt.
//
ulStatus = UARTIntStatus(UART1_BASE, true);
UARTIntClear(UART1_BASE, ulStatus);
ulStatus = UARTIntStatus(UART3_BASE, true);
UARTIntClear(UART3_BASE, ulStatus);
IntEnable(INT_UART1);
UARTIntEnable(UART1_BASE, UART_INT_RT | UART_INT_RX);
IntEnable(INT_UART3);
UARTIntEnable(UART3_BASE, UART_INT_RT | UART_INT_RX);
for(;;) {
UARTSend(UART1_BASE,(unsigned char*)command.msg, 3);
UARTSend(UART3_BASE,(unsigned char*)command.msg, 3);
SysCtlDelay(2000000);
}
The interrupt functions are registered in startup_ccs.c. I copied only the related parts. See bellow:
extern void UART1IntHandler(void);
extern void UART3IntHandler(void);
.
.
.
IntDefaultHandler, // UART0 Rx and Tx
UART1IntHandler, // UART1 Rx and Tx
IntDefaultHandler, // SSI0 Rx and Tx
.
.
IntDefaultHandler, // SSI3 Rx and Tx
UART3IntHandler, // UART3 Rx and Tx
IntDefaultHandler, // UART4 Rx and Tx
Thank You!