STM32的DMA

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的引脚写入成功

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOV8+Pyqt5光伏太阳能电池板目标检测系统

1、YOLOV8算法 YOLOv8 是当前效果较好的目标检测 算法,它的核心网络来源于 DarkNet-53,该网络初次在 YOLOv3[11] 中被引入,并深受 ResNet[12] 的影响。DarkNet-53 使用了残差机制,并连续添加了卷积模块来加强其功能性。 这 53 层…

Cortex‐M3/M4/M7内核的操作模式和特权等级介绍

0 前言 如果我们是基于MCU的裸机编程,是不需要关心内核的操作模式和特权等级的。如果是进行RTOS的开发编程,我们就要必要了解一下Cortex‐M3/M4/M7内核的操作模式和特权等级,这在RTOS的线程切换等场合会使用到。 1 Cortex‐M3/M4/M7内核的操…

栈————顺序栈和链式栈

目录 栈 顺序栈 1、初始化顺序栈 2、判栈空 3、进栈 4、出栈 5、读栈顶元素 6、遍历 链式栈 1、初始化链式栈 2、断链式栈是否为空判 3、入栈(插入) ​编辑​编辑 4、出栈(删除) 5、读取栈顶元素 6、输出链式栈中各个节点的值(遍历) 栈 …

Golang | Leetcode Golang题解之第2题两数相加

题目: 题解: func addTwoNumbers(l1, l2 *ListNode) (head *ListNode) {var tail *ListNodecarry : 0for l1 ! nil || l2 ! nil {n1, n2 : 0, 0if l1 ! nil {n1 l1.Vall1 l1.Next}if l2 ! nil {n2 l2.Vall2 l2.Next}sum : n1 n2 carrysum, carry …

(React组件基础)前端八股文Day6

一 类组件与函数组件有什么异同 在React中,类组件和函数组件是创建组件的两种主要方式。随着React的发展,尤其是自Hooks在React 16.8中引入以来,函数组件的功能变得更加强大,使得它们能够更加方便地与类组件相竞争。下面是类组件…

MySQL数据库(高级)

文章目录 1.MySQL约束1.主键细节说明演示复合主键 2.not null(非空)3.unique(唯一)细节说明演示 4.外键外键示意图使用细节演示 5.check演示 6.创建表练习答案 7.自增长演示细节 2.索引1.索引机制2.创建索引演示细节 3.删除索引4.…

【苹果MAC】苹果电脑 LOGI罗技鼠标设置左右切换全屏页面快捷键

首先键盘设置->键盘快捷键 调度中心 设置 f1 f2 为移动一个空间(就可以快捷移动了) 想要鼠标直接控制,就需要下载官方驱动,来设置按键快捷键,触发 F1 F2 安装 LOGI OPTIONS Logi Options 是一款功能强大且便于使用…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具,它与npm类似,但提供了一些额外的性能优化和一致性保证。 Yarn的使用: 初始化项目: yarn init 此命令会引导您创建一个新的package.json文件,用于记录项目的元信息和依赖。 添加依赖&…

38.HarmonyOS鸿蒙系统 App(ArkUI)堆叠布局结合弹性布局

层叠布局用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠,容器中的子元素(子组件)依次入栈,后一个子元素覆盖前一个子元素,子元素…

神经网络与深度学习(一)误差反传BP算法

误差反传BP算法 1多层感知机1.1XOR问题1.2多层感知机 2.BP算法2.1简述2.2详解2.2.1输入输出模型2.2.2梯度下降算法迭代2.2.3前向传播在输出端计算误差2.2.4误差反传--输出层2.2.5误差反传--隐含层2.2.6误差反传--总结 1多层感知机 1.1XOR问题 线性不可分问题: 无法…

正弦实时数据库(SinRTDB)的使用(10)-数据文件的无损压缩

前文已经将正弦实时数据库的使用进行了介绍,需要了解的可以先看下面的博客: 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

LabVIEW双通道太阳射电频谱观测系统

LabVIEW双通道太阳射电频谱观测系统 开发了一个基于LabVIEW平台开发的双通道高速太阳射电频谱观测系统。该系统实时监测太阳射电爆发,具有随机性、持续时间短、变化快等特点。通过高速信号采集卡实现1.5 GS/s的信号采集,时间分辨率可达4ms,频…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存,同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知,类加载的最终产品是数据访问入口。 加载类文件(即.class文件)的方式有以下几…

ChatGPT chrome扩展下载与安装

官方下载地址 https://chromewebstore.google.com/detail/lpbhmlbicmgjpacbofijdfpcplfhakeo 截图 安装 离线安装 下载地址 https://static.xutongbao.top/app/chatgpt-chrome-crx-v0.0.7.zip 打开链接 chrome://extensions/ 人工智能学习网站 https://chat.xutongbao.to…

获取电商数据的几种方法分享

在数字化时代,电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析,还是产品优化和营销策略的制定,都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法,力求在干货满满的同时,也不…

精通【PHP循环结构知识】

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

怎么打包出release.aar包

第一种 选择build variant 更改成release 第二钟 在gradle中选择相应任务来编译 选择assemble release如果没有这个选项,可能是你没有开启那个Task 收集的选项

Acrobat Pro DC 2023 for Mac PDF编辑管理软件

Acrobat Pro DC 2023 for Mac是一款功能强大的PDF编辑和管理软件,旨在帮助用户轻松处理PDF文件。它提供了丰富的工具和功能,使用户可以创建、编辑、转换和注释PDF文件,以及填写和签署PDF表单。 软件下载:Acrobat Pro DC 2023 for …

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章,本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式,手把手保姆级,模型高精度,结果有保障! 分析: 本题待解决问题 目标&#…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…