Crossworks & Interrupts

Apr 08, 2012 2 Replies

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


--------------------------------------- Posted through

formatting link


It looks like you never enable global IRQs in the ARM core CPSR register. When the ARM comes out of reset, all interrupts are disabled.

I am not familiar with Crossworks, so I don't know if they have a library call for that.

Good catch.

The OP can include and use __enable_interrupt() and __disable_interrupt() to en/disable global interrupts. If/when he starts using the CTL (the RTOS they provide) switch to and use ctl_global_interrupts_enable() or ... _disable().

He also ought to include a handler for spurious interrupts

Rich Webb Norfolk, VA

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required