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.

[参考译文] MSP430FR2422:UART 接收数据尝试使用外部 UART

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/987369/msp430fr2422-uart-receive-data-try-with-external-uart

器件型号:MSP430FR2422

您好!

我在 MSP430FR2422上工作、我不熟悉此电路板。 我目前正在使用 UART,我正在尝试接收来自 UART 外部外设的数据,我想接收数据,但在这里我无法这样做。 我为 UART COM 端口提供输入、该端口应连接到我们正在使用的 UCA0RXD P1.5。 在这里,我们面临的主要问题是,当 ISR 被调用时,例程被执行,并且 dat 不会保存在 UCARXBUF 中。 我附加了代码、我还从资源浏览器中看到了驱动程序和寄存器库示例、但我没有找到任何重要线索。

/*********
#include "driverlib.h"
//#include "Board.h"
#define GPIO_PORT_UCA0TXD GPIO_PORT_P1
#define GPIO_PIN_UCA0TXD GPIO_PIN4
#define GPIO_FUNCITY_UCA0TXD GPIO_PRIMARY_MODULE_FUNCTION
#define GPIO_PORT_UCA0RXD GPIO_PORT_P1
#define GPIO_PIN_UCA0RXD GPIO_PIN5
#define GPIO_FUNCITY_UCA0RXD GPIO_PRIMARY_MODULE_FUNCTION
uint16_t i;
uint8_t RXData = 0、TXData = 0;
char mystr[20]="Hello_World\r\n";
unsigned long int m=0;
uint8_t check = 0;
#include

void main (void)

//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);

//set ACLK = REFOCLK、时钟分频器为1
CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_Clock_divider);
//set SMCLK = DCO、分频器为1
CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK _DIVIDER_1);
//set MCLK = DCO、分频器为1
CS_initClockSignal (CS_MCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK _DIVIDER_1);

//配置 UART 引脚
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_UCA0TXD、
GPIO_PIN_UCA0TXD、
GPIO_Function_UCA0TXD
);
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_UCA0RXD、
GPIO_PIN_UCA0RXD、
GPIO_Function_UCA0RXD
);

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

//配置 UART
//SMCLK = 1MHz、波特率= 115200
//UCBRx = 8、UCBRFx = 0、UCBRSx = 0xD6、UCOS16 = 0
EUSCI_A_UART_initParam param ={0};
param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
param.clockPrescalar = 8;
param.firstModReg = 0;
param.secondModReg = 0xD6;
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_Transmit 中断);

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

//启用全局中断
_enable_interrupt ();
while (1)

//增加 TX 数据

//将数据加载到缓冲区中
int f;
for (f=0;mystr[f]!='0';f++)

//UCA0TXBUF=mystr[f];
eUSCI_A_UART_transmitData (eUSCI_A0_BASE、mystr[f]);

for (m=0;m<10000;m++);
// 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__((中断(USCI_A0_Vector))
#endif
空 EUSCI_A0_ISR (空)

switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

USCI_NONE 案例:中断;
USCI_UART_UCTXIFG 案例:
// RXData=UCA0RXBUF;
RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
//检查值
//if (!(RXData == TXData))
//{
// while (1);
//}
//check =1;
中断;
USCI_UART_UCRXIFG 案例:中断;
案例 USCI_UART_UCSTTIFG:中断;
案例 USCI_UART_UCTXCPTIFG:中断;

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

    > EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_Transmit _INTERRUPT);

    > EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_Transmit _INTERRUPT);

    根据代码的其余部分、您应该启用接收中断(UCRXIE)、如下所示:

    > EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);

    > EUSCI_A_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);

    ----------

    >案例 USCI_UART_UCTXIFG:
    >// RXData=UCA0RXBUF;
    > RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);

    这会检测发送中断、而不是接收中断。 将第一行替换为:

    >案例 USCI_UART_UCRXIFG:

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

    您好,感谢您的回复,我的问题已在您的帮助下得到解决

    我也在附上我的最终代码

    /*-版权所有-、BSD
    *版权所有(c) 2017、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *--/版权--*/
    //
    //! 使用 EUSCI_A_UART_init API 的 EUSCI_A0外部环回测试
    //!
    //! 说明:此演示将 TX 连接到 MSP430 UART 的 RX
    //! 示例代码显示了寄存器的正确初始化
    //! 以及用于接收和发送数据的中断。
    //!
    //! SMCLK = MCLK = BRCLK = DCOCLKDIV =~1MHz、ACLK = 32.768kHz
    //!
    //!
    //! MSP430FR2xx_4xx 电路板
    //! --------
    //! RST -| UCA0TXD|--|
    //! ||||
    //! ||||
    //! | UCA0RXD|---|
    //! ||
    //!
    //! 此示例使用以下外设和 I/O 信号。 您必须执行的操作
    //! 查看这些内容并根据您自己的董事会的需要进行更改:
    //! UART 外设
    //! - GPIO 端口外设(用于 UART 引脚)
    //! UCA0TXD
    //! UCA0RXD
    //!
    //! 此示例使用以下中断处理程序。 来使用该示例
    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到
    //! 矢量表。
    //! - USCI_A0_Vector。
    //
    #include "driverlib.h"
    //#include "Board.h"
    #define GPIO_PORT_UCA0TXD GPIO_PORT_P1
    #define GPIO_PIN_UCA0TXD GPIO_PIN4
    #define GPIO_FUNCITY_UCA0TXD GPIO_PRIMARY_MODULE_FUNCTION
    #define GPIO_PORT_UCA0RXD GPIO_PORT_P1
    #define GPIO_PIN_UCA0RXD GPIO_PIN5
    #define GPIO_FUNCITY_UCA0RXD GPIO_PRIMARY_MODULE_FUNCTION
    uint16_t i;
    uint8_t RXData = 0、TXData = 0;
    char mystr[20]="Hello_World\r\n";
    字符接收[20];
    uint16_t x;
    unsigned long int m=0;
    uint8_t check = 0;
    #include

    void main (void)

    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);

    //set ACLK = REFOCLK、时钟分频器为1
    CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_Clock_divider);
    //set SMCLK = DCO、分频器为1
    CS_initClockSignal (CS_SMCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK _DIVIDER_1);
    //set MCLK = DCO、分频器为1
    CS_initClockSignal (CS_MCLK、CS_DCOCLKDIV_SELECT、CS_CLOCK _DIVIDER_1);

    //配置 UART 引脚
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_UCA0TXD、
    GPIO_PIN_UCA0TXD、
    GPIO_Function_UCA0TXD
    );
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_UCA0RXD、
    GPIO_PIN_UCA0RXD、
    GPIO_Function_UCA0RXD
    );

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

    //配置 UART
    //SMCLK = 1MHz、波特率= 115200
    //UCBRx = 8、UCBRFx = 0、UCBRSx = 0xD6、UCOS16 = 0
    EUSCI_A_UART_initParam param ={0};
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
    param.clockPrescalar = 8;
    param.firstModReg = 0;
    param.secondModReg = 0xD6;
    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)

    //增加 TX 数据

    //将数据加载到缓冲区中
    int f;
    for (f=0;mystr[f]!='0';f++)

    //UCA0TXBUF=mystr[f];
    eUSCI_A_UART_transmitData (eUSCI_A0_BASE、mystr[f]);
    while (EUSCI_A_UART_getInterruptStatus (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt_FLAG)){
    //等待完成


    // while (eUSCI_A_UART_getInterruptStatus (eUSCI_A0_BASE、eUSCI_A_UART_receive_interrupt_FLAG)){
    //等待完成
    //}

    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__((中断(USCI_A0_Vector))
    #endif
    空 EUSCI_A0_ISR (空)

    switch (__evo_in_range (UCA0IV、USCI_UART_UCTXCPTIFG))

    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    // RXData=UCA0RXBUF;
    RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
    // EUSCI_A_UART_transmitData (EUSCI_A0_BASE、RXData);

    //检查值
    /*if (!(RXData =TXData))

    while (1);

    Check =1;*/
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;