DMA的三種傳輸功能

①內存到內存

#include "dma.h"
#include "stdio.h"#define BUF_SIZE 16uint32_t src_buf[BUF_SIZE] ={0x00000000,0x11111111,0x22222222,0x33333333,0x44444444,0x55555555,0x66666666,0x77777777,0x88888888,0x99999999,0xAAAAAAAA,0xBBBBBBBB,0xCCCCCCCC,0xDDDDDDDD,0xEEEEEEEE,0xFFFFFFFF};
uint32_t dst_buf[BUF_SIZE]={0};DMA_HandleTypeDef dma_handle={0};  void dma_init()
{__HAL_RCC_DMA1_CLK_ENABLE(); dma_handle.Instance = DMA1_Channel1;                               //基地址 dma_handle.Init.Direction= DMA_MEMORY_TO_MEMORY;                   //方向是什么 是存儲器到外設  還是外設到存儲器  文中代碼為內存到內存      DMA_MEMORY_TO_PERIPH(此為內存到外設)//內存相關的配置 dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE ;          //數據對齊的模式   這里選擇的是字節對齊的模式dma_handle.Init.MemInc=DMA_MINC_ENABLE;                          //數據增長的方式(偏移)//外設相關的配置dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;       //外設數據對齊的模式dma_handle.Init.PeriphInc =DMA_PINC_ENABLE ;                 //外設數據增長的方式   dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;                  //優先級(中等)dma_handle.Init.Mode = DMA_NORMAL;                              //模式選擇(循環模式還是非循環模式)  內存到內存只支持正常模式 不支持循環模式HAL_DMA_Init(&dma_handle);}void dma_transmit(void)
{HAL_DMA_Start(&dma_handle,(uint32_t)src_buf,(uint32_t)dst_buf,sizeof(uint32_t)* BUF_SIZE);              //包含三個參數 源 目標 數據長度 和handle  其中 DMA 配置為 字節傳輸(8 位),DataLength 的單位是 字節數  因此16個數據 每個數據4個字節while(__HAL_DMA_GET_FLAG(%dma_handle,DMA_FLAG_TC1) == RESET);               ///RESET為0 SER為1   int i =0;for(i=0;i<BUF_SIZE;i++)printf("buf[%d] =%X\r\n",i,dst_buf[i]);}

輸出結果如下

②外設到內存

編程步驟如下

dma.c代碼如下

#include "dma.h"
#include "stdio.h"#define BUF_SIZE 16DMA_HandleTypeDef dma_handle={0};  
extern UART_HandleTypeDef uart1_handle;void dma_init()
{__HAL_RCC_DMA1_CLK_ENABLE(); dma_handle.Instance = DMA1_Channel4;                               //基地址 dma_handle.Init.Direction= DMA_MEMORY_TO_PERIPH;                   //方向是什么 是存儲器到外設  還是外設到存儲器  文中代碼為內存到內存      DMA_MEMORY_TO_PERIPH(此為內存到外設)//內存相關的配置 dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE ;          //數據對齊的模式   這里選擇的是字節對齊的模式dma_handle.Init.MemInc=DMA_MINC_ENABLE;                          //數據增長的方式(偏移)//外設相關的配置dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;       //外設數據對齊的模式dma_handle.Init.PeriphInc =DMA_PINC_DISABLE ;                 //外設數據增長的方式     內存到外設的目標不能遞增 dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;                  //優先級(中等)dma_handle.Init.Mode = DMA_NORMAL;                              //模式選擇(循環模式還是非循環模式)  內存到內存只支持正常模式 不支持循環模式HAL_DMA_Init(&dma_handle);__HAL_LINKDMA(&uart1_handle,hdmatx,dma_handle);                //第一個數據為外設句柄  第二個為出口發送數據(tx) 第三個為DMA的句柄}

uart.c文件

void USART1_IRQHandler(void)
{uint8_t receive_data = 0;   if(__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_RXNE) != RESET){        /* 獲取接收RXNE標志位是否被置位 */if(uart1_rx_len >= sizeof(uart1_rx_buf))                            /* 如果接收的字符數大于接收緩沖區大小, */uart1_rx_len = 0;                                               /* 則將接收計數器清零 */HAL_UART_Receive(&uart1_handle, &receive_data, 1, 1000);            /* 接收一個字符 */uart1_rx_buf[uart1_rx_len++] = receive_data;                        /* 將接收到的字符保存在接收緩沖區 */}if (__HAL_UART_GET_FLAG(&uart1_handle, UART_FLAG_IDLE) != RESET)        /* 獲取接收空閑中斷標志位是否被置位 */{
//        printf("recv: %s\r\n", uart1_rx_buf);                               /* 將接收到的數據打印出來 */
//        uart1_rx_clear();
//        __HAL_UART_CLEAR_IDLEFLAG(&uart1_handle);                           /* 清除UART總線空閑中斷 *///清除空閑中斷__HAL_UART_CLEAR_IDLEFLAG(&uart1_handle);//停止DMA傳輸,防止干擾HAL_UART_DMAStop(&uart1_handle);//獲取接收到的數據長度uart1_rx_len=UART1_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(&dma_handle);              //總共接受的減去剩余的即為獲取接收到的數據長度//打印接收到的內容printf("recv:%s,recv_len:%d\r\n",uart1_rx_buf,uart1_rx_len);//清空接收緩沖uart1_rx_clear();//重新開啟串口DMA傳輸HAL_UART_Receive_DMA(&uart1_handle,uart1_rx_buf,UART1_RX_BUF_SIZE);}
}

結果輸出如下

利用空閑中斷 和DMA傳輸儲存在緩沖區?

③外設到內存

dma.c的代碼如下

#include "dma.h"
#include "stdio.h"#define BUF_SIZE 16DMA_HandleTypeDef dma_handle={0};  
extern UART_HandleTypeDef uart1_handle;void dma_init()
{__HAL_RCC_DMA1_CLK_ENABLE(); dma_handle.Instance = DMA1_Channel4;                               //基地址 dma_handle.Init.Direction= DMA_MEMORY_TO_PERIPH;                   //方向是什么 是存儲器到外設  還是外設到存儲器  文中代碼為內存到內存      DMA_MEMORY_TO_PERIPH(此為內存到外設)//內存相關的配置 dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE ;          //數據對齊的模式   這里選擇的是字節對齊的模式dma_handle.Init.MemInc=DMA_MINC_ENABLE;                          //數據增長的方式(偏移)//外設相關的配置dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;       //外設數據對齊的模式dma_handle.Init.PeriphInc =DMA_PINC_DISABLE ;                 //外設數據增長的方式     內存到外設的目標不能遞增 dma_handle.Init.Priority = DMA_PRIORITY_MEDIUM;                  //優先級(中等)dma_handle.Init.Mode = DMA_NORMAL;                              //模式選擇(循環模式還是非循環模式)  內存到內存只支持正常模式 不支持循環模式HAL_DMA_Init(&dma_handle);__HAL_LINKDMA(&uart1_handle,hdmatx,dma_handle);                //第一個數據為外設句柄  第二個為出口發送數據(tx) 第三個為DMA的句柄}

main.c代碼如下

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "dma.h"uint8_t send_buf[1000] ={0};
extern UART_HandleTypeDef uart1_handle;int main(void)
{HAL_Init();                         /* 初始化HAL庫 */stm32_clock_init(RCC_PLL_MUL9); /* 設置時鐘, 72Mhz */led_init();uart1_init(115200);dma_init();//printf("hello world!\r\n");int i =0;for(i=0;i<1000;i++)send_buf[i]='A';HAL_UART_Transmit_DMA(&uart1_handle,send_buf,1000);while(1){ led1_on();led2_off();delay_ms(500);led1_toggle();led2_toggle();delay_ms(500);}
}

結果如下

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

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

相關文章

【MySQL】MySQL 表的增刪改查(CRUD)—— 下篇(內含聚合查詢、group by和having子句、聯合查詢、插入查詢結果)

目錄 1. 插入查詢結果 2 聚合查詢 &#xff08;行與行之間運算&#xff09; count 計算查詢結果的行數 sum 求和 avg 求平均值 max 最大值 min 最小值 【小結】 3. group by 子句 分組 where 條件 having 條件 4. 聯合查詢&#xff08;多表查詢&#xff09; 內連接…

“思考更長時間”而非“模型更大”是提升模型在復雜軟件工程任務中表現的有效途徑 | 學術研究系列

作者&#xff1a;明巍/臨城/水德 還在為部署動輒數百 GB 顯存的龐大模型而煩惱嗎&#xff1f;還在擔心私有代碼庫的安全和成本問題嗎&#xff1f;通義靈碼團隊最新研究《Thinking Longer, Not Larger: Enhancing Software Engineering Agents via Scaling Test-Time Compute》…

電腦屏幕錄制軟件Captura源碼編譯(Win10,VS2022)

屏幕錄像的意義&#xff1a; 教育教學方面 制作教學資源&#xff1a;教師可以通過錄制屏幕來制作教學視頻&#xff0c;演示軟件操作、講解復雜的知識點等。學生可以隨時觀看這些視頻&#xff0c;便于復習和鞏固知識&#xff0c;尤其對于一些抽象的概念或難以在課堂上一次性掌握…

記一次調用大華抓拍SDK并發優化

目錄 一、問題分析 二、解決思路 三、貼代碼 四、總結 一、問題分析 按慣例上問題&#xff1a; 設備告警采用高電平持續模式&#xff1a;一次開&#xff0c;不主動關就一直處于告警狀態。 并發時多個請求下發 setDVRAlarmOutConfig&#xff0c;導致狀態混亂。 “開 -&g…

Python圖像變清晰與銳化,調整對比度,高斯濾波除躁,卷積銳化,中值濾波鈍化,神經網絡變清晰

本次使用圖片來源于百度 import cv2 import time import numpy as np import pywtfrom PIL import Image, ImageEnhance#-i https://pypi.mirrors.ustc.edu.cn/simpledef super_resolution(input_path, output_path, model_path, scale4):# 初始化超分辨率模型sr cv2.dnn_su…

12個HPC教程匯總!從入門到實戰,覆蓋分子模擬/材料計算/生物信息分析等多個領域

在科學研究、工程仿真、人工智能和大數據分析等領域&#xff0c;高性能計算 (High Performance Computing, HPC) 正扮演著越來越重要的角色。它通過并行處理、大規模計算資源的整合&#xff0c;極大提升了計算效率&#xff0c;使原本耗時數日的任務能夠在數小時內完成。 隨著計…

使用Autocannon.js進行HTTP壓測

目錄 一、為什么選擇Autocannon&#xff1f; 二、五分鐘快速上手 1. 環境準備 2. 發起首個壓測 3. 解讀測試報告 三、高階場景實戰 場景1&#xff1a;POST請求壓測 場景2&#xff1a;階梯式壓力測試 場景3&#xff1a;編程式集成測試 四、結果深度分析指南 1. 延遲分…

pnpm install報錯:此系統上禁止運行腳本

依賴安裝 報錯信息&#xff1a; pnpm : 無法加載文件 C:\Users\XXX\AppData\Roaming\npm\pnpm.ps1&#xff0c;因為在此系統上禁止運行腳本。有關詳細信息&#xff0c;請參閱 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在位置 行:1 …

第9章 多模態大語言模型

??????第1章 對大型語言模型的介紹第2章 分詞和嵌入第3章 解析大型語言模型的內部機制第4章 文本分類第5章 文本聚類與主題建模第6章 提示工程第7章 高級文本生成技術與工具第8章 語義搜索與檢索增強生成第10章 構建文本嵌入模型第11章 面向分類任務的表示模型微調第12章…

Python 繪圖代碼解析:用 Turtle 和 Colorsys 打造絢麗圖案

注:本文為作者原創文章,未經許可禁止轉載。 Python 繪圖代碼解析:用 Turtle 和 Colorsys 打造絢麗圖案 在 Python 的世界里,有許多有趣的庫可以用來創造精美的圖形。今天,我們就來詳細剖析一段使用turtle庫和colorsys庫的代碼,看看它是如何繪制出獨特圖案的。 一、庫的導…

RTMP 入門指南

1. RTMP 基礎概念?? ??核心角色??&#xff1a; ??推流端&#xff08;Publisher&#xff09;??&#xff1a;將音視頻數據推送到服務器的設備&#xff08;如OBS、手機APP&#xff09;。??服務器&#xff08;RTMP Server&#xff09;??&#xff1a;接收推流并分發給…

Java Stream流 常用方法

Map 修改 用于修改集合里的值 public void findData(){ArrayList<String> list new ArrayList<>();list.add("張三");list.add("李四");List<String> collect list.stream().map(s -> s "a").collect(Collectors.toLi…

巧記英語四級單詞 Unit5-上【曉艷老師版】

count 數&#xff0c; counter n.計算器&#xff0c;柜臺 a.相反的 數數的東西就是計算器&#xff0c;在哪數&#xff0c;在柜臺里面數&#xff1b;你和售貨員的關系就是相反的(一個買貨&#xff0c;一個賣貨account n.賬戶&#xff0c;賬號 一再的數accountant n.會計 一再的…

Git多人協作與企業級開發模型

目錄 1.多人協作一 2.多人協作二 3.遠程分?刪除后&#xff0c;本地gitbranch-a依然能看到的解決辦法 4.企業級開發模型 4.1.Git的重要性 4.2.系統開發環境 4.3.Git 分?設計規范 1.多人協作一 ?前&#xff0c;我們所完成的?作如下&#xff1a; 基本完成Git的所有本…

大眾點評 mtgsig1.2 分析 mtgsig

聲明 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向過程 部分代碼 params[yodaRead…

(三) Trae 調試C++ 基本概念

調試C基本概念 一、調試基礎概念1.1 調試信息格式1.2 DWARF格式和PDB格式生成(圖解)1.3.典型工具鏈和調試信息 二、各工具鏈深度解析1. Clang 與 G 的 DWARF 差異 三 調試工具3.1 調試工具3.2 調試插件(Trae) 一、調試基礎概念 1.1 調試信息格式 格式類型適用系統存在形式DWA…

Flink部署與應用——部署方式介紹

引入 我們通過Flink相關論文的介紹&#xff0c;對于Flink已經有了初步理解&#xff0c;這里簡單的梳理一下Flink常見的部署方式。 Flink 的部署方式 StandAlone模式 介紹 StandAlone模式是Flink框架自帶的分布式部署模式&#xff0c;不依賴其他的資源調度框架&#xff0c…

【智慧城市】新中地GIS開發實訓:基于 Vue 框架的武漢智慧旅游系統

首頁 地球自轉頁 控制臺頁 景點信息頁 天氣預報頁 路線規劃頁 查詢頁 AI問答頁 熱力圖頁 測量頁 來源&#xff1a; 【智慧城市】新中地GIS開發實訓&#xff1a;優秀學生項目作品&#xff08;58&#xff09;基于 Vue 框架的武漢智慧旅游系統

C++入侵檢測與網絡攻防之網絡嗅探以及ARP攻擊

目錄 1.tcpdump基本使用 2.tcpdump條件過濾 3.wireshark介紹 4.wireshark的介紹 5.tcp握手揮手分析 6.telnet服務的介紹和部署 7.復習 8.telnet服務的報文嗅探 9.網絡嗅探基礎 10.arp協議的解析 11.arp攻擊原理以及試驗環境 12.arp實驗以及防御方式 1.tcpdump基本使…

【數據可視化-28】2017-2025 年每月產品零售價數據可視化分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…