【STM32学习3】DMA基础操作

stm32入门教程——DMA介绍之memory to memory 4. **设置传输方向、增量模式和数据宽度**:在DMA_CCRx中配置数据传输的方向(是否从外设到内存或相反)、是否在传输后递增地址(增量模式)以及数据的宽度(字节、半字或全字)。1. **设置源地址和目标地址**:在DMA的通道x外设地址寄存器(DMA_CPARx)和通道x内存地址寄存器(DMA_CMARx)中分别设置外设和内存的地址。2. **配置DMA请求**:在STM32CubeMX中,选择DMA2控制器,并创建一个新的DMA请求,选择“MEMTOMEM”作为请求类型。 阅读详情

前言

        介绍了DMA的基础概念以及存储器到存储器、存储器到外设两种DMA的使用方式。


一、DMA基础概念

        DMA(Direct Memory Access)翻译过来就是直接存储器访问,顾名思义就是能够直接访问存储器的一个外设。传输数据是单片机的一个重要工作任务,比如各种传感器传输给单片机的数据,以及处理完成的数据要传输给上位机。如果这些任务全部交给CPU核心,那么可能太占用资源,导致CPU来不及处理其它的任务。DMA是STM32里独立于CPU的外设,专门用于传输数据,这样我们可以把传输数据的任务交给DMA完成,计算等其他任务交给CPU,最大化发挥单片机的性能。

        根据数据的位置,DMA有三种工作方式,即外设到存储器、存储器到外设以及存储器到存储器。外设到存储器就比如传感器采样后通过ADC将数据传入存储器;存储器到外设就比如通过串口向上位机发送数据;而存储器到存储器可以用于FLASH向SRAM复制数据。

        其中有关外设的工作方式需要外设向DMA控制器发出请求,DMA做出应答后才能进行数据传输。STM32F1系列芯片中有DMA1与DMA2两个DMA控制器,分别有7个通道与5个通道,每个通道对应着不同的外设请求,外设都要通过专门的通道发出请求才能完成数据的传输。

以下介绍在使用HAL库时如何设置存储器到存储器DMA传输、存储器到外设DMA传输 。

二、存储器到存储器DMA传输

        通过STM32CubeIDE(或者STM32CubeMX),我们可以十分快速的完成DMA基础配置。选择MEMTOMEM(memory to memory),普通传输模式,数据源与目的地地址均设为增量模式,数据单位为word(32位)。

  • 传输模式:普通Normal:每调用一次DMA只执行一次数据传输循环;Circular:调用一次DMA后就重复执行数据传输。
  • 地址增量模式Increment Address:设置每完成一次传输地址是否增加。若设置为是,则下一次传输下一个地址的数据;否则反复传输同一个地址的数据。一般存储器设置为增量模式,而外设不用设置。
  • 每次传输的数据量:Byte——1字节、Half Word——2字节、Word——4字节。

        完成初始化配置后,我们尝试通过DMA将FLASH中的数据传输到SRAM中,首先定义数据源数组SRC_Buffer、目的地数组DST_Buffer以及数据长度BUFFER_SIZE,数据类型为uint32_t,通过const关键字将数据源数组定义在FLASH中。

#define BUFFER_SIZE 32

const uint32_t SRC_Buffer[BUFFER_SIZE] = {
		0x01020304,0x05060708,0x090A0B0C,0X0D0E0F10,
		0x11020304,0x15060708,0x190A0B0C,0X1D0E0F10,
		0x21020304,0x25060708,0x290A0B0C,0X2D0E0F10,
		0x31020304,0x35060708,0x390A0B0C,0X3D0E0F10,
		0x41020304,0x45060708,0x490A0B0C,0X4D0E0F10,
		0x51020304,0x55060708,0x590A0B0C,0X5D0E0F10,
		0x61020304,0x65060708,0x690A0B0C,0X6D0E0F10,
		0x71020304,0x75060708,0x790A0B0C,0X7D0E0F10,
};

uint32_t DST_Buffer[BUFFER_SIZE];

根据之前的设置,CubeIDE程序已经在dma.c中帮我们初始化了以下代码:

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();
  }

}

 可以看到我们选择的通道、模式以及传输数据大小都设置到了结构体hdma_memtomem_dma1_channel1中,接下来通过函数HAL_DMA_Start我们就可以完成DMA数据传输。这里我们要设置HAL状态变量供HAL_DMA_Start返回传输状态。

HAL_StatusTypeDef DMA_status = HAL_ERROR;

DMA_status = HAL_DMA_Start(&hdma_memtomem_dma1_channel1, (uint32_t)SRC_Buffer, (uint32_t)DST_Buffer, BUFFER_SIZE);

传输完成后,可以通过如下函数比较二者数据的一致性

TransferStatus = Buffer_cmp(SRC_Buffer, DST_Buffer, BUFFER_SIZE);

uint8_t Buffer_cmp(const uint32_t* pBuffer, uint32_t* pBuffer1, uint16_t BufferLength)
{
	while(BufferLength--){
		if(*pBuffer != *pBuffer1){
			return 0;
		}
		pBuffer++;
		pBuffer1++;
	}

	return 1;
}

三、存储器到外设DMA传输

        存储器到外设DMA传输的典型应用是单片机通过串口向上位机(电脑)传输数据,在上位机上可以通过串口助手显示传上来的数据。我们采用USART1_TX串口1的发送功能完成这次传输。首先在CubeIDE中配置DMA基本设置:

根据DMA1各通道对应的外设请求,选择DMA1的通道4完成串口1的发送。发送设置为循环模式,外设地址非增量、存储器地址增量,传输数据单位长度为1字节。

        DMA初始化代码如下,注意该段代码在usart.c文件中,不再是dma.c。

/* USART1 DMA Init */
    /* USART1_TX Init */
    hdma_usart1_tx.Instance = DMA1_Channel4;
    hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
    hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
    hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
    hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
    hdma_usart1_tx.Init.Mode = DMA_NORMAL;
    hdma_usart1_tx.Init.Priority = DMA_PRIORITY_MEDIUM;
    if (HAL_DMA_Init(&hdma_usart1_tx) != HAL_OK)
    {
      Error_Handler();
    }

        代码初始化完成后,设置待传输数据长度以及数组,然后在数组里填入待发送的数据,这里我们选择全部发送字符“A”。

#define SENDBUFF_SIZE 10

uint8_t SendBuff[SENDBUFF_SIZE];
for(uint16_t i=0; i<SENDBUFF_SIZE; i++){
	  SendBuff[i] = 'A';
  }

 然后通过函数HAL_UART_Transmit_DMA便可完成数据传输。

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)SendBuff, SENDBUFF_SIZE);

         由于采用了循环传输模式,数据量非常大,但都是通过DMA完成的,CPU还处于空闲状态,依旧可以完成其他的工作。


总结

        介绍了DMA基础概念以及存储器到存储器、存储器到外设两种DMA使用方式(HAL库、轮询使用)

STM32 | DMA配置和使用如此简单(超详细) DMA学习很难吗?其实DMA配置和使用如此简单!本文让你无论在DMA认识和理解上(抽象不抽象都有)还是在DMA配置和使用上有个彻彻底底的认识。文章包括寄存器和库函数讲解,省去你自行翻阅使用手册和固件库手册,点到点教会你DMA的配置和使用。 阅读详情

相关推荐

STM32f407 DMA

如果传输的数据量比较大,建议选择更高编号的数据流(2-7),可以提高数据传输的效率,减少CPU的处理负担。串口1:usart1 rx使用DMA2,数据流5,通道4,数据接收.usart1 tx使用DMA2,数据流7,通道4,数据发送。串口3:usart3 rx使用DMA1,数据流1,通道4,数据接收.usart3 tx使用DMA1,数据流3,通道4,数据发送。串口2:usart6 rx使用DMA2,数据流1,通道5,数据接收.usart6 tx使用DMA2,数据流6,通道5,数据发送。

m0_59949484的博客 3896

DMA方式

DMA方式

weixin_51711289的博客 2761

STM32自学之SPI的DMA操作(寄存器级)

STM32自学之SPI的DMA操作(寄存器级) 一、实验目标 学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。之后看可以利用DMA来实现什么功能~~~ 二、实验目的 加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题...

chao961015的博客 1万+

STM32学习-DMA介绍及一般使用方法

m0_52850679的博客 8471

STM32CubeMX 实现串口 DMA 通信

STM32CubeMX 实现串口 DMA 通信 文章目录STM32CubeMX 实现串口 DMA 通信1、了解DMA2、 DMA_ InitTypeDef 初始化结构体3、DMA接口函数4、STM32CubeMX 配置 DMA5、添加代码6、串口调试7、总结 1、了解DMA 直接存储器访问 (DMA) :用于在外设与存储器之间以及存储器与存储器之 间进行高速数据传输。DMA传输过程的初始化和启动由CPU完成,传输过 程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。 DMA数据传输的四

m0_56739646的博客 2352

STM32_基础入门(十二)_DMA

STM32_基础入门(十二)_DMA

weixin_50546241的博客 1857

STM32的DMA操作

DMA概述 Direct Memory Access 直接存储器访问 DMA传输将数据从一个地址空间复制到另一个地址空间 由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成 DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率 STM32中的DMA STM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个 DMA1有7个通道,DMA2有5个通道 每个通道专门用来管理来自于一个或多个外设对存储器访问的请求 还有一

Code for Coffee 8676

[STM32学习笔记] DMA

DMA(Direct Memory Access)直接存储器存取DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输外设一般指的是外设的数据毒存器DR, DataRegister,比如ADC的数据寄存器、串口的数据寄存器等等:存储器指的就是运行内存SRAM和程序存储器Flash,是我们存储变量数组和程序代码的地方12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)STM32F103C8T6 DMA资源:DMA1(7个通道)

qq_45984081的博客 852

STM32 DMA配置

作个搬运工,以下内容均来自: https://blog.csdn.net/gdjason/article/details/51019219 https://blog.csdn.net/u010280307/article/details/53334985 https://blog.csdn.net/faihung/article/details/78748033 https://blog.csdn...

yhy2690 6425

CEH Practical 实战考试真题与答案

CEH Practical 是 EC-Council 推出的Certified Ethical Hacker(CEH)认证项目中的一项高级动手实践考试。它不同于传统的理论考试,侧重于在真实环境中检验考生的实操能力。

sgafdgdagd的博客 960

AGV、RGV、四向车openTCS调度系统(三)车辆适配器解读,封装自己的适配器

AGV、RGV、四向车调度。理解适配器的整体作用,以及如何使用官方例子改造自己的适配器,

要这头发有何用 3599

STM32 DMA的学习理解以及配置

STM32 DMA的简单运用,对DMA参数的理解和实践运用,介绍了串口DMA接收和发送以及带FIFO的DMA使用,最后介绍了DMA的双缓冲功能。

SuperShuiShui’博客 4882

【unity小技巧】实现FPS射击游戏枪武器随镜头手臂摇摆效果(2025/12/11补充)

如果我们视角移动转向,武器如果不跟着进行摇摆,会感觉我们的动作很生硬,特别是射击类游戏,如下实现武器摇摆这里主要分享两种实现方法,一种是改变武器位置,一种是修改武器旋转想要使用哪种方法都可以,看你自己喜欢,如果是我,我会选择第二种,比较简单,参数也少,而且个人感觉效果也更好,已枪中心做旋转更符合现实。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1464

STM32之DMA

DMA(Direct MemoryAccess,直接存储器访问)提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于CPU,在这个时间中,CPU对于内存的工作来说就无法使用。

weixin_54076783的博客 8483

Redhawk: dynamic ir drop分析(Clock Buffer Clustering)

在dynamic分析中,ir drop问题多出现在三种情况下,缺power mesh,缺power switch,clock cell过于密集。 前两种情况通过选中具体instance查看min res path都比较容易分析出来,而且大部分问题都出现在channel里,这里不多做赘述。 clock cell过于密集这是观察结果,缺少报告支持,这里分享一下分析方法。 首先,选中压降超过signoff标准的instance,(Results->List of Worst Instance DVD中

m0_61544122的博客 5253

【车载以太网测试从入门到精通】系列文章目录汇总

物理层测试、数据链路层测试、以太网交换机测试、网络层测试、传输层测试、以太网TCP/IP协议自动化测试、以太网网络管理测试、以太网网络管理自动化测试、鲁棒性测试、SOME/IP测试、SOMEI/IP服务接口自动化测试、DoIP诊断测试、DoIP诊断自动化测试、DoIP BootLoader刷写、以太网网关路由测试、以太网网关路由自动化测试、AVB测试。

测试领域技术分享 3146

STM32之DMA学习

概述: 传统的DMA的概念是用于大批量数据的传输,但是我理解,在STM32中,它的概念被扩展了,也许更多的时候快速是其应用的重点。数据可以从1~65535个。 直接存储器存取(Direct Memory Access,DMA)是计算机科学中的一种内存访问技术。它允许某些电脑内部的硬体子系统(电脑外设),可以独立地直接读写系统存储器,而不需绕道 CPU。在同等程度的CPU负担下,DMA是一种快速的数据传送方式。它允许不同速度的硬件装置来沟通,而不需要依于 CPU的大量中断请求。【摘自数据手册】 现在越来越多的

qeekje的博客 2872

特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置

通过Solidworks导出机械臂的URDF模型文件,建立机械臂的各个关节坐标系的规则以及注意点,详细步骤

六眼飞鱼的博客 1万+

stm32学习-零基础学习DMA

介绍DMA的基本概念、寄存器及HAL库配置步骤,涵盖DMA硬件框图、优先级机制及典型应用。通过实例详解内存到内存和串口DMA传输的代码呈现。

m0_66756526的博客 1316

linux系统宝塔服务器temp文件夹里总是被上传病毒php脚本

服务器时不时的会发送短信说你服务器有病毒,找到了这个tmp文件,删除了之后又有了。确实是有很多人就这么无聊,每天都攻击你的服务器。找了很久的原因,网上也提供了一大堆方法,但都是很简陋的答案,具体怎么操作并没有说。没办法只能自己去排查这个问题。从两个角度来考虑,第一是服务器系统问题,比如宝塔的漏洞。但一时半会看不出问题来。只能去排查自己的项目代码。最后了解到代码确实是存在漏洞的。但代码中也确实了很多的校验,为什么会存在漏洞了?这就不得不从上传的过程开始说起。

guiplan 1488

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 215

STM32DMA学习日记

DMA,全称为:Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。是计算机的4种I/O方式中的一种。驱动函数关联寄存器功能描述**__**RCC_AHBENR使能DMAx时钟DMA_CCR初始化DMA开始DMA传输用来连接DMA和外设句柄使能DMA发送,启动传输DMA_ISR查询DMA传输通道的状态。

dianfu233的博客 1289

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

STM32单片机DMA串口数据收发

前言 本实验是在原子哥的DMA实验的基础上进行修改,添加了DMA串口数据接收功能。接收到指定数据时LED1的状态翻转。 注意:在编写DMA串口数据收发时,DMA发送和接收传输的数据量需要单独进行初始化,在每次传输数据时都需要进行初始化。 如下图所示: 一、STM32 DMA介绍 **DMA详尽介绍可网上查找,这里就不在细说。** 如果对DMA不是很了解可参考另一位博主的文章,很形象:(https://blog.csdn.net/zn2016/article/details/79030112) DMA直接

qq_36966968的博客 5991

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

STM32学习——DMA

DMA)直接存储器存取。CPU作为计算机的大脑,像数据传输这种简单,重复性高的工作交给CPU来做就显得有些浪费,所以DMA就来充当这一角色,DMA可以在硬件外设和存储器之间,或者是存储器与存储器之间进行高速数据转运,不需要CPU的介入,节省了cpu资源。在STM32中,有DMA1和DMA2两个,其中DMA1有7个通道,DMA2有5个通道,但是根据芯片型号的不同,DMA资源也有区别,具体还要参考手册。

2303_76686142的博客 2421

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

STM32 PWM+DMA

定时器2在APB1中线上,系统时钟是72M,TIM_Prescaler=0,.TIM_Period=89,一个周期就是1.25us,符合WS2812的时序,一个时钟时间是1/72=14ns,25*14ns=350ns符合0码,45*14=630ns符合1码时序。我使用的是PA1,定时器2通道2.再看一下DMA的配置,TIM2_CH2对应的DMA1通道是7.在确认主控硬件资源之后,先别急着敲代码,先了解一下WS2812的驱动方式。void Ws2812b_CloseAll(void)//熄灭。

fqm0_0的博客 3194
上一篇: 【STM32学习2】存储器相关概念与操作
下一篇: 【STM32学习4】STM32CubeIDE功能介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值