找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4444|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MSP430單片機(jī)UART高效發(fā)幀與收幀 程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:108615 發(fā)表于 2016-3-14 19:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書(shū)里面的源碼,(包含工程文件 (例2.9.x)))完整例程下載:http://www.torrancerestoration.com/bbs/dpj-46245-1.html

關(guān)于本程序的詳細(xì)解說(shuō)大家可以下載電子書(shū)點(diǎn)擊上圖即可

UART發(fā)幀程序:
  1. #include <msp430x42x.h>
  2. unsigned char TX_BUFF[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};/*待發(fā)送數(shù)組*/
  3. /*****************************************************************
  4. * 名    稱(chēng):UART0_ PutFrame ()
  5. * 功    能:從串口發(fā)送1幀數(shù)據(jù)
  6. * 入口參數(shù):Ptr:待發(fā)送數(shù)組的首地址(數(shù)組名)
  7. *           Lenth:數(shù)據(jù)幀長(zhǎng)度   
  8. * 出口參數(shù):無(wú)
  9. * 說(shuō)    明: 發(fā)送過(guò)程中,會(huì)阻塞CPU運(yùn)行
  10. *****************************************************************/
  11. void UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
  12. {
  13.   int i;
  14.   U0TCTL |= TXWAKE;             // 產(chǎn)生一個(gè)線(xiàn)路空閑時(shí)間
  15.   TXBUF0=0;                     // 寫(xiě)入任意字節(jié)
  16.   while ((IFG1 & UTXIFG0)==0);         // 等待該字節(jié)發(fā)完(實(shí)際上并未發(fā)出)
  17.   for(i=0;i<Lenth;i++)
  18.   {
  19.      TXBUF0=Ptr[i];
  20.      while ((IFG1 & UTXIFG0)==0);         // 等待該字節(jié)發(fā)完
  21.      IFG1 &=~ UTXIFG0;                          // 清除發(fā)送標(biāo)志位
  22.   }
  23.   while ((U0TCTL & TXEPT)==0);                 // 等待最后一字節(jié)數(shù)據(jù)發(fā)出(移位寄存器空)
  24. }

  25. void main( void )
  26. {
  27.   WDTCTL = WDTPW + WDTHOLD;            // 停止看門(mén)狗
  28.   FLL_CTL0 |= XCAP18PF;         // 配置晶振負(fù)載電容
  29.   U0CTL = CHAR;                        // 異步通訊模式,8位數(shù)據(jù),無(wú)校驗(yàn),1位停止位。
  30.   ME1 |= UTXE0 + URXE0;                // 開(kāi)啟串口0收發(fā)模塊
  31.   U0TCTL |= SSEL0;                // 選擇ACLK作為串口波特率時(shí)鐘源。
  32.   U0BR1 = 0;                        //
  33.   U0BR0 = 13;                        // 分頻系數(shù)整數(shù)部分=13
  34.   U0MCTL = 0x6B;                // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
  35.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開(kāi)啟第二功能,作為串口收發(fā)引腳(不同單片機(jī)有差別)
  36.   while(1)
  37.   {
  38.     UART0_PutFrame(TX_BUFF,8);//發(fā)送一個(gè)數(shù)據(jù)幀
  39.     _NOP();                //在這一句設(shè)斷點(diǎn)查看調(diào)試用
  40.   }
  41. }
復(fù)制代碼

UART高效發(fā)幀:
  1. #include <msp430x42x.h>
  2. #define TXBUF_SIZE  32                        /*一幀最多能發(fā)送的數(shù)據(jù)字節(jié)數(shù)*/
  3. unsigned char TX_BUFF[TXBUF_SIZE];        /*發(fā)送緩沖區(qū)*/
  4. unsigned char TX_NUM;                        /*發(fā)送字節(jié)總數(shù)變量*/
  5. unsigned char TX_CNT;                        /*發(fā)送字節(jié)計(jì)數(shù)變量*/

  6. /*****************************************************************
  7. * 名    稱(chēng):UART0_ PutFrame ()
  8. * 功    能:從串口發(fā)送1幀數(shù)據(jù)
  9. * 入口參數(shù):Ptr:待發(fā)送數(shù)組的首地址(數(shù)組名)
  10. *           Lenth:數(shù)據(jù)幀長(zhǎng)度   
  11. * 出口參數(shù):返回1表示發(fā)送成功,
  12.             返回0表示發(fā)送失敗。     
  13. * 說(shuō)    明: 發(fā)送過(guò)程中,不阻塞CPU運(yùn)行
  14. *****************************************************************/
  15. char UART0_PutFrame(unsigned char * Ptr, unsigned int Lenth)
  16. {
  17.   int i;
  18.   if(IE1 & UTXIE0)      return(0);  //如果上一幀沒(méi)發(fā)送完,返回0
  19.   if(Lenth>TXBUF_SIZE)  return(0);  //長(zhǎng)度超過(guò)最大緩沖區(qū),返回0
  20.   for(i=0;i<Lenth;i++)      
  21.   {
  22.     TX_BUFF[i]=Ptr[i];    // 待發(fā)送數(shù)據(jù)裝入發(fā)送緩沖區(qū)
  23.   }
  24.   TX_CNT=0;               // 發(fā)送字節(jié)計(jì)數(shù)清零
  25.   TX_NUM=Lenth;           // 發(fā)送字節(jié)總數(shù)
  26.   IFG1|=UTXIFG0;          // 人為制造第一次發(fā)生中斷
  27.   IE1 |= UTXIE0;          // 允許UART0的發(fā)送中斷
  28.   return (1);             // 返回發(fā)送成功
  29. }
  30. #pragma vector=UART0TX_VECTOR
  31. __interrupt void UART_TX (void) //串口發(fā)送中斷
  32. {
  33.   U0TXBUF=TX_BUFF[TX_CNT];  //將本次應(yīng)該發(fā)送的數(shù)據(jù)送入TXBUF
  34.   TX_CNT++;                 //下一次依次發(fā)送后續(xù)字節(jié)
  35.   if(TX_CNT >=TX_NUM)       //發(fā)送字節(jié)計(jì)數(shù)值到達(dá)發(fā)送總數(shù)
  36.   {
  37.     IE1 &=~ UTXIE0;         // 禁止UART0的發(fā)送中斷,停止發(fā)送
  38.   }
  39. }

  40. void main( void )
  41. {
  42.   unsigned char TxTestBuff[8]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
  43.   WDTCTL = WDTPW + WDTHOLD;            // 停止看門(mén)狗
  44.   FLL_CTL0 |= XCAP18PF;         // 配置晶振負(fù)載電容
  45.   U0CTL = CHAR;                        // 異步通訊模式,8位數(shù)據(jù),無(wú)校驗(yàn),1位停止位。
  46.   ME1 |= UTXE0 + URXE0;                // 開(kāi)啟串口0收發(fā)模塊
  47.   U0TCTL |= SSEL0;                // 選擇ACLK作為串口波特率時(shí)鐘源。
  48.   U0BR1 = 0;                        //
  49.   U0BR0 = 13;                        // 分頻系數(shù)整數(shù)部分=13
  50.   U0MCTL = 0x6B;                // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
  51.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開(kāi)啟第二功能,作為串口收發(fā)引腳(不同單片機(jī)有差別)
  52.   _EINT();                        // 總中斷允許

  53.   while(1)
  54.   {
  55.     UART0_PutFrame(TxTestBuff,8);        //發(fā)送一個(gè)數(shù)據(jù)幀
  56.     __delay_cycles(1000000);                //約一秒發(fā)送一次
  57.   }
  58. }
復(fù)制代碼

UART收幀(例2.9.6)
  1. #include <msp430x42x.h>
  2. #define FrameLenth    8                                /*數(shù)據(jù)幀長(zhǎng)度=8*/
  3. #define LocalAddr     0x01                        /*本機(jī)地址=0x01*/
  4. unsigned char RX_BUFF[FrameLenth];        /*接收數(shù)據(jù)幀存放數(shù)組*/
  5. /*****************************************************************
  6. * 名    稱(chēng):UART0_ GetFrame ()
  7. * 功    能:從串口接收1幀數(shù)據(jù)
  8. * 入口參數(shù):Addr:首字節(jié)地址匹配,只接受地址匹配的數(shù)據(jù)幀
  9. *           Lenth:數(shù)據(jù)幀長(zhǎng)度   
  10. * 出口參數(shù):無(wú)(接收數(shù)據(jù)存于全局變量數(shù)組內(nèi))
  11. * 說(shuō)    明: 如果串口沒(méi)有數(shù)據(jù),會(huì)一直等待。等待過(guò)程中,會(huì)阻塞CPU運(yùn)行
  12. *****************************************************************/
  13. void UART0_GetFrame(unsigned char Addr, unsigned int Lenth)
  14. {
  15.   unsigned int RcvCnt;
  16.   while(1)
  17.   {
  18.     U0RCTL |= URXWIE;                        // 僅響應(yīng)幀頭首字節(jié)
  19.     while ((IFG1 & URXIFG0)==0);           // 等待接收一字節(jié)
  20.     IFG1 &=~ URXIFG0;                            // 清除接收標(biāo)志位
  21.   CHK_ADDR:
  22.     if(U0RXBUF==LocalAddr)                  // 如果與首地址匹配
  23.       {
  24.         U0RCTL &=~ URXWIE;                       // 之后響應(yīng)全部數(shù)據(jù),接收數(shù)據(jù)幀其他字節(jié)
  25.         RX_BUFF[0]=U0RXBUF;                      // 接收第一字節(jié)
  26.         RcvCnt=1;                                                // 接收字節(jié)計(jì)數(shù)
  27.         break;                                   // 跳出幀頭識(shí)別循環(huán),繼續(xù)接收其他字節(jié)
  28.       }
  29.   }
  30.   while(RcvCnt<Lenth)                           // 直到接收完8字節(jié)
  31.   {
  32.     while ((IFG1 & URXIFG0)==0);                // 等待接收一字節(jié)
  33.     IFG1 &=~ URXIFG0;                                // 清除接收標(biāo)志位
  34.     if(U0RCTL & RXWAKE)                         // 如果又收到的是幀首,說(shuō)明數(shù)據(jù)幀中斷
  35.       {
  36.         goto CHK_ADDR;                          // 重新開(kāi)始接收
  37.       }  
  38.     RX_BUFF[RcvCnt]=U0RXBUF;                    // 放入接收數(shù)組的對(duì)應(yīng)位置
  39.     RcvCnt++;                                   // 下一字節(jié)放入數(shù)組的后一單元
  40.   }
  41. }

  42. void main( void )
  43. {
  44.   WDTCTL = WDTPW + WDTHOLD;            // 停止看門(mén)狗
  45.   FLL_CTL0 |= XCAP18PF;         // 配置晶振負(fù)載電容
  46.   U0CTL = CHAR;                        // 異步通訊模式,8位數(shù)據(jù),無(wú)校驗(yàn),1位停止位。
  47.   ME1 |= UTXE0 + URXE0;                // 開(kāi)啟串口0收發(fā)模塊
  48.   U0TCTL |= SSEL0;                // 選擇ACLK作為串口波特率時(shí)鐘源。
  49.   U0BR1 = 0;                        //
  50.   U0BR0 = 13;                        // 分頻系數(shù)整數(shù)部分=13
  51.   U0MCTL = 0x6B;                // 分頻系數(shù)小數(shù)部分調(diào)制=5/8。(2400bps)
  52.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開(kāi)啟第二功能,作為串口收發(fā)引腳(不同單片機(jī)有差別)
  53.   while(1)
  54.   {
  55.     UART0_GetFrame(LocalAddr,FrameLenth);//接收一個(gè)數(shù)據(jù)幀
  56.     _NOP();                                //在這一句設(shè)斷點(diǎn)查看RX_BUFF[]數(shù)組的數(shù)據(jù)
  57.   }
  58. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表