• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

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

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

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

    大家好,我是小麥。

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

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

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

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

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

    圖片

    空閑信號

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

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

    舉個例子;

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

    • DMA接收到第6個字節的時候,會觸發HC事件;
    • DMA接收到第12個字節的時候,會觸發TC事件;

    圖片HC TC

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

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

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

    圖片來自原項目

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

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

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

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

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

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

      圖片第一步
    • 因為是環形模式,所以回到第一個字節處,繼續接收10字節,觸發HT事件,這時候可以處理10字節數據;

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

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

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

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

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

    圖片項目主頁

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

    圖片支持平臺

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

    圖片例子程序

    作者在 STM32F413-Nucleo 開發板進行程序的測試,發現優化效果很不錯;

    在115200的串口波特率下,每秒發送1581個字節,大約142ms;

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

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

    Enjoy  : )


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

    電子鎮流器相關文章:電子鎮流器工作原理


    電子鎮流器相關文章:


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



    關鍵詞: 串口通訊

    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 南投县| 达州市| 宁河县| 龙陵县| 木里| 石狮市| 肇东市| 菏泽市| 四川省| 福建省| 普宁市| 泗阳县| 福鼎市| 红安县| 武平县| 定远县| 类乌齐县| 聊城市| 东海县| 申扎县| 会宁县| 巨野县| 松江区| 阿拉善左旗| 门头沟区| 合肥市| 文成县| 抚松县| 武义县| 宁陕县| 岗巴县| 怀宁县| 玉树县| 确山县| 扶风县| 安阳市| 乡城县| 堆龙德庆县| 东兴市| 南充市| 湘乡市|