STM32DMA

本文详细介绍了DMA(直接存储器存取)的概念及其在单片机中的应用。重点讲述了DMA如何通过建立数据传输通道,允许数据在存储器与外设之间传输而无需CPU干预,从而提高系统的整体效率。文章还探讨了DMA的不同工作模式,包括存储器到存储器、外设到存储器及存储器到外设,并提供了HAL库中DMA配置的具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DMA的作用

DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据, 但是不需要占用CPU,即在传输数据的时候,CPU可以干其他的事情,好像是多线程一样。 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是SRAM或者是FLASH。 DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道,这里的通道可以理解为传输数据的一种管道。要注意的是DMA2只存在于大容量的单片机中。

DMA外设要点概括

对于dma这个器件,就是建立起一个数据传输的通道

DMA的主要特性

主要有7各通道,源和目标的确立就是根据传输模式来选择
例如串口接收数据,将数据放到内存里就要通过DMA,外设到存储器的模式
例如存储器的数据,发送到外设里,通过串口的发送,用DMA来建立通道
存储器和存储器之间就相当于复制

dma传输的步骤

建立传输通道

存储器-》存储器
外设-》存储器
存储器-》外设

确立传输对象

具体功能
uart(源)–内存(目标)
内存数据给uart

敲定传输细节

确定由谁来发生dma请求,外设的dma请求对应通道
优先级
确定传输数据双方的数据格式
一般传输、循环传输
例如,如果使用adc器件,就需要不停采集,就需要循环传输
是否需要传送标志或者中断

HAL库中外设驱动的实现

句柄结构体 ——handletypedef

instance 它指向了外设内,一个具体的外设成员,如adc里的ADC1
,实例化一个具体的外设对象,实际上它用指针指向一个外设基地址

Init 指向了一个具体外设的初始化结构体,用来配置外设的工作参数

initTypedef 具体外设对象的初始化参数,
根据外设的各种配置寄存器,组织起来的外设参数配置结构体,内附在——handletypedef

DMA外设请求

串口不同选择的通道不同,instance确定外设具体的传输对象,对应外设请求

在这里插入图片描述

这张图主要是描述了DMA的工作模式主要是
存储器到存储器
外设到存储器
存储器到外设

在这里插入图片描述

HAL库的配置

1 先配置rcc–在clock里面变成HSE,72MHZ
2 在配置sys-变成serial wires模式
3 配置DMA
(1)如果是内存到内存,先点击DMA可以直接是如图软件内存到内存
(2) 配置外设为usart1,是外设到内存还是内存到外设,然后之间传输 的是字节还是half word,还有内存和外设之间的自增值
4 在配置串口的时候,一定记住配置成异步模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

然后是初始化的代码

void USART_DMA_Config(void)
{
  DEBUG_USART_DMA_CLK_ENABLE();  
     
  DMA_Handle.Instance=DEBUG_USART_DMA_STREAM;                            //数据流选择
                             
  DMA_Handle.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设HAL_DMA_Init(&DMA_Handle);
  DMA_Handle.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式/* Associate the DMA handle */
  DMA_Handle.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式__HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle); 
  DMA_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
  DMA_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
  DMA_Handle.Init.Mode=DMA_NORMAL;                            //外设普通模式
  DMA_Handle.Init.Priority=DMA_PRIORITY_MEDIUM;               //中等优先级
  
  HAL_DMA_Init(&DMA_Handle);
  /* Associate the DMA handle */
  __HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle); 
  
}

以上代码是存储器到外设里面init的初始化

在代码片,会用到的函数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值