博客專欄

        EEPW首頁 > 博客 > 高效,可靠,安全的串口通訊開源方案

        高效,可靠,安全的串口通訊開源方案

        發(fā)布人:xiaomaidashu 時間:2022-06-22 來源:工程師 發(fā)布文章

        大家好,我是小麥。

        在嵌入式開發(fā)中,經常會用到串口通訊。面對不同應用場景,需要不同的方案。

        今天我們來講一下高效,可靠,安全的方案,記得看到最后,會有收獲。

        常見的有串口輪詢模式,串口中斷模式,串口DMA接收傳輸等等;

        利用串口的空閑中斷配合DMA的環(huán)形緩沖區(qū)模式,可以高效接收不固定長度的消息報文

        下圖中經過黃色的高電平時間空閑之后,就會產生一個空閑事件,IDLE EVENT

        圖片

        空閑信號

        因為DMA功能有HC和TC中斷;

        • HC  (Harf Complete)DMA傳輸一半成功標志;
        • TC   (Total Complete)  DMA傳輸完成成功標志;

        舉個例子;

        如下圖所示,這里分配了一個DMA緩沖區(qū),大小是12字節(jié),如果從地址1開始接收,會出現以下這兩種情況;

        • DMA接收到第6個字節(jié)的時候,會觸發(fā)HC事件;
        • DMA接收到第12個字節(jié)的時候,會觸發(fā)TC事件;

        圖片HC TC

        這個思路其實我之前也有實踐過,但是沒有很好地利用HC和TC事件。

        所以無法處理這種情況,即DMA緩沖區(qū)處于環(huán)形模式(Circular)的時候,數據覆蓋的問題,最近看到了一個非常棒的開源項目,這里的思路非常不錯,下面會詳細介紹。

        下面是DMA HC/DMA TC/Idle組合進行串口接收的細節(jié),如下圖所示;

        圖片來自原項目

        再次簡單介紹一下縮略詞的含義;

        • R 讀取;
        • W 寫入;
        • I 空閑信號;
        • HT Half-Transfer complete DMA緩沖區(qū)半傳輸完成;
        • TC Transfer-Complete DMA緩沖區(qū)全部接收完成;

        這里簡單介紹一下情況E的解決方案,上面圖片最右邊小圖;

        • 緩沖區(qū)大小20格,這里假設20字節(jié),情況E需要接收30個字節(jié),也就是說,10字節(jié)可能會被覆蓋;

        • 經過前面的四次接收后,串口繼續(xù)從字母R處接收數據至DMA緩沖區(qū);

        • 接收4字節(jié)時,會觸發(fā)TC事件,這時候可以將4字節(jié)數據處理;

          圖片第一步
        • 因為是環(huán)形模式,所以回到第一個字節(jié)處,繼續(xù)接收10字節(jié),觸發(fā)HT事件,這時候可以處理10字節(jié)數據;

          圖片第二步
        • 第三步,繼續(xù)接收10字節(jié),觸發(fā)TC事件,其中,已經有4字節(jié)被覆蓋(下圖橙色所示),因為之前這部分數據已經處理了,所以,即使覆蓋也不影響;

          圖片第三步
        • 第四步,上述已經接收了24個字節(jié),所以還有6個字節(jié)沒有接收,后面接收會產生空閑信號,并對之前的數據區(qū)域進行覆蓋,如下圖示所示;圖片

        所以,不難發(fā)現,如果只使用空閑中斷,如果需要接收的數據長度大于緩沖區(qū),就會出現數據覆蓋的情況,而加上DMA的HT和TC中斷,就完美解決了這樣的問題;

        當然除了這些,還有很多優(yōu)秀的方案,這個項目提供大量的例子。

        項目地址:https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

        圖片項目主頁

        目前這個項目主要支持主流的STM32芯片平臺和一些開發(fā)板上的測試DEMO,具體如下所示;

        圖片支持平臺

        相應的例子程序如下所示,除了裸機程序,還有環(huán)形緩沖區(qū)接收,輪詢接收,DMA+空閑中斷基于RTOS的模式接收,挺豐富的,可以參考一下;

        圖片例子程序

        作者在 STM32F413-Nucleo 開發(fā)板進行程序的測試,發(fā)現優(yōu)化效果很不錯;

        在115200的串口波特率下,每秒發(fā)送1581個字節(jié),大約142ms;

        • 不使用DMA,CPU負載14%;
        • 使用DMA,CPU負載0%;

        最后,這個項目目前是基于STM32CubeIDE創(chuàng)建的,記得搭建一下環(huán)境。如果無法下載,公眾號后臺回復【高效串口】獲取項目代碼。

        Enjoy  : )


        *博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。

        電子鎮(zhèn)流器相關文章:電子鎮(zhèn)流器工作原理


        電子鎮(zhèn)流器相關文章:


        調光開關相關文章:
        調光開關原理



        關鍵詞: 串口通訊

        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 彭泽县| 临沭县| 财经| 若尔盖县| 青神县| 海门市| 万宁市| 门源| 通辽市| 虞城县| 惠州市| 富宁县| 正安县| 河池市| 濮阳县| 慈溪市| 平阳县| 乌海市| 永平县| 龙川县| 上栗县| 绥滨县| 司法| 新丰县| 海盐县| 马龙县| 上林县| 奉化市| 蒙自县| 宣化县| 进贤县| 富民县| 甘南县| 淮阳县| 雅江县| 同仁县| 宜丰县| 社旗县| 封丘县| 唐河县| 湖口县|