UART的FIFO功能
UART的FIFO功能
2015年09月08日 18:21:23
閱讀數(shù):5464
經(jīng)常聽到UART的FIFO功能,但是從來(lái)沒有真正使用過(guò)和認(rèn)真思考過(guò)它的作用。正好有客戶用到這個(gè)功能,在這里做個(gè)總結(jié)。?
FIFO 是“First-In First-Out”的縮寫,它是一個(gè)具有先入先出特點(diǎn)的緩沖區(qū)。串口設(shè)計(jì)FIFO的目的是為了提高串口的通訊性能。如果沒有FIFO或者說(shuō)緩沖區(qū)的長(zhǎng)度只有1字節(jié),那么使用接收中斷,就意味著每次收到一個(gè)字節(jié)的數(shù)據(jù)就要進(jìn)一次中斷,這樣頻繁進(jìn)中斷會(huì)占用CPU資源。另外如果沒有及時(shí)讀走數(shù)據(jù),那么下一個(gè)字節(jié)數(shù)據(jù)就會(huì)覆蓋之前的數(shù)據(jù),導(dǎo)致數(shù)據(jù)丟失,這在通訊速率高的場(chǎng)合很有可能出現(xiàn)。?
使用FIFO,可以在連續(xù)接收若干個(gè)數(shù)據(jù)后才產(chǎn)生一次中斷,然后一起進(jìn)行處理。這樣可以提高接收效率,避免頻繁進(jìn)中斷,適用于大數(shù)據(jù)傳輸。你可能會(huì)想到如果FIFO中的數(shù)據(jù)沒有達(dá)到指定長(zhǎng)度而無(wú)法產(chǎn)生中斷怎么辦,通常MCU會(huì)有接收超時(shí)中斷,即在一定的時(shí)間內(nèi)沒有接收到數(shù)據(jù)會(huì)進(jìn)入中斷,可以利用這個(gè)中斷把不足FIFO長(zhǎng)度的數(shù)據(jù)最后都讀取完。?
?
但是使用FIFO接收多字節(jié)數(shù)據(jù)進(jìn)中斷不好的地方是實(shí)時(shí)性會(huì)受到一定的影響,對(duì)某些實(shí)時(shí)性要求高的場(chǎng)合,比如說(shuō)要求UART收到某個(gè)特定字符就立刻停止發(fā)送數(shù)據(jù)這樣一個(gè)場(chǎng)合,使用FIFO每多個(gè)字節(jié)進(jìn)一次中斷就不合適了。?
所以說(shuō)使用FIFO好處是1)避免頻繁進(jìn)中斷,提高吞吐率 2)避免數(shù)據(jù)因沒有及時(shí)處理而丟失。不好的地方是實(shí)時(shí)性受影響。?
此客戶要求使用FIFO的原因是他們擔(dān)心在接收中斷處理過(guò)程中數(shù)據(jù)來(lái)的太快沒有及時(shí)處理而丟失。?
針對(duì)這個(gè)問題采取的解決方法是:還是一個(gè)字節(jié)進(jìn)一次接收中斷,這樣可以保證實(shí)時(shí)性,把FIFO打開,這樣可以防止數(shù)據(jù)被覆蓋而丟失,在接收中斷處理完接收數(shù)據(jù)之后去判斷緩沖區(qū)中是否有數(shù)據(jù),如果有的話把數(shù)據(jù)讀走,這樣就防止了數(shù)據(jù)丟失,同時(shí)保證了實(shí)時(shí)性。?
對(duì)于Kinetis M4 MCU操作也非常簡(jiǎn)單。?
以K60為例,UART0和UART1緩沖區(qū)長(zhǎng)度為8,其他UART緩沖區(qū)長(zhǎng)度為1.?
?
只要配置UARTx_PFIFO寄存器即可。?
?
軟件上是:
- 1
- 2
- 3
需要注意的是:配置此寄存器 C2[RE] 和C2[TE] 位為0,另外在設(shè)置完RXFE位之后,應(yīng)立刻向UARTx_CFIFO的TXFLUSH和RXFLUSH位寫1.
這樣配置完之后就打開了接收FIFO功能。在中斷處理函數(shù)中,最后去判斷UARTx_SFIFO 寄存器的RXEMPT位是否為1即可。?
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
前面提到的接收多個(gè)字節(jié)進(jìn)一次中斷該如何實(shí)現(xiàn)呢。?
只需要設(shè)置一下UARTx_RWFIFO寄存器即可。?
- 1
前面還提到超時(shí)中斷,在Kinetis MCU里是叫做IDLE Line 中斷。?
只需要設(shè)置UARTx_C2的ILIE為1,使能IDLE LINE中斷。?
?
另外設(shè)置UARTx_C1的ILT位?
?
在中斷服務(wù)函數(shù)中
/* IDLE interrupt */if(UART1_S1&UART_S1_IDLE_MASK)// if IDLE Line interrupt occured{// clear interrupt flag; To clear IDLE, read UART status S1 with IDLE set and then read DUART1_S1 |= UART_S1_IDLE_MASK;Receive_data=(uint8_t)(UART1_BASE_PTR->D); printf("\r\nGo to Idle line\r\n");}- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
前面一直說(shuō)的接收過(guò)程,對(duì)于發(fā)送過(guò)程也是類似的。不用FIFO,如果使用中斷方式發(fā)送的話,那么就是一個(gè)字節(jié)發(fā)送完進(jìn)一次中斷,然后發(fā)送另外一字節(jié)數(shù)據(jù)。使用FIFO的話,每次中斷處理可以多個(gè)字節(jié)的數(shù)據(jù)。?
?
注意在中斷服務(wù)里發(fā)送的字節(jié)數(shù)并沒有限制,進(jìn)發(fā)送中斷的核心條件是?
TXWATER默認(rèn)值為0. 當(dāng)FIFO為空時(shí),即所有數(shù)據(jù)都發(fā)送出去時(shí)進(jìn)中斷。?
假設(shè)我想在每次中斷服務(wù)函數(shù)中發(fā)送4個(gè)字節(jié),程序設(shè)置如下:?
首先初始化時(shí)打開TX的FIFO功能
- 1
- 2
- 3
在中斷處理函數(shù)中
/* Tx */if((UART_InstanceTable[HW_UART0]->S1 & UART_S1_TDRE_MASK) && (UART_InstanceTable[HW_UART0]->C2 & UART_C2_TIE_MASK)){/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '1';/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '2'; /* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '3'; /* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '4';/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '5';/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '6';/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = '7';/* buffer is used */while(UART_InstanceTable[HW_UART0]->TCFIFO >= UART_GetTxFIFOSize(HW_UART0));UART_InstanceTable[HW_UART0]->D = ' ';- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
.?
.?
.?
}
在網(wǎng)上看到一篇很好的文章,下載鏈接為:http://download.csdn.net/detail/wangwenxue1989/9089861
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的UART的FIFO功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPI 接口配置
- 下一篇: FIFO and DMA