#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));
}
求大神指点:进入串口发送中断后,一直死循环,无法退出。应该怎么写串口发送程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
其一:一般发送数据可以不用中断,而采用主动发送方式,而在串口接收数据时采用中断方式。
其二:main函数的for循环无**常运行,你只有进入LPM0模式的程序,却没有退出的程序。所以,可以在定时器中断中,加入LPM_EXIT;保证主函数能周期运行。
一周热门 更多>