日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

一份開源的單片機(jī)串口高效通訊方案

 新用戶0118F7lQ 2022-05-24 發(fā)布于山東

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

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

常見的有串口輪詢模式,串口中斷模式,串口DMA接收傳輸?shù)鹊龋?/p>

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

下圖中經(jīng)過黃色的高電平時間空閑之后,就會產(chǎn)生一個空閑事件,IDLE EVENT

圖片
空閑信號

因為DMA功能有HCTC中斷;

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

舉個例子;

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

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

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

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

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

圖片
來自原項目

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

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

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

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

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

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

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

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

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

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

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

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

圖片
項目主頁

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

圖片
支持平臺

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

圖片
例子程序

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

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

  • 不使用DMA,CPU負(fù)載14%;
  • 使用DMA,CPU負(fù)載0%;

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多