5086|4

53

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430F149单片机,串口通信 [复制链接]

我使用USART1模块进行串口通讯,但调试的时候发现程序进不了中断。

相关代码:

  1. #include "msp430x14x.h"
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. #define URXD1 BIT7
  5. #define UTXD1 BIT6

  6. uchar dataSedBuffer[100]={"123"}; //发送数据缓存区
  7. uchar redySedLen = 3;             //准备发送的数据的总长度
  8. uchar curtSedLen = 0;             //当前已经发送的数据的长度
  9. uchar dataSedFlag = 1;            //0->没有数据需要发送,1->有数据发送

  10. void Delay_us(uchar count)
  11. {
  12.   while(count-- ){};
  13. }

  14. void Init_clk()
  15. {
  16.   uchar i;
  17.   
  18.   WDTCTL = WDTPW +WDTHOLD;
  19.   BCSCTL1 &= ~XT2OFF;
  20.   BCSCTL2 &= SELM1 +SELS;
  21.   do
  22.   {
  23.     IFG1 &= ~OFIFG;
  24.     for(i=0;i<100;i++);
  25.   }while((IFG1 & OFIFG)!=0);
  26.   IFG1 &= ~OFIFG;
  27. }

  28. void Init_port()      
  29. {
  30.   P3SEL |= URXD1+UTXD1;    //端口功能设置为第二功能
  31.   P3DIR |= UTXD1;         //发送端口为输出
  32.   P3DIR &= ~URXD1;         //接受端口为输入
  33. }

  34. void Init_usart()
  35. {
  36.   U1CTL = 0x00;
  37.   U1CTL |= CHAR;          //8位数据
  38.   
  39.   U1TCTL = 0x00;
  40.   U1TCTL |= SSEL1;         //时钟SMCLK
  41.   
  42.   U1BR0 = 0x45;
  43.   U1BR1 = 0x00;          //波特率115200
  44.   
  45.   U1MCTL = 0x4a;         //小数设置
  46.   
  47.   ME2 |= UTXE1 + URXE1;   //使能UART的发送和接收
  48.   IE2 |= URXIE1;          //UART接收中断使能
  49.   IE2 |= UTXIE1;          //UART发送中断使能
  50. }

  51. #pragma vector = UART1TX_VECTOR
  52. __interrupt void UART1_TX_ISR()
  53. {
  54.    if(redySedLen != 0)
  55.    {
  56.       dataSedFlag = 0;    //缓冲区里数据没发送完
  57.       TXBUF1 = dataSedBuffer[curtSedLen];       //发送数据
  58.       curtSedLen += 1;    //当前位置加1
  59.       Delay_us(10);
  60.       if(curtSedLen >= redySedLen)              //判断是否发送完毕
  61.       {
  62.         redySedLen = 0;                         //清空数据总长度
  63.         dataSedFlag = 1;                        //设置发送完毕标识
  64.         curtSedLen = 0;                         //清空已发送长度
  65.       }
  66.    }
  67. }

  68. void test()
  69. {
  70.   _DINT();
  71.   Init_port();
  72.   Init_usart();
  73.   _EINT();
  74.   if(dataSedFlag == 1)         //如果有需要发送
  75.   {
  76.     IFG2 |= UTXIFG1;           //设置发送中断
  77.     Delay_us(5);
  78.   }
  79. }

  80. void main()
  81. {
  82.   Init_clk();
  83.   test();
  84. }
复制代码


我的思路是,在程序执行了test()函数里的IFG2 |= UTXIFG1 之后,程序进入串口发送的中断。但是调试的时候发现没进去。
大家帮我看看为什么没有进中断,谢谢了

最新回复

大神们知道原因了吗? 说说呗!  详情 回复 发表于 2015-7-27 20:45
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
最好是设置断点,send端口配置为输出,receive端口配置为输入做一些串口初始化就应该行了啊,除非你的这个串口不能用
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
请先用TI官方给出的串口例程试试
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(中级)

4
 
今天换成了串口1,所有的初始化都改成了串口1的配置,虽然能主动发送了,但是发过去的字符不是正常的啊。。。比如说 发0x36,那超级终端应该是显示6啊,可是显示的是2,发0x39,显示的是c。。。也就是说差了一个4,这是为什么啊??有人用过串口1吗??
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
大神们知道原因了吗?
说说呗!
 
 
 

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

随便看看
查找数据手册?

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
快速回复 返回顶部 返回列表