概 述
2023年3月底,先楫半導體官方發布了新的hpm_sdk版本,相比上一次發布的版本,串口外設多了一個uart_hardware_rx_idle的sample。目前,這個硬件的空閑中斷僅適用于HPM6200系列產品,而HPM6750/6400/6300系列的MCU只能使用 uart_software_rx_idle 通過軟件利用額外的定時器實現空閑中斷機制。
首先,我們簡單介紹一下以上4個串口相關的sample:
(1) uart_dma:此demo 的串口均使用DMA掌管進行收發,判斷收發完成只需要一次DMA傳輸完成中斷,但只能定長收發,適用于固定長度的收發場景。此demo適用于先楫半導體所有MCU系列產品。
(2) uart_hardware_rx_idle:此demo 使用硬件空閑機制和DMA接收進行接收不定長。適合接收不定長數據的場景,但此demo僅適用先楫半導體HPM6200系列MCU產品。
(3)uart_irq:此demo 的串口均使用中斷來進行收發,可適用于任何應用場景。中斷進行接收帶來的一個問題就是每接收一個字節就會進入一次中斷,在數據量稍大的場景下會比較耗費中斷次數。此demo適用于先楫半導體所有MCU系列產品。
(4)uart_software_rx_idle:此demo需要定時器的兩個通道,并且互聯到一個IO,這個IO需要接到串口的RX引腳。一個通道作為捕獲RX引腳下降沿以此判斷開始接收,另一個通道作為同步輸入SYNC(觸發會重置計數器)以此來判斷接收完成。利用定時器來實現空閑機制實現接收不定長數據。在資源利用不緊張的情況下可以選擇使用此demo,因為每個串口都需要定時器的兩個通道作為輔助外設。此demo適用于先楫半導體所有MCU系列產品。
對于某些應用場合,比如接收不定長數據,有硬件空閑中斷的支持,可以再配合DMA,用最小的中斷損耗(只需要一次中斷)以及最少的外設輔助(不需要定時器查詢)實現接收不定長數據。
本文將探討一種利用串口FIFO接收超時機制而不依賴額外定時器在HPM6700/6400/6300 產品系列上實現串口不定長數據接收。
實現方案
先楫半導體 HPM6700/6400/6300 產品系列串口特性如下:
先楫半導體所有產品系列的串口 FIFO都支持閾值觸發中斷,也就是FIFO存儲到多少個字節認為一次有效數據進而觸發中斷。這樣可以大大減少觸發中斷的次數,有了FIFO閾值中斷,就可以在進入中斷后,一次性把FIFO的所有數據取出來。
開發者可以在SDK中找到詳細描述閾值范圍的內容:
接收觸發閾值為 0 (uart_rx_fifo_trg_not_empty):代表RX FIFO不為空就一次觸發中斷。
接收觸發閾值為 1 (uart_rx_fifo_trg_gt_one_quarter):代表RX FIFO接收到超過FIFO的四分之一就觸發一次中斷。
接收觸發閾值為 2 (uart_rx_fifo_trg_gt_half):代表RX FIFO接收到超過FIFO的一半就觸發一次中斷。
接收觸發閾值為 3 (uart_rx_fifo_trg_gt_three_quarters):代表RX FIFO接收到超過FIFO的四分之三就觸發一次中斷。
有了FIFO閾值設置,先楫半導體MCU產品的串口還具備了FIFO timeout 的中斷。
? ? ?
產生中斷需要同時具備以下條件:
① 需要使能FIFO;
② RXFIFO里面需要存在至少一個字符;
③ RXFIFO在四個字符的時間再也沒有收到新的字符。
結合以上特點可知,當接收閾值產生中斷的時候,系統能夠把接收到的數據從FIFO提取出來;當FIFO timeout中斷觸發時,系統能夠在最后把接收的數據從FIFO提取出來。通過這種方式來實現一幀不定長數據的接收。
此外,開發者可以結合以下特征以及自己的應用開發需求來決定是否采用此方案:
相比單個字節接收,接收中斷次數能減少10倍以上。比如接收1000個字節,單個字節接收需要進入1000次中斷,而使用rx fifo閾值+fifo超時機制,只需要進入77次,相比減少12倍以上中斷次數。
接收閾值中斷和超時中斷是一起使能觸發的。
使用這種方式的話,接收無法配合DMA,但是發送可以使用DMA。
超時條件是四個字符時間。也就是在四個字符時間沒收到新數據,則判斷超時。
方案驗證
結合以上的論述,我們開發一個sample進行驗證。接收使用RX FIFO 和 FIFO timeout方式,發送則使用DMA。使用100到1000字節隨機幾組進行驗證接收的中斷次數。
對于RX FIFO 和 FIFO timeout方式,代碼配置如下:
中斷進行提取FIFO的數據:
實驗現象
通過本次實驗結果可見相對于中斷方式接收,采用本文提到的方案可以顯著減少中斷次數。本法在進行不定長大數據量傳輸的場景下尤為有利,假設接收1000個字節,單個字節中斷需要產生1000次中斷,而本文提到的方案在不使用其他額外定時器的條件下,只需要77次中斷就可完成傳輸。
以上是針對先楫半導體HPM6700/6400/6300這三個系列的MCU產品操作串口外設的一種方式的介紹。在實際操作過程中,希望能帶給各位開發者一點啟發。
如果大家在開發過程中還有其他的思路或建議,歡迎到官方網站的 “先楫社區”發貼討論,MCU生態建設需要各位的積極參與,感謝您的信任與支持!
審核編輯:湯梓紅
-
定時器
+關注
關注
23文章
3248瀏覽量
114792 -
串口
+關注
關注
14文章
1554瀏覽量
76512 -
引腳
+關注
關注
16文章
1196瀏覽量
50476 -
dma
+關注
關注
3文章
561瀏覽量
100584 -
先楫半導體
+關注
關注
10文章
214瀏覽量
2120
原文標題:再談 HPM6700/6400/6300 產品系列串口接收不定長數據的方式
文章出處:【微信號:HPMicro,微信公眾號:先楫半導體HPMicro】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論