Изменение скорости передачи UARTx для LPC 1768 не работает

У меня возникли проблемы с изменением скорости передачи данных uart на моем lpc1768.

Для инициализации и настройки uarts я использую следующий код, который отлично работает со скоростью 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 18МГц

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


person Efhache    schedule 03.07.2012    source источник


Ответы (1)


Я нашел решение: я забыл установить бит 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;
person Efhache    schedule 03.07.2012