C语言 将波特率UARTx更改为LPC 1768不起作用



我在 lpc1768 上更改 uart 波特率的方式遇到了一些问题。

要初始化和配置我的 uart,我使用以下代码,并且可以在 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

仅更改这三个寄存器是不够的?我错了吗?

我找到了解决方案:我忘了在LCR寄存器中设置DLAB位。没有此更改,则无法更改波特率。

改变波特率的一种简单方法是:

   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;

相关内容

  • 没有找到相关文章

最新更新