久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5620|回復: 1
收起左側

MSP430單片機UART_FIFO 發送 接受

[復制鏈接]
ID:108615 發表于 2016-3-14 19:03 | 顯示全部樓層 |閱讀模式
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 (例2.9.10)))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html

關于本程序的詳細解說大家可以下載電子書點擊上圖即可
原書一共有2個程序
程序1發送:
  1. #include <msp430x42x.h>
  2. #define TXBUF_SIZE  32                    /*發送FIFO的最大容量*/
  3. unsigned char TX_BUFF[TXBUF_SIZE];  /*發送FIFO緩沖區數組*/
  4. unsigned int  UART_OutLen=0;        /*發送FIFO內待發出的字節數*/
  5. unsigned int  TX_IndexR=0;          /*發送FIFO內的讀指針*/
  6. unsigned int  TX_IndexW=0;          /*發送FIFO內的寫指針*/
  7. /*****************************************************************
  8. * 名    稱:UART0_PutChar()
  9. * 功    能:從串口發送1字節數據(向緩沖隊列內填入1字節待發送數據)
  10. * 入口參數:Chr:待發送的字節
  11. * 出口參數:返回1表示發送成功,
  12.             返回0表示發送失敗。     
  13. * 說    明: 發送過程中,不阻塞CPU運行
  14. *****************************************************************/
  15. char UART0_PutChar(unsigned char Chr)
  16. {
  17.   if(UART_OutLen == TXBUF_SIZE) //如果FIFO已滿
  18.   {
  19.     return (0);                 // 不發送數據,返回發送失敗標志
  20.   }
  21.   if(UART_OutLen==0)            // 如果是第一個字節
  22.   {
  23.     IFG1|=UTXIFG0;              // 人為制造第一次中斷條件   
  24.   }
  25.   _DINT();                      // 涉及FIFO操作時不允許中斷,以免數據錯亂
  26.   UART_OutLen++;                // 待發送字節數加1
  27.   TX_BUFF[TX_IndexW] = Chr;     // 待發送數據通過寫指針寫入FIFO
  28.   if (++TX_IndexW >= TXBUF_SIZE)// 寫指針遞增,且判斷是否下標越界
  29.    {
  30.     TX_IndexW = 0;              // 如果越界則寫指針歸零(循環隊列)      
  31.    }
  32.   IE1 |= UTXIE0;                  // 允許UART0的發送中斷,在中斷內依次發送數據   
  33.   _EINT();                      // FIFO操作完畢,恢復中斷允許
  34.   return (1);                   // 返回發送成功標志   
  35. }                                   

  36. #pragma vector=UART0TX_VECTOR
  37. __interrupt void UART_TX (void)         // 串口發送中斷
  38. {
  39.    if(UART_OutLen>0)                    // FIFO內是否有待發送的數據?
  40.        {                                
  41.           UART_OutLen--;                // 待發送數據字節數減1  
  42.           U0TXBUF=TX_BUFF[TX_IndexR];   // 從尾指針讀取一個字節并發送
  43.           if (++TX_IndexR >= TXBUF_SIZE)// 讀指針遞增,且判斷是否下標越界
  44.            {                                   
  45.              TX_IndexR = 0;             // 如果越界則寫指針歸零(循環隊列)
  46.            }
  47.        }
  48.     else  IE1 &=~ UTXIE0;  // 如果數據已發完,則關閉UART0的發送中斷,停止發送  
  49. }   
  50. /*****************************************************************
  51. * 名    稱:UART0_PutChar_Legacy()
  52. * 功    能:傳統的從串口發送1字節數據程序,供對比用
  53. * 入口參數:Chr:待發送的字節   
  54. * 說    明: 發送過程中,會阻塞CPU運行
  55. *****************************************************************/
  56. void UART0_PutChar_Legacy(char Chr)
  57. {
  58.   TXBUF0=Chr;
  59. while ((IFG1 & UTXIFG0)==0);         // 等待該字節發完
  60. }


  61. void main( void )
  62. {                                                               
  63.   WDTCTL = WDTPW + WDTHOLD;           // 停止看門狗
  64.   FLL_CTL0 |= XCAP18PF;                // 配置晶振負載電容
  65.   U0CTL = CHAR;                        // 異步通訊模式,8位數據,無校驗,1位停止位。
  66.   ME1 |= UTXE0 + URXE0;                // 開啟串口0收發模塊
  67.   U0TCTL |= SSEL0;                // 選擇ACLK作為串口波特率時鐘源。
  68.   U0BR1 = 0;                        //
  69.   U0BR0 = 13;                        // 分頻系數整數部分=13
  70.   U0MCTL = 0x6B;                // 分頻系數小數部分調制=5/8。(2400bps)
  71.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
  72.   _EINT();                        // 總中斷允許

  73.   while(1)
  74.   {
  75.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA測量傳統發送程序所需時間                                                   
  76.     UART0_PutChar_Legacy(0x01);
  77.     UART0_PutChar_Legacy(0x02);
  78.     UART0_PutChar_Legacy(0x03);
  79.     UART0_PutChar_Legacy(0x04);
  80.     UART0_PutChar_Legacy(0x05);             //測試,發送8字節數據
  81.     UART0_PutChar_Legacy(0x06);
  82.     UART0_PutChar_Legacy(0x07);
  83.     UART0_PutChar_Legacy(0x08);
  84.     TACTL = TASSEL_2 + MC_0;                // TA停止計時
  85.     _NOP();                           // 在這一句設斷點查看TAR值(29652個周期)
  86.     __delay_cycles(1000000);        
  87.    
  88.     TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 用TA測量帶FIFO的發送程序所需時間                                                   
  89.     UART0_PutChar(0x01);
  90.     UART0_PutChar(0x02);
  91.     UART0_PutChar(0x03);
  92.     UART0_PutChar(0x04);
  93.     UART0_PutChar(0x05);                    //測試,發送8字節數據
  94.     UART0_PutChar(0x06);
  95.     UART0_PutChar(0x07);
  96.     UART0_PutChar(0x08);
  97.     TACTL = TASSEL_2 + MC_0;                // TA停止計時
  98.     _NOP();                           // 在這一句設斷點查看TAR值 (440個周期)   
  99.     __delay_cycles(1000000);                    //約一秒發送一次
  100.   }
  101. }
復制代碼

程序2接受:
  1. #include <msp430x42x.h>
  2. #define RXBUF_SIZE  32                              /*接收FIFO的最大容量*/
  3. unsigned char RX_BUFF[RXBUF_SIZE];          /*接收FIFO緩沖區數組*/
  4. unsigned int  UART_InpLen=0;                /*接收FIFO內待讀取的字節數*/
  5. unsigned int  RX_IndexR=0;                  /*接收FIFO的讀指針*/
  6. unsigned int  RX_IndexW=0;                  /*接收FIFO的寫指針*/
  7. /*****************************************************************
  8. * 名    稱:UART0_GetChar()
  9. * 功    能:從串口讀取1字節數據(從緩沖隊列內讀取1字節已接收的數據)
  10. * 入口參數:*Chr:讀取數據所存放的地址指針
  11. * 出口參數:返回1表示讀取成功,返回0表示讀取失敗。     
  12. * 說    明: 讀取過程中,不阻塞CPU運行
  13. *****************************************************************/
  14. char UART0_GetChar(unsigned char *Chr)
  15. {
  16.   if(UART_InpLen==0) return(0);         // 如果FIFO內無數據,返回0
  17.   _DINT();                              // 涉及FIFO操作時不允許中斷,以免指針錯亂                              
  18.   UART_InpLen--;                        // 待讀取數據字節數減1  
  19.   *Chr=RX_BUFF[RX_IndexR];                   // 從尾指針讀取一個字節作為返回值
  20.   if (++RX_IndexR >= RXBUF_SIZE)        // 讀指針遞增,且判斷是否下標越界
  21.      {                                   
  22.        RX_IndexR = 0;                   // 如果越界則寫指針歸零(循環隊列)
  23.      }
  24.   _EINT();                              // FIFO操作完畢,恢復中斷允許
  25.   return (1);                           // 返回發送成功標志   
  26. }                                   
  27. /*****************************************************************
  28. * 名    稱:UART0_GetCharsInRxBuf()
  29. * 功    能:獲取FIFO內已接收的數據字節數
  30. * 入口參數:無
  31. * 出口參數:待讀取的字節數     
  32. *****************************************************************/
  33. unsigned int UART0_GetCharsInRxBuf()
  34. {
  35.   return (UART_InpLen);                 // 返回FIFO內數據的字節數   
  36. }                                   
  37. /*****************************************************************
  38. * 名    稱:UART0_ClrRxBuf()
  39. * 功    能:清除接收FIFO區
  40. * 入口參數:無
  41. * 出口參數:無     
  42. *****************************************************************/
  43. void UART0_ClrRxBuf()
  44. {
  45.   _DINT();        // 涉及FIFO操作時不允許中斷,以免指針錯亂
  46.   UART_InpLen=0;  // 接收的數據清空
  47.   RX_IndexR=0;   
  48.   RX_IndexW=0;    // 頭尾指針復位
  49.   _EINT();
  50. }

  51. #pragma vector=UART0RX_VECTOR
  52. __interrupt void UART0_RX (void)         // 串口接收中斷
  53. {
  54.   UART_InpLen++;                        // 接收字節計數加1
  55.   RX_BUFF[RX_IndexW] =U0RXBUF;             // 串口接收數據通過寫指針寫入FIFO
  56.   if (++RX_IndexW >= RXBUF_SIZE)        // 寫指針遞增,且判斷是否下標越界
  57.    {
  58.     RX_IndexW = 0;                      // 如果越界則寫指針歸零(循環隊列)      
  59.    }  
  60. }

  61. void main( void )
  62. {                                                               
  63.   unsigned char RxDataBuff[8];
  64.   unsigned char Addr;
  65.   unsigned char Func;
  66.   int i;
  67.   WDTCTL = WDTPW + WDTHOLD;           // 停止看門狗
  68.   FLL_CTL0 |= XCAP18PF;                // 配置晶振負載電容
  69.   U0CTL = CHAR;                        // 異步通訊模式,8位數據,無校驗,1位停止位。
  70.   ME1 |= UTXE0 + URXE0;                // 開啟串口0收發模塊
  71.   U0TCTL |= SSEL0;                // 選擇ACLK作為串口波特率時鐘源。
  72.   U0BR1 = 0;                        //
  73.   U0BR0 = 13;                        // 分頻系數整數部分=13
  74.   U0MCTL = 0x6B;                // 分頻系數小數部分調制=5/8。(2400bps)
  75.   P2SEL |= BIT4 + BIT5;  // P2.4,5 開啟第二功能,作為串口收發引腳(不同單片機有差別)
  76.   IE1 |= URXIE0;         // 開啟UART0的接收中斷,在中斷內接收數據
  77.   _EINT();                        // 總中斷允許
  78.   while(1)
  79.   {  
  80.     __delay_cycles(1000000);//模擬一個長耗時的程序,使CPU暫時不能讀取串口
  81.     if(UART0_GetCharsInRxBuf()>=10) //每收到10字節數據
  82.     {
  83.       UART0_GetChar(&Addr);         //讀取第1字節
  84.       UART0_GetChar(&Func);         //讀取第2字節
  85.       for(i=0;i<8;i++) UART0_GetChar(RxDataBuff+i); //依次讀取后8字節
  86.     }
  87.   }
  88. }
復制代碼




回復

使用道具 舉報

ID:165841 發表于 2017-3-14 22:58 | 顯示全部樓層
if(UART_OutLen==0)            // 如果是第一個字節   {     IFG1|=UTXIFG0;              // 人為制造第一次中斷條件       }是什么意思
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 美女视频h | 欧美aaa级 | 精品久久久一区 | 爱高潮www亚洲精品 中文字幕免费视频 | 在线男人天堂 | 国产福利在线免费观看 | 国内精品久久影院 | 中文字幕a√ | 在线精品一区二区三区 | 欧美日韩视频在线第一区 | 自拍视频一区二区三区 | 久草在线青青草 | 国产精品一区二区三区久久 | 操操操日日日 | 国产乱xxav| 中文字幕一区二区在线观看 | 97精品国产 | 亚洲欧洲成人av每日更新 | 色综合av | 国产精品一区在线观看 | 欧美a级成人淫片免费看 | 国产 日韩 欧美 中文 在线播放 | 日本黄视频在线观看 | 精品国产综合 | 国产成人精品一区二三区在线观看 | 天天插天天操 | www国产亚洲精品久久网站 | 中文字幕一区在线观看视频 | 拍真实国产伦偷精品 | 久久激情视频 | 精品一级 | 日韩av最新网址 | 欧美日韩精品一区二区三区四区 | 99reav| 国产成人精品一区二 | 久久精品亚洲精品 | 欧美中文字幕一区二区三区亚洲 | av资源网站 | 久久9精品 | 色接久久 | 欧美精品久久一区 |