6279|10

14

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

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

进入串口中断至少应该具备四个条件:第一,串口使能;第二,串口中断使能;第三,开总中断;第四,设置对应的中断向量及中断服务函数。如下程序中相应为: 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);
}


最新回复

配置波特率的后面,串口发送、接收使能的前面   详情 回复 发表于 2014-9-9 08:49
 
点赞 关注

回复
举报

2781

帖子

419

TA的资源

五彩晶圆(中级)

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


中断均无法进入你是怎么判断的?根据P2.0和P2.1 灯闪烁吗?

点评

对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。  详情 回复 发表于 2014-7-24 21:57
 
个人签名
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

4
 
qinkaiabc 发表于 2014-7-24 21:43
中断均无法进入你是怎么判断的?根据P2.0和P2.1 灯闪烁吗?

对的,如果进入中断得话,应该会点亮LED灯,但LED始终无法点亮。
 
 
 

回复

2781

帖子

419

TA的资源

五彩晶圆(中级)

5
 
进入中断执行的程序非常快。你的灯其实已经亮了。执行TXBUF1=RXBUF1;
    while((UTCTL1&TXEPT)==0);   这段程序的时间太短,灯又灭了。你的眼睛来不及反应,人眼察觉不到而已。

点评

谢谢你的回答,话又说回来了,如果执行了中断按道理应该可以在串口助手观察到接收的数据,但没有。之前测试过该的程序,如果不使用中断而用查询的方式,接收和发送是没问题的。  详情 回复 发表于 2014-7-24 22:09
 
个人签名
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

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

谢谢你的回答,话又说回来了,如果执行了中断按道理应该可以在串口助手观察到接收的数据,但没有。之前测试过该的程序,如果不使用中断而用查询的方式,接收和发送是没问题的。
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(中级)

7
 
也许是发送有问题。可以把程序改一下,每次进接收中断反转LED状态观察一下

点评

嗯,谢谢你的回复,我再试试。  详情 回复 发表于 2014-7-25 08:04
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

8
 
mangoal 发表于 2014-7-24 23:20
也许是发送有问题。可以把程序改一下,每次进接收中断反转LED状态观察一下

嗯,谢谢你的回复,我再试试。
 
 
 

回复

14

帖子

0

TA的资源

一粒金砂(中级)

9
 
问题已经解决了,分享一下我的经验吧:这是一个细节问题,USART模块初始化的顺序是:SWRST=1的情况下设置串口;后设置SWRST=0使模块正常工作;最后如果需要中断,则设置相应的中断使能。即我的问题是中断使能没有设置在SWRT=0后,使中断使能位一直处于复位状态。

点评

请问是少了UCTL1 &= ~SWRST;这个吗?这句话应该加在哪里?我也遇到这么问题  详情 回复 发表于 2014-9-7 21:22
 
 
 

回复

333

帖子

0

TA的资源

一粒金砂(高级)

10
 
竹林清水 发表于 2014-7-25 09:21
问题已经解决了,分享一下我的经验吧:这是一个细节问题,USART模块初始化的顺序是:SWRST=1的情况下设置串 ...

请问是少了UCTL1 &= ~SWRST;这个吗?这句话应该加在哪里?我也遇到这么问题

点评

配置波特率的后面,串口发送、接收使能的前面  详情 回复 发表于 2014-9-9 08:49
 
 
 

回复

447

帖子

0

TA的资源

纯净的硅(中级)

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

配置波特率的后面,串口发送、接收使能的前面
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表