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.

[参考译文] MSP430FR2433:MSP430未接收通过 UART 从 PC 发送的数据

Guru**** 2618025 points

Other Parts Discussed in Thread: MSP430FR2433

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/674340/msp430fr2433-msp430-is-not-receiving-data-sent-from-pc-over-uart

器件型号:MSP430FR2433

您好!

我尝试通过 UART 将 MSP430FR2433与 PC 连接、波特率为115200。 我想将一些数据从 PC 发送到微控制器、根据接收到的数据、微控制器的行为应该有所不同。 我能够将数据发送到 PC、但无法接收。 我使用 FTDI TTL 串行 USB 电缆、并使用连接到 COM 端口 PC 的 Fly 线连接 TX、RX 和 GND。 我有 UCA0 UART ISR、该 ISR 应在 RX 线上接收到任何内容时触发。 但它根本不会触发。 我尝试使用不同的串行终端、但运气不好。 我 不知道我是否缺少任何东西。 任何帮助都将不胜感激,我们将提前表示感谢。  

代码如下:

//=========== 头文件包括========================================================================================================
#include 
#include 
#include 
#include 
#include 

//=========== 常量=========================================================================
#define CR 13
#define LF 10
#define UART_TIMEOUT 9876

//=== 全局变量===================================================
char rx_data;
char debug_string [123];
uint64_t seconds = 0;

//======== 函数原型===================================================================
void UART_init (void);
bool UART_SEND_DEBUG_string (char []);
bool UART_SEND_BYTE (char);
void init_RTC (void);

//====== 函数定义===========================================

/*
*@brief 这是 main 函数
*@param None
*@Return None
*/
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

UART_INIT();

//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;

_enable_interrupt (); //启用所有中断--> GIE = 1 (高电平)

UART_SEND_DEBUG_STRING ("Hello World");

while (1)
{

}
}

// UCA0 UART ISR
#pragma vector=USCI_A0_vector
__interrupt void USCI_A0_ISR (void)
{
switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
{
USCI_NONE 案例:
中断;

USCI_UART_UCRXIFG 案例:
UCA0IFG &=~ UCRXIFG; //清除中断
RX_DATA = UCA0RXBUF; //存储缓冲区
sprintf (debug_string、"received:%c"、Rx_data);
UART_SEND_DEBUG_STRING (DEBUG_STRING);

中断;

USCI_UART_UCTXIFG 案例:
中断;

USCI_UART_UCSTTIFG 案例:
中断;

USCI_UART_UCTXCPTIFG 案例:
中断;
}
}
//结束 UCA0 UART ISR
//********

// RTC 中断服务例程
#pragma vector=RTC_vector
__interrupt void RTC_ISR (void)
{
开关(__evo_in_range (RTCIV、RTCIV_RTCIF))
{
案例 RTCIV_NONE:
中断; //无中断

案例 RTCIV_RTCIF: // RTC 溢出
P1OUT ^= BIT0; // Blink P1.0
秒++;
sprintf (debug_string、"seconds:%llu"、seconds);
UART_SEND_DEBUG_STRING (DEBUG_STRING);

中断;

默认值:
中断;
}
}
//结束 RTC 中断服务例程
//********

//
*@brief 初始化 USCI A0 UART 通信
*@param None
*@Return None
*/
void UART_init (void)
{
//配置 UART 引脚
P1SEL0 |= BIT4 | BIT5; //将2个 UART 引脚设置为第二个功能

//配置 UART
UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位状态
UCA0CTLW0 |= UCSSEL_SMCLK; //选择 SMCLK 作为时钟源

//使用 SMCLK (1MHz)计算115200的波特率
// 1000000/115200 = 8.68
// 1000000/115200 - INT (1000000/115200)=0.68
// UCBRSx 值= 0xD6 (请参阅 UG)
UCA0BR0 = 8;
UCA0MCTLW = 0xD600;
UCA0BR1=0;

UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
}
//结束 UART_INIT
//*********

//*
@brief 此函数通过 USCI A0 UART 发送给定的字节
*@param[in] data - char 字节发送
*@返回 true 成功,false (如果失败
)*/
bool UART_SEND_byte (char data)
{
uint16_t UART_TIMEOUT = UART_TIMEOUT;//加载超时值

while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
{
UART_TIMEOUT--; //等待 TX 中断挂起
}

if (UART_TIMEOUT = 0)
{
返回 false; //超时失败
}

UCA0TXBUF =数据;

UART_TIMEOUT = UART_TIMEOUT; //再次加载超时值

while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
{
UART_TIMEOUT--; //等待 TX 中断挂起
}

if (UART_TIMEOUT = 0)
{
返回 false; //超时失败
}

返回 true; //否则成功
}
//结束 UART_SEND_BYTE
//********

//*
@brief 此函数通过 USCI A0 UART 发送给定的字符串
*@param 数组 char 数组以发送
*@返回 true 成功,false (如果失败
)*/
bool UART_SEND_DEBUG_string (char array[])
{
uint16_t size = strlen (array);
uint16_t 索引= 0;

for (index=0;索引 

和 Putty 捕获的数据:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您将收到"秒"消息、但我看不到对 init_RTC 的调用。

    您确定这是您正在运行的代码吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另外:您是否从 J101上移除了 TXD 和 RXD 跳线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我正在调用 RTC_init(),似乎我发布了旧版本的代码。 很抱歉造成混淆。 以下是代码的更新版本:

    //=========== 头文件包括========================================================================================================
    #include 
    #include 
    #include 
    #include 
    #include 
    
    //=========== 常量=========================================================================
    #define CR 13
    #define LF 10
    #define UART_TIMEOUT 9876
    
    //=== 全局变量===================================================
    char rx_data;
    char debug_string [123];
    uint64_t seconds = 0;
    
    //======== 函数原型===================================================================
    void UART_init (void);
    bool UART_SEND_DEBUG_string (char []);
    bool UART_SEND_BYTE (char);
    void init_RTC (void);
    
    //====== 函数定义===========================================
    
    /*
    *@brief 这是 main 函数
    *@param None
    *@Return None
    */
    void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    init_rtc();
    UART_INIT();
    
    //禁用 GPIO 上电默认高阻抗模式
    //激活先前配置的端口设置
    PM5CTL0 &=~LOCKLPM5;
    
    _enable_interrupt (); //启用所有中断--> GIE = 1 (高电平)
    
    UART_SEND_DEBUG_STRING ("Hello World");
    
    while (1)
    {
    
    }
    }
    
    // UCA0 UART ISR
    #pragma vector=USCI_A0_vector
    __interrupt void USCI_A0_ISR (void)
    {
    switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))
    {
    USCI_NONE 案例:
    中断;
    
    USCI_UART_UCRXIFG 案例:
    UCA0IFG &=~ UCRXIFG; //清除中断
    RX_DATA = UCA0RXBUF; //存储缓冲区
    sprintf (debug_string、"received:%c"、Rx_data);
    UART_SEND_DEBUG_STRING (DEBUG_STRING);
    
    中断;
    
    USCI_UART_UCTXIFG 案例:
    中断;
    
    USCI_UART_UCSTTIFG 案例:
    中断;
    
    USCI_UART_UCTXCPTIFG 案例:
    中断;
    }
    }
    //结束 UCA0 UART ISR
    //********
    
    // RTC 中断服务例程
    #pragma vector=RTC_vector
    __interrupt void RTC_ISR (void)
    {
    开关(__evo_in_range (RTCIV、RTCIV_RTCIF))
    {
    案例 RTCIV_NONE:
    中断; //无中断
    
    案例 RTCIV_RTCIF: // RTC 溢出
    P1OUT ^= BIT0; // Blink P1.0
    秒++;
    sprintf (debug_string、"seconds:%llu"、seconds);
    UART_SEND_DEBUG_STRING (DEBUG_STRING);
    
    中断;
    
    默认值:
    中断;
    }
    }
    //结束 RTC 中断服务例程
    //********
    
    //
    *@brief 初始化 USCI A0 UART 通信
    *@param None
    *@Return None
    */
    void UART_init (void)
    {
    //配置 UART 引脚
    P1SEL0 |= BIT4 | BIT5; //将2个 UART 引脚设置为第二个功能
    
    //配置 UART
    UCA0CTLW0 |= UCSWRST; //将 eUSCI 置于复位状态
    UCA0CTLW0 |= UCSSEL_SMCLK; //选择 SMCLK 作为时钟源
    
    //使用 SMCLK (1MHz)计算115200的波特率
    // 1000000/115200 = 8.68
    // 1000000/115200 - INT (1000000/115200)=0.68
    // UCBRSx 值= 0xD6 (请参阅 UG)
    UCA0BR0 = 8;
    UCA0MCTLW = 0xD600;
    UCA0BR1=0;
    
    UCA0CTLW0 &=~UCSWRST; //初始化 eUSCI
    UCA0IE |= UCRXIE; //启用 USCI_A0 RX 中断
    }
    //结束 UART_INIT
    //*********
    
    //*
    @brief 此函数通过 USCI A0 UART 发送给定的字节
    *@param[in] data - char 字节发送
    *@返回 true 成功,false (如果失败
    )*/
    bool UART_SEND_byte (char data)
    {
    uint16_t UART_TIMEOUT = UART_TIMEOUT;//加载超时值
    
    while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
    {
    UART_TIMEOUT--; //等待 TX 中断挂起
    }
    
    if (UART_TIMEOUT = 0)
    {
    返回 false; //超时失败
    }
    
    UCA0TXBUF =数据;
    
    UART_TIMEOUT = UART_TIMEOUT; //再次加载超时值
    
    while ((!(UCA0IFG & UCTXIFG))&&(UART_TIMEOUT>0))
    {
    UART_TIMEOUT--; //等待 TX 中断挂起
    }
    
    if (UART_TIMEOUT = 0)
    {
    返回 false; //超时失败
    }
    
    返回 true; //否则成功
    }
    //结束 UART_SEND_BYTE
    //********
    
    //*
    @brief 此函数通过 USCI A0 UART 发送给定的字符串
    *@param 数组 char 数组以发送
    *@返回 true 成功,false (如果失败
    )*/
    bool UART_SEND_DEBUG_string (char array[])
    {
    uint16_t size = strlen (array);
    uint16_t 索引= 0;
    
    for (index=0;索引 
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不可以、我按原样使用实验板。 因此、所有引脚都连接在其默认位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如我所理解的、您要将 FTDI 板连接到 UCA0引脚、这些引脚也通过跳线连接到 Launchpad USB。 如果是、您应该移除跳线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经移动了这些跳线、它开始工作。 谢谢 Bruce!