STM32的DMA使用记录

1.介绍

DMA(,直接存储器存取,是单片机的一个外设,主要功能用来搬运数据,不占用CPU,像多线程一样,数据传输支持外设到存储器,存储器到外设,存储器到存储器,存储器可以是SRAM,FLASH,DAM包含DMA1,DMA2,其中DMA1有7个通道,DMA2有5个通道,
在这里插入图片描述

2.DMA通讯过程

2.1 DMA请求
如果外设想要用DMA传输数据到存储器,必须先给DMA控制器发送DMA请求,控制器给外设一个应答信号,外设应答,DMA收到应答信号,就会启动DMA传输,直到传输完毕
2.2。通道
DMA1有7个通道,DMA2有5个通道,每个通道对应不同的外设,同一时间只能接收一个外设请求
在这里插入图片描述
在这里插入图片描述
2.3。仲裁器
当发生多个DMA请求时,由仲裁器管理,1.设置DMA_CCRx 寄存器的等级,非常高,高,中,低四个优先级,2.如果两个及以上的通道请求设置(软件)优先级相同,则看硬件,看通道编号,编号越低,优先级越高,
3.DMA数据配置
1,。外设到存储器,外设地址就是外设寄存器的地址,DMA存储区的地址就是我们自定义变量的地址, 方向设置外设地址为源地址
2.存储器到外设:,同上,方向设置外设为目标地址
3.存储器到存储器:以内部flash向SRAM存储数据为例,白内部flash地址当做一个外设地址,存储器地址为自定义变量的地址,方向设置外设Flash为源地址
4,。要传多少,单位是什么
传输多少有DMA_BufferSize定义传的数据个数,
源地址与目标地址数据宽度必须保持一致,单位是8/16/32位
在DMA 控制器的控制下,数据要想有条不紊的从一个地方搬到另外一个地方,还必须设置传输数据两边指针的增量模式,以串口向电脑发送数据为例,要发送的数据很多,每发送完一个,那么存储器的地址指针就应该加1,而串口数据寄存器只有一个,那么外设的地址指针就固定不变。具体的数据指针的增量模式由实际情况决定。
5.什么时候传输完成
查询标志位或者通过中断方式来鉴别,每个DMA在传输过半,传输完成,传输错误时都有相应的标志位,如果使能了该类型的中断后,就会产生中断,

3.软件

1.开启DMA时钟
2.设置源数据地址
3.设置目标数据地址(要传输的变量)
4.设置传输方向
DMA_DIR_PeripheralDST 存储器到外设DMA_DIR_PeripheralSRC 外设到存储器
5…设置传输大小,传输多少数据
6.设置外设地址递增还是不变
7.设置内存地址递增还是不变
8.设置外设数据宽度(8/16/32)传输数据位数
9.内存数据宽度(8/16/32)与外设一致
10.传输模式选择(一次或者循环)
11.优先级(非常高,高,中,低)
12.是否使能存储器到存储器模式(存储器到存储器传输使能,其他失能)
13.清除DMA传输完成标志
14.使能DMA

void DMA_Config(void)
{
	  DMA_InitTypeDef  DMA_InitStructure;
	
		// 开启DMA时钟
		RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
		// 源数据地址
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;
		// 目标地址
		DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;
		// 方向:外设到存储器(这里的外设是内部的FLASH)	
		DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
		// 传输大小	
		DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE;
		// 外设(内部的FLASH)地址递增	    
		DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
		// 内存地址递增
		DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
		// 外设数据单位	
		DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
		// 内存数据单位
		DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;	 
		// DMA模式,一次或者循环模式
		DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
		//DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  
		// 优先级:高	
		DMA_InitStructure.DMA_Priority = DMA_Priority_High;
		// 使能内存到内存的传输
		DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
		// 配置DMA通道		   
		DMA_Init( DMA1_Channel6, &DMA_InitStructure);
    //清除DMA数据流传输完成标志位
    DMA_ClearFlag(DMA_FLAG_TC);
		// 使能DMA
		DMA_Cmd(DMA_CHANNEL,ENABLE);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32DMA中断是指在STM32微控制器中使用DMA(Direct Memory Access,直接内存访问)时,可以通过配置中断来及时处理传输完成或错误的情况。DMA是一种用于实现高效数据传输的技术,它可以在不需要CPU干预的情况下,在外设和内存之间进行数据传输。 在STM32中,以下是使用DMA中断的基本步骤: 1. 配置DMA传输:首先,需要配置DMA控制器和相关外设的寄存器,以设置传输的源地址、目的地址、传输长度等参数。 2. 配置中断:然后,需要使能DMA中断并设置相关的中断优先级。可以通过设置DMA控制寄存器中的相应位来使能中断,并通过设置相应的中断优先级寄存器来设置中断优先级。 3. 编写中断处理函数:在DMA传输完成或出现错误时,会触发相应的DMA中断。需要编写一个中断处理函数来处理这些中断事件。在这个函数中,可以执行所需的操作,例如处理传输完成的数据、重新启动传输、记录错误等。 4. 中断服务函数注册:最后,需要将编写的中断处理函数注册到相应的中断向量表中。这样,在触发DMA中断时,系统会跳转到注册的中断处理函数进行处理。 需要注意的是,具体的配置和操作方法可能会根据使用STM32系列和开发环境而略有差异。因此,在实际开发中,建议参考所使用STM32系列的官方文档和相关的例程来进行配置和编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值