欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
MSP430單片機(jī)UART高效發(fā)幀與收幀 程序
[打印本頁(yè)]
作者:
51hei單片
時(shí)間:
2016-3-14 19:15
標(biāo)題:
MSP430單片機(jī)UART高效發(fā)幀與收幀 程序
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書(shū)里面的源碼,(包含工程文件 (例2.9.x)))完整例程下載:
http://www.raoushi.com/bbs/dpj-46245-1.html
‘
關(guān)于本程序的詳細(xì)解說(shuō)大家可以下載電子書(shū)點(diǎn)擊上圖即可
UART發(fā)幀程序:
#include <msp430x42x.h>
unsigned char TX_BUFF[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};/*待發(fā)送數(shù)組*/
/*****************************************************************
* 名 稱:UART0_ PutFrame ()
* 功 能:從串口發(fā)送1幀數(shù)據(jù)
* 入口參數(shù):Ptr:待發(fā)送數(shù)組的首地址(數(shù)組名)
* Lenth:數(shù)據(jù)幀長(zhǎng)度
* 出口參數(shù):無(wú)
* 說(shuō) 明: 發(fā)送過(guò)程中,會(huì)阻塞CPU運(yùn)行
*****************************************************************/
void UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
{
int i;
U0TCTL |= TXWAKE; // 產(chǎn)生一個(gè)線路空閑時(shí)間
TXBUF0=0; // 寫(xiě)入任意字節(jié)
while ((IFG1 & UTXIFG0)==0); // 等待該字節(jié)發(fā)完(實(shí)際上并未發(fā)出)
for(i=0;i<Lenth;i++)
{
TXBUF0=Ptr[i];
while ((IFG1 & UTXIFG0)==0); // 等待該字節(jié)發(fā)完
IFG1 &=~ UTXIFG0; // 清除發(fā)送標(biāo)志位
}
while ((U0TCTL & TXEPT)==0); // 等待最后一字節(jié)數(shù)據(jù)發(fā)出(移位寄存器空)
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
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ī)有差別)
while(1)
{
UART0_PutFrame(TX_BUFF,8);//發(fā)送一個(gè)數(shù)據(jù)幀
_NOP(); //在這一句設(shè)斷點(diǎn)查看調(diào)試用
}
}
復(fù)制代碼
UART高效發(fā)幀:
#include <msp430x42x.h>
#define TXBUF_SIZE 32 /*一幀最多能發(fā)送的數(shù)據(jù)字節(jié)數(shù)*/
unsigned char TX_BUFF[TXBUF_SIZE]; /*發(fā)送緩沖區(qū)*/
unsigned char TX_NUM; /*發(fā)送字節(jié)總數(shù)變量*/
unsigned char TX_CNT; /*發(fā)送字節(jié)計(jì)數(shù)變量*/
/*****************************************************************
* 名 稱:UART0_ PutFrame ()
* 功 能:從串口發(fā)送1幀數(shù)據(jù)
* 入口參數(shù):Ptr:待發(fā)送數(shù)組的首地址(數(shù)組名)
* Lenth:數(shù)據(jù)幀長(zhǎng)度
* 出口參數(shù):返回1表示發(fā)送成功,
返回0表示發(fā)送失敗。
* 說(shuō) 明: 發(fā)送過(guò)程中,不阻塞CPU運(yùn)行
*****************************************************************/
char UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
{
int i;
if(IE1 & UTXIE0) return(0); //如果上一幀沒(méi)發(fā)送完,返回0
if(Lenth>TXBUF_SIZE) return(0); //長(zhǎng)度超過(guò)最大緩沖區(qū),返回0
for(i=0;i<Lenth;i++)
{
TX_BUFF[i]=Ptr[i]; // 待發(fā)送數(shù)據(jù)裝入發(fā)送緩沖區(qū)
}
TX_CNT=0; // 發(fā)送字節(jié)計(jì)數(shù)清零
TX_NUM=Lenth; // 發(fā)送字節(jié)總數(shù)
IFG1|=UTXIFG0; // 人為制造第一次發(fā)生中斷
IE1 |= UTXIE0; // 允許UART0的發(fā)送中斷
return (1); // 返回發(fā)送成功
}
#pragma vector=UART0TX_VECTOR
__interrupt void UART_TX (void) //串口發(fā)送中斷
{
U0TXBUF=TX_BUFF[TX_CNT]; //將本次應(yīng)該發(fā)送的數(shù)據(jù)送入TXBUF
TX_CNT++; //下一次依次發(fā)送后續(xù)字節(jié)
if(TX_CNT >=TX_NUM) //發(fā)送字節(jié)計(jì)數(shù)值到達(dá)發(fā)送總數(shù)
{
IE1 &=~ UTXIE0; // 禁止UART0的發(fā)送中斷,停止發(fā)送
}
}
void main( void )
{
unsigned char TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
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ī)有差別)
_EINT(); // 總中斷允許
while(1)
{
UART0_PutFrame(TxTestBuff,8); //發(fā)送一個(gè)數(shù)據(jù)幀
__delay_cycles(1000000); //約一秒發(fā)送一次
}
}
復(fù)制代碼
UART收幀(例2.9.6)
#include <msp430x42x.h>
#define FrameLenth 8 /*數(shù)據(jù)幀長(zhǎng)度=8*/
#define LocalAddr 0x01 /*本機(jī)地址=0x01*/
unsigned char RX_BUFF[FrameLenth]; /*接收數(shù)據(jù)幀存放數(shù)組*/
/*****************************************************************
* 名 稱:UART0_ GetFrame ()
* 功 能:從串口接收1幀數(shù)據(jù)
* 入口參數(shù):Addr:首字節(jié)地址匹配,只接受地址匹配的數(shù)據(jù)幀
* Lenth:數(shù)據(jù)幀長(zhǎng)度
* 出口參數(shù):無(wú)(接收數(shù)據(jù)存于全局變量數(shù)組內(nèi))
* 說(shuō) 明: 如果串口沒(méi)有數(shù)據(jù),會(huì)一直等待。等待過(guò)程中,會(huì)阻塞CPU運(yùn)行
*****************************************************************/
void UART0_GetFrame(unsigned char Addr, unsigned int Lenth)
{
unsigned int RcvCnt;
while(1)
{
U0RCTL |= URXWIE; // 僅響應(yīng)幀頭首字節(jié)
while ((IFG1 & URXIFG0)==0); // 等待接收一字節(jié)
IFG1 &=~ URXIFG0; // 清除接收標(biāo)志位
CHK_ADDR:
if(U0RXBUF==LocalAddr) // 如果與首地址匹配
{
U0RCTL &=~ URXWIE; // 之后響應(yīng)全部數(shù)據(jù),接收數(shù)據(jù)幀其他字節(jié)
RX_BUFF[0]=U0RXBUF; // 接收第一字節(jié)
RcvCnt=1; // 接收字節(jié)計(jì)數(shù)
break; // 跳出幀頭識(shí)別循環(huán),繼續(xù)接收其他字節(jié)
}
}
while(RcvCnt<Lenth) // 直到接收完8字節(jié)
{
while ((IFG1 & URXIFG0)==0); // 等待接收一字節(jié)
IFG1 &=~ URXIFG0; // 清除接收標(biāo)志位
if(U0RCTL & RXWAKE) // 如果又收到的是幀首,說(shuō)明數(shù)據(jù)幀中斷
{
goto CHK_ADDR; // 重新開(kāi)始接收
}
RX_BUFF[RcvCnt]=U0RXBUF; // 放入接收數(shù)組的對(duì)應(yīng)位置
RcvCnt++; // 下一字節(jié)放入數(shù)組的后一單元
}
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看門狗
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ī)有差別)
while(1)
{
UART0_GetFrame(LocalAddr,FrameLenth);//接收一個(gè)數(shù)據(jù)幀
_NOP(); //在這一句設(shè)斷點(diǎn)查看RX_BUFF[]數(shù)組的數(shù)據(jù)
}
}
復(fù)制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1