打印

MSP430 串口发送中断问题

[复制链接]
6116|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
study_boy|  楼主 | 2012-12-10 21:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include  "msp430g2553.h"
#define uchar unsigned char
uchar const trdata[]=

{'A','B','C','D','E','F','G','H','I','J','K','L',0x0d,0x0a};
uchar i;
///////////////////////////////////
//          初始函数声明         //

///////////////////////////////////
void init_device();
void init_wdt();
void init_port();
void init_clock();
void init_uart();
void init_timer();
///////////////////////////////////


///////////////////////////////////
///////////////////////////////////
//          函数实现             //
///////////////////////////////////

///////////////////////////////////
//      init_device函数实现      //
///////////////////////////////////
void init_device()
{
   init_wdt();
   init_port();
   init_clock();
   init_uart();
   init_timer();
}


///////////////////////////////////
//      init_wdt函数实现        //
///////////////////////////////////

void init_wdt()
{
  WDTCTL = WDTPW + WDTHOLD;               // Stop WDT
}

///////////////////////////////////
//      init_port函数实现        //
///////////////////////////////////
void init_port()
{
  P1DIR = 0x41;   //LED 配置为输出
  P1OUT = 0x09;   //LED1输出高电平,选择为上拉方式
  P1REN = 0x08;   //使能上拉电阻

  P1SEL = BIT1 + BIT2 ;                   // P1.1 = RXD,   P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                  // P1.1 = RXD,   P1.2=TXD
}

///////////////////////////////////
//      init_clock函数实现        //
///////////////////////////////////
void init_clock()
{
  BCSCTL1 = CALBC1_8MHZ;           //DCO数字振荡器=8MHZ
  DCOCTL  = CALBC1_8MHZ;           //DCO数字振荡器=8MHZ
}


///////////////////////////////////
//      init_uart函数实现        //
///////////////////////////////////
void init_uart()
{
  UCA0CTL1 |= UCSSEL_2;           //串口选择时钟系统SMCLK,SMCLK默认时钟源为DCO

  //DCO= 998400 波特率为9600   发送大于1个字符稳定,发送一个字符不稳定
  UCA0BR0 = 0x68;                            // 1MHz 9600   104分频
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS0;                        // Modulation UCBRSx = 1
  //DCO= 998400 波特率为9600       

  UCA0CTL1 &= ~UCSWRST;              // **Initialize USCI state machine**
  //IE2 |= UCA0RXIE;                   // Enable USCI_A0 RX interrupt
  IE2 |= UCA0TXIE;                   // Enable USCI_A0 TX interrupt
}


///////////////////////////////////
//      init_timer函数实现        //
///////////////////////////////////
void init_timer()
{
  P1DIR |= BIT0;
  //CCTL0 = CCIE;              //开定时器中断
  CCR0 = 50000;               //计数值
  TACTL = TASSEL_2+ ID_3 + MC_1;  //选择SMCLK时钟系统、8分频、上升模式,计数到

CCR0

  //TACTL = TASSEL_1 + MC_2;       

}


///////////////////////////////////

void main(void)
{
  init_device();
  for(;;)
  {
    _BIS_SR(LPM0_bits + GIE);

    for(i=0;i<14;i++)
    {
      UCA0TXBUF=trdata[i];
      while(!(IFG2&UCA0TXIFG));
    }


  }

}

//发送中断函数
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
  //if((IFG2&UCA0TXIFG));
}



求大神指点:进入串口发送中断后,一直死循环,无法退出。应该怎么写串口发送程序

相关帖子

沙发
雨落沉轩| | 2012-12-11 13:51 | 只看该作者
个人理解:
其一:一般发送数据可以不用中断,而采用主动发送方式,而在串口接收数据时采用中断方式。
其二:main函数的for循环无**常运行,你只有进入LPM0模式的程序,却没有退出的程序。所以,可以在定时器中断中,加入LPM_EXIT;保证主函数能周期运行。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
study_boy + 1 赞一个!
板凳
tianm| | 2012-12-11 14:52 | 只看该作者
注意在响应事件的时候 会不会来新的中断

使用特权

评论回复
地板
sx12341234| | 2014-8-25 10:10 | 只看该作者
把标志位清除

使用特权

评论回复
5
搞IT的| | 2014-8-26 22:32 | 只看该作者
发送的时候给个中断,接收的时候是不是也有个中断啊。程序我也没看懂呢、、

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝