新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32中DMA實現方式

        STM32中DMA實現方式

        作者: 時間:2016-11-26 來源:網絡 收藏
          STM32系列微控制器均含有DMA和通用時鐘TIMx模塊。其低端型號中僅包含DMA1,支持7個通道;高端型號還包括DMA2,支持5個通道。它的每個通道可任意指定工作模式,如內存到內存、內存到外設或外設到內存等。當涉及到外設時,一般是由外設來觸發DMA的一次傳輸,如串口收到數據的標志位可觸發DMA。
          DMA的每次傳輸都分為4個階段:申請仲裁、地址計算、總線存取和應答。除總線存取階段,其他3個階段都只需要一個系統周期,并且不占用總線,可在DMA控制器內部并發地執行。總線存取階段,每個字(4字節)的傳輸需要3個系統周期。DMA和CPU工作在交替方式下,不會相互阻塞。DMA各個通道可獨立設置優先級,當訪問同一資源時高優先級通道先獲得資源。
          采用時鐘的4個比較/捕獲通道加DMA可以產生出4路不同頻率和占空比的方波。這里為簡化篇幅,只列出了產生一路方波的代碼。基本原理是:將時鐘的4個通道設置為反轉模式(即計數器與比較捕獲寄存器相等時,其對應的CPU引腳電平發生反轉),設置計數器為向上計數到0xFFFF的模式;然后預先計算好需要引腳反轉的時刻,并使能對應通道的DMA請求。這樣,當計數器與比較/捕獲寄存器的值相等時,由DMA將下一個需要引腳電平反轉的時刻送入到比較/捕獲寄存器。
          這里將DMA設置為從內存到外設的半字(2個字節)環形傳輸。開啟DMA全滿和半滿中斷,在中斷處理函數中不斷填充新的時刻值,即可保證產生的波形不間斷。假設存放時刻值的緩沖長度為N,則每N/2個點才中斷一次,這樣CPU就不需要頻繁進入中斷,執行效率比較高。由此也可以看出,緩沖越大,對中斷響應的實時性要求也越低,當然這時中斷的處理時間也越長。以下為示例代碼:
          需要注意的是,比較/捕獲寄存器的預加載功能必須禁止掉。我們需要的是寫入比較/捕獲寄存器的值立即與計數器相比較輸出,而無需等待一個更新事件。
          采用DMA+TIMx的方式來捕獲上升沿和下降沿時刻,有利于提高系統的實時性和執行效率。通過TIMx的捕獲功能將方波的電平跳變時刻記錄在比較/捕獲寄存器中,然后DMA將該值自動傳輸到內存,只有當DMA觸發半滿或全滿事件時CPU才需要進入中斷處理數據。通過記錄方波的上升沿和下降沿時刻,然后將兩個時刻相減,進而就能得到所有低沿和高沿的寬度,最后進行后續的分析處理。這種方式下中斷頻率僅為方波頻率的4/N(N為緩沖區大小)。
          測試中STM32系列微控制器工作在36 MHz,可產生出1路最高1.5 MHz的方波,可捕獲1 MHz的方波,而此時CPU的執行幾乎不受影響。這里采用DMA來實現方波的產生和捕獲,極大地提高了系統的實時性和執行效率,減少了中斷次數,節省了寶貴的資源。這種方案也可以用來實現高效的模擬串口。另外,若有多個DMA同時工作,應考慮最壞情況下DMA的響應時間,以避免錯誤發生。


        關鍵詞: STM32DMA實現方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 夹江县| 清远市| 拜城县| 河间市| 绥芬河市| 无棣县| 天柱县| 霍林郭勒市| 微博| 昔阳县| 壤塘县| 年辖:市辖区| 海口市| 西乌| 新巴尔虎右旗| 昔阳县| 永济市| 永宁县| 子长县| 化州市| 茂名市| 穆棱市| 皋兰县| 安乡县| 卓资县| 宣威市| 万载县| 黄龙县| 高邮市| 瓮安县| 拜泉县| 濮阳市| 凉山| 大庆市| 麻城市| 伊宁县| 成安县| 梨树县| 文成县| 宁阳县| 濉溪县|