什么是UART中的FIFO


  FIFO是先進先出緩沖區的意思,即串口接收到的數據可以先進入FIFO,不必馬上進入中斷服務程序接收,這樣可以節省CPU時間。對於發送數據也一樣可以把要發送的數據一起寫入FIFO,串口控制器按照寫入的順序依次發送出去。

    FIFO只是一個緩沖器而已,如果你的CPU沒有什么別的工作或完全處理過來uart數據的話,可以用noFIFO模式,如果你的CPU有一些耗時工作要處理,可能uart數據來了很多才開始處理,這樣就需要FIFO做緩沖區了。串口會設置觸發等級,就是預先設置一個值,每當傳輸這個值的數據量就觸發一次中斷。比如設置8個字節,那么每傳輸8字節數據就會觸發一次中斷。

    很多人停留在每收發一個字符就要中斷處理一次的老思路上。UART收發FIFO主要是為了解決收發中斷過於頻繁而導致CPU效率不高的問題。這就是FIFO的必要性,在進行UART通信時,中斷方式比輪詢方式要簡介且有效率。但是,如果沒有收發FIFO,則每傳輸一個數據(5~8位)都要中斷處理一次,這樣中斷方式,效率仍然不高。如果有了收發FIFO,則可以連續收發若干數據(可多至14個)后才產生一次中斷,然后一起處理,這就大大提高了收發效率。

    接收超時問題,如果沒有接收超時功能,則在對方已經發送完畢而接收FIFO未滿時並不會觸發中斷(FIFO滿才會觸發中斷),結果造成最后接收到的有效數據得不到處理的問題。有了接收超時功能后,如果接收FIFO未滿而對方送已經停止,則在不超過3個數據的接收時間內就會觸發超時中斷,因此數據會照常處理。

    總之,FIFO的設計時優秀而合理的,它已經幫你向導了收發過程中存在的任何問題,只要初始化配置UART后,就可以放心的收發了,FIFO和中斷例程會自動搞定一切。完全不必要擔心FIFO大大減少了中斷產生的次數而可能造成數據丟失的問題。

    發送時,只要發送FIFO不滿,數據只管往里連續放,放完后就直接退出發送子程序,隨后,FIFO真正發送完成后會自動產生中斷,通知主程序:我已經完成了真正的發送。

    接收時,如果對方連續不間斷發送,則填滿FIFO后會以中斷的方式通知主程序說:現在有一批數據來了,請處理。如果對方是間斷性發送,也不要緊,當間隔時間過長(2~3個字符傳輸時間),也會產生中斷,這次是超時中斷,通知主程序說:對方可能已經發送完畢,但FIFO未滿,請處理。

 

當然也可以軟件字節定義一種緩沖區作為FIFO

 

【相關庫函數】

1. UARTConfigSet()配置UART,例如UART2:波特率9600,數據位8,停止位1,無校驗

    UARTConfigSet(UART2_BASE, 9600, UART_CONFIG_WLEN_8 |UART_CONFIG_STOP_ONE |

           UART_CONFIG_PAR_NONE);

2. UARTFIFOLevelSet()

  設置UART收發FIFO的深度,可以設置的深度有2、4、8、12、14

3. UARTSpaceAvail()

  確認在發送FIFO里是否有可利用的空間。

4. UARTCharsAvail()

  確認在接收FIFO里是否存在字符。

5. UARTCharPutNonBlocking()

  該函數要與UARTSpaceAvail()配合使用,如果已確認發送FIFO里有可用空間,則將字符直接放入發送FIFO,不等待。

6. UARTCharGetNonBlocking()

  該函數要與UARTCharsAvail()配合使用,如果已確認接收FIFO里有字符,則直接從接收FIFO里讀取字符,不等待。

7. UARTCharPut()

  將字符放到發送FIFO里,如果沒有可用空間則一直等待。

8. UARTCharGet()

  從接收FIFO里讀取字符,如果沒有字符則一直等待。

9. UARTIntEnable() 使能一個或多個UART中斷,例如:同時使能接收中斷(接收FIFO溢出)和接收超時中斷

UARTIntEnable(UART2_BASE, UART_INT_RX | UART_INT_RT);

 

轉帖:http://blog.csdn.net/zlsh007/article/details/35367521


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM