STM32的DMA

news2024/11/24 12:52:51
DMA(Direct memory access)直接存储器存取,用来提供在外设和存储器之间或者存储
器和存储器之间的高速数据传输,无须CPU干预,数据可以通过DMA快速地移动,这就节
省了CPU的资源来做其他操作。
STM32有两个DMA控制器共12个通道(DMA1有7个通道,DMA2有5个通道),每个通
道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个
DMA请求的优先权。
3.1、DMA作用
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环
节, 主要涉及四种数据传输模式,其本质还是一样的,都是地址到地址的数据传
输。
外设到内存
内存到外设
内存到内存
外设到外设
3.2、 DMA传输相关参数
源地址
目标地址
数据传输量
...
3.3、DMA的主要特征
12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道,每个通
道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过
软件来配置:
同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很
高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 独立数据源和目标数据区的传输宽度包括字节、半字、全字,源地址和目标地址
必须按数据传输宽度对齐。
支持循环的缓冲器管理
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错)
FLASH、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和
目标
编程的数据传输数目:最大为65535
3.4、stm32DMA资源
3.4.1、DMA1控制器
从外设(TIMx[x=1、2、3、4]、ADC1、SPI1、SPI/I2S2、I2Cx[x=1、2]和USARTx[x=1、
2、3])产生的7个请求,通过逻辑或输入到DMA1控制器。
外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭
3.4.2、DMA2控制器
从外设(TIMx[5、6、7、8]、ADC3、SPI/I2S3、UART4、DAC通道1、2和SDIO)产生的5
个请
求,经逻辑或输入到DMA2控制器
外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭
注意:DMA2控制器及相关请求仅存在于大容量产品和互联型产品中
3.5、stm32DMA相关固件库函数说明
3.5.1、初始化函数
1 void DMA_Init ( DMA_Channel_TypeDef * DMAy_Channelx , \
2 DMA_InitTypeDef * DMA_InitStruct )
参数:
@DMAy_Channelx:DMA通道
y:1或2,用于选择DMA1或DMA2
x:对于DMA1:1-7,对于DMA2:1-5
@DMA_InitStruct:DMA配置结构体指针
1 typedef struct
2 {
3 uint32_t DMA_PeripheralBaseAddr ; // 外设地址
4 uint32_t DMA_MemoryBaseAddr ; // 存储器地址
5 uint32_t DMA_DIR ; // 传输方向
6 uint32_t DMA_BufferSize ; // 输出大小
7 uint32_t DMA_PeripheralInc ; // 外设地址增量模式
8 uint32_t DMA_MemoryInc ; // 存储器地址增量模式 9 uint32_t DMA_PeripheralDataSize ; // 外设数据宽度
10 uint32_t DMA_MemoryDataSize ; // 存储器数据宽度
11 uint32_t DMA_Mode ; // 模式选择
12 uint32_t DMA_Priority ; // 通道优先级
13 uint32_t DMA_M2M ; // 存储器到存储器模式
14 } DMA_InitTypeDef ;
传输方向:
1 #define DMA_DIR_PeripheralDST (( uint32_t ) 0x00000010 )
2 #define DMA_DIR_PeripheralSRC (( uint32_t ) 0x00000000 )
DMA通道x配置寄存器(DMA_CCRx):
外设地址增量模式:
1 #define DMA_PeripheralInc_Enable (( uint32_t ) 0x00000040 )
2 #define DMA_PeripheralInc_Disable (( uint32_t ) 0x00000000 )
存储器地址增量模式:
1 #define DMA_MemoryInc_Enable (( uint32_t ) 0x00000080 )
2 #define DMA_MemoryInc_Disable (( uint32_t ) 0x00000000 )
外设数据宽度:
1 #define DMA_PeripheralDataSize_Byte (( uint32_t ) 0x00000000 )
2 #define DMA_PeripheralDataSize_HalfWord (( uint32_t ) 0x00000100 )
3 #define DMA_PeripheralDataSize_Word (( uint32_t ) 0x00000200 )
存储器数据宽度
1 #define DMA_MemoryDataSize_Byte (( uint32_t ) 0x00000000 )
2 #define DMA_MemoryDataSize_HalfWord (( uint32_t ) 0x00000400 )
3 #define DMA_MemoryDataSize_Word (( uint32_t ) 0x00000800 )
4
模式选择(DMA_Mode):
1 #define DMA_Mode_Circular (( uint32_t ) 0x00000020 ) // 循环模式
2 #define DMA_Mode_Normal (( uint32_t ) 0x00000000 ) // 正常模式
通道优先级:
1 #define DMA_Priority_VeryHigh (( uint32_t ) 0x00003000 )
2 #define DMA_Priority_High (( uint32_t ) 0x00002000 )
3 #define DMA_Priority_Medium (( uint32_t ) 0x00001000 )
4 #define DMA_Priority_Low (( uint32_t ) 0x00000000 )
存储器到存储器模式: 1 #define DMA_M2M_Enable (( uint32_t ) 0x00004000 )
2 #define DMA_M2M_Disable (( uint32_t ) 0x00000000 )
3.5.2、DMA通道使能
1 void DMA_Cmd ( DMA_Channel_TypeDef * DMAy_Channelx , \
2 FunctionalState NewState )
3.5.3、DMA中断配置
1 void DMA_ITConfig ( DMA_Channel_TypeDef * DMAy_Channelx , uint32_t DMA_IT , \
2 FunctionalState NewState )
3.5.4、其他辅助函数
DMA清除中断挂起
1 void DMA_ClearITPendingBit ( uint32_t DMAy_IT )
DMA获取中断状态
1 ITStatus DMA_GetITStatus ( uint32_t DMAy_IT )
获取传输剩余个数
1 uint16_t DMA_GetCurrDataCounter ( DMA_Channel_TypeDef * DMAy_Channelx )
3.6、memory to memory实例
使用DMA的M2M模式从内嵌flash拷贝数据到sram中:
1 //32 4 字节数据
2 0x01020304 , 0x05060708 , 0x090A0B0C , 0x0D0E0F10 ,
3 0x11121314 , 0x15161718 , 0x191A1B1C , 0x1D1E1F20 ,
4 0x21222324 , 0x25262728 , 0x292A2B2C , 0x2D2E2F30 ,
5 0x31323334 , 0x35363738 , 0x393A3B3C , 0x3D3E3F40 ,
6 0x41424344 , 0x45464748 , 0x494A4B4C , 0x4D4E4F50 ,
7 0x51525354 , 0x55565758 , 0x595A5B5C , 0x5D5E5F60 ,
8 0x61626364 , 0x65666768 , 0x696A6B6C , 0x6D6E6F70 ,
9 0x71727374 , 0x75767778 , 0x797A7B7C , 0x7D7E7F80
stm32的内嵌flash中存放的是code和const修饰的变量值
4.dma数据传输示例
1、User目录新建dma_mtom.h和dma_mtom.c文件,通过三色板文件添加按钮添加文件
2、编写dma_mtom.c代码
2.1在外设库定义文件找到RCC_AHBPeriphClockCmdASB总线的外部使能函数
3.编译
4.没有错误
5.下载程序到STM32单片机中进行调试
6.按下复位按键
7.黄灯和红灯亮了,代表p13的引脚写入成功

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

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

相关文章

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 (一)随机变量 (二)全概率公式 (三)高斯分布及其性质 二、似然是什么? (一)概率和似然 (二)极大似然估计 …

Linux内核之Binder驱动container_of进阶用法(三十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

EasyRecovery2024汉化精简版,无需注册

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作,它是一个威力非常强大的硬盘数据恢复软件。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东,它主要是在内存中重建文件分区表使数据能够安全地传输…

ctfshow web入门 XXE

XXE基础知识 XXE(XML External Entity)攻击是一种针对XML处理漏洞的网络安全攻击手段。攻击者利用应用程序在解析XML输入时的漏洞,构造恶意的XML数据,进而实现各种恶意目的。 所以要学习xxe就需要了解xml xml相关: …

Chrome浏览器 安装Vue插件vue-devtools

前言 vue-devtools 是一个为 Vue.js 开发者设计的 Chrome 插件。它可以让你更轻松地审查和调试 Vue 应用程序。与普通的浏览器控制台工具不同,Vue.js devtools 专为 Vue 的响应性数据和组件结构量身定做。 1. 功能介绍 组件树浏览:这个功能可以让你查…

使用Python实现ID3决策树中特征选择的先后顺序,字节跳动面试真题

def empty1(pri_data): hair [] #[‘长’, ‘短’, ‘短’, ‘长’, ‘短’, ‘短’, ‘长’, ‘长’] voice [] #[‘粗’, ‘粗’, ‘粗’, ‘细’, ‘细’, ‘粗’, ‘粗’, ‘粗’] sex [] #[‘男’, ‘男’, ‘男’, ‘女’, ‘女’, ‘女’, ‘女’, ‘女’] for o…

OpenHarmony error: signature verification failed due to not trusted app source

问题:error: signature verification failed due to not trusted app source 今天在做OpenHarmony App开发,之前一直用的设备A在测试开效果,今天换成了设备B,通过DevEco Studio安装应用程序的时候,就出现错误&#xf…

爱上数据结构:栈和队列的概念及使用

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:数据结构 ​ 一、栈 1.栈的基本概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,…

不同Python版本和wxPython版本用pyinstaller打包文件大小对比

1、确定wxPython和Python版本的对应关系 在这里可以找到Python支持的所有wxPython版本:https://pypi.tuna.tsinghua.edu.cn/simple/wxpython/ 由于Python从3.6版本开始支持f字符串、从3.9版本开始不支持Windows7操作系统,所以我仅筛选3.6-3.8之间的版本…

qupath再度更新:使用WSInfer进行深度学习

Open and reusable deep learning for pathology with WSInfer and QuPath Open and reusable deep learning for pathology with WSInfer and QuPath | npj Precision Oncology (nature.com) 以前:数字病理图像分析的开源软件qupath学习 ①-CSDN博客 背景 深度学…

HarmonyOS实战开发-如何实现一个自定义抽奖圆形转盘

介绍 本篇Codelab是基于画布组件、显式动画,实现的一个自定义抽奖圆形转盘。包含如下功能: 通过画布组件Canvas,画出抽奖圆形转盘。通过显式动画启动抽奖功能。通过自定义弹窗弹出抽中的奖品。 相关概念 Stack组件:堆叠容器&am…

统计XML文件内标签的种类和其数量及将xml格式转换为yolov5所需的txt格式

1、统计XML文件内标签的种类和其数量 对于自己标注的数据集,需在标注完成后需要对标注好的XML文件校验,下面是代码,只需将SrcDir换成需要统计的xml的文件夹即可。 import os from tqdm import tqdm import xml.dom.minidomdef ReadXml(File…

Day62-Nginx四层负载均衡及结合7层负载均衡实践

Day62-Nginx四层负载均衡及结合7层负载均衡实践 1. 什么是四层负载均衡?2. 四层负载均衡的常用场景3. 百万并发百亿PV大规模架构4. L4和L7的区别及常用软件。5. lvs、nginx、haproxy区别6. nginx四层负载均衡(tcp/ip,ip:port)7. n…

python多方式操作elasticsearch介绍

python多方式操作elasticsearch介绍 1. requests模块操作ES ​ requests 是一个 Python HTTP 库,它简化了发送 HTTP 请求和处理响应的过程。通过 requests 模块,开发人员可以轻松地与 Web 服务进行通信,包括获取网页内容、执行 API 请求等。…

JavaScript(一)---【js的两种导入方式、全局作用域、函数作用域、块作用域】

一.JavaScript介绍 1.1什么是JavaScript JavaScript简称“js”&#xff0c;js与java没有任何关系。 js是一种“轻量级、解释型、面向对象的脚本语言”。 二.JavaScript的两种导入方式 2.1内联式 在HTML文档中使用<script>标签直接引用。 <script>console.log…

跨越时空,启迪智慧:奇趣相机重塑儿童摄影与教育体验

【科技观察】近期&#xff0c;奇趣未来公司以其创新之作——“奇趣相机”微信小程序&#xff0c;强势进军儿童AI摄影市场。这款专为亚洲儿童量身定制的应用&#xff0c;凭借精准贴合亚洲儿童面部特征的AIGC大模型&#xff0c;以及丰富的摄影模板与场景设定&#xff0c;正在重新…

【每日跟读】常用英语500句(400~500)

【每日跟读】常用英语500句 Where can I buy a ticket? 在哪里能买到票&#xff1f; When is the next train? 下趟火车什么时候到&#xff1f; Thank you so much for helping me move yesterday. 非常感谢你昨天帮我搬家 I’m feeling a little under the weather toda…

与webpack类似的工具还有哪些?区别?

文章目录 一、模块化工具二、详细对比RollupParcelSnowpackVitewebpack 参考文献 一、模块化工具 模块化是一种处理复杂系统分解为更好的可管理模块的方式 可以用来分割&#xff0c;组织和打包应用。每个模块完成一个特定的子功能&#xff0c;所有的模块按某种方法组装起来&a…

吴恩达2022机器学习专项课程(一) 4.1 梯度下降

问题预览 梯度下降算法的作用是&#xff1f;梯度下降的过程&#xff1f;梯度下降和最小化成本函数的联系&#xff1f;所有的成本函数都是一个形状吗&#xff1f;在非凸形状中&#xff0c;梯度下降的更新过程是&#xff1f;在非凸形状中&#xff0c;不同的初值对最小化成本函数…

量化交易入门(三十二)什么是BIAS指标以及它的优缺点

BIAS&#xff0c;中文名称为“乖离率”&#xff0c;是量化交易中常用的一种技术指标&#xff0c;主要用于衡量价格偏离移动平均线的程度。下面我将从原理、优缺点和应用三个方面对BIAS指标进行详细讲解。 一、BIAS指标的原理 BIAS指标的计算公式为&#xff1a;BIAS(当前收盘价…