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

Guru**** 2382480 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/986652/msp430fr2422-uart

器件型号:MSP430FR2422

您好!

我想测试 与外部 UART 相连的 MSP430FR2422中的 UCA0TXD P1.4,并使用它检查 UART 串行端口的输出。 我尝试使用 uint8_t 数据、但现在我想让 hello World 尝试、但 由于 char 和 uint8_t 数据类型不同且不支持转换、所以没有发生这种情况。 那么、有人能帮我处理这个代码、并尝试在 UART 上打印 Hello World。

#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;
unsigned long int m=0;
uint8_t RXData = 0;
unsigned long int TXData = 10;
uint8_t check = 0;
char mystr[49]="1219";

void main (void)

//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);
SYSCFG3 &=~μ F USCIARMP;
//* ptr = mystr;

//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 数据

//将数据加载到缓冲区中
eUSCI_A_UART_transmitData (eUSCI_A0_BASE、mystr);//此处 mystr 将输入作为 uint8_t
for (m=0;m<10000;m++);
// while (check!= 1);
//check = 0;

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

    eUSCI_A_uart_transmitData (eUSCI_A0_BASE、mystr);//此处 mystr 将输入作为 uint8_t

    您正在传递数组(char *) 、但此函数需要一个字节(uint8_t)。 您需要在循环中发送数组字节、如下所示:

    >表示(i = 0;mystr[i]!='\0';+i)

    >  EUSCI_A_UART_transmitData (EUSCI_A0_BASE、mystr[i]);// 按字节

    然后,您可以通过将 mystr[]声明为"uint8_t mystr[]"而不是"char mystr[]"来摆脱警告。

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

    感谢您的回答,我也尝试过,但现在如果我添加字符串 hello world,那么它将打印 hello worldd (即一个 d),则会额外打印。

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

    那么您会遇到一个错误。 您需要向我们展示您的当前代码。

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

    /*-版权所有-、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;
    unsigned long int m=0;
    uint8_t RXData = 0;
    unsigned long int TXData = 10;
    uint8_t check = 0;
    char mystr[15]="Hello_World";
    void send (char);
    void main (void)

    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    SYSCFG3 &=~μ F USCIARMP;
    //* ptr = mystr;

    //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、UCA0TXBUF);

    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_UCRXIFG 案例:
    RXData = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
    //检查值
    if (!(RXData = TXData))

    while (1);

    支票=1;
    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;

    }*/

    /*void send (char mystr)

    UCA0TXBUF=mystr;

    }*/

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

    >UCA0TXBUF=mystr[f];
    > EUSCI_A_UART_transmitData (EUSCI_A0_BASE、UCA0TXBUF);

    我不太确定您在这里要实现的目标。 transmitData()为您写入 TXBUF,并且还负责寄存器协议。 我(仍然)推荐我在上面发布的代码:

    >  EUSCI_A_UART_transmitData (EUSCI_A0_BASE、mystr[i]);// 按字节