This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

串口开启HSE模式波特率超过1000000后通信不上

Other Parts Discussed in Thread: TM4C1290NCPDT

大家好:

        我在做一个串口升级工具,上位机已经验证串口波特率设置到1500000没问题,下位机设置超过1000000(1000000以及以内的波特率都没问题)串口就发送都发送不出去,我系统时钟配置成16000000;看到M4的驱动库里UARTConfigSetExpClk函数if((ui32Baud * 16) > ui32UARTClk)有判断这个条件时必须开启HSE高速模式,我也加上了,但是还是有问题,由于是直接改bootloader的代码,基本上都是直接操作寄存器,现将串口初始化代码贴上:

#define UART_FIXED_BAUDRATE 1500000

#define  CRYSTAL_FREQ     16000000

HWREG(SYSCTL_RCGCGPIO) |= (UART_RXPIN_CLOCK_ENABLE |
                               UART_TXPIN_CLOCK_ENABLE);
    HWREG(SYSCTL_RCGCUART) |= UART_CLOCK_ENABLE;

    HWREG(UART_RXPIN_BASE + GPIO_O_AFSEL) |= UART_RX;
    HWREG(UART_RXPIN_BASE + GPIO_O_PCTL) |= UART_RX_PCTL;
    HWREG(UART_RXPIN_BASE + GPIO_O_ODR) &= ~(UART_RX);
    HWREG(UART_RXPIN_BASE + GPIO_O_DEN) |= UART_RX;

    HWREG(UART_TXPIN_BASE + GPIO_O_AFSEL) |= UART_TX;
    HWREG(UART_TXPIN_BASE + GPIO_O_PCTL) |= UART_TX_PCTL;
    HWREG(UART_TXPIN_BASE + GPIO_O_ODR) &= ~(UART_TX);
    HWREG(UART_TXPIN_BASE + GPIO_O_DEN) |= UART_TX;
    HWREG(UARTx_BASE + UART_O_CC) = UART_CLOCK_SYSTEM;
    //
    // Set the baud rate.
    //
    if(UART_FIXED_BAUDRATE*16 > CRYSTAL_FREQ)
    {
        //
        // Enable high speed mode.
        //
        HWREG(UARTx_BASE + UART_O_CTL) |= UART_CTL_HSE;

        //
        // Half the supplied baud rate to compensate for enabling high speed
        // mode.  This allows the following code to be common to both cases.
        //

        ui32ProcRatio = UART_BAUD_RATIO(UART_FIXED_BAUDRATE/2);
    }
    HWREG(UARTx_BASE + UART_O_IBRD) = ui32ProcRatio >> 6;
    HWREG(UARTx_BASE + UART_O_FBRD) = ui32ProcRatio & UART_FBRD_DIVFRAC_M;

    //
    // Set data length, parity, and number of stop bits to 8-N-1.
    //
    HWREG(UARTx_BASE + UART_O_LCRH) = UART_LCRH_WLEN_8 | UART_LCRH_FEN;

    HWREG(UARTx_BASE + UART_O_FR) = 0;

// Enable RX, TX, and the UART.
    //
    HWREG(UARTx_BASE + UART_O_CTL) |= (UART_CTL_UARTEN | UART_CTL_TXE |
                                      UART_CTL_RXE);

调试我在循环发送0xAA0X55字符串,结果是当波特率超过1000000,都会挂在while(!(HWREG(UARTx_BASE + UART_O_FR) & UART_FR_TXFE))这个循环出不来,数据也没发送出去。

      想请教下,当想使用高速的波特率时该怎样配置才能正常使用?