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:当我的 smclk 为24MHz 时,UART 波特集115200无法工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/688158/rtos-msp430f5529-ti-rtos-uart-baud-set-115200-can-t-work-when-my-smclk-is-24mhz

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

工具/软件:TI-RTOS

大家好、

用于 MSP430的 ccsv7;

适用于 msp43X 2.20.0.06的 TI-RTOS

我在 MSP-EXP5529LP 开发板中运行一个 TI-RTOS UART 示例,并 Board_initGeneral()函数中将 SMCLK 和 MCLK 时钟配置为24MHZ (通过 DCO 将4M XT2加倍)

#include 
#include 

UARTUSCI_Object uartUSCIAObjects[MSP_EXP430F5529LP_UARTCOUNT];

const UARTUSCIA_BAUDRATEXConfig uartUSCIA波特 率[]={
/*{波特率、输入时钟、预分频器、UCBRFx、UCBRSx、 过采样}*/
{//我的加法 
.outputBudrate = 115200、
.inputClockFreq = 24000000、
.prescalar = 13、
hwRegUCBRFx = 0、
hwRegUCBRSx=0、
过采样= 1.
}、
{
.outputBudrate = 115200、
.inputClockFreq = 8192000、
.prescalar = 4、
hwRegUCBRFx = 7、
hwRegUCBRSx=0、
过采样= 1.
}、
{9600、32768、 3、 0、 3、 0}、
};


const UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP_EXP430F5529LP_UARTCOUNT]={
{
baseAddr = USCI_A1_BASE、
时钟源= USCI_A_UART_CLOCKSOURCE_MCLK、//###### MCLK = 24000000#### 

.bitOrder = USCI_A_UART_LSB_FIRST、 numBudrateEndries = sizeof (uartUSCIABAURATS)/sizeof (UARTUSCIA_BAUDRAateConfig)、 .budrateLUT = uartUSCIA波特 率 }、 }; const UART_Config UART_CONFIG[]={ { .fxnTablePtr =&UARTUSCIA_fxnTable、 .object = uartUSCIAObjects[0], hwAttrs = uartUSCIAHWAttrs[0](&U) }、 {NULL、NULL、NULL} };
空 uartFxn (UARg arg0、UARg arg1)
{
UART_Handle UART;
UART_Params uartParams;
const char echoPrompt[]="\fEchoing Characters:\r\n";
//创建一个数据处理关闭的 UART。
UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 115200;
UART = UART_OPEN (Board_UART0、uartParams);
if (UART == NULL){
System_abort ("打开 UART 时出错");
}

UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));

/*循环永久回显*/
while (1){
UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));
Task_sleep( unsigned int)arg0;
}

}

int main (void)
{
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initUART();

Task_Params taskParams;
Task_Params_init (&taskParams);
taskParams.arg0 = 1000;
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =任务0Stack (&T);
Task_construct(&task0Struct,(Task_FuncPtr) uartFxn、&taskParams、NULL);

/*启动 BIOS */
BIOS_start();

返回(0);
} 

  

当我移除 const UARTUSCIA_BAUDRAateConfig uartUSCIA波特 率[]

{
.outputBudrate = 115200、
.inputClockFreq = 8192000、
.prescalar = 4、
hwRegUCBRFx = 7、
hwRegUCBRSx=0、
过采样= 1.
}、 

我找到 UART_open() 返回 ERR。  我不知道为什么?   

 

 同样、当我将 MCLK 配置为24MHZ 时、我必须将 cpufrq 配置为.CFG 文件中32768的倍数才能在 UART 9600波特率下工作。  有人解释原因?



/*========================= 内核(SYS/BIOS)配置=================== *
VAR BIOS = xdc.useModule('ti.sysbios.BIOS');

BIOS.sertsEnabled = false;

BIOS.heapSize = 512;

BIOS.includeXdcRuntime = false;

BIOS.libType = BIOS.LibType_Custom;

BIOS.runtimeCreatesEnabled = true;

BIOS.logsEnabled = false;

bios.cpufreq.hi = 0;
bios.cpufreq.lo = 23986176;//32768*732

谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不知道 TI-RTOS 系统的默认 SMCLK 时钟为什么为8192000、波特率115200和9600在默认时钟下是正常的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 XC.MO、

    您似乎正在使用 USCIA1、这是用于 MSP430F5529LP 的反向通道 UART。 由于 Launchpad 上的 eZ-FET Lite HW (电路板顶部的调试器)、Launchpad 上的反向通道 UART 限制为9600波特。 如果您希望使用高于9600波特的波特率、则需要使用 Launchpad 上具有到 PC 的单独路径的另一个 UART。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好、JH
    感谢你的答复。 您说这是由于 eZ-FET Lite HW 限制为9600波特、我不这么认为。 我执行三个测试。

    当 TI-RTOS 使用默认时钟 SMCLK (8192000)时,默认情况下,UARTUSCIA_BAUDRAateConfig[]列表中存在115200波特,并且工作正常。 也是如此。 当我使用 drivelib API 在 TI-RTOS 中配置 UART 时、115200波特是可以的。
    --------------------------

    //默认表列表
    * const UARTUSCIA_BAUDRAateConfig uartUSCIADDRates []={
    *//波特率、输入时钟(Hz)、预分频器、UCBRFx、UCBRSx、 过采样
    *{
    *.outputBudrate = 115200、
    *.inputClockFreq = 8192000、
    *.prescalar = 4、
    *.hwRegUCBRFx = 7、
    *.hwRegUCBRSx = 0、
    *.overs取样= 1
    *}、
    *{9600、8192000、53、5、 0、1}、
    *{9600、32768、3、 0、3、0}、
    *}; 


    --------------------------
    2.我修改了 UART 以使用 USCIA0,并使用了自己的配置时钟 SMCLK (240000000),发现 CRT 仍在打印乱码。
    --------------------------

    //my
    const UARTUSCIA_BAUDRAATEConfig uartUSCIABAUDRAates []={
    /*{波特率、输入时钟、预分频器、UCBRFx、UCBRSx、 过采样}*/
    {
    .outputBudrate = 115200、
    .inputClockFreq = 24000000、
    .prescalar = 13、
    .hwRegUCBRFx = 0、
    .hwRegUCBRSx = 0、
    过采样= 1
    }、
    {
    .outputBudrate = 115200、
    .inputClockFreq = 8192000、
    .prescalar = 4、
    .hwRegUCBRFx = 7、
    .hwRegUCBRSx = 0、
    过采样= 1
    }、
    {9600、32768、3、0、 3、0}、
    };
    
    
    const UARTUSCIA_HWAttrs uartUSCIAHWAttrs[MSP_EXP430F5529LP_UARTCOUNT]={
    
    .baseAddr = USCI_A0_BASE、
    .clockSource = USCI_A_UART_CLOCTRCK_UARTCOUNT]={.base_USCI_A0_UART_drateUART/
    
    }uatedrateUART_UART_UART24bautes = UST_UARTAULT_UART/ UART_UARTAULT_UARTx (1、UART_A)的.budrateS/ UART_dratedrateUART_UART_UARTx
    
    
    


    ------------------------
    我尝试修改 cfg 以关闭默认的 DCO,并发现 UART_open()始终返回 ERR。 我不知道这是不是因为 TI-RTOS 的 UART 模块、也不知道如何获取 TI-Rios UART_MODULE src。
    ------------------------

    //my cfg
    var Boot = xdc.useModule('ti.catalog.msp430.init.Boot');
    Boot.configureDCO = false;//禁用8192000hz DCO
    
    ---
    
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    BIOS.cpufreq.hi = 0;
    BIOS.cpufreq.lo = 24000000;/23986176;//32768*732 


    ------------------------

    此致、

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

    无论 TI-RTOS 有何问题、您的波特率将在 launchpad 上的 USCI A1上限制为9600波特。 因此、我建议将您的测试移到另一个 UART 上、以消除该问题。

    有关 TI-RTOS 问题、我邀请到我们的 TI-RTOS 专家。

    此外、在发布代码时、请记住使用代码编辑器、以便更易于阅读。 我已经修改了您之前的帖子、以反映这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们开了一个 Jira 工单、以了解适用于 MSP430的未来 TI-RTOS 版本。 现在、我将遵循 Jace 的指导。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、JH
    感谢您的指导。 我找到了问题。 我第一次使用该社区、因此我忽略了提交问题的一些详细信息。 现在、我将讨论如何解决该问题。

    我发现 UART_open()将调用 UARTUSCIA_open (UART_Handle handle、UART_Params *参数),如下所示
    ------------------------
    UART_Handle UARTUSCIA_open (UART_Handle handle、UART_Params *参数)


    /*获取 SPI 时钟输入频率*/
    switch (hwAttrs->clockSource){
    USCI_A_UART_CLOCKSOURCE_ACLK 案例:
    clockFreq = ClockFreqs_getFrequency (ClockFreqs_Clock_ACLK);
    log_Print1 (Diags_User1、"ClockFreqs_getFrequency ACLK:%d、clockFreq);
    中断;

    USCI_A_UART_CLOCKSOURCE_SMCLK 案例:
    clockFreq = ClockFreqs_getFrequency (ClockFreqs_Clock_SMCLK);

    …………
    ------------------------

    问题是时钟频率,我发现 ClockFreqs_getFrequency (ClockFreqs_Clock_Clk)总是返回819200,所以当我们使用其他具有振荡器频率的波特时,我们修改了 ClockFreqs.SMCLK 和 ClockFreqs.ACLK,或者使用 API 在 UART_OPEN 之前进行动态修改
    ------------------------
    VAR ClockFreqs = xdc.useModule('ti.sysbios.family.msp430.ClockFreqs');
    ClockFreqs.ACLK = 32768;
    ClockFreqs.SMCLK = 24000000;

    ------------------------


    谢谢大家。 很抱歉我的表达式。