This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

LPC2129 UART ISR Problem

I'm using the LPC2129 and Keil Tools. The purpose of the code is to interrupt on the receipt of a single byte of data and assign "data" to its value. The interrupt seems to work however "data" isn't the right value. Please help, Thanks.

#include <stdio.h> /* prototype declarations for I/O functions */
#include <lpc21xx.h> /* LPC21xx definitions */

void U1ISR(void) __irq; //Declare UART1 IRQ ISR

int data;

int main (void) {

PINSEL0 = 0x0005800A; // Enable UART1

U1LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
U1DLL = 8; /* 115200 Baud Rate @ 15MHz VPB Clock */
U1LCR = 0x03; /* DLAB = 0 */
U1IER = 0x1; //Enable the RDA interrupt

VICVectAddr0 = (unsigned long)U1ISR; //Set UART1 ISR Vector Address
VICVectCntl0 = 0x20 | 7; //Enable Slot, Set Channel 7
VICIntEnable = 0x80; //Enable Int UART1

blah ... blah ... blah

while (1) {

yada ... yada ... yada

}

}

void U1ISR(void) __irq {

U1IIR |= 0x01; /* Clear Interrupt */

data = U1RBR;

VICVectAddr = 0x0; /* return from interrupt */

}

Parents
  • Thanks. After reading you post and running the code in the simulator, I realized that the test source is sending a string of characters to represent an integer ...

    I'm compiling the code in ARM mode and I'm not receiving any errors. I don't think you need any special statements other than the selection you mentioned. However, I recently downloaded an updated version of uVision on another computer and some of the same problems you mentioned in the other post happened. The issue was the projects were using an older startup.s file ...

Reply
  • Thanks. After reading you post and running the code in the simulator, I realized that the test source is sending a string of characters to represent an integer ...

    I'm compiling the code in ARM mode and I'm not receiving any errors. I don't think you need any special statements other than the selection you mentioned. However, I recently downloaded an updated version of uVision on another computer and some of the same problems you mentioned in the other post happened. The issue was the projects were using an older startup.s file ...

Children
  • Thanks, so you confirm that your small code piece can be switched between ARM and Thumb mode using the Flash-Configure, Flash Tools-C tab,-Use Thumb Mode toggle and it compiles in both modes without problems. Is so, I will try a clean install.

    I was wondering about your code, initially at (*1*)VicVectAddr0 gets U1ISR, which makes sense. Then at the end of the interupt (*2*) it gets put back to 0x0. and back to U1ISR addr at (*1*) again. Is this the right thing to do I wonder. I would have thought that the ISR vector can be left alone and something else done to reset the interupt for next time. Am I completely wrong or just not understanding what is happening?

    (*1*) VICVectAddr0 = (unsigned long)U1ISR; //Set UART1 ISR Vector Address
    VICVectCntl0 = 0x20 | 7; //Enable Slot, Set Channel 7
    VICIntEnable = 0x80; //Enable Int UART1

    void U1ISR(void) __irq {
    U1IIR |= 0x01; /* Clear Interrupt */
    data = U1RBR;
    (*2*) VICVectAddr = 0x0; /* return from interrupt */