UART_IRQ handler not invoked with peripheral Interfacing.

Status
Not open for further replies.

kulks

Newbie level 6
Joined
Apr 25, 2013
Messages
14
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Visit site
Activity points
1,427
Hi,

I'm interfacing a GPS skynav SKM53 which uses UART with MCB 1700 board( onboard LPC1768 microcontroller). I have the transmitter pin of GPS connected to P2.1 (configured as UART1 Rx). Though, i can see the data in the RBR register but I don see the UART_IRQ handler being invoked.

I have tested the IRQ handler by interfacing with PC (COM Port connected using RS232 cable) and it works perfectly. I use the same function for
interfacing on peripheral UART, it doesn't get invoked. Is there any other configuration, I need to do so as to invoke IRQ handler when data is seen on
peripheral??? Please advise.

Here's the snippet of my IRQ handler which I found from the Keil examples.

void UART1_IRQHandler (void)
{


uint8_t IIRValue, LSRValue;
uint8_t Dummy = Dummy;

IIRValue = LPC_UART1->IIR;

IIRValue >>= 1; /* skip pending bit in IIR */
IIRValue &= 0x07; /* check bit 1~3, interrupt identification */
if ( IIRValue == IIR_RLS ) /* Receive Line Status */
{
LSRValue = LPC_UART1->LSR;


/* Receive Line Status */
if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
{
GLCD_SetTextColor(Red);

/* There are errors or break interrupt */
/* Read LSR will clear the interrupt */
UART1Status = LSRValue;
Dummy = LPC_UART1->RBR; /* Dummy read on RX to clear
interrupt, then bail out */
return;
}
if ( LSRValue & LSR_RDR ) /* Receive Data Ready */
{
/* If no error on RLS, normal ready, save into the data buffer. */
/* Note: read RBR will clear the interrupt */
UART1Buffer[UART1Count] = LPC_UART1->RBR;
UART1Count++;
if ( UART1Count == BUFSIZE )
{
UART1Count = 0; /* buffer overflow */
}
}
}
else if ( IIRValue == IIR_RDA ) /* Receive Data Available */
{
/* Receive Data Available */
UART1Buffer[UART1Count] = LPC_UART1->RBR;
UART1Count++;
if ( UART1Count == BUFSIZE )
{
UART1Count = 0; /* buffer overflow */
}
}
else if ( IIRValue == IIR_CTI ) /* Character timeout indicator */
{
/* Character Time-out indicator */
UART1Status |= 0x100; /* Bit 9 as the CTI error */
}
else if ( IIRValue == IIR_THRE ) /* THRE, transmit holding register empty */
{
/* THRE interrupt */
LSRValue = LPC_UART1->LSR; /* Check status in the LSR to see if
valid data in U0THR or not */
if ( LSRValue & LSR_THRE )
{
UART1TxEmpty = 1;
}
else
{
UART1TxEmpty = 0;
}
}

}

And in UART_init function, I have the peripheral pins P2.1 enabled as receiver as seen in the snippet below

LPC_PINCON->PINSEL4 &= ~0x0000000F;
LPC_PINCON->PINSEL4 |= 0x0000000A; /* Enable RxD1 P2.1, TxD1 P2.0 */
 

I'm not quite familiar with this particular MCU, but it is a Cortex-M3, so it has an NVIC (nested vectored interrupt controller). In order to execute the handler you need to enable the interrupt channel connected to USART1. You also need to specify the priority for this interrupt. All of this is accomplished via the NVIC registers - see the appropriate examples for the LPC.

Regards,
Ivan
 

Hi Ivan,

You are right..It's a cortex-M3 with NVIC. and I have enabled the interrupt using NVIC as below

NVIC_EnableIRQ(UART1_IRQn);


Thanks,
 

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…