Edesigner. 发表于 2019-9-22 18:28:50

lpc1754串口0,按照demo,设置波特率57600及以下正确115200不正常

打出来是乱码,有这方面经验的网友提供一下解决方法好吗?

LPC_PINCON->PINSEL0 &= ~0x000000F0;
        LPC_PINCON->PINSEL0 |= 0x00000050;/* RxD0 is P0.3 and TxD0 is P0.2 */
        /* 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 / 16 ) / baudrate ;        /*baud rate */
    LPC_UART0->DLM = Fdiv / 256;                                                       
    LPC_UART0->DLL = Fdiv % 256;
        LPC_UART0->LCR = 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 */

SUPER_CRJ 发表于 2019-9-22 19:57:48

估计是波特率算错了,之前的LPC1768都正常的。

weiwei4 发表于 2019-9-22 20:24:33

是不是哪里的系统时钟没设置正确,在某个波特率以下是允许范围内,其它波特率超了呢?

Edesigner. 发表于 2019-9-22 21:24:55

weiwei4 发表于 2019-9-22 20:24
是不是哪里的系统时钟没设置正确,在某个波特率以下是允许范围内,其它波特率超了呢? ...

换成外置晶振都是一样

Edesigner. 发表于 2019-9-22 21:45:20

SUPER_CRJ 发表于 2019-9-22 19:57
估计是波特率算错了,之前的LPC1768都正常的。

是不是这个原因?

Excellence 发表于 2019-9-23 08:15:17

小数部分设置没?

Edesigner. 发表于 2019-9-23 08:34:52

Excellence 发表于 2019-9-23 08:15
小数部分设置没?

正在研究中

dengxiaofeng 发表于 2019-9-23 08:58:30

外设时钟 默认25MHz   不能上到 115200   ,需要修改 外设时钟的。就这个问题。没别的问题。

openmcu666 发表于 2019-9-23 09:49:55

本帖最后由 openmcu666 于 2019-9-23 09:51 编辑

试试这个 Fdiv = (25000000/16) / baudrate;// 设置波特率, 看串口外设时钟是多少

Excellence 发表于 2019-9-23 10:47:55

void                        Uart1Init(void)
{

        LPC_SC->PCONP         |= PCUART1;

        //P2.0   TXD1,P2.1   RXD1
        //LPC_PINCON->PINSEL4 =(LPC_PINCON->PINSEL4&(~(0x03 << (2 *UART_TXD1_NUM))))|(SECONDFUNC<<(2*UART_TXD1_NUM));
        //LPC_PINCON->PINSEL4 =(LPC_PINCON->PINSEL4&(~(0x03 << (2 *UART_RXD1_NUM))))|(SECONDFUNC<<(2*UART_RXD1_NUM));
        //P0.15TXD1,P0.16RXD1
        LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~((unsigned int)0x03 << (2 *UART_TXD1_NUM))))                |(FIRSTFUNC<<(2*UART_TXD1_NUM));
        LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_RXD1_NUM-16)))))|(FIRSTFUNC<<(2*(UART_RXD1_NUM-16)));
       
       
           LPC_UART1->LCR = 0x83;                     


        //24M:9600--125   115200--1357600--17//十进制
           LPC_UART1->DLM = 0;///Fdiv / 256;                                                       
        LPC_UART1->DLL = 125;///Fdiv % 256;          
        LPC_UART1->LCR = ((U1_DATA_BIT)|(U1_STOP_BIT<<2)|(U1_CHECK_BIT_EN<<3)|(U1_CHECK_BIT<<4));
           LPC_UART1->IER = 0x03;                     // Enable RDA and THRE interrupts
        LPC_UART1->FCR = 0xc7;


        //24M:9600--0X41   115200--0X20   57600--0XF8

        LPC_UART1->FDR = 0x41;
       
    NVIC_SetPriority(UART1_IRQn,2);

        NVIC_EnableIRQ(UART1_IRQn);                                        /* 使能I2C中断         */


}// End of UART0 initialize function

Excellence 发表于 2019-9-23 10:48:25

void                        Uart3Init(void)
{
        //uint16Fdiv;               


        LPC_SC->PCONP         |= PCUART3;

        //P0.0 TXD3,         P0.1 RXD3
        //LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~(0x03 << (2 *UART_TXD3_NUM))))|(SECONDFUNC<<(2*UART_TXD3_NUM));
        //LPC_PINCON->PINSEL0 =(LPC_PINCON->PINSEL0&(~(0x03 << (2 *UART_RXD3_NUM))))|(SECONDFUNC<<(2*UART_RXD3_NUM));

        //P0.25 TXD3,         P0.26 RXD3
        //LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_TXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_TXD3_NUM-16)));
        //LPC_PINCON->PINSEL1 =(LPC_PINCON->PINSEL1&(~(0x03 << (2 *(UART_RXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_RXD3_NUM-16)));

        //P4.28 TXD3,         P4.29 RXD3
        LPC_PINCON->PINSEL9 =(LPC_PINCON->PINSEL9&(~(0x03 << (2 *(UART_TXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_TXD3_NUM-16)));
        LPC_PINCON->PINSEL9 =(LPC_PINCON->PINSEL9&(~(0x03 << (2 *(UART_RXD3_NUM-16)))))|(THIRDFUNC<<(2*(UART_RXD3_NUM-16)));

       
       
           LPC_UART3->LCR = 0x83;                     
        //Fdiv = (25000000UL / 16) / UART0_BPS;    // set baudrate

        //12M:9600--71   115200--6   57600--13//十进制
        //18M:9600--X   115200--x   57600--11//十进制
        //24M:9600--125   115200--1357600--17//十进制
        //25M:9600--92   115200--1057600--19//十进制
           LPC_UART3->DLM = 0;///Fdiv / 256;                                                       
        LPC_UART3->DLL = 17;///Fdiv % 256;          
        LPC_UART3->LCR = ((U3_DATA_BIT)|(U3_STOP_BIT<<2)|(U3_CHECK_BIT_EN<<3)|(U3_CHECK_BIT<<4));
           LPC_UART3->IER = 0x03;                     // Enable RDA and THRE interrupts
        LPC_UART3->FCR = 0xc7;

        //12M:9600--0XA1   115200--0XC1   57600--0X20 D=0,M=2
        //18M:9600--X   115200--X             57600--0X97 D=7,M=9
        //24M:9600--0X41   115200--0X20   57600--0XF8 D=8,M=F
        //25M:9600--0XDA   115200--0XE5   57600--0X73 D=3,M=7
        LPC_UART3->FDR = 0xF8;
       
    NVIC_SetPriority(UART3_IRQn, 4);

        NVIC_EnableIRQ(UART3_IRQn);                                        /* 使能I2C中断         */


}// End of UART0 initialize function

Excellence 发表于 2019-9-23 10:49:13

LPC1768,,,,,,,,,,主频是96MHz.,不是100MHz.

Edesigner. 发表于 2019-9-23 11:03:59

dengxiaofeng 发表于 2019-9-23 08:58
外设时钟 默认25MHz   不能上到 115200   ,需要修改 外设时钟的。就这个问题。没别的问题。 ...

我的板是用12M晶振。

Edesigner. 发表于 2019-9-23 11:04:56

openmcu666 发表于 2019-9-23 09:49
试试这个 Fdiv = (25000000/16) / baudrate;// 设置波特率, 看串口外设时钟是多少

用12M晶振要小数才行的。9600倒是可以

dengxiaofeng 发表于 2019-9-24 17:46:50

Edesigner. 发表于 2019-9-23 11:03
我的板是用12M晶振。

和你板子晶体 啥关系   内部PLL到 100M的

openmcu666 发表于 2019-9-24 17:53:57

系统时钟100M.,看串口外设时钟是多少?应该是你时钟设置问题

Edesigner. 发表于 2019-9-24 20:57:25

问题解决了,增加小数寄存器设置就可以了
页: [1]
查看完整版本: lpc1754串口0,按照demo,设置波特率57600及以下正确115200不正常