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.

[参考译文] 编译器/MSP430G2553:针对接收器 UART 的程序

Guru**** 2589280 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/883614/compiler-msp430g2553-programme-for-reciever-uart

器件型号:MSP430G2553
主题中讨论的其他器件: MSPWARE

工具/软件:TI C/C++编译器

您好!

我是嵌入式 c 的初学者、我遇到了一个问题、即当我运行程序来接收字符时、可以看到信号反复出现、例如:如果我只键入"b"一次、它会重复出现

因此、请帮助获取一个程序、如果我键入'c'一次、它只会出现在屏幕上一次。我使用的是 code composer、我的程序写在下面

#include "msp430g2553.h"
#define TXD BIT2
#define RXD BIT1

int main (空)

  WDTCTL = WDTPW + WDTHOLD;//停止 WDT
  BCSCTL1 = CALBC1_1MHz;//设置 DCO
  DCOCTL = CALDCO_1MHz;
  P1SEL |= RXD + TXD;// P1.1 = RXD、P1.2=TXD
  P1SEL2 |= RXD + TXD;// P1.1 = RXD、P1.2=TXD
  UCA0CTL1 |= UCSSEL_2;// SMCLK
  UCA0BR0 = 104;// 1MHz 9600
  UCA0CTL1 &=~UCSWRST;//**初始化 USCI 状态机**
  while (1)
  {
      UCA0TXBUF = UCA0RXBUF;
      _DELAY_CYCLES (1000000);
  }


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

    尊敬的 Anthonis:

    它持续发送"b"或"c"的原因是 while (1)循环中包含"UCA0TXBUF = UCA0RXBUF"。

    我建议您使用 G2553 UART 通信的代码示例。 您可以在 MSPWare 中找到它、网址为 :http://www.ti.com/tool/MSPWARE。 在这里、它使用中断来处理 UART 操作、因此接收到的字符只发出一次。

    此处还附上了代码示例以供快速参考。

    /*-版权所有-、BSD_EX
    *版权所有(c) 2012、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    *
    ***
    *
    * MSP430代码示例免责声明
    *
    * MSP430代码示例是自包含的低级程序
    ,通常*以
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    值*寄存器值和时钟配置等设置、
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    *了解外设配置的 API 函数库方法。
    *
    *--/版权--*
    //*********
    // MSP430G2xx3演示- USCI_A0、9600 UART Echo ISR、DCO SMCLK
    //
    说明:回显接收到的字符、使用 RX ISR。 正常模式为 LPM0。
    // USCI_A0 RX 中断触发 TX 回波。
    //波特率分频器、1MHz = 1MHz/9600 =~104.2
    // ACLK = n/a、MCLK = SMCLK = CALxxx_1MHz = 1MHz
    //
    MSP430G2xx3
    // --------
    // /|\| XIN|-
    // || |
    // -|RST XOUT|-
    // | |
    // | P1.2/UCA0TXD|--- >//
    | | 9600 - 8N1
    // | P1.1/UCA0RXD|<---
    //
    // D. Dang
    // Texas Instruments Inc.
    // 2011年2月
    //使用 CCS 版本4.2.0和 IAR Embedded Workbench 版本构建:5.10
    //*********
    #include 
    
    int main (void)
    {
    WDTCTL = WDTPW + WDTHOLD; //如果
    (CALBC1_1MHz=0xFF)则停止 WDT//如果校准常数被擦除
    {
    while (1); //不加载,陷阱 CPU!!
    }
    DCOCTL = 0; //选择最低 DCOx 和 MODx 设置
    BCSCTL1 = CALBC1_1MHZ; //设置 DCO
    DCOCTL = CALDCO_1MHz;
    P1SEL = BIT1 + BIT2; // P1.1 = RXD,P1.2 = TXD
    P1SEL2 = BIT1 + BIT2; // P1.1 = RXD、P1.2=TXD
    UCA0CTL1 |= UCSSEL_2; // SMCLK
    UCA0BR0 = 104; // 1MHz 9600
    UCA0BR1 = 0; // 1MHz 9600
    UCA0MCTL = UCBRS0; //调制 UCBRSx = 1
    UCA0CTL1 &=~UCSWRST; //**初始化 USCI 状态机**IE2|=
    UCA0RXIE; //启用 USCI_A0 RX 中断
    
    __bis_SR_register (LPM0_bits + GIE); //输入 LPM0、启用中断
    }
    
    //回显 RXed 字符,确认 TX 缓冲区已准备就绪#if
    defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
    #pragma vector=USCIAB0RX_vector
    __interrupt void USCI0RX_ISR (supporteded)#elif_ICUSCIAR_ICRx_
    
    (void)(void)(void = USCI0RX_error
    
    )_ vector (void)(void = USCI0RX_vector (void)(void = USCI0RX_isr)(vector)(void = USCIC
    #endif
    {
    while (!(IFG2&UCA0TXIFG)); // USCI_A0 TX 缓冲器就绪?
    UCA0TXBUF = UCA0RXBUF; // TX -> RXed 字符
    }
    

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

    感谢 您的回复、但有一个问题、我正在寻找一个不使用中断的编程。 那么、您能否在不使用中断的情况下建议一个程序。

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

    尊敬的 Anthonis:

    请问您是否有具体原因不想使用中断? 通常、由于 UART 通信是异步事件、因此通常使用中断、即 UART 中断本身或某些其他中断(如计时器)来定期检查 UART 状态。 否则、您需要通过 CPU 检查 UART 状态、这将阻止您的 CPU 执行其他任务。

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

    当然、我可以为您提供一个不使用中断来满足您的要求的示例。

    您需要在您的邮政编码中添加

    while ((IFG2&UCA0RXIFG)); 

    在您填充 RXBUF 的 TXBUF 之前。 这有助于检查是否有新的到达。 当新的 Rx 数据到达时、UCA0RXIFG 被设定为1、因此 while 状态达到并且程序可继续。 当您读取 RXBUF 并将其发送出去后、RXIFG 会自动清零、并且不会被发送两次。

    但是,这不是我会推荐给你的--它会阻止 CPU,你几乎不能做任何其他事情。