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.

[参考译文] MSP430FR5739:当使用推荐的寄存器值时,UART在其他时钟频率下运行时不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/578750/msp430fr5739-uart-not-working-when-running-at-other-clock-frequencies-when-using-recommended-register-values

部件号:MSP430FR5739
主题中讨论的其他部件: MSP430FR2311MSP-EXP430FR5739

我已按照 《MSP430FR57xx系列用户指南》中的表18-5使用注册表项,在以8MHz的时钟频率运行时配置了MSP430FR5739 UART。 典型晶体和紫色的推荐设置。  这适用于8MHz时钟。  但是,当我使用表中的值尝试另一个频率时,UART会发出垃圾信息。  是否有人建议您是否需要其他设置?  请参阅以下代码:

// UART测试

#include <MSP4S.h>

//定义常量值
//#define MCU_CLK_8MHZ //将此注释为使用16MHz时钟
#define UART_TXD BIT0 //引脚19:2.0 UARTXD
#define UART_RXD BIT1//引脚20:2.1 UARTRXD

8MHz用户指南中的#ifdef MCU_CLK_8MHZ //值
#define UART_BR 52.
#define UART_BRF 1.
#define UART_BRS 0x49
#define UART_OS16 1.
#else //用户指南中16MHz的值
#define UART_BR 104
#define UART_BRF 2.
#define UART_BRS 0xD6
#define UART_OS16 1.
#endif

//函数声明和变量
void UART_TX(Char *TXData);
CHAR* TXString;// UART的传输字符串

//主菜单
void main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

//配置时钟
CSCTL0_H = 0xA5;//解锁寄存器
#ifdef MCU_CLK_8MHZ
CSCTL1 |= DCOFSEL0 + DCOFSEL1;// 8MHz
#否则
CSCTL1 || DCOFSEL_0 + DCORSEL;// 16MHz
#endif

CSCTL2 =拉美经济体系3 + SELS_3 + SELM_3;//设置ACLK = VLO;SMCLK = DCO,MCLK = DCO
CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0;//设置所有分隔线
CSCTL0_H = 0x01;//锁定寄存器

//配置端口
P2SEL1 |= UART_TXD + UART_RXD;//配置UART引脚,可用于WFP 2.0 和WFP 2.1
P2SEL0 &=~(UART_TXD + UART_RXD);

//配置UART
UCA0CTL1 || UCSWRST + UCSSEL_2;//配置UART 0
UCA0BR0=(UART_BR&0xff);
UCA0BR1=(UART_BR>8);
UCA0MCTLW = UART_BRF|UART_BRS|UART_OS16;

同时(1)

TXString ="测试\r\n";
UART_TX (TXString);
__DELAY周期(2万);
}
}


void UART_TX(Char *TXData)//定义一个接受指向数组的字符指针的函数

//用于传输字符的函数

无符号int i=0;

UCA0CTL1 &=~UCSWRST;//复位后释放
while (TXData[I])//通过数组递增,查找字符串末尾的空指针(0)

同时(!(UCA0IFG和UCTXIFG));// USI_A0 TX缓冲器就绪?
UCA0TXBUF = TXData[I];//在UART总线上发送TX_DATA阵列的元素I
数组地址的I++;//增量变量
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    基本上,我尝试使用UART,同时使用16MHz时钟,没有外部32.768kHz外部晶振。 我使用了用户指南中所有与计算波特率相关的公式,但它们似乎都不会产生未加密的UART传输。 是否有人可以协助提供有效的UCBRx,UCBRFx和UCBRSx? 任何波特率都将执行:96.001152亿等。谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    表18-5中的数字指定了寄存器中字段的值,该值与您写入寄存器中未以最低位开头的字段的值不同。

    使用"UCBRF_1"代替"1"。 使用"(0x49 * UCBRS0)"代替"0x49"。 使用"UCOS16"代替"1"。
    和UCA0BR可作为16位寄存器访问。

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

    感谢您的回应。Clemens。  我尝试了建议的值,它适用于产生9600波特的8MHz时钟。  根据表18-5,16MHz时钟可以使用相同的值来产生1.92万波特,但不会产生有效的结果。  对于注册条目,我使用以下内容:

    CSCTL1 || DCOFSEL_0 + DCORSEL;       //将时钟设置为16MHz

    UCA0BRW =52;
    UCA0MCTLW = UCBRF_1 +(0x49 * UCBRS0)+ UCOS16;

    这是为16MHz时钟和1.92万波特填充这些寄存器的正确方式吗?  如果没有,请告知。

    我非常感谢您的意见,因为对我来说,这非常令人困惑,我真的需要让UART工作。  我不在乎什么波特-但在16MHz时的任何波特。  任何示例工作代码都很有帮助。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    CSCTL1 || DCOFSEL_0 + DCORSEL; //将时钟设置为16MHz 

    这实际上将时钟设置为24 MHz。 (默认情况下,两个FSEL位均已设置;"|="不清除任何位。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我更改为CSCTL1 = DCOFSEL_0 + DCORSEL;现在我有UART工作在9600。 我尝试了表中的许多其他值,以查看是否可以使其他波特率工作,但它们都不起作用。 您能否展示一个例如16MHz和3.84万波特的快速示例? 正确设置寄存器的代码是什么?

    即 对于3.84万,我使用以下值(表18-5中的值),使用16MHz,但不起作用。
    UCA0BRW =26;
    UCA0MCTLW = UCBRF_0 +(0xB6 * UCBRS0)+ UCOS16;

    我使用以下值(表18-5中的值),使用16MHz,它可以正常工作。
    UCA0BRW =104;
    UCA0MCTLW = UCBRF_2 +(0xD6 * UCBRS0)+ UCOS16;

    设置寄存器时,我是否使用了错误的这些值? 如果是,正确的方法是什么。

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

    我不知道表18-5是从哪里得到这些值的。 USCI UART计算器 显示BRW = 26,MCTLW = UCOS16 + UCBRF_1 + 0 * UCBRS0 (在过采样模式下),但这会导致比不进行过采样更高的错误,因此您应该使用BRW = 416,MCTLW = UCBRF_0 + 6 * UCBRS0。

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

    您好,Clemens:

    再次感谢您的回复。  我尝试了两组数字,但它们都不起作用。  我还尝试了UART计算器中的其他值(感谢链接),它们也不起作用。  我尝试使用您建议的值的示例- 16MHz时钟:

    UCA0BRW =416;
    UCA0MCTLW = UCBRF_0 + 6 * UCBRS0;
    UCA0CTLW0 |= UCSWRST + UCMODE_0 + UCSSEL_2;

    是否还有其他事情会导致此操作不起作用?  当然,在线计算器应该给出有效的值。  您能给我发送有效的代码吗?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它可以使用9600波特,因此我们知道,剩下的唯一问题是时钟。

    “吐出垃圾”是什么意思? 通常,这表示发送器和接收器的时钟不完全匹配。
    您是否可以确认时钟源的运行频率正好为16 MHz?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有一个外部晶体,Xin和XOUT引脚上有2个12pF电容器,并使用以下代码将时钟设置为以16MHz运行:
    CSCTL0_H = 0xA5; //解锁寄存器
    CSCTL1 = DCOFSEL0 + DCOFSEL1; // 8MHz
    CSCTL1 = DCOFSEL_0 + DCORSEL; // 16MHz
    CSCTL2 =拉美经济体系0 + SESS_3 + SELM_3; //设置ACLK = DCO;SMCLK = DCO,MCLK = DCO
    CSCTL3 = DIVA_0 + DIVS_0 + DIVM_0; //设置所有分禾器
    CSCTL0_H = 0x01; //锁定寄存器

    我认为这对于以16MHz运行MCU是正确的。 这对您来说是否合适?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不使用晶体。

    有关如何启动Crystal的信息,请参阅代码示例包中的*CS.c文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Clemens:

    我查看了MSP430FR57xx的3个*CS.c文件中的每一个,它们都不使用外部晶体。  因此,我将忽略外部晶体,并专注于使用上面提到的时钟设置来使内部晶体正常工作。  当我按照您给我的值设置UART时,我确实在终端上得到了响应,它看起来像这样:

    i?i) i?) i?) i?) i?) i?) II) i?i) II?i?i?II?II?)))

    您可以告诉我是否还有其他事情可以尝试使其正常工作?  您是否有一个使用16MHz Crystal和3.84万 (或9600以外的任何其它波特)的代码示例?

    谢谢

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

    没有内部晶体。 DCO/VLO不是晶体,而是R/C振荡器;这就是它们不是非常精确的原因。
    根据数据表,调至"16 MHz"的DCO频率通常以16.2 MHz运行,在正常温度下误差高达2万 ppm。

    如果可能,您应该从晶体中派生UART时钟。 CS_03.c显示如何在低频模式下启动XT1上的外部晶体。 (您拥有什么晶体?)

    或者,尝试计算16.2 MHz基本时钟的波特率寄存器(或测量 芯片上的实际频率)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    XTAL I具有7A-16.000MAHE-T 我现在有了MCU的驱动器,我在CRO上进行了测量,它的测量结果精确到16.0万MHz (令人惊讶)。 然后我尝试了你给我的寄存器值,没有运气,然后是用户指南中的值,仍然没有运气。 代码现在如下所示:

    GPIO_setAsPeripheralModuleFunctionInputPin (
    GPIO_PORT_PJ,GPIO _PIN4 + GPIO _PIN5,GPIO主要模块功能);
    cs_setDCOFreq (DCORSEL,DCOFSEL_2); //将DCO频率设置为16MHz
    cs_initClockSignal (CS_ACLK,CS_XT1CLK_SELECT,CS_Clock_diver_1);//将ACLK=XT1和CLK除法器初始化为1
    cs_initClockSignal (CS_SMCLK,CS_DCOCLK_SELECT,CS_Clock_diverer_1);//初始化SMCLK=DCOCLK和CLK除法器到2
    cs_initClockSignal (CS_MCLK,CS_DCOCLK_SELECT,CS_Clock_diver_1);//初始化MCLK=DCOCLK和CLK除法器设置为1
    cs_setExternalClockSource(1600万,0); //设置XT1频率
    cs_turnOnXT1 (CS_XT1_DRIVE_0); //启动XT1外部晶体

    P2SEL1 || UART_TXD + UART_RXD; //配置UART引脚:WFP 2.0 和2.1
    P2SEL0 &=~(UART_TXD + UART_RXD);
    UCA0BRW =416;
    UCA0MCTLW = UCBRF_0 + 6 * UCBRS0;
    UCA0CTLW0 = UCSWRST + UCMODE_0 + UCSSEL_1;
    UCA0CTL1 &=~UCSWRST; //解除复位

    我不知道还有什么可以尝试。 该代码是否正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    理论上,16 MHz晶体需要驱动器强度1或2。

    现在会发生什么? 什么也没有? 垃圾? TxD信号的外观如何?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Thx。 我更改为CS_turnOnXT1 (CS_XT1_DRIVE_1)以更硬地驱动。 结果是:
    €…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b€…æ…b b b b b

    如果你不能找到任何其他的问题,你认为这应该是可行的,那么我真的很失落. 我甚至尝试用CCS示例eusci_a_UART.c中的代码替换UART init部件,结果也是一样的。
    此芯片是否真的支持此功能?或者我是否因为上面的代码似乎正确而错过了某些内容?
    再次感谢您的帮助。 我真的很感谢您的这段时间。 虽然有点令人沮丧:(
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    当发送者和接收者的时钟不匹配时,就会收到这样的垃圾。
    实际ACLK频率是多少? (将WFP 2.0 配置为输出ACLK,并进行测量。)

    从理论上讲,这看起来不像错误USCI44。 但为了安全起见,请将ACLK和MCLK都配置为从XT1获取。

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

    我已根据以下代码将MCLK设置为= ACLK。  此代码适用于9600波特,但不适用于其它波特率。

    GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_PJ, GPIO _PIN4 + GPIO _PIN5,
    GPIO主要模块功能
    );

    cs_setDCOFreq (DCORSEL,DCOFSEL_2);                                     //将DCO频率设置为16MHz
    Cs_initClockSignal (CS_ACLK,CS_XT1CLK_SELECT,CS_Clock_diver_1);         //将ACLK=XT1和CLK除法器初始化为1
    cs_initClockSignal (CS_SMCLK,CS_XT1CLK_SELECT,CS_Clock_diver_1);        //初始化SMCLK=DCOCLK和CLK除法器到2
    CS_initClockSignal (CS_MCLK,CS_XT1CLK_SELECT,CS_Clock_diver_1);         //初始化MCLK=DCOCLK和CLK分配器设置为1
    cs_setExternalClockSource(1600万,0);               //设置XT1频率
    cs_turnOnXT1 (CS_XT1_DRIVE_0);                   //启动XT1外部晶体

    我还配置了WFP 2.0 来输出ACLK信号,它的读数为15.997MHz,因此ACLK运行正常。

    还有其他建议吗?

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

    我不知道MSP430FR5739是否可以以9600波特以外的任何波特率运行UART。 我已经浏览了所有的TI示例,甚至使用了devicelib代码,但除了9600波特之外,它仍然无法正常工作。 我已经为MSP430FR2311编写了代码,并且设置了各种波特率,这些波特率使用eUSCI,它们可以正常工作。 我将相同的值应用于MSP430FR5739 -我只得到奇怪的字符。 您或TI的其他人能否确认,并在可能的情况下发送一些工作代码)此MCU的工作波特率不是9600波特?
    以下代码适用于9600波特,但不适用于1.92万波特@ 16MHz时钟:

    代码:
    #Elif MCLK_FREQ_MHz == 16
    #if UART_BAUD_RATE == 9600 //使用16MHz CLK,9600波特
    UCA0BR0 = 104; //1600万/16/9600</s>9600
    UCA0BR1 = 0x00;
    UCA0MCTLW = 0xD600 | UCOS16 | UCBRF_2;
    #Elif UART_BAUD_RATE == 1.92万 //使用16MHz CLK,1.92万波特
    UCA0BR0 = 52; //1600万/16/19200</s>1.92万
    UCA0BR1 = 0x00;
    UCA0MCTLW = 0x4900 | UCOS16 | UCBRF_1;

    1.92万波特的结果。
    ¥‡„ Dó¡…G£¤†…㤆¥‡t ó…£¤†…£¤†¥DbàDó

    请有人建议-或提供波特率为9600 (16MHz时钟)以外的工作代码。 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    输出一组0x55字节。 TXD输出的确切频率是多少? 是否存在抖动?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    按照建议,我将输出设置为0x55。

    16MHz时,波特率:9600,测量频率:4.86kHz。 无抖动。 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
    16MHz时,波特率:1.92万,测量频率:9.724kHz。 无抖动。 输出结果如下所示:€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀàÀ€àÀÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€€àÀ€ðàÀ€àÀ€àÀ€àÀ€àÀ€àÀ€à€àÀ€àÀ€àÀ€àÀ€à€à€àÀ€àÀ€àÀ€àÀ€àÀÀ€àÀàÀ€ðàÀàÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀàÀ€àÀ€àÀ€àÀ€àÀàÀ€àÀ€àÀ€àÀÀ€àÀ€à€àÀ€àÀ€àÀ€àÀàÀàÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀ€àÀÀ€àÀ€àÀ€àÀ€àÀ€àÀ€à€à€àÀ€àÀ€àÀ€àÀ€àÀ€Ð
    在16MHz时,波特率为3.84万,没有值输出。

    我使用的是MSP-EXP430FR5739,因此不会出现任何抖动。

    是否有任何代码可以使用单独的波特与此EXP板配合使用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在这两种情况下,测得的频率大约关闭1.3 %。 这可能会妨碍在较高波特率下正确接收。

    请尝试不要过度采样。

    如果要确保UART以高波特率工作,请改用波特率晶体(例如14.7456 MHz)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试删除过采样,但仍然不起作用。 到目前为止,我已经尝试了你们的所有建议,除了外部的14.7456MHz冷冻机之外,没有一个建议奏效。 我还尝试了16.0000MHz的外置晶体-这也没有什么区别。
    结论:MSP-EXP430FR5739开发板仅在8MHz时钟,9600波特或16MHz时钟,9600波特时工作-无论是否有外部晶体。 TI的所有UART示例代码仅适用于9600波特。 此外,我还可以在较低的MCU (MSP430FR2311)上获得其它波特率-使用与UCAxxx相同的确定寄存器值。

    TI能否提供在不同波特率下工作的代码,或者我是否可以断定MSP430FR57xx系列/或Launchpad不支持其他波特率?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,Clemens:

    到目前为止,我已经尝试了你们的所有建议,除了外部的14.7456MHz冷冻机之外,没有一个建议奏效。 我还尝试了16.0000MHz的外置晶体-这也没有什么区别。  
    结论: MSP-EXP430FR5739 开发板仅在8MHz时钟,9600波特或16MHz时钟,9600波特时工作-无论是否有外部晶体。 TI的所有UART示例代码仅适用于9600波特。 此外,我还可以在较低的MCU (MSP430FR2311)上获得其它波特率-使用与UCAxxx相同的确定寄存器值。

    TI能否提供以与9600不同的波特率工作的代码,或者我是否可以断定MSP430FR57xx系列/或Launchpad不支持其他波特率?

    请提供建议。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Timothy,您可以使用示波器查看硬件是否按您的预期工作,首先您可以将IO设置为特定频率,您可以测量它是否符合预期的测量频率, 然后,您可以缩短TX引脚和RX引脚,发送一个字节,以检查TX波形,并检查从TX收到的值。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 硬件是TI EVM板-您说它可能存在问题吗? 我仍然不相信这是硬件问题,因为我用示波器测量时钟,频率正常。 首先,我要确保软件正确无误-使用用于寄存器等的正确值。一旦确认了这一点,我就可以排除这一问题-因为我希望TI的EVM板应该?? 工作。
    在我的帖子中,我要求提供一段已知的波特率不是9600的示例代码,以及8或16MHz的时钟,但我似乎找不到任何人(至少在这篇帖子上)有这种情况。 如果有人有一个小的正在工作的UART代码示例,请告诉我。
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨,Timothy,我不是说这是硬件问题,我只是建议 您逐步检查系统。如果系统不能按您的预期工作,则是 由软件或硬件引起的。 USART是 一种异步通信,它也由 振荡器的精度决定,所以我建议您缩短TX引脚和RX引脚,看看您是否可以接收正确的值并检查波形。