In an interrupt service routine:
in order to exit it properly you must, Clear the interrupt flag that
triggered it (write a 1 to the flag?) eg:
U0IIR = 0x0000000A; //Clear the interrupt register
anyway, most importantly you also need to write to teh vector
address register:
eg:
VICVectAddr = 0x00000000;//Dummy write to signal end of interrupt
failure to do these will lead to continuous interrupts.....
Does this help???
rgds
pete
--- In lpc2000@yahoogroups.com, "peterburdine" <lordofdawn@h...>
wrote:
>
> I think I may be missing something stupid, but can anyone help me?
> I am tring to write to UART0, but it doesn't seem to work. I am
> trying to write a software buffer to help out the one byte hardware
> buffer. Specifically I am using the LPC 2294. Below is my code.
>
> I am using the Keil toolset (compiler/debugger/simulator). The
code
> works perfectly fine when running it on the simulator, but when I
try
> to run it on the chip, I will only get "ho" instead of "hello". I
put
> some break points in it when using JTAG to debug, but the ISR is
never
> called when running on the real hardware, it is called on the
> simulator. Also, when I debug on JTAG I never se the THRE or TEMT
> clear. Can you see anything obviously wrong? I think I put in
> everything that you need to compile it.
>
> #include <stdio.h>
> #define TX_BUFFER_LENGTH 64
> #define UART0_THRE (U0LSR & 0x20)
> #define PINSEL0_00_TxD (0x01)
> #define PINSEL0_01_GPIO (0x00 << 2)
> #define U0RBR (*((volatile unsigned char *) 0xE000C000))
> #define U0THR (*((volatile unsigned char *) 0xE000C000))
> #define U0IER (*((volatile unsigned char *) 0xE000C004))
> #define U0IIR (*((volatile unsigned char *) 0xE000C008))
> #define U0FCR (*((volatile unsigned char *) 0xE000C008))
> #define U0LCR (*((volatile unsigned char *) 0xE000C00C))
> #define U0MCR (*((volatile unsigned char *) 0xE000C010))
> #define U0LSR (*((volatile unsigned char *) 0xE000C014))
> #define U0MSR (*((volatile unsigned char *) 0xE000C018))
> #define U0SCR (*((volatile unsigned char *) 0xE000C01C))
> #define U0DLL (*((volatile unsigned char *) 0xE000C000))
> #define U0DLM (*((volatile unsigned char *) 0xE000C004))
> #define VICVectAddr6 (*((volatile unsigned long *) 0xFFFFF118))
> #define VICVectCntl6 (*((volatile unsigned long *) 0xFFFFF218))
> #define VICIntSelect (*((volatile unsigned long *) 0xFFFFF00C))
> #define VICIntEnable (*((volatile unsigned long *) 0xFFFFF010))
> #define VICIntEnClr (*((volatile unsigned long *) 0xFFFFF014))
> static Uint16 txBytes = 0;
> static Uint16 txRdPos = 0;
> static Uint16 txWrPos = 0;
> static Uint16 txBuffer[TX_BUFFER_LENGTH];
>
> void uart0_config (void);
> void uart0_isr (void);
> void uart0_sendByte (Uint8);
> int putchar(int);
> int main (void);
>
> void uart0_config (void) {
> // Setup UART 0
> U0LCR = 0x80; // Enable DLAB
> U0DLL = 0x16; // Setup BGR
> U0DLM = 0x05; // ~2400 Bit/s @ 50 Mhz
> U0LCR = 0x03; // Enable UART 0, 8 bits, no parity, 1 stop bit
>
> // Reset the FIFOs
> U0FCR = 0xC7; // RX FIFO trigger level 8 chars, reset tx and
rx fifo,
> enable fifos
>
> // Setup Interrupts for UART0
> U0IER = 0x7;
> VICIntSelect &= 0x0;
> VICVectCntl6 = 0x20 | 6;
> VICVectAddr6 = (unsigned long) uart0_isr;
> VICIntEnable |= (0x1 << 6); // Enable Uart0 Interrupt
> }
>
> void uart0_isr (void) __irq {
> switch((U0IIR>>1)&0x7) {
> // THRE
> case 001:
> if(txBytes != 0) {
> U0THR = txBuffer[txRdPos];
> txRdPos++;
> txRdPos = (txRdPos ==
TX_BUFFER_LENGTH)?0:txRdPos;
> txBytes--;
> }
> break;
> }
> }
>
> void uart0_sendByte(Uint8 byte) {
> // Wait until there is room in the buffer
> while(txBytes == TX_BUFFER_LENGTH);
> VICIntEnClr |= (1 << 6);
> if(!UART0_THRE) { // Put it in the software buffer
> txBuffer[txWrPos] = byte;
> txWrPos++;
> txWrPos = (txWrPos == TX_BUFFER_LENGTH)?0:txWrPos;
> txBytes++;
> }
> else { // If the chip buffer is empty, put it there
> U0THR = byte;
> }
> VICIntEnable |= (1 << 6);
> }
>
> int putchar(int a) {
> uart0_sendByte((int)a);
> }
>
> int main (void) {
> PINSEL0 = PINSEL0_00_TxD | PINSEL0_01_RxD;
> printf("hello");
> }Message
Re: Problems w/ UART
2004-10-07 by Pete
Attachments
- No local attachments were found for this message.