EmbeddedRelated.com
Forums

Crossworks & Interrupts

Started by step...@langley-park.co.uk April 8, 2012
Hello
I'm new to both ARM and Crossworks and trying to understand interrupts, i order to do so, i've created a small serial program to echo characters received, however it never seems to call the ISR. Ive tried adding VECTORED_IRQ_INTERRUPTS and STARTUP_FROM_RESET to the Preprocessor Definitions section of the startup.s file...
I would appreciate a little guidance

Program as follows :-

#include "targets/LPC210X.H"

#define Fosc 12000000 // Crystal Frequency
#define Fcclk (Fosc * 5) // System Frequency
#define Fcco (Fcclk * 4) // CCO Frequency
#define Fpclk (Fcclk / 4) * 1 // VPB Clock Frequency

unsigned char rec;
unsigned char rec_new;

/**********************************************************************
IRQ_UART0()
**********************************************************************/
void IRQ_UART0 () __attribute__ ((interrupt ("IRQ")));
void IRQ_UART0 () {
if( (U0IIR&0x0F)==0x04 )
{
rec = U0RBR;
rec_new = 1;
}
VICVectAddr = 0x00;
}
/**********************************************************************
SendByte()
**********************************************************************/
void SendByte(unsigned char data)
{
U0THR = data;
while( (U0LSR & 0x20)==0 );
}
/**********************************************************************
UART0_Ini()
**********************************************************************/
unsigned char
UART0_Ini(unsigned int baud)
{
unsigned long temp;

U0LCR = 0x80; // Line Control Register = DLAB
temp = (Fpclk / 16)/baud;
U0DLM = temp / 256; // Divisor Latch MSB
U0DLL = temp % 256; // Divisor Latch LSB
U0LCR = 0x83; // 8 bits, no Parity, 1 Stop bit
U0LCR = 0x03; // DLAB = 0

return(1);
}
/**********************************************************************
Main()
**********************************************************************/
int main(void)
{
PINSEL0 = 0x00000005; // GPIO = TXD (UART0) & RxD (UART0)
PINSEL1 = 0x00000000; // No Change from Reset

rec_new = 0; // Reset rec_new flag

UART0_Ini(115200); // Set Baud Rate and intalise UART

U0FCR = 0x01; // FIFO Control Register - Enable FIFO
U0IER = 0x01; // Interrupt Enable Register - Enable RX Data Available Interrupt

VICIntSelect = 0x00000000; // Clear Interrupt Select register
VICVectCntl0 = 0x26; // UART0 IRQ slot 0
VICVectAddr0 = (int)IRQ_UART0; // Address of URAT0 ISR
VICIntEnable = 0x00000040; // Enable Interrupts - UART0

while(1)
{
if(rec_new==1)
{
SendByte(rec);
if (rec==0x0D)
SendByte(0X0A);
rec_new = 0;
}
}
return 0;
}
Thank you

An Engineer's Guide to the LPC2100 Series

You've not enabled interrupts and, even then, your variables are not volatile.

-- Paul.

On 8 Apr 2012, at 10:56, s...@langley-park.co.uk wrote:

> Hello
> I'm new to both ARM and Crossworks and trying to understand interrupts, i order to do so, i've created a small serial program to echo characters received, however it never seems to call the ISR. Ive tried adding VECTORED_IRQ_INTERRUPTS and STARTUP_FROM_RESET to the Preprocessor Definitions section of the startup.s file...
> I would appreciate a little guidance
>
> Program as follows :-
>
> #include "targets/LPC210X.H"
>
> #define Fosc 12000000 // Crystal Frequency
> #define Fcclk (Fosc * 5) // System Frequency
> #define Fcco (Fcclk * 4) // CCO Frequency
> #define Fpclk (Fcclk / 4) * 1 // VPB Clock Frequency
>
> unsigned char rec;
> unsigned char rec_new;
>
> /**********************************************************************
> IRQ_UART0()
> **********************************************************************/
> void IRQ_UART0 () __attribute__ ((interrupt ("IRQ")));
> void IRQ_UART0 () {
> if( (U0IIR&0x0F)==0x04 )
> {
> rec = U0RBR;
> rec_new = 1;
> }
> VICVectAddr = 0x00;
> }
> /**********************************************************************
> SendByte()
> **********************************************************************/
> void SendByte(unsigned char data)
> {
> U0THR = data;
> while( (U0LSR & 0x20)==0 );
> }
> /**********************************************************************
> UART0_Ini()
> **********************************************************************/
> unsigned char
> UART0_Ini(unsigned int baud)
> {
> unsigned long temp;
>
> U0LCR = 0x80; // Line Control Register = DLAB
> temp = (Fpclk / 16)/baud;
> U0DLM = temp / 256; // Divisor Latch MSB
> U0DLL = temp % 256; // Divisor Latch LSB
> U0LCR = 0x83; // 8 bits, no Parity, 1 Stop bit
> U0LCR = 0x03; // DLAB = 0
>
> return(1);
> }
> /**********************************************************************
> Main()
> **********************************************************************/
> int main(void)
> {
> PINSEL0 = 0x00000005; // GPIO = TXD (UART0) & RxD (UART0)
> PINSEL1 = 0x00000000; // No Change from Reset
>
> rec_new = 0; // Reset rec_new flag
>
> UART0_Ini(115200); // Set Baud Rate and intalise UART
>
> U0FCR = 0x01; // FIFO Control Register - Enable FIFO
> U0IER = 0x01; // Interrupt Enable Register - Enable RX Data Available Interrupt
>
> VICIntSelect = 0x00000000; // Clear Interrupt Select register
> VICVectCntl0 = 0x26; // UART0 IRQ slot 0
> VICVectAddr0 = (int)IRQ_UART0; // Address of URAT0 ISR
> VICIntEnable = 0x00000040; // Enable Interrupts - UART0
>
> while(1)
> {
> if(rec_new==1)
> {
> SendByte(rec);
> if (rec==0x0D)
> SendByte(0X0A);
> rec_new = 0;
> }
> }
> return 0;
> }
> Thank you
>