串口接收中断程序为什么始终进不了啊

2019-08-02 15:47发布

#include"msp430.h"

/**************宏定义***********************/
#define uchar unsigned char
#define uint  unsigned int

uchar  Buffer_Rx[40];
uchar  Buffer_TX[40]="串口程序调试";           //定义发送缓冲区
uchar  Rx_long;
uchar  Flag=0;                                              //一旦我们进入中断,就改变此标志位,控制灯闪烁

/**************串口初始化,采用查询方式***********************/
/*************注意:串口初始化完成后,是处于复位状态**********************/
void  Init_usart(void)
{
     P3SEL|=0XC0;                //串口1的I/O口选择位外围模块功能
     P3DIR|=0X40;                //P3.6为输出,P3.7为输入

    U1TCTL=SSEL1+SSEL0;         //选择SMCLK
     U1CTL=SWRST+CHAR;           //先将串口处于复位状态,8位数据,无校验,停止位1位
//   U1RCTL|=URXEIE;           //接收出错中断允许位
     U1TXBUF=0x00;               //先将发送缓冲区和接收缓冲区清0
//   U1RXBUF=0x00;
     U1BR1=0;
     U1BR0=208;                  //波特率为38400
     U1MCTL=0x89;
     ME2|=UTXE1+URXE1;           //允许发送和接收
     IE2|=URXIE1;                //接收中断使能
}
void main()
{
     volatile unsigned int i=0;            // volatile to prevent optimization

    WDTCTL = WDTPW + WDTHOLD;             // Stop watchdog timer

    P4DIR |= 0x04;                        // Set P4.3  当接收完成后置位
     BCSCTL1&=~XT2OFF;                     //开启XT2
     BCSCTL2|=SELM1+SELS;                   //选择XT2CLK为MCLK和SMCLK时钟源

    do
     {
           IFG1&=~OFIFG;       //清除振荡器失效标志
           for(i=255;i>0;i--);
      }while(IFG1&OFIFG);//判断XT2是否起振

    Init_usart();
     //SR|=GIE;                            //开总中断

    U1CTL&=~SWRST;                        //关闭串口的复位
     _BIS_SR(GIE);                         //开总中断
   //  _EINT();            
    while(Buffer_TX!='')
     {        
         while((IFG2&UTXIFG1)==0);
         U1TXBUF=Buffer_TX;
//       UTXIFG1=0;
         i++;
     }
     while(1)
     {  
         if(Rx_long==8)
         {
             i=0;
              while(Rx_long!=i)
             {        
                 while((IFG2&UTXIFG1)==0);
                 U1TXBUF=Buffer_TX;
                 i++;
             }
             Rx_long=0;
         }
         if(Flag==1)
         {
             P4OUT ^= 0x04;                      // Toggle P4.2 using exclusive-OR

            i = 5000;                          // SW Delay
             do i--;
             while (i != 0);
             P4OUT ^= 0x04;                      // Toggle P4.2 using exclusive-OR

            i = 5000;                          // SW Delay
             do i--;
             while (i != 0);           
         }
     }
}
/************串口接收中断服务子程序**********************/
#pragma vector=USART1RX_VECTOR
__interrupt void UART1RXINT(void)
{
        _DINT();                  //关闭全局中断
       Flag=1;
       if((IFG2&URXIFG1)!=0)
       {
             Buffer_Rx[Rx_long]=U1RXBUF;
             Rx_long++;
        }
       _EINT();                   //恢复全局中断
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。