日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

UART的FIFO功能

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UART的FIFO功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

UART的FIFO功能

2015年09月08日 18:21:23

閱讀數:5464

經常聽到UART的FIFO功能,但是從來沒有真正使用過和認真思考過它的作用。正好有客戶用到這個功能,在這里做個總結。?
FIFO 是“First-In First-Out”的縮寫,它是一個具有先入先出特點的緩沖區。串口設計FIFO的目的是為了提高串口的通訊性能。如果沒有FIFO或者說緩沖區的長度只有1字節,那么使用接收中斷,就意味著每次收到一個字節的數據就要進一次中斷,這樣頻繁進中斷會占用CPU資源。另外如果沒有及時讀走數據,那么下一個字節數據就會覆蓋之前的數據,導致數據丟失,這在通訊速率高的場合很有可能出現。?
使用FIFO,可以在連續接收若干個數據后才產生一次中斷,然后一起進行處理。這樣可以提高接收效率,避免頻繁進中斷,適用于大數據傳輸。你可能會想到如果FIFO中的數據沒有達到指定長度而無法產生中斷怎么辦,通常MCU會有接收超時中斷,即在一定的時間內沒有接收到數據會進入中斷,可以利用這個中斷把不足FIFO長度的數據最后都讀取完。?
?
但是使用FIFO接收多字節數據進中斷不好的地方是實時性會受到一定的影響,對某些實時性要求高的場合,比如說要求UART收到某個特定字符就立刻停止發送數據這樣一個場合,使用FIFO每多個字節進一次中斷就不合適了。?
所以說使用FIFO好處是1)避免頻繁進中斷,提高吞吐率 2)避免數據因沒有及時處理而丟失。不好的地方是實時性受影響。?
此客戶要求使用FIFO的原因是他們擔心在接收中斷處理過程中數據來的太快沒有及時處理而丟失。?
針對這個問題采取的解決方法是:還是一個字節進一次接收中斷,這樣可以保證實時性,把FIFO打開,這樣可以防止數據被覆蓋而丟失,在接收中斷處理完接收數據之后去判斷緩沖區中是否有數據,如果有的話把數據讀走,這樣就防止了數據丟失,同時保證了實時性。?
對于Kinetis M4 MCU操作也非常簡單。?
以K60為例,UART0和UART1緩沖區長度為8,其他UART緩沖區長度為1.?
?
只要配置UARTx_PFIFO寄存器即可。?
?
軟件上是:

UART_EnableRxFIFO(UART_InitStruct->instance, true); UART_FlushRxFifo(UART_InitStruct->instance); UART_FlushTxFifo(UART_InitStruct->instance);
  • 1
  • 2
  • 3

需要注意的是:配置此寄存器 C2[RE] 和C2[TE] 位為0,另外在設置完RXFE位之后,應立刻向UARTx_CFIFO的TXFLUSH和RXFLUSH位寫1.

這樣配置完之后就打開了接收FIFO功能。在中斷處理函數中,最后去判斷UARTx_SFIFO 寄存器的RXEMPT位是否為1即可。?

while(!((UART_InstanceTable[HW_UART0]->SFIFO \& UART_SFIFO_RXEMPT_MASK) >> UART_SFIFO_RXEMPT_SHIFT)){ch = (uint8_t)UART_InstanceTable[HW_UART0]->D;...}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

前面提到的接收多個字節進一次中斷該如何實現呢。?
只需要設置一下UARTx_RWFIFO寄存器即可。?

UART_SetRxFIFOWatermark(UART_InitStruct->instance, 0x4); // 每4個字節進一次中斷
  • 1

前面還提到超時中斷,在Kinetis MCU里是叫做IDLE Line 中斷。?
只需要設置UARTx_C2的ILIE為1,使能IDLE LINE中斷。?
?
另外設置UARTx_C1的ILT位?
?

在中斷服務函數中

/* 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

前面一直說的接收過程,對于發送過程也是類似的。不用FIFO,如果使用中斷方式發送的話,那么就是一個字節發送完進一次中斷,然后發送另外一字節數據。使用FIFO的話,每次中斷處理可以多個字節的數據。?
?
注意在中斷服務里發送的字節數并沒有限制,進發送中斷的核心條件是?

TXWATER默認值為0. 當FIFO為空時,即所有數據都發送出去時進中斷。?
假設我想在每次中斷服務函數中發送4個字節,程序設置如下:?
首先初始化時打開TX的FIFO功能

UART_EnableTxFIFO(UART_InitStruct->instance, true); UART_FlushRxFifo(UART_InitStruct->instance); UART_FlushTxFifo(UART_InitStruct->instance);
  • 1
  • 2
  • 3

在中斷處理函數中

/* 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

.?
.?
.?
}

在網上看到一篇很好的文章,下載鏈接為:http://download.csdn.net/detail/wangwenxue1989/9089861

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的UART的FIFO功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91看片免费看 | 99久久婷婷国产综合精品青牛牛 | av网站久久 | 黑人和白人做爰 | 久久爱一区 | 综合久 | 亚洲国产精品电影 | 污网在线观看 | 蘑菇福利视频一区播放 | 国产91沙发系列 | 老司机深夜免费福利 | 国产精品日 | 三级黄色免费 | 日韩成人激情视频 | 无码人妻一区二区三区在线视频 | 可以看的av网站 | 男男啪啪网站 | 日韩人妻一区二区三区蜜桃视频 | 黑人100部av解禁片 | 手机看片欧美日韩 | 日本特黄色片 | 亚洲av无码一区二区三区网站 | 美日韩久久 | 67194在线免费观看 | 黄色xxxx| 免费黄色美女网站 | 桃色激情网 | 欧美精品一级二级三级 | 91精品国产综合久久久久久久 | 风韵丰满熟妇啪啪区老熟熟女 | 午夜精品极品粉嫩国产尤物 | 亚洲激情视频一区 | 狠狠躁夜夜躁人人爽视频 | 欧洲精品码一区二区三区免费看 | 亚洲理论片在线观看 | 一区二区三区激情视频 | 国产不卡一区 | 把高贵美妇调教成玩物 | 免费网站污 | 精品美女在线 | 午夜免费福利小电影 | 亚洲一区动漫 | 男人天堂国产 | 久久99精品国产麻豆婷婷洗澡 | 一级片在线免费播放 | 成人深夜网站 | 国产无码精品一区二区 | 亚洲性大片 | 特黄一级大片 | 操极品 | 国产黄色网络 | 欧美日韩一级二级三级 | 成人在线超碰 | 中文字幕观看在线 | 国产一级片中文字幕 | 老司机午夜免费福利 | 成人污在线 | 亚洲欧美日本在线 | 国产乱码一区二区三区在线观看 | 久色精品| 国产欧美精品在线 | 一区二区三区午夜 | 婷婷久久网 | 天天综合永久入口 | 中文字幕 国产 | 亚洲午夜视频在线观看 | 亚洲精品污一区二区三区 | 日本一区二区三区免费看 | 蜜臀视频在线播放 | 中国黄色三级视频 | 91禁看片 | 女人床技48动态图 | 99操| 在线日韩 | 日产久久视频 | 国产91白丝在一线播放 | 国产福利社| 青青草原国产在线 | 国产一区二区福利 | 日韩美在线 | 亚洲欧美经典 | 日韩国产欧美视频 | 国产成人精品123区免费视频 | 产乳奶汁h文1v1 | 日韩精品中文字幕在线播放 | 蜜臀在线一区二区三区 | 超碰人人插 | av成人免费在线 | 国产字幕侵犯亲女 | 激情久久视频 | 日韩激情av在线 | 黄色免费网 | 精品少妇久久久久久888优播 | 一区二区三区免费看 | 韩国一级一片高清免费观看 | 免费无码肉片在线观看 | 国产精品丝袜黑色高跟鞋 | 伊人快播 | 91精产国品一二三区在线观看 |