2012-07-03 3 views
1

У меня есть некоторые проблемы с моим способом изменить скорость передачи uart на моем lpc1768.Изменение скорости передачи данных UARTx для LPC 1768 не работает

Для инициализации и настройки моих УАПП, я использую следующий код, и отлично работает с 9600 бод или 38400.

/* RxD0 is P0.3 and TxD0 is P0.2 */ 
LPC_PINCON->PINSEL0 &= ~(0x03<<4);   // Reset P0.2 = GPIO 
LPC_PINCON->PINSEL0 |= (0x01<<4);   // Config P0.2 = TxD0 
LPC_PINCON->PINSEL0 &= ~(0x03<<6);  // Reset P0.3 = GPIO 
LPC_PINCON->PINSEL0 |= (0x01<<6);   // Config P0.3 = RxD0 

LPC_UART0->LCR = 0x87; //8bits, no parity, 2 stop bits 
switch (baudrate) 
{ 
default : 
case 9600 : 
    LPC_UART0->DLM = 0x00; //calculated with datasheet 
    LPC_UART0->DLL = 0x4E; 

    LPC_UART0->FDR = 0x21; 
    break; 

case 38400 : 
    LPC_UART0->DLM = 0x00; //calculated with datasheet 
    LPC_UART0->DLL = 0x14; 

    LPC_UART0->FDR = 0xF7; 
} 




LPC_UART0->LCR = 0x07;//0x03;  /* DLAB = 0 */ 
LPC_UART0->FCR = 0x07;  /* Enable and reset TX and RX FIFO. */ 

NVIC_EnableIRQ(UART0_IRQn); 

LPC_UART0->IER = IER_RBR | IER_THRE | IER_RLS; /* Enable UART0 interrupt */ 

Но менять скорость передачи данных от 9600 до 38400, я стараюсь просто изменить DLM/DLL и FDR записываются в соответствующее значение (то же, что и в коде выше). Но это не работает ... (скорость не определена).

Мой PCLK является 18MHz

Изменение только те три регистра не достаточно? Я ошибаюсь ?

ответ

2

Я нашел решение: я забыл установить бит DLAB в регистре LCR. Без этого изменения невозможно изменить скорость.

И простой способ изменить скорость передачи ча в том, что:

LPC_UART0->LCR = 0x87; 
    switch (baudrate) 
    { 
    default : 
    case 9600 : 
     LPC_UART0->DLM = 0x00; //fhn calculated with algorithm in the datasheet 
     LPC_UART0->DLL = 0x4E;//0x06; 

     LPC_UART0->FDR = 0x21;//0x85;calculation, but not sure to need 
    break; 

     case 38400 : 
     LPC_UART0->DLM = 0x00; 
     LPC_UART0->DLL = 0x14;//0x06; 

     LPC_UART0->FDR = 0xF7; 
    break; 
} 
LPC_UART0->LCR = 0x07;