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

simple printf demo won't work (MSB2300)

I am amazed at how much trouble I am having getting the simplest demo working. I have stripped everything out of the blinky demo so that I only test the printf capability and nothing comes out.

The simulation environment works, but using the MCB2300, I can't get any output.

First, here is my env:

IDE-Version:
µVision3 V3.80
Copyright (c) Keil Elektronik GmbH / Keil Software, Inc. 1995 - 2009

Tool Version Numbers:
Toolchain: RealView MDK-ARM Version: 3.50
Toolchain Path: BIN40\
C Compiler: Armcc.Exe V4.0.0.524 [Evaluation]
Assembler: Armasm.Exe V4.0.0.524 [Evaluation]
Linker/Locator: ArmLink.Exe V4.0.0.524 [Evaluation]
Librarian: ArmAr.Exe V4.0.0.524 [Evaluation]
Hex Converter: FromElf.Exe V4.0.0.524 [Evaluation]
CPU DLL: SARM.DLL V3.50
Dialog DLL: DARMP.DLL V1.44
Target DLL: BIN\UL2ARM.DLL V1.47
Dialog DLL: TARMP.DLL V1.44

Next, here is my code:

#include <stdio.h>
#include <LPC23xx.H> /* LPC23xx definitions */

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;

#define UART1 /* Use UART 0 for printf */

/* If UART 0 is used for printf */
#ifdef UART0 #define UxFDR U0FDR #define UxLCR U0LCR #define UxDLL U0DLL #define UxDLM U0DLM #define UxLSR U0LSR #define UxTHR U0THR #define UxRBR U0RBR
/* If UART 1 is used for printf */
#elif defined(UART1) #define UxFDR U1FDR #define UxLCR U1LCR #define UxDLL U1DLL #define UxDLM U1DLM #define UxLSR U1LSR #define UxTHR U1THR #define UxRBR U1RBR
#endif

void init_serial (void) { /* Initialize Serial Interface */ #ifdef UART0 PINSEL0 |= 0x00000050; /* Enable TxD0 and RxD0 */ #elif defined (UART1) PINSEL0 |= 0x40000000; /* Enable TxD1 */ PINSEL1 |= 0x00000001; /* Enable RxD1 */ #endif UxFDR = 0; /* Fractional divider not used */ UxLCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */ UxDLL = 78; /* 9600 Baud Rate @ 12.0 MHZ PCLK */ UxDLM = 0; /* High divisor latch = 0 */ UxLCR = 0x03; /* DLAB = 0 */
}

/* Implementation of putchar (also used by printf function to output data) */
int sendchar (int ch) { /* Write character to Serial Port */

while (!(UxLSR & 0x20)); U1THR = ch; return (UxTHR = ch);
}

int getkey (void) { /* Read character from Serial Port */

while (!(UxLSR & 0x01));

return (UxRBR);
}

int fputc(int ch, FILE *f) { return (sendchar(ch));
}

int ferror(FILE *f) { /* Your implementation of ferror */ return EOF;
}

void _ttywrch(int ch) { sendchar(ch);
}

void _sys_exit(int return_code) {
label: goto label; /* endless loop */
}

int main (void) {

init_serial(); /* Init UART */ while (1) { /* Loop forever */ printf ("Hello World\n\r"); }
}

It is pulled directly from the demo code.

As I said, it doesn't print anything out when I look ath the UART windows. It would not be possible to develop any real code without this capabilities.

I would very much appreciate any help that anyone can provide. I hope that I am just clueless.

Thanks

david

By the way, I have tried both UART0 and UART1

  • Sorry, but your code is unreadable.

    Look at the posting instructions just above the message textbos. It clearly describes how to post source code.

    By the way - why this code:

    U1THR = ch;
    return (UxTHR = ch);
    


    Your #define will map UxTHR to U1THR which means that you make two writes to the UART1 transmit holding register. The UART will start sending immediately it gets the first assign, but what happens when you then assign again?

  • Sorry about the unreadable code - I just pasted it from source files. It was the middle of the night, so I got lazy -- again sorry. Let's first fix that:

    #include <stdio.h>
    #include <LPC23xx.H> /* LPC23xx definitions */
    
    struct __FILE {
        int handle; /* Add whatever you need here */
    };
    FILE __stdout;
    
    #define UART1 /* Use UART 0 for printf */
    
    /* If UART 0 is used for printf */
    #ifdef UART0
       #define UxFDR U0FDR
       #define UxLCR U0LCR
       #define UxDLL U0DLL
       #define UxDLM U0DLM
       #define UxLSR U0LSR
       #define UxTHR U0THR
       #define UxRBR U0RBR
      /* If UART 1 is used for printf */
    #elif defined(UART1)
       #define UxFDR U1FDR
       #define UxLCR U1LCR
       #define UxDLL U1DLL
       #define UxDLM U1DLM
       #define UxLSR U1LSR
       #define UxTHR U1THR
       #define UxRBR U1RBR
    #endif
    
    void init_serial (void) {
       /* Initialize Serial Interface */
       #ifdef UART0
          PINSEL0 |= 0x00000050;
          /* Enable TxD0 and RxD0 */
       #elif defined (UART1)
          PINSEL0 |= 0x40000000;
          /* Enable TxD1 */
          PINSEL1 |= 0x00000001;
          /* Enable RxD1 */
       #endif
    
       UxFDR = 0; /* Fractional divider not used */
       UxLCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
       UxDLL = 78; /* 9600 Baud Rate @ 12.0 MHZ PCLK */
       UxDLM = 0; /* High divisor latch = 0 */
       UxLCR = 0x03; /* DLAB = 0 */
    }
    
    /* Implementation of putchar (also used by printf function to output data) */
    
    int sendchar (int ch) {
       /* Write character to Serial Port */
    
       while (!(UxLSR & 0x20));
       return (UxTHR = ch);
    }
    
    int getkey (void) {
       /* Read character from Serial Port */
    
       while (!(UxLSR & 0x01));
       return (UxRBR);
    }
    
    int fputc(int ch, FILE *f) {
       return (sendchar(ch));
    }
    
    int ferror(FILE *f) {
        /* Your implementation of ferror */
        return EOF;
    }
    
    void _ttywrch(int ch) { sendchar(ch);}
    
    void _sys_exit(int return_code) {
    label:
    goto label; /* endless loop */
    }
    
    int main (void) {
    
        init_serial(); /* Init UART */
        while (1) { /* Loop forever */
            printf ("Hello World\n\r");
        }
    }
    
    

    To your question about the source code line that you pointed out, please ignore it (I took it out here). It wasn't there before (and it didn't work). The reason that I put that line in is because I was having trouble with the debugger. I was trying to see if UxTHR was getting set with ch, but because it was inline with the return statement the watch window didn't appear to update correctly as I stepped through the code. After adding the line, I found that it still wasn't setting UxTHR, so it didn't provide any additional insight and then I forgot to remove it. Thank you for pointing out the error with the code.

    I am still looking for a way to get printf working. Any help would be appreciated.

    Thanks

    david