STM32--DMA详解

这篇具有很好参考价值的文章主要介绍了STM32--DMA详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、DMA简介

二、DMA实现过程

1.框图​编辑

2.DMA的处理过程 

 3.DMA仲裁器

4.DMA通道

 5.DMA寄存器

1`DMA中断状态寄存器(DMA_ISR)

2`DMA中断标志清除寄存器(DMA_IFCR)

3`DMA通道x配置寄存器(DMA_CCRx)(x = 1…7) ​

4`DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

5`DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)

6`DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)​

 6.DMA配置结构图

三、库函数使用


一、DMA简介

直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道, DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

最大传输量是65535,因为DMA_CNTR寄存器是16位有效的

1. DMA2仅存在于大容量产品和互联型产品。

2. SPI/I2S3、 UART4、 TIM5、 TIM6、 TIM7和DAC的DMA请求仅存在于大容量产品和互联型产品。

3. ADC3、 SDIO和TIM8的DMA请求仅存在于大容量产品

二、DMA实现过程

1.框图

由上图可知,DMA是AHB上的,SRAM,FLASH,外设都能申请DMA传输,DMA有多个通道 

2.DMA的处理过程 

在发生一个事件后,外设向DMA控制器发送DMA请求,DMA根据通道优先级处理请求。当DMA开始访问发送请求的外设是,会给外设一个应答,外设得到应答后就会立刻释放请求,与此同时DMA撤销应答信号,以便于处理下一个请求,开始下一个DMA传输。

总之,每次DMA传送由三个操作组成

1.从外设数据寄存器或者从我们指示的地址取数据,第一次开始地址是DMA_CPARx或 DMA_CMARx寄存器指定的外设基地址或存储器单元。

2.存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输

时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。
3.执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。       

 3.DMA仲裁器

仲裁器,顾名思义,就是在众多请求中选择一个最合适的。

DMA仲裁器依靠着通道的请求优先级来选择,优先级又分为软件和硬件优先级

硬件优先级:看排序,例如通道1>通道2

软件优先级:分为最高,高,中等,低 四个优先级,在DMA_CCRx寄存器中配置

注意:在大容量产品和互联型产品中, DMA1控制器拥有高于DMA2控制器的优先级!

4.DMA通道

DMA1:有7个通道,可以实现P->M,M->P,M->M                        

DMA2:有5个通道,可以实现P->M,M->P,M->M,只存在大容量或者互联型

P:外设  

M:闪存(flash,只读 存储器)、 SRAM

M->M时所有的通道都能使用

下图是各个外设的DMA通道,具体配置在下面讲解寄存器和库函数时进行 

stm32l0 dma,stm32,嵌入式硬件,单片机

stm32l0 dma,stm32,嵌入式硬件,单片机

stm32l0 dma,stm32,嵌入式硬件,单片机

 5.DMA寄存器

1`DMA中断状态寄存器(DMA_ISR)

stm32l0 dma,stm32,嵌入式硬件,单片机

TEIF是传输错误标志位,HEIF是通道的半传输标志位,TCIF是通道x的传输完成标志位

这三个都是在事件发生时,会由硬件自动置1,表示事件发生,我们可以通过DMA_IFCR寄存器相应位写入1来消除这些标志位

GIF是通道x的全局中断标志位,当上面三个事件发生其中一个时,就会被硬件自动置1,也是写入MDA_IFCR寄存器相应位为1来清除

2`DMA中断标志清除寄存器(DMA_IFCR)

stm32l0 dma,stm32,嵌入式硬件,单片机

CTEIFx:清除通道x的传输错误标志

CHTIFx:清除通道x的半传输标志

CTCIFx:清除通道x的传输完成标志

CGIFx : 清除通道x的全局中断标志

均是写入1清除标志位

3`DMA通道x配置寄存器(DMA_CCRx)(x = 1…7)
 stm32l0 dma,stm32,嵌入式硬件,单片机

 EN:使能位

TCIE,HTIE,TEIE都是中断使能位,给1使能

DIR:用来配置数据传输方向,即从哪读取数据,0外设,1存储器

CIRC:配置循环模式,就是进行完一次DMA传输之后是否继续进行下一次的传输

PINC,MINC:配置地址增量模式,即传输和存储的地址是否需要递增,例如,我们使用

                         M- >M模式,自己定义了两个数组,那么两个数组的地址都需要自动递增

                        才能实现对应存储。若我们使用的是数据寄存器,因为数据寄存器只有一

                        个地址,所以不递增

PSIZE,MSIZE:数据宽度,有8,16,32位 

                             少传多,高位补零;多传少,舍弃高位

PL:设置通道优先级

MEM2MEM:选择是M->M,还是P->M,M->P

以上这些都可以用库函数进行直接配置

4`DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7)

stm32l0 dma,stm32,嵌入式硬件,单片机

5`DMA通道x存储器地址寄存器(DMA_CMARx)(x = 1…7)

6`DMA通道x外设地址寄存器(DMA_CPARx)(x = 1…7)
stm32l0 dma,stm32,嵌入式硬件,单片机
 

stm32l0 dma,stm32,嵌入式硬件,单片机

 6.DMA配置结构图

stm32l0 dma,stm32,嵌入式硬件,单片机

传输计数器:递减,减到零后,自增的地址就会返回到起始地址。写入传输计数器的时候

                      必须先关闭使能DMA再写入--DMA_CNDTRx

自动重装器:是否恢复传输计数器的最初的值,即是否循环转运数据,自减,每传输一个

                     就自减一,直到减到0,表示传输完成

软件触发:以最快的速度连续不断的转运数据,一般用于存储器到存储器的转运,一般不

                 与循环模式同时使用

硬件触发:一般是外设,这些转运需要一定的时机,比如ADC转换完成,串口收到数据,

                 定时时间……

开关控制:DMA_Cmd函数

数据宽度:少传多,高位补零;多传少,舍弃高位

三、库函数使用

#include "bsp_dma.h"


//const使变量存放在flash中,非易失性存储器
const uint32_t aSRC_Const_Buffer[BUFFER_SIZE] 
= { 0x12345678,0x12345677,0x11111111,
																									        
    0x32165478,0x22554433,0x22335544,
																									 
    0x33554488,0x22333111,0x54646546};//原始数据-Source		
															
//stm32的变量存放在内部SRAM中,易失性存储器
uint32_t aDST_Buffer[BUFFER_SIZE];	
																								
void MtM_DMA_Config()
{
	DMA_RCC(DMA1_CLK,ENABLE);//开启AHB时钟
	
	DMA_InitTypeDef DMA_InitStruct;
	DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)aSRC_Const_Buffer;//外设基地址,数组本质上可以看作指针,我们需要给他强制类型转换为32位的地址	
	DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)aDST_Buffer;//存储器基地址
	DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;//外设当作Source,即传输方向为外设到寄存器
	DMA_InitStruct.DMA_BufferSize = BUFFER_SIZE;//传输的数据个数
	DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;//外设地址递增
	DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址递增
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//以一个字节接收
	DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//以一个字节发送
	DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;//不循环模式
	DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;//配置优先级
	DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;//使能M->M
	DMA_Init(DMA1_Channel1,&DMA_InitStruct);
	
	DMA_ClearFlag(DMA1_FLAG_TC1);//可以先清除传输完成标志位,以避免其他错误
	DMA_Cmd(DMA1_Channel1,ENABLE);
}

#ifndef __BSP_DMA_H
#define __BSP_DMA_H

#include "stm32f10x.h"

#define BUFFER_SIZE    9

#define DMA_RCC 		RCC_AHBPeriphClockCmd
#define DMA1_CLK  		RCC_AHBPeriph_DMA1
#define DMA2_CLK  		RCC_AHBPeriph_DMA2

extern uint32_t aDST_Buffer[BUFFER_SIZE];	
extern const uint32_t aSRC_Const_Buffer[BUFFER_SIZE];
void MtM_DMA_Config(void);
uint8_t Buffercmp(const uint32_t *Tra,uint32_t *Rec,uint32_t Num);


#endif

为了检测是否传输的数据正确,可以进行判断 

uint8_t Buffercmp(const uint32_t *Tra,uint32_t *Rec,uint32_t Num)
{
	while(Num--)
	{
		if(*Tra != *Rec)
		{
			return 10;
		}
		Tra++;
		Rec++;
	}
	return 255;
}

补充一点

stm32l0 dma,stm32,嵌入式硬件,单片机文章来源地址https://www.toymoban.com/news/detail-840117.html

到了这里,关于STM32--DMA详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32的定时器详解(嵌入式学习)

    想要了解STM32的时钟系统 点击这里跳转——》STM32的时钟系统(嵌入式学习) 建议先看看时钟树如何配置 点击这里跳转——》STM32的时钟树配置(嵌入式学习) 跳转——》STM32的时钟基础详解(嵌入式学习) 跳跳转——》STM32的时钟源详解(嵌入式学习) SysTick又称滴答定时

    2024年02月13日
    浏览(70)
  • 单片机STM32看门狗详解(嵌入式学习)

    单片机STM32的看门狗(Watchdog)是一种硬件定时器,用于监控系统的运行状态并在出现故障或死锁时采取措施以恢复正常操作。看门狗的主要功能是定期检查系统是否正常运行,并在系统出现问题时触发复位操作。 STM32系列单片机通常配备了内置的看门狗定时器(通常称为独立

    2024年02月13日
    浏览(63)
  • 嵌入式STM32 单片机 GPIO 的工作原理详解

    STM32的 GPIO 介绍 GPIO 是通用输入/输出端口的简称,是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以 STM32F103ZET6 芯片为例子,该芯片共有 144 脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为

    2024年02月20日
    浏览(50)
  • 嵌入式基础知识-DMA

    本篇来介绍DMA的一些基础知识。 DMA(Direct Memory Access),中文名为直接内存访问,它是一些计算机总线架构提供的功能,能使数据从附加设备(如磁盘驱动器)直接发送到计算机主板的内存上。对应嵌入式处理器来说,DMA可以提供外设和存储器之间,或存储器与存储器之间的高

    2024年02月09日
    浏览(43)
  • 【嵌入式系列】一文彻底理解DMA

    DMA用于在 外设 与 存储器 之间以及 存储器 与 存储器 之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。 我们用一个现实例子来做个类比。有一家冶炼公司,每天要不断的从矿场拉矿石进入厂区冶炼,以

    2023年04月19日
    浏览(96)
  • 嵌入式开发——DMA外设到内存

    加强理解DMA数据传输过程 加强掌握DMA的初始化流程 掌握DMA数据表查询 理解源和目标的配置 理解数据传输特点 能够动态配置源数据 需求 实现串口的数据接收,要求采用dma的方式。 数据交互流程 CPU配置好DMA 外部数据发送给串口外设 串口外设触发中断 CPU处理中断逻辑,通知

    2024年02月03日
    浏览(55)
  • STM32L0 ADC使用HAL库关于校准问题的说明

    最近是有一个产品用到了ADC,使用的是STM32L051 芯片,使用 STM32CubeMX 生成的代码,本来以为简简单单,但是在调用 HAL ADC校准函数的时候遇到一个问题有点疑问,度娘一下也没有找到解答,还是经过翻阅了一些资料才得到答案,特此来记录一下。 我是矜辰所致,全网同名,尽

    2024年02月02日
    浏览(52)
  • STM32--DMA详解

    目录 一、DMA简介 二、DMA实现过程 1.框图​编辑 2.DMA的处理过程   3.DMA仲裁器 4.DMA通道  5.DMA寄存器 1`DMA中断状态寄存器(DMA_ISR) 2`DMA中断标志清除寄存器(DMA_IFCR) 3`DMA通道x配置寄存器(DMA_CCRx)(x = 1…7) ​ 4`DMA通道x传输数量寄存器(DMA_CNDTRx)(x = 1…7) 5`DMA通道x存储器地址寄存器(D

    2024年03月15日
    浏览(45)
  • STM32——DMA详解

    小白需要系统的掌握微机原理的知识 DMA 全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。 DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留

    2024年02月10日
    浏览(44)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包