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.

5438A串口波特率计算问题

大家帮忙看一下我的串口计算结果对不对,我感觉没问题,但是输出不正确。

  • 谢谢楼上分享的工具

    另外在用户指南(www.ti.com/.../slau208q.pdf)内也有 36.3.13 Typical Baud Rates and Errors

    以及36.3.10 Setting a Baud Rate

    For a given BRCLK clock source, the baud rate used determines the required division factor N:
    N = fBRCLK/Baudrate

    BRCLK:时钟源,可以通过寄存器设定何为时钟源;

    N:波特率产生的分频因子。

    如果N等于或大于16,则可以通过设置选择过采样波特率生成模式UCOS16
  • 使用了这个工具的结果还是不行,我用的外部XIT 2M晶振,示波器测试时钟代码配置正确,串口输出频率在5.6K 左右,实在是找不到什么原因了。实际输出结果都是0x37。

    void ucs_init(void)
    {
        /* Set VCore = 1 for 12MHz clock */
        PMM_setVCore(PMM_CORE_LEVEL_0);
       
        /* ACLK, MCLK, SMCLk set out to pins */
        GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P11, GPIO_PIN0 + GPIO_PIN1 + GPIO_PIN2);
       
        /* Port select XT1 选择晶振引脚 */
        GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P7, GPIO_PIN0 + GPIO_PIN1);
        
        /* 初始化XT1和XT2晶振频率 */
        UCS_setExternalClockSource(UCS_XT1_CRYSTAL_FREQUENCY, UCS_XT2_CRYSTAL_FREQUENCY);
        
        /* 初始化 XT1. 初始化成功返回STATUS_SUCCESS */
        UCS_turnOnHFXT1WithTimeout(UCS_XT1_DRIVE_0, UCS_XT1_TIMEOUT);
        
        /* 选择XT1 作为 MCLK 时钟源 */
        UCS_initClockSignal(UCS_MCLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);
        
        /* 选择XT1 作为 SMCLK 时钟源 */
        UCS_initClockSignal(UCS_SMCLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);
        
        /* 选择XT1 作为 ACLK 时钟源 */
        UCS_initClockSignal(UCS_ACLK, UCS_XT1CLK_SELECT, UCS_CLOCK_DIVIDER_1);
        
        /* 使能振荡器故障中断 */
        SFR_clearInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
        SFR_enableInterrupt(SFR_OSCILLATOR_FAULT_INTERRUPT);
    }
    
    void uart_init(void)
    {
       /* 选择串口收发引脚
        * P9.4,5 = USCI_A0 TXD/RXD
        */
        GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P9, GPIO_PIN4 + GPIO_PIN5);
       
        /* Baudrate = 9600, clock freq = 2MHz
           UCBRx = 208, UCBRFx = 0, UCBRSx = 3, UCOS16 = 0
        */
        USCI_A_UART_initParam param = {0};
        param.selectClockSource = USCI_A_UART_CLOCKSOURCE_SMCLK;
        param.clockPrescalar = 13;
        param.firstModReg = 0;
        param.secondModReg = 0;
        param.parity = USCI_A_UART_NO_PARITY;
        param.msborLsbFirst = USCI_A_UART_LSB_FIRST;
        param.numberofStopBits = USCI_A_UART_ONE_STOP_BIT;
        param.uartMode = USCI_A_UART_MODE;
        param.overSampling = 1;
    
        if(STATUS_FAIL == USCI_A_UART_init(USCI_A2_BASE, &param))
        {
            return;
        }
    
        /* 使能串口操作 */
        USCI_A_UART_enable(USCI_A2_BASE);
    
        /* 使能串口接收中断 */
        USCI_A_UART_clearInterrupt(USCI_A2_BASE, USCI_A_UART_RECEIVE_INTERRUPT);
        USCI_A_UART_enableInterrupt(USCI_A2_BASE, USCI_A_UART_RECEIVE_INTERRUPT);
    }
    
    void main(void)
    {
      /* 停止看门狗 */
       WDT_A_hold(WDT_A_BASE);
       
       ucs_init();
       uart_init();
       
       /* 使能全局中断 */
        __bis_SR_register(GIE);
        
       while(1)
       {
         USCI_A_UART_transmitData(USCI_A2_BASE,55);
       } 
    }

  • 建议先把ACLK、smclk和mclk通过io输出,用示波器确定下时钟信号是否正确。

  • 这个看了,都正确的, 你看看代码配置有问题吗大佬
  • 是自己眼花了,把55的当成0x55了,啊啊啊。