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