打印

串口接收中断程序

[复制链接]
642|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jiaxw|  楼主 | 2019-3-4 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

为什么始终进不了
#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!='\0')
     {        
         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();                   //恢复全局中断
}

相关帖子

沙发
dengdc| | 2019-3-4 19:04 | 只看该作者
首先确认端口功能配置是否正确

使用特权

评论回复
板凳
jiaxw|  楼主 | 2019-3-4 19:06 | 只看该作者
然后呢

使用特权

评论回复
地板
wuhany| | 2019-3-4 19:11 | 只看该作者
然后确认初始化配置是否正确,波特率设置是否正确,是否允许中断。

使用特权

评论回复
5
jiahy| | 2019-3-4 19:13 | 只看该作者

可以去TI网站下下载相应型号CPU的各外围模块例程,例程是肯定可以用的。

使用特权

评论回复
6
lizye| | 2019-3-4 19:17 | 只看该作者
用个正确的例程试试,排除硬件上的问题

使用特权

评论回复
7
spark周| | 2019-3-4 19:21 | 只看该作者

串口接收中断程序的处理也很关键的。

使用特权

评论回复
8
zhaoxqi| | 2019-3-4 19:24 | 只看该作者
初始化配置是否正确,中断是否打开了呢

使用特权

评论回复
9
jiaxw|  楼主 | 2019-3-4 19:28 | 只看该作者
结贴了,多谢大家讨论这么多哈,呵呵

使用特权

评论回复
10
phosphate| | 2019-3-5 16:08 | 只看该作者
这个也需要判断硬件是否有问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

825

主题

9762

帖子

4

粉丝