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.

[参考译文] CCS/MSP-EXP430FR5994:UART 回显示例返回字符、但延迟一秒

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430FR5994, MSP430FR5969, ENERGYTRACE

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/894587/ccs-msp-exp430fr5994-uart-echo-back-example-return-the-character-but-with-one-second-delay

器件型号:MSP-EXP430FR5994
主题中讨论的其他器件:MSP430FR5994MSP430FR5969

工具/软件:Code Composer Studio

您好!

我在 TIREX 上找不到 MSP430FR5994的 UART 示例、因此我将使用 MSP430FR5969的示例。

代码(附在下面)与示例相同、但有一点变化、即它将始终回显(而不是像原始示例中那样"反向回显")。

该示例工作正常。 我通过 launchpad 在使用 USB 连接到 PC 时创建的 COM 端口看到 UART 数据。

一直都很棒

但出于某种原因、从从从 PC 发送字符到看到字符返回、我有一秒的延迟。

为什么? 如何使其立即运行、以便立即返回字符?

(对于其他器件、我会立即看到返回的 char、因此我想我的其他硬件也可以。)

我在代码处没有看到任何延迟环路或类似的东西...

代码:

/*-版权所有-、BSD
*版权所有(c) 2017、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*--/版权--*//*********

//! 使用 EUSCI_A_UART_init API
的 EUSCI_A0外部环回测试//!
//! 说明:此演示将 TX 连接到 MSP430 UART 的 RX
//! 示例代码显示了寄存器//
!的正确初始化 以及用于接收和发送数据的中断。
//!
//! ACLK = BRCLK = 32.768kHz、MCLK = SMCLK = DCO =~1MHz
//!
//!
//! 在 MSP430FR5969中进行了测试
//! --------
//! RST -| P2.0/UCA0TXD|--|
//! | ||
//! | ||
//! | P2.1/UCA0RXD|--|
//! | |
//!
//! 此示例使用以下外设和 I/O 信号。 您必须
//! 查看这些内容并根据您自己的董事会需要进行更改:
//! - UART 外设
//! - GPIO 端口外设(用于 UART 引脚)
//! - UCA0TXD
//! - UCA0RXD
//!
//! 此示例使用以下中断处理程序。 要使用此示例
//! 在您自己的应用程序中、您必须将这些中断处理程序添加到
您的//! 矢量表。
//! - USCI_A0_Vector。
//
#include "driverlib.h"

uint16_t i;
uint8_t RXData = 0、TXData = 0;
uint8_t check = 0;

void main (void)
{
//停止看门狗
WDT_A_HOLD (WDT_A_base);

// LFXT 设置
//将 PJ.4和 PJ.5设置为主模块功能输入。
/*

*选择端口 J
*将引脚4、5设置为输入主模块功能 LFXT。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_PJ、
GPIO_PIN4 + GPIO_PIN5、
GPIO_PRIMARY_MODULE_FUNCTION
);

//将 DCO 频率设置为1MHz
CS_setDCOFreq (CS_DCORSEL_0、CS_DCOFSEL_0);
//将外部时钟频率设置为32.768KHz
cs_setExternalClockSource (32768、0);
//set ACLK=LFXT
CS_initClockSignal (CS_ACLK、CS_LFXTCLK_select、CS_Clock_divider);
//set SMCLK = DCO、分频器为1
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_select、CS_Clock_divider);
//set MCLK = DCO、分频器为1
CS_initClockSignal (CS_MCLK、CS_DCOCLK_select、CS_Clock_divider);
//Start XT1、无超时
CS_TurnOnLFXT (CS_LFXT_DRIVE_0);


//配置 UART 引脚
//将 P2.0和 P2.1设置为辅助模块功能输入。
/*

*选择端口2D
*将引脚0、1设置为输入次级模块功能(UCA0TXD/UCA0SIMO、UCA0RXD/UCA0SOMI)。
*
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P2、
GPIO_PIN0 + GPIO_PIN1、
GPIO_secondary 模块功能
);

/*
*禁用 GPIO 上电默认高阻抗模式以激活
*先前配置的端口设置
*
PMM_unlockLPM5 ();

//配置 UART
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_ACLK;
param.clockPrescalar = 3;
param.firstModReg = 0;
param.secondModReg = 92;
param.parity = EUSCI_A_UART_NO_parity;
param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
param.numerofStopBits = EUSCI_A_UART_Oe_STOP_BIT;
param.uartMode = EUSCI_A_UART_MODE;
param.oversaming= EUSCI_A_UART_LOW_FREQUENCY BAUDRATE_generation;

if (STATUS_FAIL = EUSCI_A_UART_init (EUSCI_A0_BASE、&param)){
返回;
}

EUSCI_A_UART_ENABLE (EUSCI_A0_BASE);

EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、
EUSCI_A_UART_receive_interrupt);

//启用 USCI_A0 RX 中断
EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、
EUSCI_A_UART_receive_interrupt); //启用中断

_enable_interrupt ();
while (1)
{
TXData = RXData; //增加 TX 数据
//将数据加载到缓冲区中
EUSCI_A_UART_transmitData (EUSCI_A0_BASE、
TXData);
while (check!= 1);
Check = 0;
}
}
//*********
//
////这是 USCI_A0中断矢量处理例程。
////
*********
#if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
#pragma vector=USCI_A0_vector
__interrupt #elif
defined (__GNU__)
__attribute__(interrupt (USCI_A0_vector))#endif

void USCI_A0_ISR __interrupt #elt #elif defined (__GTIC_属性_(UCA_UCI_IN_IN_INTRIF_IN_IN_INTRIBUCI_IN_UCAINTRIEL

)(UCA0_INTRUCAINTR

USCI_NONE 案例:中断;
USCI_UART_UCRXIFG 案例:
RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
支票=1;
中断;
案例 USCI_UART_UCTXIFG:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:break;
}
}

谢谢。

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

    尊敬的 Ron:

    如果您查看 Web 产品文件夹、仍然可以找到在线代码示例。 在链接的 zip 存档中、您可以找到 UART 回波示例、例如 msp430fr599x_euscia0_UART_01.c 也许您可以尝试一下、因为到目前为止、我没有理由延迟一个完整的秒。 是否确定这不是由 PC 上的超级终端程序引起的?

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

    尊敬的 Dietmar:

    感谢您的回答。

    我检查了所附的示例"430m fr599x_euscia0_UART_01.c"、它工作正常。 我立即得到了字符。

    但是、以下几点:

    该示例使用引脚 P6.1、P6.0; 我需要使用引脚 P2.0、 P2.1。  (即连接到 launchpad 案例中的 launchpad UART 的引脚。 这些也在生产中使用。 因此我必须使用它们)

    2.我更喜欢使用 DriverLib 函数、使用寄存器级别更少。

    BTW、您提到的 Web 产品文件夹是否有任何链接?  它可能有用...

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

    尊敬的 Ron:

    如果您想使用 P2.0和 P2.1、只需交换寄存器、就可以将代码示例与这些引脚对齐、并使用 eUSCI_A0而不是 eUSCI_A3。

    但是、如果您想使用 DriverLib、寄存器级示例对您来说毫无意义。

    您能告诉我您使用的是哪个 MSP430软件版本(可能是屏幕截图)吗?

    您是否尝试调试了第二个延迟来自哪里? 连接调试器时使用反向通道 UART 受到限制。《MSP 调试器 用户指南 》中介绍了这些限制 SLAU647N 显示、当使用流量控制且目标 MCLK 频率为8MHz 时、115200波特下的运行只能保证可靠性、即不会丢失数据

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

    您正在运行调试器吗? 在许多/大多数 Launchpad 上、当调试器运行时、反向通道 UART 会延迟(明显可见)。 流优先级的东西。

    这是一个匹配项;如果您发送65个字节、您将立即得到前64个字节。

    [编辑:此外、"check"应该被声明为"volatile"。 不过、这是一个不同的症状。]

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

    Dietmar、Bruce、

    感谢您的回答。  

    实际上、当与调试断开连接并作为独立运行时、字符会立即进入 PC 终端软件。

    此外、我还进行了更多的调试、以确定1秒延迟的来源。

    我在'USCI_A0_ISR'上设置一个断点(在开关情况下为'USCI_UART_UCRXIFG')

    在数据传输处设置另一个断点(上面切断代码处的第149-150行)。  

    正如我看到的,在我从 PC 发送一个字符后,'USCI_A0_ISR'上的断点会直接被命中-这很好:)

    从'USCI_A0_ISR'断点恢复后、数据传输处的断点(实际上在传输前已命中)立即命中-这也很好。

    但从发送断点恢复到 PC 终端软件真正到达字符后、似乎需要一段时间。

    如何检查 我的 MSP430软件版本?  我使用的是 CCS  9.1.0.00010、采用了在线 TIREX 中的示例项目。

    谢谢

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

    尊敬的 Ron:

    您是否看过第20页的 SLAU647N、发现启用 Energytrace 后、反向通道 UART 可能会出现明显的延迟。 因此、如果尚未禁用、请尝试。 但很明显、这是调试端口和反向通道 UART 同时共享的结果、会导致延迟。 尤其是您的测试表明、如果没有调试器、它的工作方式会很好。

    我认为、对于您的 CCS 版本、您应该拥有最新版本的 MSP430软件。 以下是它在我的 Resource Explorer 中的外观: