MSP430 串口发送中断问题

2019-07-31 15:44发布

#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));
}



求大神指点:进入串口发送中断后,一直死循环,无法退出。应该怎么写串口发送程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
雨落沉轩
2019-07-31 20:56
个人理解:
其一:一般发送数据可以不用中断,而采用主动发送方式,而在串口接收数据时采用中断方式。
其二:main函数的for循环无**常运行,你只有进入LPM0模式的程序,却没有退出的程序。所以,可以在定时器中断中,加入LPM_EXIT;保证主函数能周期运行。

一周热门 更多>