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.

[参考译文] RTOS/MSP430F5529:帮助在 TI-RTOS 中配置 UART 驱动程序波特率

Guru**** 2001915 points
Other Parts Discussed in Thread: MSP430F5529, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581383/rtos-msp430f5529-help-to-configure-uart-drivers-baudrate-in-ti-rtos

器件型号:MSP430F5529
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

您好!  

我目前正在使用 TI-RTOS 中的 UART 驱动程序为 MSP430F5529开发一个项目。

我有2个与 UART 驱动程序相关的问题:

问题1:

当我使用与8192000Hz 不同的 SMCLK 频率配置 UART 波特率时、我通过 UART 收到了错误的数据

+我配置了 SMCLK 时钟频率:  

bios.cpufreq.lo = 24000000;
ClockFreqs.SMCLK = 24000000;
ClockFreqs.ACLK = 32768;

+然后、我使用此工具计算波特率: http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html

+即使我尝试使用较低的 SMCLK 频率、例如4000000MHz、我仍会遇到数据错误。

+毕竟、当我使用 SMCLK freq = 8192000Hz 时、我只获得正确的数据。

+我的 UART 配置基于 TI-RTOS 的 uartecho 示例中的配置。

问题2:

+我想在 MSP430F5529中同时使用 UART A0和 A1、那么我应该如何配置?

我尝试过此代码、但不起作用:

/*

*@def MSP430F5529_UARTName
*@MSP430F5529上 UART 名称的简短枚举
*/
typedef enum MSP430F5529_UARTName{
MSP430F5529_UART_A0 = 0、
MSP430F5529_UART_A1 = 1、

MSP430F5529_UART_COUNT// UART 对象数
*


******

*@defuartUSCIAHWAttrs
*@简单UART 硬件属性
*/
const UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP430F5529_UART_COUNT]=
{
{
baseAddr = USCI_A0_BASE、
时钟源= USCI_A_UART_CLOCKSOURCE_SMCLK、
.bitOrder = USCI_A_UART_LSB_FIRST、
numBudrateEndries = sizeof (uartUSCIABAURATS)/sizeof (UARTUSCIA_BAUDRAateConfig)、
.budrateLUT = uartUSCIA波特 率
}、
{
baseAddr = USCI_A1_base、
时钟源= USCI_A_UART_CLOCKSOURCE_SMCLK、
.bitOrder = USCI_A_UART_LSB_FIRST、
numBudrateEndries = sizeof (uartUSCIABAURATS)/sizeof (UARTUSCIA_BAUDRAateConfig)、
.budrateLUT = uartUSCIA波特 率
}
};


/*
***
*@defUART_CONFIG
*@简单UART 配置列表
*/
const UART_Config UART_CONFIG[]={
{
.fxnTablePtr =&UARTUSCIA_fxnTable、
.object = uartUSCIAObjects[0]、
.hwAttrs = uartUSCIAHWAttrs[0]
}、

{
.fxnTablePtr =&UARTUSCIA_fxnTable、
.object = uartUSCIAObjects[1]、
.hwAttrs = uartUSCIAHWAttrs [1]
}、

{NULL、NULL、NULL}
};

void IOSEKPeripheral_openUART (UART_Mode uartMode、MSP430F5529_UARTName uartName)
{
if (uartMode = UART_MODE_BLOCKING)
{
//创建数据处理关闭的 UART。
UART_Params_init (&uartParams);
{
uartParams.readMode = UART_MODE_BLOCKING;
uartParams.writeMode = UART_MODE_BLOCKING;
uartParams.readTimeout = UART_WAIT_FOREVE;
uartParams.readCallback
= NULL;
uartParams.writeCallback = NULL;
uartParams.readReturnMode = UART_return_full;
uartParams.readDataMode = UART_DATA_binary;
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 115200;
uartParams.dataLength = UART_LEN_8;
uartParams.stopbits = UART_STOP_One;
uartParams.parityType = UART_PAR_NONE;
}

}} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Duc:
    您使用的是 TI-RTOS 的哪个版本? 您是否已将波特率配置添加到 board.c 文件中的 uartUSCIA波特 率[]表中:

    CONST UARTUSCI_BAUDRAateConfig uartUSCIABAUDRAates []={
    /*{波特率、输入时钟、预分频器、UCBRFx、UCBRSx、 过采样}*/

    .outputBudrate = 115200、
    .inputClockFreq = 8192000、
    .prescalar = 4、
    hwRegUCBRFx = 7、
    hwRegUCBRSx=0、
    过采样= 1.
    }、
    {9600、8192000、53、5、0、 1}、
    {9600、32768、3、0、3、 0}、
    };

    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Janet、您好!
    我将 TI-RTOS 用于 MSP430 v2.20

    我在该表中添加了该波特率:
    {115200、24000000、13、0、0、 1}

    然后、我在 UART 终端中获取了一些垃圾数据。

    我还尝试使用另一个 SMCLK 进行配置、例如4000000Hz、8000000Hz 和16000000Hz。 但是、只有当 SMCLK = 8000000Hz 时、我才会获得正确的数据?

    由于 MSP430的电源配置或其它原因、问题是否会导致?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Duc:
    您的 UART 终端是否设置为115200?
    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、您好!
    我已经将终端波特率设置为115200、但我仍然得到垃圾数据。
    另一件事是、如果我不想使用 C 代码创建 EchoFxn 任务、并且想使用.cGF 文件配置此任务、我该怎么办? 我尝试使用 XGCONF 移动 echoFxn 任务以用作空闲任务、但没有任何工作。 现在只能使用"void main()"中的 C 代码创建任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Duc:

    您是否实际更改了 SMCLK 频率?  仅设置 ClockFreqs.SMCLK 并不会实际改变 SMCLK 频率。  它只是告诉系统新的频率是多少。  要从 BIOS 设置的默认值更改频率、您需要将以下行添加到.cfg 文件中:

    VAR Boot = xdc.useModule('ti.catalog.msp430.init.Boot');
    Boot.configureDCO = false; 

    然后在 main()中,根据需要设置时钟频率。 您还需要在.cfg 文件中设置 ClockFreq。

    此致、
    Janet
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Janet、您好!  

    所以我需要配置 Boot.configureDCO = false;或者 Boot.configureDCO = true 吗?

    我必须使用 driverlib 和.cfg 文件中配置时钟频率、对吧?

    要配置时钟的东西太多了

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Janet、您好!
    如上所示、我配置了.cfg 文件
    然后、我使用以下代码在 main 中配置时钟:

    // 1. 设置内核电压电平以处理24MHz 时钟速率
    PMM_setVCore (PMM_CORE_LEVEL_1);
    PMM_setVCore (PMM_CORE_LEVEL_2);
    PMM_setVCore (PMM_CORE_LEVEL_3);

    //*********
    // 2. 配置振荡器
    //初始化正在使用的 XT1和 XT2晶振频率
    //所以 driverlib 知道它们的速度有多快
    UCS_setExternalClockSource (
    lf_lp_crystal_frequency in_Hz、
    Hf_LP_crystal_frequency in_Hz
    );

    UCS_TurnOnLFXT1 (UCS_XT1_DRIVE_0、UCS_XCAP_3);

    //初始化 XT2晶体振荡器而不超时。
    //如果出现故障,代码会在此处挂起。
    //对于超时而不是代码挂起,请使用 UCS_TurnOnXT2WithTimeout()。
    UCS_TurnOnXT2 (UCS_XT2_DRIVE_16MHz_24MHZ);


    //*********
    // 3. 配置时钟频率
    //选择 XT1作为 ACLK 源(32KHz)
    UCS_initClockSignal (
    UCS_ACLK、 //您正在配置的时钟
    UCS_XT1CLK_SELECT、 //时钟源
    UCS 时钟分频器1 //将时钟源除以这个值
    );

    //将 FLL 的基准时钟源设置为使用 XT2 (4MHz)
    UCS_initClockSignal (
    UCS_FLLREF、 //您正在配置的时钟
    UCS_XT2CLK_SELECT、 //时钟源
    UCS 时钟分频器1 //将时钟源除以这个值
    );

    //配置 FLL 的频率并设置 MCLK 和 SMCLK 以使用 FLL 作为源(24MHz)
    UCS_initFLSettle (
    MCLK_24MHZ_REGLED_FREQUENCY IN_kHz、 // MCLK 频率
    MCLK_24MHZ_FLLREF_Ratio MCLK 和 FLL 基准时钟源之间的//比值
    );


    --------
    (当:
    #define LF_LP_crystal_frequency in_Hz32768 // 32KHz

    #define HF_LP_crystal_frequency in_Hz4000000 // 4MHz

    #define MCLK_24MHZ_REGLED_FREQUENCY IN_kHz24000 // 24MHz

    #define MCLK_24MHZ_FLLREF_Ratio(MCLK_24MHZ_REGLED_FREQUENCY IN_kHz)\
    /(HF_LP_crystal_frequency in_Hz / 1000)
    )

    --------------
    但现在终端中没有任何内容... 我现在该怎么做?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Duc:

    我能够让 UART 回波示例与波特率115200和以4MHz 运行的 SMCLK 配合使用。  我无法使其在 SMCLK = 24MHz 时工作。  板级配置文件中的 UART 波特率配置为:

       {
           .outputBudrate = 115200、
           .inputClockFreq = 4000000、
           .prescalar = 2、
           hwRegUCBRFx = 2、
           hwRegUCBRSx = 3、
           过采样= 1.
       }、

    在 uartecho.cfg 中、我添加了:

    boot.configureDCO = false;

    VAR ClockFreqs = xdc.useModule('ti.sysbios.family.msp430.ClockFreqs');
    bios.cpufreq.lo = 4000000;
    ClockFreqs.SMCLK = 4000000;
    ClockFreqs.ACLK = 32768;

    我从 SYS/BIOS 获取了 boot.c 文件、并通过更改 UCS 控制寄存器2中的乘法器将其修改为将 SMCLK 设置为4MHz。  我要附加此 boot.c 文件。  我从 main()调用函数 Boot_configureDCO ()。

    e2e.ti.com/.../7635.boot.c

    我仍在研究它为什么不适用于24MHz。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Janet、

    您能否向我展示如何配置为在 MSP430F5529 Launchpad 上使用2个 UART 外设? 我无法配置使用 UART 外设 A0和 A1。 我刚刚在 uartecho 示例中编辑了 Board.h、MSP430F5529.h 和 MSP430F5529.c、但它不起作用。

     

    +在 MSP430F5529.c 和.h 中编辑的代码:
    /*
     * ****************************************************************************
     *  @def    MSP430F5529_UARTName
     *  @brief  Enum of UART names on the MSP430F5529
     */
    typedefenumMSP430F5529_UARTName {
        MSP430F5529_UART_A0 = 0,
        MSP430F5529_UART_A1 = 1,
        MSP430F5529_UART_COUNT      //Number of UART objects
    } MSP430F5529_UARTName;
    /*
     * *****************************************************************
     * @def     uartUSCIAHWAttrs
     * @brief   UART hardware attributes
     */
    constUARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP430F5529_UART_COUNT] =
    {
        {
            .baseAddr = USCI_A0_BASE,
            .clockSource = USCI_A_UART_CLOCKSOURCE_SMCLK,
            .bitOrder = USCI_A_UART_LSB_FIRST,
            .numBaudrateEntries = sizeof(uartUSCIABaudrates)/sizeof(UARTUSCIA_BaudrateConfig),
            .baudrateLUT = uartUSCIABaudrates
        },
        {
            .baseAddr = USCI_A1_BASE,
            .clockSource = USCI_A_UART_CLOCKSOURCE_SMCLK,
            .bitOrder = USCI_A_UART_LSB_FIRST,
            .numBaudrateEntries = sizeof(uartUSCIABaudrates)/sizeof(UARTUSCIA_BaudrateConfig),
            .baudrateLUT = uartUSCIABaudrates
        }
    };
    /*
     * *****************************************************************
     * @def     UART_config
     * @brief   UART configuration list
     */
    constUART_Config UART_config[] = {
        {
            .fxnTablePtr = &UARTUSCIA_fxnTable,
            .object = &uartUSCIAObjects[0],
            .hwAttrs = &uartUSCIAHWAttrs[0]
        },
        {
            .fxnTablePtr = &UARTUSCIA_fxnTable,
            .object = &uartUSCIAObjects[1],
            .hwAttrs = &uartUSCIAHWAttrs[1]
        },
        {NULL, NULL, NULL}
    };

    void IOSEKPeripheral_initUART (void)

    //初始化 UART 引脚
    //P3.3、4 = USCI_A0 TXD/RXD
    //--------------------------------------
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P3、
    GPIO_PIN3 | GPIO_PIN4);

    //P4.4、5 = USCI_A1 TXD/RXD
    //--------------------------------------
    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、
    GPIO_PIN4 | GPIO_PIN5);

    //初始化 UART 驱动程序
    //--------------------------------------
    UART_INIT();

    *在 uartecho.c 中:
    UART_OPEN (MSP430F5529_UART_A0、uartParams);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Duc:

    您的配置对我来说似乎正常。  测试板文件中的内容如下所示:

    e2e.ti.com/.../3034.MSP_5F00_EXP430F5529LP.c

    您可以将此文件与您的文件进行比较。

    此致、

    Janet

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、Janet。
    我的配置工作正常。 我忘记将 UART A0的硬件配置添加到.cfg 文件中。 添加这些代码后、效果非常好

    // UART Hwi
    ///------------------------------
    var halHwi1Params = new halHwi.Params ();
    halHwi1Params.instance.name ="IZUART_PORT_A1";
    program.global.IZUart_port_A1 = halHwi.create (46、"&UARTUSCIA_hwiIntFxn"、halHwi1Params);

    var halHwi2Params = new halHwi.Params ();
    halHwi2Params.instance.name ="IZUART_PORT_A0";
    halHwi2Params.arg = 1;
    program.global.IZUart_port_A0 = halHwi.create (56、"&UARTUSCIA_hwiIntFxn"、halHwi2Params);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢、Janet。
    我的配置工作正常。 我忘记将 UART A0的硬件配置添加到.cfg 文件中。 添加这些代码后、效果非常好。

    // UART Hwi
    ///------------------------------
    var halHwi1Params = new halHwi.Params ();
    halHwi1Params.instance.name ="IZUART_PORT_A1";
    program.global.IZUart_port_A1 = halHwi.create (46、"&UARTUSCIA_hwiIntFxn"、halHwi1Params);

    var halHwi2Params = new halHwi.Params ();
    halHwi2Params.instance.name ="IZUART_PORT_A0";
    halHwi2Params.arg = 1;
    program.global.IZUart_port_A0 = halHwi.create (56、"&UARTUSCIA_hwiIntFxn"、halHwi2Params);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Duc:

    我很高兴听到它正在工作。

    此致、

    Janet