雖然是LPC但對UART FIFO的硬體原理說的比較清楚

來源:互聯網
上載者:User

LPC2000 UART串口使用心得
針對zgpswh在串口使用上的一些難題,總結個人在前一階段的理解,比較片面,不對的地方請高手指正。

1、LPC2000 系列晶片的串口的接收模組包括接收緩衝寄存器和移位寄存器。接收的資料進入移位寄存器後經移位處理並行傳入緩衝寄存器,事實上,UART的FIFO是一個硬體環形的緩衝隊列,物理上不可定址,不可見,僅U0RBR這個FIFO出口可見。U0RBR就是接收FIFO的第一位。FIFO的長度是可設的,也叫觸發點,低於這個長度的字串不會引起中斷,但在實際應用中,不可能串口讀入的資料長度總為觸發點值的整數倍,為此,引入了CTI即字元接收逾時中斷,當有不足觸發點值規定的字串讀入時,將引起中斷,其與串口的RDA中斷具有相同的優先順序,並會同時被使能。
那麼,LPC2000的UART機制是如何判斷串口讀入資料的一次性容量呢?如果接收FIFO裡已經有了1個字元,它可在一定的時間內等待下一個字元的讀入,也就是說,不超過一定的時間就不會觸發CTI中斷,這個時間是在本次通訊通訊協定設定的前提下,接收3.5到4.5個字元所用的時間。比如,需串口接收GPRS數傳狀態成功建立後的傳回值“Ok_Info_WaitingForData”22個字元組成的字串,FIFO觸發點設定為14,在前14個字元讀入之後,立即觸發RDA中斷,跳轉至RDA中斷服務子程式將這14個字元放入我所預設的緩衝區內,接著,後8個字元讀入,這時CPU並不立刻中斷,它需等待在本次串口通訊通訊協定設定的前提下,接收3.5到4.5個字元所用的時間(需根據傳輸速率和框架格式具體計算),這個時間一到,立刻觸發CTI中斷,換句話說,超過這個時間的等待,CPU就認為一個完整的字串已經結束了,這才是字串逾時的真正含義。
    
2、為什麼要用FIFO呢?我個人覺得,主要是為了提高串口的利用效率,同時可以避免一定程度上的丟包。比如,在用串口發送FIFO中斷時,觸發深度設為8,那麼接收中斷髮生的條件是,FIFO裡有了8個字元,但不是8個位元組,因為串口非同步通訊的協議中,會加幀頭和幀尾,但外表上還是以字元為單位。發送時,則是當FIFO裡不滿8個字元的時候要中斷一次,所以利用FIFO發送時也要自建一個用來串口發送的緩衝池,發送中斷服務程式裡要做的就是從這個發送緩衝區裡取數送進FIFO裡,沿用上面的假設,觸發深度設為8,一次性向FIFO裡送15個字元,在送入第一批15個字元之後串口開始自動發送,當FIFO裡只有7個字元時,立即發生中斷,因此,在發送中斷服務程式裡要設個計數指標作為跳出中斷的上限,這個上限不是8而是15。我認為,如果要發揮fifo的高效率,就必須把自設的緩衝區作成一個環狀鏈表,即,不需要做移位處理使自設的緩衝區剩餘的資料頂頭。ZLG有詳細的基於隊列思想的常式。

3、個人覺得,當FIFO的觸發深度設為1時和不用FIFO時的效果是一樣的。

4、串口發送時,推薦第一個字元要在開啟串口中斷前送,否則可能中斷只來一次。比如下面的這個用串口中斷髮送字串的函數為:
/****************************************************************************************************
** 函數名稱 :UART0_SendStr()
** 函數功能 :向串口發送字串
** 入口參數 :str    要發送的字串的首地址指標
** 出口參數 :無
*****************************************************************************************************
void UART0_SendStr( CHAR const  *str)
{  
     Str_Send_P = str;
     U0THR = *Str_Send_P++;
     U0IER |= 0x02;      //開發送中斷      
}
在中斷髮送程式中的處理為:
SWITCH(IIR & 0x0e)
       {
         case 0x02:              //利用串口發送中斷,發送字串
              if((*Str_Send_P)!='/0')
              U0THR = *Str_Send_P++;
              else
              U0IER &= (~0x02);   //關發送中斷
              break;
這種做法的道理不太明白,但實驗證明,不這麼做就只發一次

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.