LPC2368 EINT0 on MCB2360

Started by Brian Sidebotham May 22, 2007
Hi Guys,

I could do with some pointers as to what I'm doing wrong here. I am
trying to get the external interrupt EINT0 to work on an LPC2368 on an
MCB2360 keil development board.

I am using the GNU toolchain, and I'm having difficultly in getting the
ISR to fire.

I have the following code:

// SELECT P2.10 as EINTO
PINSEL4 = (1 << 20);
// DISABLE ETM
PINSEL10 = 0;

// Set LED pins to outputs + clear them
FIO2DIR |= 0xFF;
FIO2CLR = 0xFF;

// *** VIC ***
// Disable EXT Int 0
VICIntEnClr = (1<<14);
// Whilst extint0 is definitely disabled, setup ext0 as edge sensitive
EXTMODE = 1;
// Falling Edge sensitive
EXTPOLAR = 0;
// Set External Interrupt 0 as a normal IRQ
VICIntSelect = 0;
// Set ISR Address as interrupt service routine for interrupt.
VICVectAddr14 = (int)ExtInt0Isr;
// Set High Priority Level
VICVectPriority14 = 1;
// Enable External Interrupt 0
VICIntEnable = (1<<14);
to set the interrupt service routine, and the isr is defined as:
void ExtInt0Isr(void) __attribute__((interrupt(IRQ)));
void ExtInt0Isr(void)
{
FIO2SET = 2;
// Required by vectored interrupt controller
while(1);
// write anything to register before leaving IRQ
VICAddress = 0;
}

But it will never fire. I know the hardware is working on that pin, as I
can check that the pin voltage level changes appropriately to cause a
falling edge interrupt.

When I debug with gdb, I get a value of 72 for VICVectAddr14, which is
correct according to a lst file. I can also see that VICIRQStatus is
zero to begin with - until I press the int0 button. Then VICIRQStatus
changes to 0x4000 which is the correct flag for EINT0 which should mean
that the IRQ is set correctly, enabled, and asserted - so why doesn't it
get processed?

In the startup script I have the following vector table:

b _start
ldr pc, _undf
ldr pc, _swi
ldr pc, _pabt
ldr pc, _dabt
nop
ldr pc, [pc,#-0x120] /* irq - read vector address */
ldr pc, _fiq
This is running from flash, I am using openocd via gdb to program the flash.

Are there any clues from my code above? This is literally all the
processor is doing, it's what I thought would be a very simple bit of
code, but I just can't crack it.

Any pointers welcome! If there's any other information that will help,
please let me know.

Best Regards,

Brian Sidebotham.

An Engineer's Guide to the LPC2100 Series

As always seems to happen, I have it working fine now. The startup file
I am using disables global interrupts!

I crudely added

void EnableInterrupts(void)
{
asm("msr CPSR_c, 0x13 \n");
}

and now the code works fine.

I have been working with the user manual for the LPC2368, and it doesn't
mention anywhere CPSR. So I guess I need to also work with the
ARM7TMDI-S manual too?

Anyway, sorted for now.

Best Regards,

Brian Sidebotham
Brian Sidebotham wrote:
> Hi Guys,
>
> I could do with some pointers as to what I'm doing wrong here. I am
> trying to get the external interrupt EINT0 to work on an LPC2368 on an
> MCB2360 keil development board.
>
> I am using the GNU toolchain, and I'm having difficultly in getting the
> ISR to fire.
>
> I have the following code:
>
> // SELECT P2.10 as EINTO
> PINSEL4 = (1 << 20);
> // DISABLE ETM
> PINSEL10 = 0;
>
> // Set LED pins to outputs + clear them
> FIO2DIR |= 0xFF;
> FIO2CLR = 0xFF;
>
> // *** VIC ***
> // Disable EXT Int 0
> VICIntEnClr = (1<<14);
> // Whilst extint0 is definitely disabled, setup ext0 as edge sensitive
> EXTMODE = 1;
> // Falling Edge sensitive
> EXTPOLAR = 0;
> // Set External Interrupt 0 as a normal IRQ
> VICIntSelect = 0;
> // Set ISR Address as interrupt service routine for interrupt.
> VICVectAddr14 = (int)ExtInt0Isr;
> // Set High Priority Level
> VICVectPriority14 = 1;
> // Enable External Interrupt 0
> VICIntEnable = (1<<14);
> to set the interrupt service routine, and the isr is defined as:
> void ExtInt0Isr(void) __attribute__((interrupt(IRQ)));
> void ExtInt0Isr(void)
> {
> FIO2SET = 2;
> // Required by vectored interrupt controller
> while(1);
> // write anything to register before leaving IRQ
> VICAddress = 0;
> }
>
> But it will never fire. I know the hardware is working on that pin, as I
> can check that the pin voltage level changes appropriately to cause a
> falling edge interrupt.
>
> When I debug with gdb, I get a value of 72 for VICVectAddr14, which is
> correct according to a lst file. I can also see that VICIRQStatus is
> zero to begin with - until I press the int0 button. Then VICIRQStatus
> changes to 0x4000 which is the correct flag for EINT0 which should mean
> that the IRQ is set correctly, enabled, and asserted - so why doesn't it
> get processed?
>
> In the startup script I have the following vector table:
>
> b _start
> ldr pc, _undf
> ldr pc, _swi
> ldr pc, _pabt
> ldr pc, _dabt
> nop
> ldr pc, [pc,#-0x120] /* irq - read vector address */
> ldr pc, _fiq
> This is running from flash, I am using openocd via gdb to program the flash.
>
> Are there any clues from my code above? This is literally all the
> processor is doing, it's what I thought would be a very simple bit of
> code, but I just can't crack it.
>
> Any pointers welcome! If there's any other information that will help,
> please let me know.
>
> Best Regards,
>
> Brian Sidebotham.
>
>
>
> 14:01