使用CubeMX新建DMA工程——存儲器到存儲器模式

目錄

1、新建板級支持包

2、修改main.c

3、程序流程

4、問題


新建工程的基本操作步驟參考這里:

【【野火】STM32 HAL庫開發實戰指南 教學視頻 手把手教學STM32全系列 零基礎入門CubeMX+HAL庫,基于野火全系列STM32開發板】 https://www.bilibili.com/video/BV18X4y1M763/?p=37&share_source=copy_web&vd_source=6bf2ecf2bed1f4e4ccbce142a48bb318


1、新建板級支持包

LED的板級支持包直接移植,DMA外設就不新建板級支持包了,直接使用生成的代碼。

dma.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file    dma.c* @brief   This file provides code for the configuration*          of all the requested memory to memory DMA transfers.******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "dma.h"/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*----------------------------------------------------------------------------*/
/* Configure DMA                                                              */
/*----------------------------------------------------------------------------*//* USER CODE BEGIN 1 *//* USER CODE END 1 */
DMA_HandleTypeDef hdma_memtomem_dma1_channel1;/*** Enable DMA controller clock* Configure DMA for memory to memory transfers*   hdma_memtomem_dma1_channel1*/
void MX_DMA_Init(void)
{/* DMA controller clock enable */__HAL_RCC_DMA1_CLK_ENABLE();/* Configure DMA request hdma_memtomem_dma1_channel1 on DMA1_Channel1 */hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_ENABLE;hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_ENABLE;hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;hdma_memtomem_dma1_channel1.Init.Mode = DMA_NORMAL;hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_MEDIUM;if (HAL_DMA_Init(&hdma_memtomem_dma1_channel1) != HAL_OK){Error_Handler();}}/* USER CODE BEGIN 2 *//* USER CODE END 2 */

dma.h

/* USER CODE BEGIN Header */
/********************************************************************************* @file    dma.h* @brief   This file contains all the function prototypes for*          the dma.c file******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __DMA_H__
#define __DMA_H__#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "main.h"/* DMA memory to memory transfer handles -------------------------------------*/
extern DMA_HandleTypeDef hdma_memtomem_dma1_channel1;/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* USER CODE BEGIN Private defines *//* USER CODE END Private defines */void MX_DMA_Init(void);/* USER CODE BEGIN Prototypes *//* USER CODE END Prototypes */#ifdef __cplusplus
}
#endif#endif /* __DMA_H__ */

2、修改main.c

1、添加LED外設驅動頭文件

2、定義aSRC_Const_Buffer數組作為DMA傳輸數據源,?定義DMA傳輸目標存儲器aDST_Buffer

3、定義簡單延時函數Delay和比較函數Buffercmp

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32f1xx.h"
#include "./led/bsp_led.h"/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
#define BUFFER_SIZE              32/* 定義aSRC_Const_Buffer數組作為DMA傳輸數據源const關鍵字將aSRC_Const_Buffer數組變量定義為常量類型 */
const uint32_t aSRC_Const_Buffer[BUFFER_SIZE]= {0x01020304,0x05060708,0x090A0B0C,0x0D0E0F10,0x11121314,0x15161718,0x191A1B1C,0x1D1E1F20,0x21222324,0x25262728,0x292A2B2C,0x2D2E2F30,0x31323334,0x35363738,0x393A3B3C,0x3D3E3F40,0x41424344,0x45464748,0x494A4B4C,0x4D4E4F50,0x51525354,0x55565758,0x595A5B5C,0x5D5E5F60,0x61626364,0x65666768,0x696A6B6C,0x6D6E6F70,0x71727374,0x75767778,0x797A7B7C,0x7D7E7F80};/* 定義DMA傳輸目標存儲器 */
uint32_t aDST_Buffer[BUFFER_SIZE];static void Delay(__IO uint32_t nCount);
uint8_t Buffercmp(const uint32_t* pBuffer, uint32_t* pBuffer1, uint16_t BufferLength); /* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* 定義存放比較結果變量 */uint8_t TransferStatus;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* LED 端口初始化 */LED_GPIO_Config(); /* 設置 RGB 彩色燈為紫色 */LED_PURPLE;/* 簡單延時函數 */Delay(0xFFFFFF);/* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();/* USER CODE BEGIN 2 */HAL_DMA_Start(&hdma_memtomem_dma1_channel1,(uint32_t)aSRC_Const_Buffer,(uint32_t)aDST_Buffer,BUFFER_SIZE);/* 等待DMA傳輸完成 */while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1,DMA_FLAG_TC1)==RESET){}   /* 比較源數據與傳輸后數據 */TransferStatus=Buffercmp(aSRC_Const_Buffer, aDST_Buffer, BUFFER_SIZE);/* 判斷源數據與傳輸后數據比較結果*/if(TransferStatus==0)  {/* 源數據與傳輸后數據不相等時RGB彩色燈顯示紅色 */LED_RED;}else{ /* 源數據與傳輸后數據相等時RGB彩色燈顯示藍色 */LED_BLUE;}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/* 簡單的延時函數 */
static void Delay(__IO uint32_t nCount)
{for(; nCount != 0; nCount--);
}
/*** 判斷指定長度的兩個數據源是否完全相等,* 如果完全相等返回1,只要其中一對數據不相等返回0*/
uint8_t Buffercmp(const uint32_t* pBuffer, uint32_t* pBuffer1, uint16_t BufferLength)
{/* 數據長度遞減 */while(BufferLength--){/* 判斷兩個數據源是否對應相等 */if(*pBuffer != *pBuffer1){/* 對應數據源不相等馬上退出函數,并返回0 */return 0;}/* 遞增兩個數據源的地址指針 */pBuffer++;pBuffer1++;}/* 完成判斷并且對應數據相等 */return 1;  
}
/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

3、程序流程

1、定義存放比較結果的變量

2、HAL庫初始化,系統時鐘初始化,LED端口初始化、設置LED為紫色,DMA初始化

3、開啟DMA傳輸

4、等待DMA傳輸完成后,比較原數據與傳輸后的數據,如果不相同顯示紅色,否則藍色。

4、問題

1、移植野火的代碼到main.c文件時要注意將DMA句柄結構體實例化對象名稱修改為自動生成的名稱hdma_memtomem_dma1_channel1。

2、在配置DMA外設時注意

  /* Configure DMA request hdma_memtomem_dma1_channel1 on DMA1_Channel1 */hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;hdma_memtomem_dma1_channel1.Init.PeriphInc = DMA_PINC_ENABLE;hdma_memtomem_dma1_channel1.Init.MemInc = DMA_MINC_ENABLE;hdma_memtomem_dma1_channel1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;hdma_memtomem_dma1_channel1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;hdma_memtomem_dma1_channel1.Init.Mode = DMA_NORMAL;hdma_memtomem_dma1_channel1.Init.Priority = DMA_PRIORITY_MEDIUM;

3、? ? 要調用庫函數開啟DMA傳輸

	HAL_DMA_Start(&hdma_memtomem_dma1_channel1,(uint32_t)aSRC_Const_Buffer,(uint32_t)aDST_Buffer,BUFFER_SIZE);

4、??

	/* 等待DMA傳輸完成 */while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1,DMA_FLAG_TC1)==RESET){}   

中的DMA_FLAG_TC1要改為這個。

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

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

相關文章

HTML5 新增的主要標簽整理

一、語義化標簽&#xff08;讓網頁結構更清晰&#xff09; 1. <header> 和 <footer> 定義&#xff1a;表示網頁的「頂部區域」和「底部區域」。場景&#xff1a; <header>&#xff1a;放 Logo、導航欄、搜索框。<footer>&#xff1a;放版權信息、聯系…

Mysql數據庫高可用解決方案-Mysql Router

目錄 一.MySQL Router介紹 1. 什么是 MySQL Router&#xff1f; 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心組件 5. MySQL Router 的部署和配置 6. MySQL Router 的優勢 7. 注意事項 8. MySQL Router 與其他工具的對比 9. 總結 …

【學習筆記】機器學習(Machine Learning) | 第六周|過擬合問題

機器學習&#xff08;Machine Learning&#xff09; 簡要聲明 基于吳恩達教授(Andrew Ng)課程視頻 BiliBili課程資源 文章目錄 機器學習&#xff08;Machine Learning&#xff09;簡要聲明 摘要過擬合與欠擬合問題一、回歸問題中的過擬合1. 欠擬合&#xff08;Underfit&#x…

當算力遇上堵車:AI如何讓城市血管不再“血栓”?

目錄 一、算力治堵的“外科手術” 二、算力治堵的“內科檢查” 三、算力治堵的“中醫調理” 治堵如治水,算力是新時代的“大禹” “堵車”是每個大城市的通病,但鮮少有人意識到:交通擁堵的根源并非車輛過多,而在于車速過慢,不是因為堵車才慢,而是因為慢才堵車。中國工…

VM虛擬機安裝CentOS7.9

目錄 1.下載CentOS7.9 2.VM虛擬機選擇自定義&#xff0c;然后一直傻瓜式下一步 3.選擇編輯虛擬機設置&#xff0c;然后選擇剛剛下載的ISO 4.輸入 ip addr 獲取ip地址 5.用Xshell連接 1.下載CentOS7.9 鏈接&#xff1a;https://pan.baidu.com/s/1kW2gGWnbcjNtq4kz46LKVw?p…

文本解析到大模型應用

文本解析到到大模型應用 一、背景 最近接到一個比較惡心的工作&#xff0c;之前有個同事將很多個小的文檔整合到了一個大文檔中&#xff0c;同時暴露出一個新的問題&#xff0c;大的文檔雖然查找問題比較方便但是維護起來較為麻煩&#xff0c;所以需要將大的文檔按照標題拆分…

AWS虛擬專用網絡全解析:從基礎到高級實踐

導語 AWS虛擬專用網絡是連接企業本地數據中心與AWS云環境的關鍵橋梁。本文將深入探討AWS VPN的核心概念、配置方法、最佳實踐以及常見問題解決方案,助您構建安全、可靠的混合云網絡架構。 一、AWS VPN概述 1. 定義 AWS VPN是一種網絡服務,允許用戶通過加密隧道將本地網絡…

【含文檔+PPT+源碼】基于微信小程序的校園快遞平臺

項目介紹 本課程演示的是一款基于微信小程序的校園快遞平臺&#xff0c;主要針對計算機相關專業的正在做畢設的學生與需要項目實戰練習的 Java 學習者。 1.包含&#xff1a;項目源碼、項目文檔、數據庫腳本、軟件工具等所有資料 2.帶你從零開始部署運行本套系統 3.該項目附帶…

基于 Rancher 部署 Kubernetes 集群的工程實踐指南

一、現狀分析 在當今的云計算和容器化領域&#xff0c;Kubernetes&#xff08;K8S&#xff09;已經成為了容器編排和管理的事實標準。根據 Gartner 的數據&#xff0c;超過 70% 的企業在生產環境中使用 K8S 來管理容器化應用。然而&#xff0c;K8S 的安裝和管理對于許多企業來…

Windows服務器提權實戰:常見方法、場景與防御指南

在滲透測試中&#xff0c;??權限提升&#xff08;提權&#xff09;??是從低權限賬戶&#xff08;如IIS、Apache運行賬戶&#xff09;獲取系統管理員&#xff08;如SYSTEM&#xff09;權限的關鍵步驟。本文將從實戰角度解析Windows服務器提權的常見技術&#xff0c;并結合真…

C# | 基于C#實現的BDS NMEA-0183數據解析上位機

以下是一個基于C#實現的BDS NMEA-0183數據解析上位機的示例代碼,包含基礎功能和界面: using System; using System.Collections.Generic; using System.IO.Ports; using System.Windows.Forms; using System.Drawing; using System.Globalization;namespace BDS_NMEA_Viewer…

圖像增強技術:從基礎原理到企業級開發實戰

簡介 圖像增強技術是提升圖像質量、改善視覺效果和提高后續處理效果的核心方法。本文將全面解析圖像增強的五大核心技術:灰度級修正、圖像平滑、圖像銳化、圖像偽彩色處理和圖像幾何校正,并提供基于OpenCV和Elasticmagic的完整企業級開發實戰代碼。通過系統化的知識整理和可…

解決中文亂碼:字符編碼全攻略 - ASCII、Unicode、UTF-8、GB2312詳解

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家&#xff0c;歷代文學網&#xff08;PC端可以訪問&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移動端可微信小程序搜索“歷代文學”&#xff09;總架構師&#xff0c;15年工作經驗&#xff0c;精通Java編…

體系學習1:C語言與指針1——預定義、進制打印、傳參為數組

1、不對一段代碼進行編譯 #if 0 statement #endif2、輸出地址 int d[3]{1,2,3}; printf("%p",(void*)d);//p期待的是void*類型的數據3、不同進制的打印 int data 1200; char hed[9];//為\0預留位置&#xff01;&#xff01;&#xff01; sprintf(hed,"%08X&…

Java 基礎--數組(Array):存儲數據的“排排坐”

作者&#xff1a;IvanCodes 發布時間&#xff1a;2025年5月1日&#x1f913; 專欄&#xff1a;Java教程 大家好&#xff01;&#x1f44b; 咱們在編程時&#xff0c;經常需要處理一批相同類型的數據&#xff0c;比如班級里所有同學的成績 &#x1f4af;、一周每天的最高氣溫 …

CSS常用屬性_(進階)

目錄 1.尺寸單位與顏色 &#xff08;1&#xff09;尺寸 &#xff08;2&#xff09;顏色 常用2種 &#xff08;3&#xff09;顏色屬性值&#xff08;透明度&#xff09; 例如&#xff1a; 2.字體屬性font 例如&#xff1a; **順序 3.文本屬性 ?編輯例如&#xff1a; …

【RabbitMQ】保證消息不丟失

要確保 RabbitMQ 在消費者&#xff08;Python 服務&#xff09;重啟或掛掉時消息不丟失&#xff0c;需結合 消息持久化、確認機制&#xff08;ACK&#xff09; 和 死信隊列&#xff08;DLX&#xff09; 實現高可靠性&#xff1a; 1. 消息持久化&#xff08;Durability&#xff…

Python基本語法(控制語句)

#控制語句 Python語言的控制語句和其他編程語言類似&#xff0c;常用的有if…else、while、for語句。 案例2一7控制語句 第1組代碼&#xff0c;說明if-else語句&#xff1a; #1 print(\n1,if) x,y,z10,20,5 if x>y:print(x>y) else:print(x<y)輸出結果: 1,if x<…

并發設計模式實戰系列(10):Balking(猶豫模式)

&#x1f31f; 大家好&#xff0c;我是摘星&#xff01; &#x1f31f; 今天為大家帶來的是并發設計模式實戰系列&#xff0c;第10章Balking&#xff08;猶豫模式&#xff09;&#xff0c;廢話不多說直接開始~ 目錄 一、核心原理深度拆解 1. 狀態守護機制 2. 與狀態模式的…

【強化學習系列】貝爾曼方程

首先回顧狀態價值函數和動作價值函數的定義&#xff1a; 狀態價值函數 v π ( s ) v_\pi(s) vπ?(s)是從狀態 s s s出發&#xff0c;直至一幕結束后獲得的回報的期望值 動作價值函數 q π ( s , a ) q_\pi(s,a) qπ?(s,a)是從狀態 s s s出發&#xff0c;采取動作 a a a后&…