STM32的 DMA(直接存儲器訪問) 詳解

STM32的DMA(Direct Memory Access,直接存儲器存取)是一種在單片機中用于高效實現數據傳輸的技術。它允許外設設備直接訪問RAM,不需要CPU的干預,從而釋放CPU資源,提高CPU工作效率,本文基于STM32F429、Hal庫詳細分析DMA的特性與使用。

1.DMA的特性

(1)STM32F429擁有兩個DMA控制器(DMA1和DMA2),DMA1 控制器 AHB 外設端口不連接到總線矩陣,因此,只有?DMA2 數據流能夠執行存儲器到存儲器的傳輸,外設包括片內外設和片外外設。

片內外設:例如GPIO(通用輸入輸出端口)、USART(通用同步/異步收發器)、I2C(Inter-Integrated Circuit,一種串行通信總線)、SPI(Serial Peripheral Interface,串行外設接口)等。這些外設通過DMA控制器,可以直接與內存(如SRAM、Flash等)進行數據傳輸。

片外外設:這是指通過外部接口連接到STM32芯片的設備,例如DHT11溫度傳感器、MQ2煙霧傳感器等。這些設備通過相應的接口(如ADC、SPI等)與STM32連接,然后通過DMA控制器進行數據傳輸,要確保片外外設支持DMA功能才可以用DMA傳輸數據。

存儲器到存儲器的傳輸意味著DMA控制器可以直接從一個內存區域(如RAM的一個數組或緩沖區)讀取數據,并將這些數據寫入到另一個內存區域(同樣是RAM的另一個數組或緩沖區)。這種傳輸模式在多種應用中都非常有用,比如:

  1. 數據移動:如果你需要將一段數據從一個位置移動到另一個位置,使用DMA可以節省CPU時間,因為CPU不需要參與數據的傳輸過程。

  2. 數據處理:在圖像處理、音頻處理或任何需要處理大量數據的應用中,你可能需要將數據從一個緩沖區讀取出來,進行一些處理(如濾波、FFT等),然后將結果寫回另一個緩沖區。使用DMA可以并行地進行數據的讀取和寫入,從而加速整個處理過程。

  3. 數據橋接:在某些應用中,你可能需要從一個硬件接口讀取數據,然后將其寫入到另一個硬件接口。使用DMA可以確保這兩個接口之間的數據傳輸是高效的,不會受到CPU中斷或其他任務的影響。

  4. 循環緩沖區:在處理實時數據流時,循環緩沖區是一種常見的解決方案。使用DMA可以自動地將新數據寫入循環緩沖區的末尾,并將舊數據從緩沖區的開頭移出,從而實現無縫的數據傳輸和處理。

(2)每個DMA控制器有8個數據流,每個數據流擁有8個通道,每次傳輸的數據最大為65535(如果數據單位為字,則一次可以傳輸256KB),每個通道具體是什么數據接口如下圖所示:

DMA1通道

DMA2通道

(3)DMA傳輸具有FIFO(先進先出)模式和直接模式。FIFO用于在源數據傳輸到目標地址之前臨時存放這些數據,每個數據流都有一個獨立的 4 字 FIFO,閾值級別可由軟件配置為 1/4、1/2、3/4 或滿。而直接模式在每個外設請求都立即啟動對存儲器傳輸。

(4)數據流與數據流之間的傳輸優先級通過軟件和硬件兩個方面決定。軟件上,可以通過DMA_SxCR寄存器配置數據流的優先級,總共有四個等級:非常高、高、中、低。硬件上,若兩個請求的軟件優先級相同時,仲裁器根據DMA通道的編號來決定響應順序,序號較小的數據流優先級更高,另外,DMA1擁有比DMA2更高的優先級。

(5)DMA支持源地址和目標地址的數據寬度可以不同,如源數據是源源不斷的字節數據,而目標地址要求輸出字寬度的數據。源傳輸和目標傳輸在整個 4 GB 區域(地址在 0x0000 0000 和 0xFFFF FFFF 之間)都可以尋址外設和存儲器。

(6)DMA擁有5個中斷,分別是:半傳輸、傳輸完成、傳輸錯誤、FIFO 上溢/下溢、直接模式錯誤。

2.DMA的使用

下面我們將一些數據通過DMA2的UART1輸出出來:

(1)使能DMA時鐘

?__HAL_RCC_DMA2_CLK_ENABLE();//DMA2時鐘使能?? ?

(2)?初始化DMA通道,配置通道,外設和內存地址,傳輸數據量等

__HAL_LINKDMA(&UART1_Handler,hdmatx,UART1TxDMA_Handler);    //將DMA與USART1聯系起來(發送DMA)//Tx DMA配置UART1TxDMA_Handler.Instance=DMA2_Stream7;                            //數據流選擇DMA2控制器的數據流7UART1TxDMA_Handler.Init.Channel=DMA_CHANNEL_4;                       //通道選擇4UART1TxDMA_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存儲器到外設UART1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外設非增量模式UART1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存儲器增量模式UART1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外設數據長度:8位UART1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存儲器數據長度:8位UART1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //外設普通模式UART1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等優先級UART1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              UART1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      UART1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存儲器突發單次傳輸UART1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外設突發單次傳輸HAL_DMA_DeInit(&UART1TxDMA_Handler);   HAL_DMA_Init(&UART1TxDMA_Handler);

(3)開啟DMA通道傳輸

 MYDMA_USART_Transmit(&UART1_Handler,(u8*)SendBuff,SEND_BUF_SIZE); //啟動傳輸    

(4)?查詢DMA通道狀態,傳輸結束后關閉串口DMA

while(1){if(__HAL_DMA_GET_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7))//等待DMA2_Steam7傳輸完成{__HAL_DMA_CLEAR_FLAG(&UART1TxDMA_Handler,DMA_FLAG_TCIF3_7);//清除DMA2_Steam7傳輸完成標志HAL_UART_DMAStop(&UART1_Handler);      //傳輸完成以后關閉串口DMAbreak; }delayms(10);
}                

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/43542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/43542.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/43542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[極客大挑戰 2019]RCE ME

[極客大挑戰 2019]RCE ME <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_f…

(附源碼)c#+winform實現遠程開機(廣域網可用)

實現邏輯 利用UDP協議發送特定格式的魔術包&#xff0c;以遠程喚醒具有特定MAC地址的目標計算機。目標計算機的BIOS和網絡配置需要支持Wake-on-LAN&#xff08;WOL&#xff09;功能&#xff0c;并且需要在目標計算機上配置正確的網絡喚醒設置。 源碼在最后 準備工作 進入Bio…

力學有限元的基石:虛功原理的推導

推導虛功方程的過程 彈性力學的平衡方程 在張量形式中&#xff0c;平衡方程為&#xff1a; ? ? σ b 0 \nabla \cdot \sigma b 0 ??σb0 用下標表示為&#xff1a; ? σ i j ? x j b i 0 \frac{\partial \sigma_{ij}}{\partial x_j} b_i 0 ?xj??σij??b…

知識圖譜入門筆記

自學參考&#xff1a; 視頻&#xff1a;斯坦福CS520 | 知識圖譜 最全知識圖譜綜述 詳解知識圖譜的構建全流程 知識圖譜構建&#xff08;概念&#xff0c;工具&#xff0c;實例調研&#xff09; 一、基本概念 知識圖譜&#xff08;Knowledge graph&#xff09;&#xff1a;由結…

Redis管理禁用命令

在redis數據量比較大時&#xff0c;執行 keys * &#xff0c;fluashdb 這些命令&#xff0c;會導致redis長時間阻塞&#xff0c;大量請求被阻塞&#xff0c;cpu飆升&#xff0c;嚴重可能導致redis宕機&#xff0c;數據庫雪崩。所以一些命令在生產環境禁止使用。 Redis 禁用命令…

【C語言】指針(3):探索-不同類型指針變量

目錄 一、字符指針變量 二、數組指針變量 三、二維數組傳參的本質 四、函數指針變量 4.1 函數指針變量 4.2 函數指針變量的使用 4.3 函數指針變量的拓展 五、函數指針數組 六、轉移表的應用 通過深入理解指針&#xff08;1&#xff09;和深入理解指針&#xff08;2&am…

67.SAP FICO-憑證類型學習

目錄 SAP憑證類型 憑證類型的作用 - OBA7 SAP默認的憑證類型更改 FI相應事務代碼默認憑證類型 - OBU1 對FB50、60、70默認憑證類型的更改 - OBZO 后勤貨物移動默認憑證類型 - OMBA 發貨憑證類型 收貨憑證類型 自動移動憑證類型 存貨盤點憑證類型 發票默認的憑證類…

深度學習Day-24:ResNeXt-50算法思考

&#x1f368; 本文為&#xff1a;[&#x1f517;365天深度學習訓練營] 中的學習記錄博客 &#x1f356; 原作者&#xff1a;[K同學啊 | 接輔導、項目定制] 要求&#xff1a; 閱讀給出代碼&#xff0c;判斷是否存在錯誤&#xff0c;正確與否都請給出你的思考&#xff1b;查找…

如何減少開發過程中的bug-數據庫篇

1.1慢查詢 1.1.1 是否命中索引 提起慢查詢&#xff0c;我們馬上就會想到加索引。如果一條SQL沒加索引&#xff0c;或者沒有命中索引的話&#xff0c;就會產生慢查詢。 索引哪些情況會失效&#xff1f; 查詢條件包含or&#xff0c;可能導致索引失效 如果字段類型是字符串&am…

LeetCode 0724.尋找數組的中心下標:前綴和(時空復雜度O(n)+O(1))

title: 724.尋找數組的中心下標 date: 2024-07-08 13:22:58 tags: [題解, LeetCode, 簡單, 數組, 前綴和] 【LetMeFly】724.尋找數組的中心下標&#xff1a;前綴和&#xff08;時空復雜度O(n)O(1)&#xff09; 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/find-pi…

數據結構--二叉樹相關習題5(判斷二叉樹是否是完全二叉樹 )

1.判斷二叉樹是否是完全二叉樹 辨別&#xff1a; 不能使用遞歸或者算節點個數和高度來判斷。 滿二叉樹可以用高度和節點來判斷&#xff0c;因為是完整的。 但是完全二叉樹前面是滿的&#xff0c;但是最后一層是從左到右連續這種 如果仍然用這種方法的話&#xff0c;如下圖…

暑期備考2024小學生古詩文大會:吃透真題和知識點(持續)

2024年上海市小學生古詩文大會的自由報名初賽將于10月19日&#xff08;星期六&#xff09;正式開始&#xff0c;還有3個多月的時間。 為幫助孩子們備考&#xff0c;我持續分享往年上海小學生古詩文大會真題&#xff0c;這些題目來自我去重、合并后的1700在線題庫&#xff0c;每…

加密與安全_密鑰體系的三個核心目標之完整性解決方案

文章目錄 Pre機密性完整性1. 哈希函數&#xff08;Hash Function&#xff09;定義特征常見算法應用散列函數常用場景散列函數無法解決的問題 2. 消息認證碼&#xff08;MAC&#xff09;概述定義常見算法工作原理如何使用 MACMAC 的問題 不可否認性數字簽名&#xff08;Digital …

SketchUp Pro 2024:現代科技之詩意體驗

在那遙遠的唐朝&#xff0c;李白曾以詩酒為伴&#xff0c;游歷山川&#xff0c;揮灑才情。而今&#xff0c;若李白穿越時空&#xff0c;手握現代科技之利器——SketchUp Pro 2024&#xff0c;定會以詩意之筆&#xff0c;描繪這款軟件的神奇與魅力。 初識SketchUp Pro 2024 初…

Vue Router:History 模式 vs. Hash 模式

在開發 SPA&#xff08;單頁應用程序&#xff09;時&#xff0c;路由管理是不可或缺的一部分。Vue.js 框架中的 Vue Router 提供了兩種主要的路由模式&#xff1a;History 模式和 Hash 模式。理解這兩種模式的區別及其實現方式&#xff0c;對于開發和部署 Vue 應用至關重要。 …

k8s record 20240708

一、PaaS 云平臺 web界面 資源利用查看 Rancher 5臺 CPU 4核 Mem 4g 100g的機器 映射的目錄是指docker重啟后&#xff0c;數據還在 Rancher可以創建集群也可以托管已有集群 先docker 部署 Rancher&#xff0c;然后通過 Rancher 部署 k8s 想使用 kubectl 還要yum install 安…

如何分析前后端bug?

如何分析前后端bug&#xff0c;我來支你1??招 &#x1f4dd;一般通過查看接口的方式分析前后端bug。 . 【方法】&#xff1a; web項目&#xff0c;用瀏覽器自帶的F12抓包看接口請求。 app客戶端&#xff0c;一般用fiddler等工具進行抓包接口。 . ?用經典的電商項目舉例&…

應用軟件受到網絡攻擊怎么辦?

大家都知道在目前的互聯網社會中&#xff0c;大型的網絡游戲與電商網站企業是網絡攻擊的重要對象&#xff0c;同時軟件應用也無法避免地會受到各種網絡攻擊&#xff0c;那么當我們的軟件應用被攻擊時&#xff0c;該怎么辦呢&#xff1f; 首先我們可以使用高防CDN&#xff0c;安…

2. 年齡問題

年齡問題 題目描述 本題為填空題&#xff0c;只需要算出結果后&#xff0c;在代碼中使用輸出語句將所填結果輸出即可。 S 夫人一向很神秘。這會兒有人問起她的年齡&#xff0c;她想了想說&#xff1a; "2020 年前&#xff0c;我丈夫的年齡剛好是我的 22 倍&#xff0c;…

ATA-8035射頻功率放大器在聲動力療法中的應用

聲動力療法是一種基于聲波能量的治療方法&#xff0c;廣泛應用于醫療和美容領域。它利用高強度聚焦的聲波來實現切割、破碎或加熱組織&#xff0c;以治療各種疾病和美容問題。在聲動力療法中&#xff0c;射頻功率放大器起著至關重要的作用&#xff0c;它負責提供足夠的能量來激…