標(biāo)題:
MSP430單片機(jī)UART定長(zhǎng)幀與變長(zhǎng)幀處理程序
[打印本頁(yè)]
作者:
51hei單片
時(shí)間:
2016-3-14 19:20
標(biāo)題:
MSP430單片機(jī)UART定長(zhǎng)幀與變長(zhǎng)幀處理程序
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書(shū)里面的源碼,(包含工程文件 (例2.9.13)))完整例程下載:
http://www.torrancerestoration.com/bbs/dpj-46245-1.html
‘
關(guān)于本程序的詳細(xì)解說(shuō)大家可以下載電子書(shū)點(diǎn)擊上圖即可
MSP430單片機(jī)UART定長(zhǎng)幀處理程序:
#include <msp430x42x.h>
#define FRAME_SIZE 8 /*定長(zhǎng)幀的長(zhǎng)度*/
#define LOCAL_ADDR 0x01
unsigned char FrameBuff[FRAME_SIZE]; /*接收幀緩沖區(qū)數(shù)組*/
unsigned int UART_RcvCnt=0; /*接收計(jì)數(shù)*/
unsigned char FrameRcvStatus=0; /*幀接收狀態(tài)*/
#define FREE 0
#define RECEIVE 1
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中斷
{
if(FrameRcvStatus==FREE) // 空閑狀態(tài)下
{
if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))
{ //如果收到的是幀首字節(jié),且與本機(jī)地址相符
FrameBuff[0]=U0RXBUF; //接收該字節(jié)
FrameRcvStatus=RECEIVE; //狀態(tài)跳轉(zhuǎn)至接收狀態(tài)
UART_RcvCnt=1; //接收計(jì)數(shù)(已經(jīng)接收1字節(jié))
}
}
else if(FrameRcvStatus==RECEIVE) // 在接收狀態(tài)下
{
if((U0RCTL & RXWAKE)==0) //如果收到的是數(shù)據(jù)
{
FrameBuff[UART_RcvCnt]=U0RXBUF; //接收該字節(jié)數(shù)據(jù)
UART_RcvCnt++; //指向下一單元
}
else //如果又收到是幀首字節(jié)(數(shù)據(jù)幀中斷或漏發(fā))
{
if(U0RXBUF==LOCAL_ADDR) //且地址相符
{
FrameBuff[0]=U0RXBUF; //接收該字節(jié)數(shù)據(jù)
UART_RcvCnt=1; //重新接收數(shù)據(jù)
}
else //地址不符
{
UART_RcvCnt=0; //接收數(shù)組清零
FrameRcvStatus=FREE; //重新回到空閑狀態(tài),等待幀起始
}
}
if(UART_RcvCnt>=FRAME_SIZE )
{
//--------------------------------------------------------------------------
// 數(shù)據(jù)幀接收完畢,在這里寫(xiě)數(shù)據(jù)幀處理程序
_NOP(); //在這里設(shè)斷點(diǎn)查看FrameBuff[]數(shù)組的數(shù)據(jù)
//--------------------------------------------------------------------------
UART_RcvCnt=0; //接收數(shù)組清零
FrameRcvStatus=FREE; //重新回到空閑狀態(tài),等待幀起始
}
}
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門(mén)狗
FLL_CTL0 |= XCAP18PF; // 配置晶振負(fù)載電容
U0CTL = CHAR; // 異步通訊模式,8位數(shù)據(jù),無(wú)校驗(yàn),1位停止位。
ME1 |= UTXE0 + URXE0; // 開(kāi)啟串口0收發(fā)模塊
U0TCTL |= SSEL0; // 選擇ACLK作為串口波特率時(shí)鐘源。
U0BR1 = 0; //
U0BR0 = 13; // 分頻系數(shù)整數(shù)部分=13
U0MCTL = 0x6B; // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 開(kāi)啟第二功能,作為串口收發(fā)引腳(不同單片機(jī)有差別)
IE1 |= URXIE0; // 開(kāi)啟UART0的接收中斷,在中斷內(nèi)接收數(shù)據(jù)
_EINT(); // 總中斷允許
while(1)
{
//CPU可以執(zhí)行其他任務(wù)
}
}
復(fù)制代碼
MSP430單片機(jī)UART變長(zhǎng)幀處理程序:
#include <msp430x42x.h>
#define FRAMEBUF_SIZE 32 /*最大幀長(zhǎng)度*/
unsigned char FrameBuff[FRAMEBUF_SIZE]; /*接收幀緩沖區(qū)數(shù)組*/
unsigned int UART_RcvCnt=0; /*接收計(jì)數(shù)*/
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中斷
{
int i;
if(U0RXBUF==0x0D) return; //對(duì)回車(chē)命令的第一字節(jié)不響應(yīng)
if(U0RXBUF==0x0A) //收到結(jié)束符
{
//--------------------------------------------------------------------------
// 數(shù)據(jù)幀接收完畢,在這里寫(xiě)數(shù)據(jù)幀處理程序,注意緩沖區(qū)只用前UART_RcvCnt個(gè)數(shù)據(jù)
_NOP(); //在這里設(shè)斷點(diǎn)查看FrameBuff[]數(shù)組的數(shù)據(jù)
//--------------------------------------------------------------------------
UART_RcvCnt=0; //清除接收緩沖區(qū)字節(jié)數(shù)清零
for(i=0;i<FRAMEBUF_SIZE;i++) FrameBuff[i]=0; //清除接收緩沖區(qū)(可省略)
return;
}
if(UART_RcvCnt<FRAMEBUF_SIZE) //正常數(shù)據(jù),若緩沖區(qū)未滿(mǎn)
{
FrameBuff[UART_RcvCnt]=U0RXBUF; //接收一字節(jié)數(shù)據(jù)
UART_RcvCnt++; //指向下一字節(jié)
}
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門(mén)狗
FLL_CTL0 |= XCAP18PF; // 配置晶振負(fù)載電容
U0CTL = CHAR; // 異步通訊模式,8位數(shù)據(jù),無(wú)校驗(yàn),1位停止位。
ME1 |= UTXE0 + URXE0; // 開(kāi)啟串口0收發(fā)模塊
U0TCTL |= SSEL0; // 選擇ACLK作為串口波特率時(shí)鐘源。
U0BR1 = 0; //
U0BR0 = 13; // 分頻系數(shù)整數(shù)部分=13
U0MCTL = 0x6B; // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 開(kāi)啟第二功能,作為串口收發(fā)引腳(不同單片機(jī)有差別)
IE1 |= URXIE0; // 開(kāi)啟UART0的接收中斷,在中斷內(nèi)接收數(shù)據(jù)
_EINT(); // 總中斷允許
while(1)
{
//CPU可以執(zhí)行其他任務(wù)
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1