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.

[参考译文] MSP430F5438A:使用 MSP430F5438A printf 示例:将 printf()输出重新路由至 UART

Guru**** 2568435 points
Other Parts Discussed in Thread: MSP-FET, MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/598148/msp430f5438a-using-the-msp430f5438a-printf-example-rerouting-printf-output-to-uart

器件型号:MSP430F5438A
主题中讨论的其他器件: MSP-TS430PZ5X100MSP-FET

我正在使用 MSP-TS430PZ5X100中插入的 MSP430F5438A。 并在 CCSv7上使用 MSP-FET 进行 JTAG 调试。  

我没有将任何外部振荡器焊接到电路板上、因此使用了内部振荡器。

我正在使用从 MSP430通过 UART 重新路由 printf 示例复制的以下代码:

该代码来自 http://processors.wiki.ti.com/index.php/Printf_support_for_MSP430_CCSTUDIO_compiler

我正在尝试使用 FTDI USB 转 UART 电缆通过 UART 向桌面转接器发送"J"。 我已连接接地、RX 和 TX 引脚。

但是、对于发送的每个"J"字符、我都会收到两个垃圾字符0x2D 0x00。

另外、当尝试使用 printf ("Hello world")时、我收到0xAB 0x3A 0x3A 0x0A 0xFA 0x8B 0xDA 0xDA 0x3A 0xBA 0x02 0x00。

我正在使用示波器来点击 UART 信号。

在导致问题的代码或硬件设置中可能出现的问题是什么。

#include "msp430x54xA.h"。
#include 
#include 

#define UART_printf

#ifdef UART_printf
int fputc (int _c、寄存器文件*_FP);
int fputs (const char *_ptr、寄存器文件*_FP);
#endif

void main (void)
{
unsigned int counter=0;
WDTCTL = WDTPW + WDTHOLD; //停止 WDT

//初始化时钟模块
P1DIR |= 0x01; // P1.0输出
UCSCTL3 |= SELREF_REFOCLK;
UCSCTL4 |= SELA_REFOCLK;

//初始化 Timer_A 模块
TA1CCTL0 = CCIE; // CCR0中断使能
TA1CCR0 = 32768;
TA1CTL = tassel_ACLK + MC_UP + TACLR;// ACLK、UP 模式、清除 TAR

#ifdef UART_printf
//初始化 USCI 模块
P5SEL |= BIT6 + BIT7; // P5.6、7 = USCI_A1 TXD/RXD
UCA1CTL1 |= UCSWRST; //**将状态机复位**
UCA1CTL1 |= UCSSEL_ACLK; // AMCLK
UCA1BR0 = 27; // 32、768kHz 1200 (请参阅用户指南)
UCA1BR1 = 0; // 32、768kHz 1200
UCA1MCTL = UCBRS_2; // 32、768kHz 1200
UCA1CTL1 &=~UCSWRST; //**初始化 USCI 状态机**#endif


while (1)
{
_bis_SR_register (LPM3_bits+GIE); //进入 LPM3、启用中断
printf ("J");
}
}//

计时器 A0中断服务例程
#pragma vector=Timer1_A0_vector
__interrupt void Timer1_A0_ISR (void)
{
P1OUT ^= 0x01; //切换 P1.0
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
}

#ifdef UART_printf
int fputc (int _c,寄存器文件*)
{
while (!











 !UCA1IFG&UCTXIFG);UCA1TXBUF =(unsigned char)_c;* return = t <len ;  (ptr) t t = t t t t char (t);t = t t t t (t) t = t t t t t (t);t = t t t t t t t = t (t = t、t = t、t = t、t = t、t = t、t = t、t  i++)
{
while (!(UCA1IFG&UCTXIFG));
UCA1TXBUF =(无符号字符)_ptr[i];
}

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

    将32kHz 时钟分频为1200波特会产生很大的误差、默认 REFO 时钟不是很精确、不能从开始。

    请尝试改用 SMCLK。 它最终基于相同的 REFO 时钟、但标称1048576Hz 频率更容易分频为波特率、而不会出现较大误差。 (对于1200波特:BRW = 873、BRS = 7。)

    但要获得真正可靠的 UART、您需要精确的时钟源。

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

    我已根据您的建议更改了代码。 接收到的字符仍然相同。 因此问题仍然存在。
    MSP-TS430PZ5X100目标开发板附带需要焊接的32.768kHz Micro Crystal MS1V-T1K。
    它是否足够精确、或者我是否需要寻找其他晶体?

    谢谢、此致、
    Ankit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任何晶振或谐振器都足够精确。 (但您需要更改软件才能启动它。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Clemens、

    这是我第一次使用 MSP430、所以我有很多问题。 很抱歉、您有这么多问题。

    我想澄清一点、关于 MSP430F5438A 中 UCS 相对于 MSP-TS430PZ5X100目标开发板的操作。

    1.在阅读《MSP430硬件工具用户指南》(SLAU278Y)时,我遇到了。 MSP-TS430PZ5x100物料清单。 它将两个外部晶体 Q1和 Q2称为 DNP。 此外、电容器 C1、C2、C3、C4和电阻器 R6、R8、R9、R12也是 DNP。 为什么是 DNP? DNP 到底是什么意思?

    2、R6、R8、R9、R12都为0欧姆、0欧姆电阻器的用途是什么?

    在阅读《MSP430x5xx 和 MSP430x6xx 系列用户指南》SLAU208P 中的统一时钟系统(UCS)部分时、我看到了以下段落:
    "XT1振荡器使用32768Hz 低频时钟晶振支持超低电流消耗
    (LF)模式(XTS = 0)。 一个手表晶振连接至 XIN 和 XOUT、而无需任何其它外部晶振
    组件。 软件可选的 XCAP 位为配置内部提供的负载电容
    LF 模式下的 XT1晶振。 该电容可选择为2pF、6pF、9pF 或12pF (典型值)。
    如有必要、可添加额外的外部电容器。"

    这是否意味着、如果我从软件中选择可通过软件选择的 XCAP 为12pF、那么我不需要使用外部电容器 C1和 C2?

    4.是否可以通过将 XT1BYPASS 置位来连接一个函数发生器来在 XIN 引脚上提供一个外部时钟信号?

    MSP-TS430PZ5X100目标开发板附带了32.768kHz 微晶振 MS1V-T1K。 但在包含振荡器的沙丘上、有人提到"为了获得更准确的时序、这个 TI-MSP430可选择连接一个石英晶体单元"。 这是否意味着 MS1V-T1K 仍然不够精确?

    6.对于22.1184MHz 或20MHz 下可与 MSP430F5438A 搭配使用的高频石英晶体有何建议?

    7.我能够使 SPI 正常工作、但无法使 UART 工作、与 SPI 串行时钟相比、振荡器在波特率方面的作用是否更大?

    很抱歉再次提出很多问题。

    谢谢、此致、
    Ankit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DNP =请勿放置;如果需要、可以稍后将这些组件焊接到中。

    0Ω 您不需要该连接、则可以取消焊接 Δ I 电阻器。

    内部电容确实可以替代外部电容器。

    XT1BYPASS 禁用振荡器反馈电路、因此 XIN 必须获得一个外部数字时钟信号。

    "更准确"是指"比没有任何晶体时更准确"。

    SPI 是同步的、即、主器件的时钟信号有一条单独的线路。 实际频率对从器件无关紧要。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Clemens、

    非常感谢您的回复。 我已经解决了 UART 打印问题。
    这是一个愚蠢的 FTDI 线缆错误。 我使用的是 USB 转 RS232电缆、直接将 RS232引脚连接到微控制器的 UART 引脚、这导致了问题。 我使用了 FTDI 基本分线- 3.3V、它解决了这个问题。

    但是在这个过程中、我也学到了很多关于外部晶体和内部振荡器的知识。

    谢谢引导我:)

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

    BTW、有更简单的5xx 记录方法、遗憾的是 TI FET 不支持该方法。 邮箱系统可用于此目的、无需任何时钟设置和任何额外的线路/引脚/胶合逻辑。

    e2e.ti.com/.../mailbox.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Zrno Soli 提供的信息。 我一定会查看_/\_