[讨论] 欢迎大家来讨论:MSP430f149串口无法进入中断。

竹林清水   2014-7-24 21:32 楼主
进入串口中断至少应该具备四个条件:第一,串口使能;第二,串口中断使能;第三,开总中断;第四,设置对应的中断向量及中断服务函数。如下程序中相应为: ME2|=UTXE1+URXE1;//串口发送、接收使能; IE2|=URXIE1;//串口接收中断使能;_EINT(); //开总中断;#pragma vector=UART1RX_VECTOR  //接收中断向量。其中测试过该波特率下串口发送和接收均无问题,但发送和接收中断均无法进入。求探讨。


#include
void delay(unsigned int j)
{
  unsigned int m;
  for(m=0;m   {
      _NOP();
   
  }
   
}
void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  BCSCTL2|=DIVM_3+SELS+DIVS_3;//DCO-MCLK 8分频   SMCLK-XT2-8分频 1M
  //配置串口
  UCTL1|=CHAR+SWRST;//8位数据模式;URAT模式;串口模块复位
  UTCTL1|=SSEL1; //TX时钟  SSEL1(0x20)(SMCLK)  SSEL0(0x10)(ACLK)

  UBR01=0x68; //配置波特率9600  
  UBR11=0x00;
  UMCTL1|=0x10;

   ME2|=UTXE1+URXE1;//串口发送、接收使能
   IE2|=URXIE1;//串口接收中断使能
   _EINT(); //开总中断
  
  //配置IO
  P3SEL|=BIT6+BIT7;//P3.6 TX  P3.7 RX
  P3DIR|=BIT6; //配置为输出  
// P3DIR&=~BIT7; //配置为输入  
  
  P2DIR|=BIT0+BIT1;
  P2OUT&=~(BIT0+BIT1);
  
  UCTL1&=~SWRST;//串口模块正常工作
  
  TXBUF1='a'; //发送测试
  while((UTCTL1&TXEPT)==0);
   
  while(1); //等待接收中断


}

#pragma vector=UART1RX_VECTOR  //接收中断
__interrupt void UART1_RX(void)
{
    P2OUT|=BIT0+BIT1;
    //将接收到的数据发送出去
    TXBUF1=RXBUF1; //读取或写入缓冲区时中断标志位会自动清除
    while((UTCTL1&TXEPT)==0);   
     P2OUT&=~(BIT0+BIT1);
}


回复评论 (10)

引用: 其中测试过该波特率下串口发送和接收均无问题,但发送和接收中断均无法进入。


中断均无法进入你是怎么判断的?根据P2.0和P2.1 灯闪烁吗?
点赞  2014-7-24 21:43
对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
点赞  2014-7-24 21:53
引用: qinkaiabc 发表于 2014-7-24 21:43
中断均无法进入你是怎么判断的?根据P2.0和P2.1 灯闪烁吗?

对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
点赞  2014-7-24 21:57
进入中断执行的程序非常快。你的灯其实已经亮了。执行TXBUF1=RXBUF1;
    while((UTCTL1&TXEPT)==0);   这段程序的时间太短,灯又灭了。你的眼睛来不及反应,人眼察觉不到而已。

点赞  2014-7-24 22:02
引用: qinkaiabc 发表于 2014-7-24 22:02
进入中断执行的程序非常快。你的灯其实已经亮了。执行TXBUF1=RXBUF1;
    while((UTCTL1&TXEPT)==0);   这 ...

谢谢你的回答,话又说回来了,如果执行了中断按道理应该可以在串口助手观察到接收的数据,但没有。之前测试过该的程序,如果不使用中断而用查询的方式,接收和发送是没问题的。
点赞  2014-7-24 22:09
也许是发送有问题。可以把程序改一下,每次进接收中断反转LED状态观察一下
点赞  2014-7-24 23:20
引用: mangoal 发表于 2014-7-24 23:20
也许是发送有问题。可以把程序改一下,每次进接收中断反转LED状态观察一下

嗯,谢谢你的回复,我再试试。
点赞  2014-7-25 08:04
问题已经解决了,分享一下我的经验吧:这是一个细节问题,USART模块初始化的顺序是:SWRST=1的情况下设置串口;后设置SWRST=0使模块正常工作;最后如果需要中断,则设置相应的中断使能。即我的问题是中断使能没有设置在SWRT=0后,使中断使能位一直处于复位状态。
点赞  2014-7-25 09:21
引用: 竹林清水 发表于 2014-7-25 09:21
问题已经解决了,分享一下我的经验吧:这是一个细节问题,USART模块初始化的顺序是:SWRST=1的情况下设置串 ...

请问是少了UCTL1 &= ~SWRST;这个吗?这句话应该加在哪里?我也遇到这么问题
点赞  2014-9-7 21:22
引用: 面纱如雾 发表于 2014-9-7 21:22
请问是少了UCTL1 &= ~SWRST;这个吗?这句话应该加在哪里?我也遇到这么问题

配置波特率的后面,串口发送、接收使能的前面
点赞  2014-9-9 08:49
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复