UART0 and Printf

Started by jstamos111 April 24, 2006
Hey all,

I am trying to get UART0 output to display on hyperterminal for a
board I made based on the LPC2106 processor. I use the ISP and
UART0 to program the board with Philips flash utility, then start
hyperterminal with the following settings: 9600 bits/second, 8
databits, no parity, 1 stop bit, and no flow control. I set
hyperterminal to listen on the same com port as the one I used to
program the flash memory. I also have the computer's com port
connected to the LPC2106's same UART (UART0?) that I used to program
the flash memory. Finally, I hit reset, but the output is not
displayed in hyperterminal.

Any thoughts on why I am not seeing any output in hyperterminal?

Here is my code which I compiled uvision by keil tools. I pretty
much stole this code from hitex's book for the philips LPC
processors.

void UART0 (void)
{
PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
U0LCR = 0x80; //Enable programming of divisor latches

U0DLL = 0xC2; //Program the divisor latch for 19200 baud
U0DLM = 0x00;

U0LCR = 0x33; //Program the line control 8\N\1
U0FCR = 0x4F; //enable the FIFO's

}

int main() {
UART0();

printf("Hello World\n"); //Call the printf function
while(1) {}
return 0;
}

Much Thanks.
- John

An Engineer's Guide to the LPC2100 Series

John,

Without looking in detail, your narrative say setting hyperterm to 9600
and the code comment says 19200.

George

On Mon, 2006-04-24 at 10:49 +0000, jstamos111 wrote:

> Hey all,
>
> I am trying to get UART0 output to display on hyperterminal for a
> board I made based on the LPC2106 processor. I use the ISP and
> UART0 to program the board with Philips flash utility, then start
> hyperterminal with the following settings: 9600 bits/second, 8
> databits, no parity, 1 stop bit, and no flow control. I set
> hyperterminal to listen on the same com port as the one I used to
> program the flash memory. I also have the computer's com port
> connected to the LPC2106's same UART (UART0?) that I used to program
> the flash memory. Finally, I hit reset, but the output is not
> displayed in hyperterminal.
>
> Any thoughts on why I am not seeing any output in hyperterminal?
>
> Here is my code which I compiled uvision by keil tools. I pretty
> much stole this code from hitex's book for the philips LPC
> processors.
>
> void UART0 (void)
> {
> PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> U0LCR = 0x80; //Enable programming of divisor latches
>
> U0DLL = 0xC2; //Program the divisor latch for 19200 baud
> U0DLM = 0x00;
>
> U0LCR = 0x33; //Program the line control 8\N\1
> U0FCR = 0x4F; //enable the FIFO's
>
> }
>
> int main() {
> UART0();
>
> printf("Hello World\n"); //Call the printf function
> while(1) {}
> return 0;
> }
>
> Much Thanks.
> - John
>
> ______________________________________________________________________
>
--- In l..., "jstamos111" wrote:
>
> Hey all,
>
> I am trying to get UART0 output to display on hyperterminal for a
> board I made based on the LPC2106 processor. I use the ISP and
> UART0 to program the board with Philips flash utility, then start
> hyperterminal with the following settings: 9600 bits/second, 8
> databits, no parity, 1 stop bit, and no flow control. I set
> hyperterminal to listen on the same com port as the one I used to
> program the flash memory. I also have the computer's com port
> connected to the LPC2106's same UART (UART0?) that I used to
program
> the flash memory. Finally, I hit reset, but the output is not
> displayed in hyperterminal.
>
> Any thoughts on why I am not seeing any output in hyperterminal?
>
> Here is my code which I compiled uvision by keil tools. I pretty
> much stole this code from hitex's book for the philips LPC
> processors.
>
> void UART0 (void)
> {
> PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> U0LCR = 0x80; //Enable programming of divisor latches
>
> U0DLL = 0xC2; //Program the divisor latch for 19200 baud
> U0DLM = 0x00;
>
> U0LCR = 0x33; //Program the line control 8\N\1
> U0FCR = 0x4F; //enable the FIFO's
>
> }
>
> int main() {
> UART0();
>
> printf("Hello World\n"); //Call the printf function
> while(1) {}
> return 0;
> }
>
> Much Thanks.
> - John
>
John,

There are only a few places for this not to work. Look at rxd and
txd pins (with a scope) at cpu and determine if you have any signals.
If you have signals check the bit time - you can use 'A' (0x55) for
its bit pattern. Check both TX and RX. If you don't have signals use
putc(0x55) in a while loop or better yet, write directly to the TX
data register. If that works then there may be config problem with
the character write routine used by printf.

Ian
Three things to try.

1) Check your code is running at all can you flash a LED or are you
still in Boot Selector mode when you think you are running your code.

2) You have closed your Philips Flash Unitily before connecting with
Hyperterninal.

3) Try writing bytes to the U0THR, if you enable the fifo you can
write upto 16 in one go without checking if the UART is busy.

Good Luck.

--- In l..., "jstamos111" wrote:
>
> Hey all,
>
> I am trying to get UART0 output to display on hyperterminal for a
> board I made based on the LPC2106 processor. I use the ISP and
> UART0 to program the board with Philips flash utility, then start
> hyperterminal with the following settings: 9600 bits/second, 8
> databits, no parity, 1 stop bit, and no flow control. I set
> hyperterminal to listen on the same com port as the one I used to
> program the flash memory. I also have the computer's com port
> connected to the LPC2106's same UART (UART0?) that I used to program
> the flash memory. Finally, I hit reset, but the output is not
> displayed in hyperterminal.
>
> Any thoughts on why I am not seeing any output in hyperterminal?
>
> Here is my code which I compiled uvision by keil tools. I pretty
> much stole this code from hitex's book for the philips LPC
> processors.
>
> void UART0 (void)
> {
> PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> U0LCR = 0x80; //Enable programming of divisor latches
>
> U0DLL = 0xC2; //Program the divisor latch for 19200 baud
> U0DLM = 0x00;
>
> U0LCR = 0x33; //Program the line control 8\N\1
> U0FCR = 0x4F; //enable the FIFO's
>
> }
>
> int main() {
> UART0();
>
> printf("Hello World\n"); //Call the printf function
> while(1) {}
> return 0;
> }
>
> Much Thanks.
> - John
>
Quoting jstamos111 :
> Any thoughts on why I am not seeing any output in hyperterminal?
>
> Here is my code which I compiled uvision by keil tools. I pretty
> much stole this code from hitex's book for the philips LPC
> processors.
>
> void UART0 (void)
> {
> PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> U0LCR = 0x80; //Enable programming of divisor latches
>
> U0DLL = 0xC2; //Program the divisor latch for 19200 baud
> U0DLM = 0x00;
>
> U0LCR = 0x33; //Program the line control 8\N\1
> U0FCR = 0x4F; //enable the FIFO's
>
> }
>
> int main() {
> UART0();
>
> printf("Hello World\n"); //Call the printf function
> while(1) {}
> return 0;
> }

I don't see any code for connecting printf to the serial port.

Robert
--- In l..., Robert Adsett
wrote:
>
> Quoting jstamos111 :
> > Any thoughts on why I am not seeing any output in hyperterminal?
> >
> > Here is my code which I compiled uvision by keil tools. I pretty
> > much stole this code from hitex's book for the philips LPC
> > processors.
> >
> > void UART0 (void)
> > {
> > PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> > U0LCR = 0x80; //Enable programming of divisor
latches
> >
> > U0DLL = 0xC2; //Program the divisor latch for 19200
baud
> > U0DLM = 0x00;
> >
> > U0LCR = 0x33; //Program the line control 8\N\1
> > U0FCR = 0x4F; //enable the FIFO's
> >
> > }
> >
> > int main() {
> > UART0();
> >
> > printf("Hello World\n"); //Call the printf function
> > while(1) {}
> > return 0;
> > }
>
> I don't see any code for connecting printf to the serial port.
>
> Robert
>

Does writing directly to the uart tx register work? How about putc ?
--- In l..., "ian.scanlon" wrote:
>
> Does writing directly to the uart tx register work? How about putc ?
>

writing directly works very well as long as you do not overfill the
fifo's.

here is some code I wrote earlier ;)

typedef union
{
unsigned long whole;
unsigned char part_byte[4];
} four_bytes;

void UNDEF_Routine(void)
{
register unsigned int *lr_ptr asm("r14");

four_bytes temp;
temp.whole = (usigned long) lr_ptr;
UART0_THR = temp.part_byte[3];
UART0_THR = temp.part_byte[2];
UART0_THR = temp.part_byte[1];
UART0_THR = temp.part_byte[0];
}

By the way thanks to the guys who helped me with reading the Link
Regitser.
You need to create a link to the printf ( ) function with writing a
putchar( ) function that links to your Comm write functions so that printf
( ) can link to the comm port such as:

/************************************************************************************************************************
Name: putchar
Descr: This routine is called by printf to output character strings
to the
console. The function sends data out com1.

Inputs: INT_32 ch = character to send to serial port
Outputs: INT_32 status - 0 = Character written OK
1 = Error
Rev: 0
************************************************************************************************************************/
INT_32 putchar ( INT_32 ch )
{
return(Com1_write(ch)); // Write character to Serial Port
}
Goog Luck!

Mike F.
A more general, simpler alternative is as follows:

/* Transmit specified string to DEBUG port, using polled i/o */

void polled_write_to_uart_0(char *s)

{
unsigned int status;

while (*s)
{
do
{
status = REG(UART0_LSR);
} while (!(status & 0x20));

REG(UART0_THR) = (uint) *s;

s++;
}

return;
}

/* example call: */

polled_write_to_uart_0("Hello world\n");

This assumes the UART has been initialsed correctly and interrupts
disabled.

It's a handy "first test" to do to see if the UART setup is correct.

Brendan

--- In l..., "fordp2002" wrote:
>
> --- In l..., "ian.scanlon"
wrote:
> >
> > Does writing directly to the uart tx register work? How about
putc ?
> > writing directly works very well as long as you do not overfill the
> fifo's.
>
> here is some code I wrote earlier ;)
>
> typedef union
> {
> unsigned long whole;
> unsigned char part_byte[4];
> } four_bytes;
>
> void UNDEF_Routine(void)
> {
> register unsigned int *lr_ptr asm("r14");
>
> four_bytes temp;
> temp.whole = (usigned long) lr_ptr;
> UART0_THR = temp.part_byte[3];
> UART0_THR = temp.part_byte[2];
> UART0_THR = temp.part_byte[1];
> UART0_THR = temp.part_byte[0];
> }
>
> By the way thanks to the guys who helped me with reading the Link
> Regitser.
>
Thanks for the help guys. I finally got things working and ultimately George was right in that I inited some of the UART0 parameters wrong. In addition to initing the UART0 for 19200 and setting Hyperterminal to 9600, I selected UART1 in the pinselect0 register, no UART0.

- John

"George M. Gallant, Jr." wrote: John,

Without looking in detail, your narrative say setting hyperterm to 9600
and the code comment says 19200.

George

On Mon, 2006-04-24 at 10:49 +0000, jstamos111 wrote:

> Hey all,
>
> I am trying to get UART0 output to display on hyperterminal for a
> board I made based on the LPC2106 processor. I use the ISP and
> UART0 to program the board with Philips flash utility, then start
> hyperterminal with the following settings: 9600 bits/second, 8
> databits, no parity, 1 stop bit, and no flow control. I set
> hyperterminal to listen on the same com port as the one I used to
> program the flash memory. I also have the computer's com port
> connected to the LPC2106's same UART (UART0?) that I used to program
> the flash memory. Finally, I hit reset, but the output is not
> displayed in hyperterminal.
>
> Any thoughts on why I am not seeing any output in hyperterminal?
>
> Here is my code which I compiled uvision by keil tools. I pretty
> much stole this code from hitex's book for the philips LPC
> processors.
>
> void UART0 (void)
> {
> PINSEL0 = 0x05; // Select TxD and RxD on pin connect block
> U0LCR = 0x80; //Enable programming of divisor latches
>
> U0DLL = 0xC2; //Program the divisor latch for 19200 baud
> U0DLM = 0x00;
>
> U0LCR = 0x33; //Program the line control 8\N\1
> U0FCR = 0x4F; //enable the FIFO's
>
> }
>
> int main() {
> UART0();
>
> printf("Hello World\n"); //Call the printf function
> while(1) {}
> return 0;
> }
>
> Much Thanks.
> - John
>
>
>
>
>
>
>
> ______________________________________________________________________
>