DMA學習筆記

參考文章

https://blog.csdn.net/as480133937/article/details/104927922

DMA簡介

DMA,全稱Direct Memory Access,即直接存儲器訪問。DMAC 即 DMA 控制器,提供了一種硬件的數據傳輸方式,無需 CPU 的介入,可以處理外設和存儲器之間或者存儲器和存儲器之間的傳輸數據。因無 CPU 介入,從而使 CPU 可以專注在處理其他系統功能上。由此可以減輕CPU的負擔,使得更多的CPU資源分配到其他的任務處理上面去。

主要配置參數

了解DMA是什么,以及為什么要使用DMA后,我們之后就是要知道如何去配置DMA,以及需要配置哪些參數。下面是一些主要需要配置的參數。

DMA的傳輸通道

不同單片機有不同的通道可供使用,結合實際資源參數進行選擇。

目標外設和源外設號(有些可能是直接配置地址)

DMA的傳輸方式

  • 外設到內存
  • 內存到外設
  • 內存到內存
  • 外設到外設

數據傳輸寬度

這個可以根據實際需求配置成一個字節、半個字、全字這三種方式

  • DMA_SRC_WIDTH_BYTE????
  • DMA_SRC_WIDTH_HALF_WORD
  • DMA_SRC_WIDTH_WORD???

模式設置

  • 模式可以設置為正常模式(開啟之后僅只傳輸一次)
  • 循環模式(會一直循環傳輸數據)

地址生成方式

所謂地址生成方式,就是看你使不使用,地址遞增或者固定地址。也就是

固定模式和遞增模式。

  • 在固定模式中,地址一直固定為初始化的基地址(DMACCxSrcAddr、 DMACCxDestAddr)。
  • 在遞增模式中,下一次傳輸數據的地址是當前地址加 1(或者 2, 4),這個值取決于數據
  • 傳輸寬度

具體配置代碼

void DMA_SPITransmit_Init(void)
{DMA_SPIT_Handle.Instance              = DMA_Channel1;DMA_SPIT_Handle.Init.Data_Flow        = DMA_DATA_FLOW_M2P;DMA_SPIT_Handle.Init.Request_ID       = REQ3_SPI2_SEND;DMA_SPIT_Handle.Init.Mode             = DMA_NORMAL;DMA_SPIT_Handle.Init.Source_Inc       = DMA_SOURCE_ADDR_INCREASE_ENABLE;DMA_SPIT_Handle.Init.Desination_Inc   = DMA_DST_ADDR_INCREASE_DISABLE;DMA_SPIT_Handle.Init.Source_Width     = DMA_SRC_WIDTH_BYTE;DMA_SPIT_Handle.Init.Desination_Width = DMA_DST_WIDTH_BYTE;/*-----------------------------------------------------------------------------------*//* Note:If user dons not apply interrupt, Set DMA_ITC_Callback?¢DMA_IE_Callback NULL *//*-----------------------------------------------------------------------------------*/DMA_SPIT_Handle.DMA_ITC_Callback = NULL;DMA_SPIT_Handle.DMA_IE_Callback  = NULL;HAL_DMA_Init(&DMA_SPIT_Handle);__HAL_LINK_DMA(SPI_Handle, HDMA_Tx, DMA_SPIT_Handle);
}

我這里使用的是SPI+DMA配置方式,單片機還是航芯的單片機,選擇了寄存器地址(目標地址)不變,源地址(數據地址)遞增,這樣配置滿足我們需求。然后傳輸完成回調函數和傳輸出錯回調函數暫時沒有配置。

DMA中斷

每個 DMA 通道都有一個專用的中斷。中斷事件有兩種類型:傳輸完成傳輸錯誤。 每一個中斷事件在狀態寄存器和清除寄存器中有專用的標志位。通過檢測兩種中斷標志位可以獲取我們DMA的傳輸情況。

__weak void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
{uint32_t lu32_Channel_Index;/* Get DMA Channel number */lu32_Channel_Index = ((uint32_t)(hdma->Instance) - (uint32_t)(DMA_Channel0)) / 0x20;/* Channel has been interrupted */if (DMA->INT_STATUS & (1 << lu32_Channel_Index)){/* Transfer complete interrupt */if (DMA->INT_TC_STATUS & (1 << lu32_Channel_Index)){DMA->INT_TC_CLR |= (1 << lu32_Channel_Index);if (NULL != hdma->DMA_ITC_Callback){hdma->DMA_ITC_Callback();}}/* Transfer error interrupt */if (DMA->INT_ERR_STATUS & (1 << lu32_Channel_Index)){DMA->INT_ERR_CLR |= (1 << lu32_Channel_Index);if (NULL != hdma->DMA_IE_Callback){hdma->DMA_IE_Callback();}}}}

上面就是在觸發中斷后在中斷函數中處理函數的中斷程序,主要邏輯就是先獲取哪個中斷觸發,然后判斷觸發源(傳輸完成或者傳輸錯誤)。

總結

DMA配置使用起來參數不多也比較簡單,但是要真正使用并理解還是需要時間去消化。像之前不使用DMA不知道有啥作用,只模糊地知道可以幫CPU減負,導致很多情況下都亂用DMA。

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

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

相關文章

7.6、指針和數組

代碼 #include <iostream> using namespace std;int main() {//指針和數組//利用指針訪問數組中的元素int arr[10] { 1,2,3,4,5,6,7,8,9,10 };cout << "第一個元素為&#xff1a;" << arr[0] << endl;int * p arr;//arr就是數組首地址co…

kaggle量化賽金牌方案(第七名解決方案)(下)

— 無特征工程的神經網絡模型&#xff08;得分 5.34X&#xff09; 比賽進入最后階段&#xff0c;現在是時候深入了解一些關于神經網絡模型的見解了。由于 Kaggle 討論區的需求&#xff0c;我在這里分享兩個神經網絡模型。第一個是 LSTM 模型&#xff0c;第二個是卷積網絡&…

華為機試HJ6質數因子

華為機試HJ6質數因子 題目&#xff1a; 按照從小到大輸出給定數值的質數因子 想法&#xff1a; 遍歷判斷從小到大的數值是否是給定數值的質數因子&#xff0c;是就直接輸出&#xff0c;該方法輸出的數值已經排序好了 import mathinput_number int(input())# 循環判斷提取…

鴻翼FEX文件安全交換系統,打造安全高效的文件擺渡“綠色通道”

隨著數字經濟時代的到來&#xff0c;數據已成為最有價值的生產要素&#xff0c;是企業的重要資產之一。隨著數據流動性的增強&#xff0c;數據安全問題也隨之突顯。尤其是政務、金融、醫療和制造業等關鍵領域組織和中大型企業&#xff0c;面臨著如何在保障數據安全的同時&#…

llm學習-3(向量數據庫的使用)

1&#xff1a;數據讀取和加載 接著上面的常規操作 加載環境變量---》獲取所有路徑---》加載文檔---》切分文檔 代碼如下&#xff1a; import os from dotenv import load_dotenv, find_dotenvload_dotenv(find_dotenv()) # 獲取folder_path下所有文件路徑&#xff0c;儲存在…

【力扣 - 每日一題】3099. 哈沙德數 | 模擬 (Go/C++)

題目內容 如果一個整數能夠被其各個數位上的數字之和整除&#xff0c;則稱之為 哈沙德數&#xff08;Harshad number&#xff09;。給你一個整數 x 。如果 x 是 哈沙德數 &#xff0c;則返回 x 各個數位上的數字之和&#xff0c;否則&#xff0c;返回 -1 。 示例 1&#xff1…

C++Primer Plus 第十四章代碼重用:編程練習,第3題

CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題 編程練習,第3題 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 CPrimer Plus 第十四章代碼重用&#xff1a;編程練習,第3題前言定義一個 QueueTp 模板…

中國國產AI芯片的崛起

一、CUDA的壟斷 當討論半導體行業面臨的挑戰時&#xff0c;你首先想到的是什么&#xff1f;光刻機&#xff1f;3納米或者5納米技術&#xff1f;我們無法生產的完美方形芯片&#xff1f;是的&#xff0c;但也不完全是。 人們經常把半導體芯片歸類為硬件產業&#xff0c;但實際上…

【大模型LLM面試合集】大語言模型基礎_llm概念

1.llm概念 1.目前 主流的開源模型體系 有哪些&#xff1f; 目前主流的開源LLM&#xff08;語言模型&#xff09;模型體系包括以下幾個&#xff1a; GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列&#xff1a;由OpenAI發布的一系列基于Transformer架構…

Linux常用查看日志方法-如使用less查看日志文件

在Linux系統中&#xff0c;查看日志文件是常見的運維任務之一。less命令是一個非常強大的工具&#xff0c;用于查看長文本文件&#xff0c;例如日志文件。它允許你按頁瀏覽文件&#xff0c;并提供了一些便捷的導航和搜索功能。 使用less查看日志文件 假設你有一個日志文件/va…

linux環境安裝elasticsearch緩存數據庫和Kibana客戶端

linux環境安裝elasticsearch緩存數據庫&#xff0c;今天我們安裝7.17.18版本&#xff0c;并分析遇到的問題。 一、elasticsearch安裝運行 1、直接下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.18-linux-x86_64.tar.gz2、解壓 tar -…

驚艷眼球的視覺盛宴【二】

當晨光初破黎明的靜謐&#xff0c;一片絢爛便悄然鋪展在蔚藍的天際。那一刻&#xff0c;大地蘇醒&#xff0c;萬物復蘇&#xff0c;我們仿佛踏入了一幅活生生的畫卷。霧氣繚繞之中&#xff0c;群山似乎在低語&#xff0c;古樹在輕搖&#xff0c;一切都沐浴在柔和而金黃的光芒之…

如何理解vuex中的每個概念(通俗易懂)

文章目錄 1. 什么是 Vuex&#xff1f;2. Vuex 的四個核心概念 1. 什么是 Vuex&#xff1f; 想象一下&#xff0c;你家里有一個大冰箱&#xff0c;所有家庭成員都可以訪問這個冰箱。每個人都可以往里面放東西&#xff0c;也可以從里面拿東西。這個冰箱就像是 Vuex 中的“狀態”…

戰略流程-麥肯錫企業數字化業務變革成熟度評估模型及案例深度解析

一、企業變革成熟度評估模型 企業變革成熟度診斷模型是一種評估工具&#xff0c;用于全面掃描和評估企業在變革轉型過程中的能力水平。該模型通過一系列量化指標和定性分析&#xff0c;對企業在不同變革領域的成熟度進行評分&#xff0c;從而幫助企業識別在變革過程中的優勢和…

第12天:上下文管理器

今日學習目標 了解上下文管理器的基本概念和作用學習如何使用 with 語句學習如何創建自定義上下文管理器理解上下文管理器的實際應用場景 1. 上下文管理器簡介 上下文管理器是一種用于管理資源的機制&#xff0c;它可以在一段代碼執行前后自動執行一些操作。最常見的上下文管…

QAM MMA

MMA是改進的CMA&#xff0c;有RCA和CMA的優點&#xff0c;還能對相位誤差進行修正。 N 5e5; % 仿真符號數 M 16; % QAM16msg randi([0 M-1],N,1); % 產生隨機符號 tx qammod(msg,M); % QAM調制test_snr 20:5:30; …

無畏契約/valorant匹配無反應、無法聯機、聯機報錯的解決辦法

無畏契約/valorant是一款熱度超高的戰術射擊游戲&#xff0c;通過其獨特的美漫英雄設計和豐富的戰術性&#xff0c;以及武器技能設計系統&#xff0c;在全球吸引了不少玩家的加入和喜愛。不過近期伴隨第九賽季更新&#xff0c;很多玩家重回服務器&#xff0c;卻遇到了匹配無反應…

進程和內存管理 如何檢查內存和CPU 內存的使用和剩余情況,當前CPU的負載情況,找進程id,結束某個進程

一、檢查內存 方法一&#xff1a;查看/proc/meminfo文件&#xff0c;又被稱為偽文件&#xff0c;記錄了內存的相關信息&#xff0c;不可用vi/vim打開編輯&#xff0c;可用cat等命令查看。 方法二&#xff1a;free -m 命令 以MB為單位來顯示內存情況。 二、檢查CPU 方法一…

基于用戶的協同過濾算法

目錄 原理&#xff1a; 計算相似度&#xff1a; 步驟&#xff1a; 計算方法&#xff1a;Jaccard相似系數、余弦相似度。 推薦 原理&#xff1a; 先“找到相似用戶”&#xff0c;再“找到他們喜歡的物品”--->人以群分。即&#xff0c;給用戶推薦“和他興趣相似的其他用…

C語言 輸出*的圖案(1,3,5,7,5,3,1順序)

輸出以下圖案&#xff08;不是直接輸出&#xff0c;且要求輸出時符號居中對齊&#xff09;。 * *** ***** ******* ***** *** * 這個程序輸出一個特定的圖案&#xff0c;符號居中對齊。 #include <stdio.h>int main() {int n 4; // 圖案的中間行數// 輸出上半部分for …