|
发表于 2014-12-27 19:34:25
|
显示全部楼层
下面是我以前做的东西,还算比较准。
if (PortNum == 0)
{
// LPC_PINCON->PINSEL0 &= ~0x000000F0;
// LPC_PINCON->PINSEL0 |= 0x00000050; /* RxD0 is P0.3 and TxD0 is P0.2 */
LPC_PINCON->PINSEL0 |= (1 << 4); /* Pin P0.2 used as TXD0 (Com0) */
LPC_PINCON->PINSEL0 |= (1 << 6); /* Pin P0.3 used as RXD0 (Com0) */
/* By default, the PCLKSELx value is zero, thus, the PCLK for
all the peripherals is 1/4 of the SystemFrequency. */
/* Bit 6~7 is for UART0 */
pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
switch (pclkdiv)
{
case 0x00:
default:
pclk = SystemFrequency / 4;
break;
case 0x01:
pclk = SystemFrequency;
break;
case 0x02:
pclk = SystemFrequency / 2;
break;
case 0x03:
pclk = SystemFrequency / 8;
break;
}
LPC_UART0->LCR = 0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv = (pclk * 100 / 16) / baudrate; /*baud rate */
//注意:系统频率变更的以下的参数也需变,现频率为80M
if (Fdiv % 100 != 0)
{
switch (baudrate)
{
case 115200:
Fdiv = 8;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (5 + (14 << 4));
break;
case 57600:
Fdiv = 13;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (2 + (3 << 4));
break;
case 38400:
Fdiv = 20;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (5 + (8 << 4));
break;
case 19200:
Fdiv = 47;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (5 + (13 << 4));
break;
case 9600:
Fdiv = 80;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (5 + (8 << 4));
break;
default:
Fdiv = 80;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
LPC_UART0->FDR = (5 + (8 << 4));
break;
}
}
else
{
Fdiv = Fdiv / 100;
LPC_UART0->DLM = Fdiv / 256;
LPC_UART0->DLL = Fdiv % 256;
}
LPC_UART0->LCR = 0x03; /* DLAB = 0 */
LPC_UART0->FCR = 0x87; /* Enable and reset TX and RX FIFO. */
NVIC_EnableIRQ(UART0_IRQn);
NVIC_SetPriority(UART0_IRQn, 2);
//LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */
LPC_UART0->IER = IER_RBR | IER_RLS; //
return(TRUE);
} |
|