玩转STM32-直接存储器DMA(详细-慢工出细活)

news2024/11/15 0:16:56

文章目录

  • 一、DMA介绍
    • 1.1 DMA简介
    • 1.2 DMA结构
  • 二、DMA相关寄存器(了解)
  • 三、DMA的工作过程(掌握)
  • 四、DMA应用实例
    • 4.1 DMA常用库函数
    • 4.2 实例程序

一、DMA介绍

1.1 DMA简介

DMA用来提供外设与外设之间、外设与存储器之间、存储器与存储器之间的高速数据传输,无需CPU干预,数据可以通过DMA快速传输,节省CPU的资源。
在实现DMA传输时,由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移的问题,即DMA传输前,CPU把总线控制权交给DMA控制器,在结束DMA传输后,DMA控制器立即把总线控制权交回CPU。
一个完整的DMA传输过程包括DMA请求、DMA响应、DMA传输、DMA结束等4个步骤。
(1)DMA请求:CPU对DMA控制器初始化,并向IO接口发出操作命令,IO接口提出DMA请求。
(2)DMA响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知IO接口开始DMA传输。
(3)DMA传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与IO接口进行DMA传输。在DMA控制器的控制下,CPU只要提供传送数据的起始位置和数据长度,然后存储器和外设之间直接进行数据传输,CPU不参与传送过程。
(4)DMA结束:当完成规定的成批数据传送后,DMA控制器释放总线控制权,并向IO接口发出结束信号。当IO接口收到结束信号后,一方面停止IO设备的工作,另一方面向CPU提出中断请求,CPU响应中断,执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来程序。

1.2 DMA结构

STM32最多拥有两个DMA控制器,DMA1控制器拥有7个独立的可配置通道,DMA2有5个独立的可配置通道,每个通道用来管理来自一个或多个外设对存储器访问的请求。
DMA是AHB总线上的设备,它有2个AHB端口:一个是从端口,用于配置DMA;一个是主端口,用于设备间数据传输。两个AHB/APB桥在AHB和两个APB总线间提供同步连接。APB1操作速度限于36MHz,APB2操作速度限于72MHz。STM32F103的DMA结构图如下所示:
来自STM32F103手册
STM32的Cortex-M3核心和DMA控制器通过总线矩阵连接到Flash控制总线、SRAM总线和AHB总线,进而通过AHB总线连接到APB总线服务外设。
总线矩阵有两个主要特征:循环优先调度、多层结构和总线挪用。

  1. 循环优先调度
    NVIC和Cortex-M3处理器实现了高性能低延时中断调度。所有的Cortex-M3指令即可以在单周期内执行,也可以在总线周期上被中断。循环优先级调度能够确保CPU在必要时每两个总线周期就去访问其他总线。
  2. 多层结构和总线挪用
    多层结构允许两个主设备并行执行数据传输。使用总线挪用存取机制,CPU访问和DMA通过APB总线存取外设可以并行工作。DMA总线挪用机制使得总线利用效率更高。

DMA功能的是通过操作两类寄存器实现的:
一类是具有DMA功能的相关外设寄存器,主要来自外设开启DMA功能,例如在通用定时器中的DMA/中断使能寄存器、DMA控制寄存器和连续式的DMA地址寄存器。
另一类是DMA相关寄存器,用来设置DMA的具体工作方式,DMA相关寄存器包括DMA中断状态寄存器(DMA_ISR)、DMA中断标志清除寄存器(DMA_IFCR)等。

二、DMA相关寄存器(了解)

  1. DMA中断状态寄存器——DMA_ISR
    该寄存器保存着DMA中断的状态。
    在这里插入图片描述
    在这里插入图片描述

  2. DMA中断标志清除寄存器——DMA_IFCR
    该寄存器用来清除DMA中断标志。
    在这里插入图片描述

  3. DMA通道x配置寄存器——DMA_CCRx
    该寄存器用来配置DMA工作模式。
    在这里插入图片描述
    在这里插入图片描述

  4. DMA通道x传输数量寄存器——DMA_CNDTRx
    该寄存器用来配置DMA传输数据量。
    在这里插入图片描述

  5. DMA通道x外设地址寄存器——DMA_CPARx
    该寄存器用来配置DMA通道外设地址。
    在这里插入图片描述

  6. DMA通道x存储器地址寄存器——DMA_CMARx
    该寄存器用来配置DMA通道存储器地址。
    在这里插入图片描述

三、DMA的工作过程(掌握)

1. DMA传送
当发生一个事件后,外设发送一个时间请求信号到DMA控制器,DMA控制器根据通道的优先权来处理请求。当DMA控制器开始访问外设时,DMA控制器首先向外设发送一个应答信号;外设得到应答信号后立即撤销请求;外设撤销请求后,DMA控制器同时撤销应答信号。如果载磁发生请求,外设则可以启动下次传送。每个DMA传送由以下3个操作组成;
(1) 从外设数据寄存器或由DMA_CMARx寄存器指定地址的存储单元执行加载操作。(取数据)
(2)存储数据到外设数据寄存器或存数据到DMA_CMARx寄存器指定地址的存储单元。(存储)
(3)执行依次DMA_CNDTRx寄存器的递减操作,该寄存器内容为完成的传输内容数量。
2. 仲裁器
仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段:
(1)软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级: 最高优先级、高优先级 、中等优先级 、低优先级。
(2)硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。举个例子,通道2优先于通道4。
3. DMA通道
每个通道都可以在有固定地址的外设寄存器和存储器地址之间执行DMA传输。DMA传输的数据量是可编程的,最大达到65535。包含要传输的数据项数量的寄存器,在每次传输后递减。
(1)传输的数据量
外设和存储器的传输数据量可以通过DMA_CCRx寄存器中的PSIZE和MSIZE位编程。
(2)指针自增
通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以有选择地完成自动增量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决与所选的数据宽度为1、2或4。第一个传输的地址是存放在DMA_CPARx /DMA_CMARx寄存器中地址。
(3)通道配置过程
下面是配置DMA通道x的过程(x代表通道号):
①在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。
② 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址。
③ 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
④ 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。
⑤ 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
⑥ 设置DMA_CCRx寄存器的ENABLE位,启动该通道。
⑦一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。
⑧当传输一半的数据后,半传输标志(HTIF)被置1,当设置了允许半传输中断位(HTIE)时,将产生一个中断请求。在数据传输结束后,传输完成标志(TCIF)被置1,当设置了允许传输完成中断位(TCIE)时,将产生一个中断请求。
(4)循环模式
循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。
(5)存储器到存储器模式
DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。 当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。
4. 错误管理
读写一个保留的地址区域,将会产生DMA传输错误。当在DMA读写操作时发生DMA传输错误时,硬件会自动地清除发生错误的通道所对应的通道配置寄存器(DMA_CCRx)的EN位,该通道操作被停止。此时,在DMA_IFR寄存器中对应该通道的传输错误中断标志位(TEIF)将被置位,如果在DMA_CCRx寄存器中设置了传输错误中断允许位,则将产生中断。
5. DMA请求映射
从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、2、3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。
在这里插入图片描述

四、DMA应用实例

4.1 DMA常用库函数

函数名称功能
DMA_DeInit将DMA的通道x寄存器重设为缺省值
DMA_Init根据DMA_InitStruct中指定的参数初始化DMA通道x寄存器
DMA_StructInit把DMA_InitStruct中的每一个参数按缺省值填入
DMA_Cmd使能或使能指定的通道x
DMA_ITConfig使能或是能指定的通道x中断
DMA_GetCurrDataCounte返回当前DMA通道x剩余的待传输数据数目
DMA_GetFlagStatus检查指定的DMA通道x标志位设置与否
DMA_ClearFlag清除DMA通道x待处理标志位
DMA_GetITStatus检查指定的DMA通道x中断发生与否
DMA_ClearITPendingBit清除DMA通道x中断待处理标志位

4.2 实例程序

  1. 实例介绍: 利用DMA将Flash中的32位数据缓冲区的内容传送到RAM中所定义的缓冲区内。传输完成后产生传输完成中断,最后将源缓冲区中数据与目的缓冲区中数据对比来检测所有数据是否传输正确。
  2. 实例
    (1)DMA初始化
void DMADriver_Init(void)
{
		DMA_InitTypeDef DMA_InitStructure;
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
	
	// 外设基地址, 源地址
	DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SRC_Const_Buffer;
	// RAM基地址, 目的地址
	DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DST_Buffer;
	// 传输方向,外设为源地址
	DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
	// 缓冲区大小, 0~65536
	DMA_InitStructure.DMA_BufferSize = BufferSize;
	// 外设地址自增1
	DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
	// RAM地址自增1
	DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
	// 外设数据宽度
	DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  // 字,4个字节
	// RAM数据宽度
	DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
	// 传输模式 一次传送
	DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
	// 优先级
	DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	//内存到内存传输
	DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;
	DMA_Init(DMA1_Channel1,&DMA_InitStructure);
	// 传输完成中断
	DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);
	// 开始传输前数据量
	CurrDataCounterBegin = DMA_GetCurrDataCounter(DMA1_Channel1);
	// 开启DMA
	DMA_Cmd(DMA1_Channel1,ENABLE);
}

(2)中断处理函数

void DMA1_Channel1_IRQHandler(void)
{
	// 检测DMA1通道1传输完成中断
	if(DMA_GetITStatus(DMA1_IT_TC1))
	{
		// 传输完成后得到当前计数
		CurrDataCounterEnd = DMA_GetCurrDataCounter(DMA1_Channel1);
		// 清除标志位
		DMA_ClearITPendingBit(DMA1_IT_TC1);
	}
}

(3)串口初始化在前几章有写过,这里就不介绍了

// 定义存储大小
#define BufferSize   32

uint32_t CurrDataCounterBegin = 0;
uint32_t CurrDataCounterEnd = 0x01;
const uint32_t SRC_Const_Buffer[BufferSize] = {
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910,
0x01022231,0x19234012,0x02348192,0x19384910};
uint32_t DST_Buffer[BufferSize];


void main()
{
	UsartDriver_Init();
	DMADriver_Init();
	Delay_ms(10);
	
	while(CurrDataCounterEnd  != 0);
	printf("Complete transfer!\r\n")
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1712009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML静态网页成品作业(HTML+CSS)——家乡芷江侗族自治县介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

深入解析数据库中的连接方法:四种关键技巧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、连接方法的重要性 二、左连接(Left Join) 三、右连接&#xff…

干货 | 学习网络安全,推荐6个常用的安全知识在线手册(非常详细)零基础入门到精通,收藏这一篇就够了

排名不分先后,欢迎各位小伙伴下方留言评论补充 **VulDoc ** 包含:IOT安全,Web安全,系统安全 地址:http://47.112.148.3:8000/ **滴水逆向学习笔记 ** 包含 汇编 C C Win32 MFC 网络编程 数据库 数据…

开源自定义表单系统源码 一键生成表单工具 可自由DIY表单模型+二开

分享一款开源自定义表单系统源码,能够实现99%各行业的报名、预约、加盟申请、调查等应用,而且同时多开创建多个表单,支持自定义各种字段模型,市面上需要的表单模型都含了,随便自定义啦,含完整的代码包和详细…

Windows找出权限维持的后门

Windows权限维持主要包含活动隐藏、自启动等技术。 隐藏文件 利用文件属性 最简单的一种隐藏文件的方式,文件右键属性,勾选隐藏,点击确定后,在这个文件里看不到刚刚的文件了。 如果要让文件显示出来,就点击查看&…

图像处理中的维度元素复制技巧

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、维度元素复制的基本概念 三、如何实现维度元素复制 1. 方法介绍 2. 代码示…

java大学城水电管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的大学城水电管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 大学城水电管理系统的…

C++ | Leetcode C++题解之第118题杨辉三角

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {vector<vector<int>> ret(numRows);for (int i 0; i < numRows; i) {ret[i].resize(i 1);ret[i][0] ret[i][i] 1;for (int j 1; j &…

批量视频剪辑神器:高效提取随机秒数画面,轻松实现视频素材精准筛选!

在数字化时代&#xff0c;视频内容已成为我们生活中不可或缺的一部分。无论是个人创作者还是专业团队&#xff0c;都需要对视频素材进行高效处理。然而&#xff0c;面对大量的视频文件&#xff0c;如何快速提取出我们所需的画面片段&#xff0c;却成为了一个令人头疼的问题。今…

【Unity入门】认识Unity编辑器

Unity 是一个广泛应用于游戏开发的强大引擎&#xff0c;从 1.0 版本开始到现在&#xff0c;其编辑器的基本框架一直保持稳定。其基于组件架构的设计&#xff0c;使得界面使用起来直观且高效。为了更好地理解 Unity 的界面&#xff0c;我们可以将其比喻为搭建一个舞台。以下是对…

ScrumMaster认证机构及CSM、PSM、RSM价值比较

企业现有的经营管理模式和传统的瀑布式交付模式&#xff0c;已经不能适应快速变化的市场响应和客户需求&#xff0c;现代的敏捷工作方式在过去数年涌现&#xff0c;比如Scrum&#xff0c;XP&#xff0c;看板&#xff0c;DevOps等敏捷方法&#xff0c;近十年Scrum在国内企业中备…

建立SFTP服务器

文章目录 建立SFTP服务器1. 使用VMware安装CentOS 7虚拟机。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot改为yes&#xff09;并重启网络服务&#xff0c;查看相应IP地址&#xff0c;并使用远程连接软件进行连接。3. 配置yum源&#xf…

C++STL---模拟实现string

我们这篇文章进行string的模拟实现。 为了防止标准库和我们自己写的string类发生命名冲突&#xff0c;我们将我们自己写的string类放在我们自己的命名空间中&#xff1a; 我们先来搭一个class string的框架&#xff1a; namespace CYF{ public://各种成员函数 priva…

【VTKExamples::Utilities】第十五期 ShepardMethod

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ShepardMethod,并解析接口vtkShepardMethod,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ…

【自动化运营】PlugLink 1.0开源版发布

什么是PlugLink&#xff1f; PlugLink&#xff0c;顾名思义&#xff0c;就是插件的链接。它旨在帮助个人和小微企业实现运营自动化&#xff0c;通过链接脚本、API、AI大模型等&#xff0c;实现全自动工作流程。你可以把PlugLink看作一个巨大的拼装积木&#xff0c;每一个插件都…

基于springboot实现医疗挂号管理系统项目【项目源码+论文说明】

基于springboot实现医疗挂号管理系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&…

计算机tcp/ip网络通信过程

目录 &#xff08;1&#xff09;同一网段两台计算机通信过程 &#xff08;2&#xff09;不同网段的两台计算机通信过程 &#xff08;3&#xff09;目的主机收到数据包后的解包过程 &#xff08;1&#xff09;同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…

AlexNet神经网络训练

导包 import tensorflow as tffrom tensorflow.keras import datasets, layers, models 加载Fashion-MNIST数据集 (train_images, train_labels), (test_images, test_labels) datasets.fashion_mnist.load_data() 归一化像素值到[0, 1]区间 train_images, test_images t…

校园周边美食探索及分享平台,基于 SpringBoot+Vue+MySQL 开发的前后端分离的校园周边美食探索及分享平台设计实现

目录 一. 前言 二. 功能模块 2.1. 前台首页功能模块 2.2. 用户功能模块 2.3. 管理员功能模块 三. 部分代码实现 四. 源码下载 一. 前言 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0…

Aria2下载安装使用

这里写目录标题 下载Aria2 配置创建 aria2.conf 文件创建 aria2.session 文件 Aria2的使用基础使用多源下载多线程下载后台下载配置文件启动 AriaNg下载安装AriaNg配置AriaNg使用 Tracker 列表 aria2 是一款免费开源跨平台且不限速的多线程下载软件&#xff0c;其优点是速度快、…