20、DMA----釋放CPU壓力,加快傳輸

1、DMA介紹

DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬件為RAM與I/O設備開辟一條直接傳送數據的通路,能使CPU的效率大為提高。

STM32F103內部有2個DMA控制器(DMA2僅存大容量產品中),DMA1有7個通道,DMA2有5個通道。每個通道專門用來管理來自于一個或多個外設對存儲器訪問的請求,一個仲裁器來協調各個DMA請求的優先權。

DMA有以下特性

  • 每個通道都直接連接專用的硬件DMA請求,每個通道都支持軟件觸發。通過軟件來配置。
  • 優先權可以通過軟件編程設置,有四個等級:很高、高、中、低,優先權相同時由硬件決定。
  • 獨立源和目標數據區的傳輸寬度,可以根據字節、半字、全字,模擬打包和拆包過程。源和目標地址必須按照數據傳輸寬度對齊。
  • 支持循環的緩沖器管理。
  • 每個通道有3個事件標志:DMA半傳輸、DMA傳輸完成、DMA傳輸出錯,3個事件標志邏輯或成為一個獨立中斷請求。
  • 存儲器和存儲器間的傳輸。
  • 外設和存儲器,存儲器和外設的傳輸。
  • 閃存、SRAM、外設SRAM、APB1、APB2、AHB外設都可以作為訪問的源和目標。
  • 最大傳輸數目:65536

1.1、DMA框圖

STM32F103ZET6有兩個DMA控制器,DMA1和DMA2。

  • ①DMA請求: 外設想要通過DMA來傳輸數據,必須先給DMA控制器發送DMA請求,DMA收到請求信號后,控制器會給外設一個應答信號,當外設應答后且DMA控制器收到應答信號后,就會啟動DMA傳輸,直到傳輸完畢。
  • ②通道:DMA具有12個獨立可編程的通道,其中DMA1有7個通道,DMA2有5個通道,每個通道對應不同的外設的DMA請求。雖然每個通道可以接收多個外設的請求,但是同一時間只能接收一個,不能同時接收多個。
  • ③仲裁器:當發生多個DMA通道請求時,就會由仲裁器管理,仲裁器管理DMA通道請求分為兩個階段。第一階段屬于軟件階段,可以在DMA_CCRx寄存器中設置,有4個等級:非常高,高,中和低四個優先級。第二階段屬于硬件階段,兩個或以上的DMA通道請求設置的優先級一樣,則他們優先級取決于通道編號,編號越低優先權越高,比如通道0高于通道1。DMA1控制器擁有高于DMA2控制器的優先級。

1.2、DMA請求映射表

2、DMA函數

DMA_HandleTypeDef結構體類型指針變量:

typedef struct __DMA_HandleTypeDef
{void                                *Instance;      /* 寄存器基地址 */DMA_InitTypeDef                     Init;           /* DAM 通信參數 */HAL_LockTypeDef                     Lock;           /* DMA 鎖對象 */ __IO HAL_DMA_StateTypeDef           State;          /* DMA 傳輸狀態 */ void                                *Parent;        /* 父對象狀態,HAL庫處理的中間變量 */ void(*XferCpltCallback)( struct __DMA_HandleTypeDef *hdma);    /*DMA傳輸完成回調*/ void(* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA一半傳輸完成回調 */void(* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma); /* DMA傳輸完整的Memory1回調 */void(* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA傳輸半完全內存回調 */void(* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);/*DMA傳輸錯誤回調*/void(* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);/* DMA傳輸中止回調 */__IO uint32_t                       ErrorCode;              /* DMA存取錯誤代碼 */DMA_TypeDef                         *DmaBaseAddress;        /* DMA通道基地址 */uint32_t                            ChannelIndex;           /* DMA通道索引 */ 
}DMA_HandleTypeDef;

  • Instance:是用來設置寄存器基地址,如果設置的對象是串口1的發送,串口1的DMA傳輸需要用到的是DMA1的通道4,即DMA1_Channel4。
  • Parent:是HAL庫處理中間變量,用來指向DMA通道外設句柄。
  • XferCpltCallback:傳輸完成回調函數入口地址
  • XferHalfCpltCallback:半傳輸完成回調函數入口地址
  • XferM1CpltCallback:Memory1傳輸完成回調函數入口地址
  • XferErrorCallback:傳輸錯誤回調函數入口地址
  • Init:它是DMA_InitTypeDef結構體類型變量
typedef struct 
{    uint32_t Direction;               /* 傳輸方向,例如存儲器到外設DMA_MEMORY_TO_PERIPH */  uint32_t PeriphInc;               /* 外設(非)增量模式,非增量模式DMA_PINC_DISABLE */   uint32_t MemInc;                  /* 存儲器(非)增量模式,增量模式DMA_MINC_ENABLE */   uint32_t PeriphDataAlignment;     /* 外設數據大小:8/16/32位 */ uint32_t MemDataAlignment;        /* 存儲器數據大小:8/16/32位 */ uint32_t Mode;                    /* 模式:循環模式/普通模式 */     uint32_t Priority;                /* DMA優先級:低/中/高/非常高 */  
}DMA_InitTypeDef;
  • HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);DMA的初始化函數
  • __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1時鐘使能 */ __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2時鐘使能 */
  • __HAL_LINKDMA(&g_uart1_handler, hdmatx, g_dma_handle);連接DMA和外設句柄。
  • 外設的DMA發送、啟動傳輸函數。
  • __HAL_DMA_GET_FLAG(&g_dma_handle, DMA_FLAG_TC4);查詢DMA傳輸通道的狀態
  • __HAL_DMA_GET_COUNTER(&g_dma_handle);獲取當前傳輸剩余數據量
  • __HAL_DMA_SET_COUNTER (&g_dma_handle, 1000);設置對應的DMA數據流傳輸的數據量大小
  • DMA中斷函數
    • DMA中斷對于每個通道都有一個中斷服務函數
    • HAL庫提供了通用DMA中斷處理函數HAL_DMA_IRQHandler, 在該函數內部,會對DMA傳輸狀態進行分析,然后調用相應的中斷處理回調函數:
      • 發送完成回調函數
      • 發送一般回調函數
      • 接收完成回調函數
      • 接收一半回調函數
      • 傳輸錯誤回調函數

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

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

相關文章

深入OpenHarmony OTA硬核升級

技術背景 OpenHarmony OTA(Over-The-Air)升級子系統為設備提供了遠程升級能力,通過統一的升級接口屏蔽底層芯片差異,支持輕量系統、小型系統和標準系統的全量升級、差分升級和變分區升級。 核心特性 跨系統支持:覆蓋輕量系統(Hi3861)、小型系統(Hi3516DV300)、標準系…

華為iVS1800接入SVMSPro平臺

華為iVS1800接入SVMSPro平臺 ** 華為好望Huawei HolosensIVS1800智能視頻云平臺采用首款昇騰310加持的嵌入式系統智能微邊緣,獨俱普惠AI鴻力。一臺融合存儲、計算、檢索功能,滿足小型園區、社區、銀行網點、超市等場景安防需求,小機大智。 …

《異形戰機2》v2.0.4數字豪華版,3D橫版射擊再臨,機體武器海量升級

[游戲名稱]: 《異形戰機2》v2.0.4數字豪華版 [軟件大小]: 17.7 GB [軟件大小]: 夸克網盤 | 百度網盤 游戲介紹 《異形戰機:最終版2》續作震撼登場!經典橫版射擊全面升級:3D 畫面炫目、關卡與機體海量擴充,只為帶來酣暢淋漓的滅…

Java 異常(Throwable)

1. Throwable Throwable: 所有異常和錯誤的根類。實現 Throwable 或其子類的對象才能被 throw 或 catch。 Error: 表示嚴重的系統級問題,通常不應該被捕獲或處理,程序通常無法從中恢復。 Exception: 表示程序可以處理的問題。分為 運行時異常、 受檢異常…

rocketmq常用命令

官方文檔 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ運維管理命令mqadm…

【C++詳解】哈希表概念與實現 開放定址法和鏈地址法、處理哈希沖突、哈希函數介紹

文章目錄一、unordered系列的使用unordered_set類的介紹unordered_set和set的使?差異unordered_map和map的使?差異unordered_xxx的哈希相關接?二、哈希表實現哈希概念直接定址法哈希沖突負載因?將關鍵字轉為整數哈希函數除法散列法/除留余數法乘法散列法處理哈希沖突開放定…

電影感人文街拍擺攤紀實攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色介紹電影感人文街拍擺攤紀實攝影后期 Lr 調色是一種專注于捕捉街頭生活煙火氣的攝影風格,通過 Lightroom 后期調色賦予畫面電影般的敘事感和情感深度。這種風格以擺攤小販、市井行人、街頭場景為主體,強調真實、自然的生活瞬間。調色核心在于低飽和暖…

【數據分享】298個地級市人工智能企業數量(1990-2023)

數據介紹引言人工智能產業作為數字經濟的核心驅動力,其發展規模與分布格局深刻反映區域科技創新活力與產業升級潛力。為助力相關研究,本文分享一份涵蓋全國 298 個地級市 1990-2023 年的人工智能企業核心數據,包含人工智能企業存量和人工智能…

LeetCode 面試經典 150_雙指針_驗證回文串(25_125_C++_簡單)(雙指針)

LeetCode 面試經典 150_數組/字符串_驗證回文串(25_125_C_簡單)題目描述:輸入輸出樣例:題解:解題思路:思路一(雙指針):代碼實現代碼實現(思路一(雙…

無障礙輔助模塊|Highcharts引領可訪問數據可視化的交流

在現代數據可視化中,無障礙輔助技術已成為必不可少的一部分。對于視障人士或使用屏幕閱讀器的用戶來說,傳統圖表往往難以獲取有效信息,而 Highcharts 在設計之初便充分考慮了無障礙體驗。 Highcharts作為可訪問數據可視化的倡導者&#xff0…

從0到1:數據庫進階之路,解鎖SQL與架構的奧秘

目錄一、SQL 基礎啟航1.1 SQL 基礎語法1.2 SQL 進階查詢1.3 SQL 實戰案例分析二、分庫分表實戰2.1 分庫分表的背景與原理2.2 分庫分表策略設計2.3 分布式 ID 生成2.4 數據遷移方案三、中間件實戰3.1 中間件概述3.2 DBLE 中間件實戰3.3 MyCat 中間件實戰四、高可用架構搭建4.1 高…

【數據結構入門】排序算法(2):直接選擇排序->堆排序

目錄 1.直接選擇排序 1.1 思想 1.2 代碼 2.堆排序 2.1 向下調整算法 2.1.1 代碼 2.2 建堆 2.2.1 代碼 2.3 正式排序 2.3.1 代碼 3. 冒泡排序 3.1 思路 3.1.1 單趟排序 3.1.2 多趟排序 3.1.3優化 3.2 代碼 1.直接選擇排序 1.1 思想 每次從未排序區中選擇一個最小…

Fluent Bit系列:字符集轉碼測試(下)

#作者:程宏斌 文章目錄fluent-bit 1.9.4 轉換測試結論接上篇:《Fluent Bit系列:字符集轉碼測試(上)》https://blog.csdn.net/qq_40477248/article/details/150776142?spm1001.2014.3001.5501fluent-bit 1.9.4 轉換測試…

redis-緩存-持久化

redis-緩存-持久化一、來因宮1、啥叫持久化?為何需要持久化?2、redis持久化方案2.1、RDB - 快照持久化A、定義原理B、快照生成流程:Copy-on-Write(寫時復制)C、dump.rdb文件說明D、RDB 數據恢復流程E、RDB的優缺點2.2、…

C++11(Linux/GCC)字節序工具

#pragma once #include <cstdint> #include <climits> #include <type_traits> // 用于類型檢查// 端序宏獲取&#xff08;保持原有邏輯&#xff09; #if __has_include(<endian.h>)#include <endian.h> #elif __has_include(<bits/endian.h…

【MTCNN網絡結構記憶卡片】--003nets.py

&#x1f9e0; MTCNN網絡結構記憶卡片 &#xfffd;&#xfffd; 基礎概念速查 &#x1f524; 庫引入&#xff1a;import torch 和 import torch.nn as nn import torch # PyTorch深度學習框架 import torch.nn as nn # nn Neural Networks (神經網絡)&#x1f3d7;?…

可視化-模塊1-HTML-03

1.發現問題<p>大數據可視化技術及應用課程</p> <img src"pic/圖片2.png" width"300" height"300"/><p></p><img />HTML 標簽按閉合方式只分兩類&#xff1a;雙標簽&#xff08;paired / container&#xff…

前端開發:詳細介紹npm、pnpm和cnpm分別是什么,使用方法以及之間有哪些關系

目錄 npm、pnpm和cnpm分別是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;創建/初始化項目 修改npm鏡像&#xff08;npm源設置&#xff09; 基本命令 安裝依賴項 下載特定版本的依賴 下載開發依賴 下載全局依賴&#xff08;全局安裝&#xff09; 升級依賴項 根據依賴…

我們為你連接網絡,安裝驅動程序

Windows 11 家庭版/專業版在安裝時默認要求聯網&#xff0c;其實可以跳過。在這個聯網界面按下 Shift F10 打開命令行。輸入以下命令并回車&#xff1a;OOBE\BYPASSNRO系統會自動重啟&#xff0c;回到聯網界面。這時會多出一個 “我沒有 Internet” 選項&#xff0c;點它&…

智慧交通夜間逆光誤檢率↓81.4%!陌訊多模態融合算法在主干道監測的落地優化

一、智慧交通視覺檢測的行業痛點智慧交通作為城市基建的核心環節&#xff0c;其視覺檢測系統&#xff08;車輛識別、車牌匹配、交通事件預警&#xff09;的可靠性直接影響通行效率與交通安全。但根據《2023 年中國智慧交通發展報告》數據&#xff0c;當前主流方案仍面臨三大核心…