?? 串行異步通訊.txt
字號:
[入門必修]串行異步通訊例子..菜菜
微控網(wǎng)原創(chuàng)
復(fù)制代碼
//****************************************************************************
//描述:在微控MC430F224開發(fā)板上實現(xiàn)UART模塊串行異步通訊實驗。
//作者:微控技術(shù)論壇總版主 DC
//編程環(huán)境:IAR 3.41
//目標(biāo)板:MC430F224 (V1.0)
unsigned char BUF; //全局變量,存放據(jù)
//---------------------------------------------------------------------
unsigned char sign; //標(biāo)記寄存器,最大8位標(biāo)記
#define update sign |= BIT0 //sign位0:置1時,表示有數(shù)據(jù)更新.
#define check_update sign & BIT0
main( void )
{
WDTCTL =WDTPW+WDTHOLD; //關(guān)看門狗
BCSCTL1 =CALBC1_1MHZ; //設(shè)定DCO為1MHZ,
//[0x10FF] TX2振蕩器開,高頻模式,設(shè)定DCO為1MHZ
DCOCTL =CALBC1_1MHZ;
volatile unsigned int n;
do //等待晶振穩(wěn)定
{
IFG1 &=~OFIFG;
for(n=5000;n>0;n--);
} while(OFIFG&IFG1);
P1DIR |=BIT1+BIT2+BIT3; //LED--D1,D2,D3
P1OUT &= ~BIT1; //P11 輸出0,D1 LED亮
P3SEL |= BIT4+BIT5; //p3.4為TX,P3.5為RX
P3DIR |= BIT4; //P3.4為輸出方向(TXD口)
UCA0CTL1 |=UCSSEL0; //[0x40]時鐘源選擇ACLK=32768晶振
UCA0BR1=0; //設(shè)置波特率32768/1200=27.3
UCA0BR0=27;
UCA0MCTL |=UCBRS1; //調(diào)整寄存器設(shè)置UCBRSx=INT(0.3*8)=2
UCA0CTL1 &=~UCSWRST; //串口狀態(tài)機(jī)設(shè)置完畢,退出USCI設(shè)置
IE2 |=UCA0RXIE+UCA0TXIE; //允許收發(fā)中斷
_EINT();
LPM3; //進(jìn)入低功耗3并使能總中斷
//或?qū)懗?_BIS_SR(LPM3_bits+GIE);
_NOP();
for(;;)
{ _DINT(); //關(guān)閉總中斷
_BIS_SR(LPM3_bits+GIE);
}
}
//****************************************************************************
//USCI中斷用法
//USCI_AX和USCI_BX使用同一個中斷向量。接收中斷標(biāo)志UCAxRXIFG和UCBxRXIFG和同
//一個中斷向量連接,發(fā)送中斷標(biāo)志UCAxTXIFG和UCBxTXIFG分享另一個中斷向量。
//****************************************************************************
//接收中斷服務(wù)程序
#pragma vector =USCIAB0RX_VECTOR
__interrupt void rx_isr(void)
{
BUF = UCA0RXBUF; //接收一個數(shù)據(jù)后,存入一個全局變量中
P1OUT ^= BIT2; //用D2 LED指示接收到一個數(shù)據(jù)
update;
LPM3_EXIT; //接收完一個數(shù)據(jù)后,退出低功耗模式
}
//****************************************************************************
//大家注意,MSP340F2上電后UCA0的中斷標(biāo)志寄存器IFG2 中UCA0TXIFG發(fā)送中斷標(biāo)志位就置1.
//在初始化時,只要總中斷允許了,同時發(fā)送中斷也允許了.初始化完后,發(fā)送中斷服務(wù)程序就
//被馬上執(zhí)行.
//當(dāng)UCA0TXBUF空閑時,中斷標(biāo)志寄存器IFG2 中UCA0TXIFG發(fā)送中斷標(biāo)志位就置1.
//發(fā)送中斷服務(wù)程序
#pragma vector =USCIAB0TX_VECTOR
__interrupt void tx_isr(void)
{
if(check_update) //是否有數(shù)據(jù)更新
{ UCA0TXBUF = BUF; //是,將接收到的數(shù)據(jù)發(fā)回去
sign &= ~BIT0; //清除標(biāo)志
P1OUT ^= BIT3; //用D3 LED指示發(fā)送完一個數(shù)據(jù)
}
}
//****************************************************************************
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -