UART輪詢與中斷模式

使用輪詢方式發送:

1、檢查TxFIFO是否爲空。等待直到TxFIFO爲空。

2、向TxFIFO寫數據。如果要發送的數據大於64字節,則先將64字節寫入。

3、寫入剩下的字節。有兩種方法:a.檢查TxFIFO是否爲非滿,如果爲非滿,則寫入一個字節,直到寫完要發送的數據。b.檢查TxFIFO是否爲空,如果爲空,則跳到2,直到寫完要發送的數據。

使用中斷方式發送:

1、禁用TxFIFO空中斷。

2、向TxFIFO寫數據。如果要發送的數據大於64字節,則先將64字節寫入。

3、檢查TxFIFO是否爲非滿,如果爲非滿,則寫入一個字節,繼續檢查,如果非滿則繼續寫入,否則進行下一步。

4、允許TxFIFO空中斷。

5、等待空中斷。中斷產生後跳到1。

使用輪詢方式接收:

1、等待直到RxFIFO填充到某個程度,即trigger level,或者TIMEOUT。(TIMEOUT用於在一定時間內RxFIFO內數據少於trigger level時也能將數據讀出)

2、從RxFIFO中讀數據,直到RxFIFO空。

3、如果TIMEOUT中斷狀態置位,則清除該置位。

使用中斷方式接收:

1、允許中斷。

2、RxFIFO填充到trigger level或者TIMEOUT時觸發中斷。

3、從RxFIFO中讀數據。

4、重複2、3直到RxFIFO空。

5、如果中斷狀態置位,則清除該置位。trigger level中斷和TIMEOUT中斷。

u32 XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes):

非阻塞發送,如果設備忙,將返回並指示發送了0個字節,該函數儘可能地填充FIFO並返回發送的字節數。

如果發送0字節,則會停止之前還未完成的發送,因爲該函數開頭有禁止中斷的操作。

在輪詢模式下,該函數只能發送FIFO能緩衝的字節數,想要發送更多字節,需要重複調用該函數。

在中斷模式下,該函數會首先發送N個字節,接着中斷句柄會發送剩餘的字節直到發完。會有一個回調函數來指示發送的完成。

u32 XUartPs_Recv(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes):

非阻塞接收。

在輪詢模式下,只接收FIFO中已經存在的數據,如果要接收所有數據,則需要重複調用該函數。

在中斷模式下,先接收FIFO中已經存在的數據,如果沒有接收完所有數據,則中斷句柄會繼續接收直到所有數據接收完。會有一個回調函數來指示接收的完成或錯誤的發生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章