MSP430g2553Launchpad中的USCI的UART模式,求助

2019-03-24 10:29发布

用LaunchPad指导书中的USCI的UART模式中的程序进行人机交互,发现总是光有接收没有回复,没有办法控制单片机的P1.0,P1.6LED的亮灭,这是怎么回事啊?
  1. #include "MSP430G2553.h"


  2.    #define LED1_ON P1DIR|=BIT0; P1OUT|=BIT0

  3.    #define LED1_OFF P1DIR|=BIT0; P1OUT&=~BIT0

  4.    #define LED2_ON P1DIR|=BIT6; P1OUT|=BIT6

  5.    #define LED2_OFF P1DIR|=BIT6; P1OUT&=~BIT6
  6.    #define RX_FIFO_SIZE   16                      //接收缓冲区大小宏定义

  7.    #define TX_FIFO_SIZE   64                      //发送缓冲区大小宏定义
  8.    unsigned char Rx_FIFO[RX_FIFO_SIZE]={0};     //UART接收FIFO数组

  9.    unsigned int Rx_FIFO_DataNum=0;              //UART接收FIFO的“空满”指示变量

  10.    unsigned int Rx_FIFO_IndexR=0;               //UART接收FIFO的模拟“读指针”变量

  11.    unsigned int Rx_FIFO_IndexW=0;               //UART接收FIFO的模拟“写指针”变量

  12.    unsigned char Tx_FIFO[TX_FIFO_SIZE]={0};     //UART发送FIFO数组

  13.    unsigned int Tx_FIFO_DataNum=0;              //UART发送FIFO的“空满”指示变量

  14.    unsigned int Tx_FIFO_IndexR=0;               //UART发送FIFO的模拟“读指针”变量

  15.    unsigned int Tx_FIFO_IndexW=0;               //UART 发送FIFO 的模拟“写指针”变量
  16.    extern  unsigned char  Rx_FIFO[RX_FIFO_SIZE];

  17.    extern  unsigned int  Rx_FIFO_DataNum;

  18.    extern  unsigned int  Rx_FIFO_IndexR;

  19.    extern  unsigned int  Rx_FIFO_IndexW;

  20.    extern  unsigned char  Tx_FIFO[TX_FIFO_SIZE];

  21.    extern  unsigned int  Tx_FIFO_DataNum;

  22.    extern  unsigned int  Tx_FIFO_IndexR;

  23.    extern  unsigned int Tx_FIFO_IndexW;
  24.    const unsigned char Out_DELETE[]= "x8  x8";     /* VT100 backspace and clear */

  25.    const unsigned char String1[]="命令:LED1_ON LED1_OFF LED2_ON LED2_OFF ";

  26.    const unsigned char String2[]="Please input Command: ";

  27.    const   unsigned char String3[]="Are you crazy? ";

  28.    const   unsigned char String4[]="I was born for these! ";

  29.    const   unsigned char String5[]="I have got it! ";

  30.    const   unsigned char String6[]="It is easy for me! ";

  31.    const   unsigned char String7[]="As your wish! ";
  32. void  UART_OnTx(void);
  33. void  UART_OnRx(void);
  34. void  UART_SendString(const  unsigned char *Ptr);
  35. void  Command_match();

  36.    /******************************************************************************************************

  37.     *  名  称:Rx_FIFO_WriteChar()

  38.     *  功   能:往Rx接收FIFO中写1字节

  39.     *  入口参数:Data:待写入FIFO的数据

  40.     * 出口参数:1:写入数据成功,0 :写入数据失败

  41.     *  说   明:操作FIFO时需要关闭总中断

  42.     * 范  例:无

  43.    ******************************************************************************************************/

  44.    char Rx_FIFO_WriteChar(unsigned  char Data)

  45.    {

  46.        if(Rx_FIFO_DataNum==RX_FIFO_SIZE)  return(0);

  47.                                     //判断FIFO是否已装满未读数据,如果装满返回0

  48.        _DINT();                 //操作FIFO前一定要关总中断

  49.        Rx_FIFO_DataNum++;                      //未读取数据个数加一

  50.        Rx_FIFO[Rx_FIFO_IndexW]=Data;           //将数据写入写读指针位置的FIFO数组

  51.        Rx_FIFO_IndexW++;                        //写指针移位

  52.        if (Rx_FIFO_IndexW>=RX_FIFO_SIZE)       //判断指针是否越界

  53.             Rx_FIFO_IndexW=0;                  //写指针循环归零

  54.        _EINT();                   //恢复总中断使能

  55.        return(1);                              //返回成功

  56.    }

  57.    char Rx_FIFO_ReadChar(unsigned  char *Chr)

  58.    {

  59.        if(Rx_FIFO_DataNum==0) return(0);   //判断FIFO是是否有未读数据,如果没有返回0

  60.        _DINT();             //操作FIFO前一定要关总中断

  61.        Rx_FIFO_DataNum--;                  //待读取数据个数减一

  62.        *Chr=Rx_FIFO[Rx_FIFO_IndexR];        //将读指针位置的FIFO数据赋给指针所指变量

  63.        Rx_FIFO_IndexR++;                    //读指针移位

  64.        if (Rx_FIFO_IndexR>=RX_FIFO_SIZE)    //判断指针是否越界

  65.             Rx_FIFO_IndexR=0;               //读指针循环归零

  66.        _EINT();              //恢复总中断使能

  67.        return(1);

  68.    }
  69.    void  Rx_FIFO_Clear()

  70.    {

  71.        _DINT();                  //操作FIFO前一定要关总中断

  72.        Rx_FIFO_DataNum=0;                       //FIFO 中未读取数据数目清零
  73.             Rx_FIFO_IndexR=0;                  //FIFO 中模拟读指针清零

  74.       Rx_FIFO_IndexW=0;                 //FIFO 中模拟写指针清零

  75.       _EINT ();            //恢复总中断使能

  76.   }
  77.    char Tx_FIFO_WriteChar(unsigned  char Data)

  78.    {

  79.        if(Tx_FIFO_DataNum==TX_FIFO_SIZE)  return(0);

  80.                                        //判断FIFO是否已装满未读数据,如果装满返回0

  81.        _DINT();                  //操作FIFO前一定要关总中断

  82.        //-----“全新”一次发送数据必须手动触发Tx中断-----

  83.        if((Tx_FIFO_DataNum==0) &&( !(UCA0STAT & UCBUSY)))

  84.                                                //判断是否为一次“全新”发送

  85.             IFG2 |=UCA0TXIFG;                  // 手动触发一次

  86.        Tx_FIFO_DataNum++;                      //未读取数据个数加一

  87.        Tx_FIFO[Tx_FIFO_IndexW]=Data;           //将数据写入写读指针位置的FIFO数组

  88.        Tx_FIFO_IndexW++;                       //写指针移位

  89.        if (Tx_FIFO_IndexW   >= TX_FIFO_SIZE)   //判断指针是否越界

  90.             Tx_FIFO_IndexW=0;                  //写指针循环归零

  91.        _EINT();                  //恢复总中断使能

  92.        return(1);                              //返回成功

  93.    }
  94.    char Tx_FIFO_ReadChar(unsigned    char *Chr)

  95.    {

  96.         if(Tx_FIFO_DataNum==0) return(0);   //判断FIFO是是否有未读数据,如果没有返回0

  97.         _DINT();              //操作FIFO前一定要关总中断

  98.         Tx_FIFO_DataNum --;                  //待读取数据个数减一

  99.         *Chr=Tx_FIFO[Tx_FIFO_IndexR];       //将读指针位置的FIFO数据赋给指针所指变量

  100.         Tx_FIFO_IndexR++;                    //读指针移位

  101.         if (Tx_FIFO_IndexR>=TX_FIFO_SIZE)    //判断指针是否越界

  102.             Tx_FIFO_IndexR=0;                //读指针循环归零

  103.         _EINT();               //恢复总中断使能

  104.         return(1);                           //返回成功

  105.    }
  106.    void Tx_FIFO_Clear()

  107.    {

  108.         _DINT();                   //操作FIFO前一定要关总中断

  109.         Tx_FIFO_DataNum=0;                         //FIFO 中未读取数据数目清零

  110.         Tx_FIFO_IndexR=0;                          //FIFO 中模拟读指针清零

  111.         Tx_FIFO_IndexW=0;                          //FIFO 中模拟写指针清零

  112.         _EINT();                     //恢复总中断使能

  113.    }
  114.    /******************************************************************************************************

  115.     *  名  称:USCI_A0_init()

  116.     *  功    能:初始化USCI_A0模块为UART模式

  117.     *  入口参数:无

  118.     * 出口参数:无

  119.     *  说    明:UART设为波特率9600,8位数据,无校验,1位停止位

  120.     *             UART初始化配置较复杂,可以使用Grace配置后再移植代码的方法

  121.     * 范  例:无

  122.    ******************************************************************************************************/

  123.    void  USCI_A0_init(void)

  124.    {

  125.        //-----开启IO口的TXD和RXD功能-----

  126.           P1SEL = BIT1 + BIT2 ;                   // P1.1 = RXD, P1.2=TXD

  127.           P1SEL2 = BIT1 + BIT2;

  128.          //-----设置UART时钟源为ACLK-----

  129.           UCA0CTL1 |= UCSSEL_1;                    // CLK = ACLK

  130.          //-----移植Grace配置的波特率参数-----

  131.           UCA0BR0 = 0x03;                         // 32kHz/9600 = 3.41

  132.           UCA0BR1 = 0x00;

  133.           UCA0MCTL = UCBRS1 + UCBRS0;             // Modulation UCBRSx = 3

  134.           UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
  135.                    IE2 |= UCA0RXIE + UCA0TXIE;                // Enable USCI_A0 TX/RX interrupt

  136.          _EINT();                     //开总中断

  137.    }

  138.    /******************************************************************************************************

  139.     *  名  称:USCI0TX_ISR()

  140.     *  功    能:响应Tx中断服务

  141.     *  入口参数:无

  142.     * 出口参数:无

  143.     *  说    明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一

  144.     * 范  例:无

  145.    ******************************************************************************************************/

  146.    #pragma vector=USCIAB0TX_VECTOR

  147.    __interrupt void  USCI0TX_ISR(void)

  148.    {

  149.        IFG2&=~UCA0TXIFG;                           //手动清除标志位

  150.         UART_OnTx();                               //调用Tx事件处理函数

  151.    }

  152.    /******************************************************************************************************

  153.     *  名  称:USCI0RX_ISR()

  154.     *  功    能:响应Rx中断服务

  155.     *  入口参数:无

  156.     * 出口参数:无

  157.     *  说    明:凡是中断标志位有可能不被自动清除的,均手动清除一次,以防万一

  158.     * 范  例:无

  159.    ******************************************************************************************************/

  160.    #pragma vector=USCIAB0RX_VECTOR

  161.    __interrupt void  USCI0RX_ISR(void)

  162.    {

  163.         IFG2&=~UCA0RXIFG;                         //手动清除标志位

  164.         UART_OnRx();                               //调用Rx事件处理函数

  165.    }
  166.     void  Command_match();
  167.    
  168.       void  UART_OnTx(void)

  169.    {

  170.         unsigned char Temp=0;

  171.         if(Tx_FIFO_DataNum>0)

  172.         {

  173.              Tx_FIFO_ReadChar(&Temp);                 //调用FIFO库函数

  174.               UCA0TXBUF= Temp;

  175.         }
  176.           }
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
huybn5776
2019-03-24 16:19
我调试这个Project时也发生过相同情况
换了几个软件后最后只有Tera Term Pro在我的Win8.1笔记本用的比较正常
有时发现MSP430没回应的话要重插USB再开串口软件连接才行

一周热门 更多>

相关问题

    相关文章