STM32直接存储器存取DMA

前提知识:

1、STM32F103内部存储器结构以及映射

        STM32F103的程序存储器、数据存储器、寄存器和IO端口被组织在同一个4GB的线性地址空间内。数据字节以小端模式存放在存储器中。即低地址中存放的是字数据的低字节,高地址中存放的是字数据的高字节

         可访问 的存储器空间被分成 8个主要块 每个块为512MB 。 其他所有没有分配给片上存储器和外设的存储器空间都是保留的地址空间
第一块(0x0000 0000 ~ 0x1FFF FFFF,512MB):
        启动空间(0x0000 0000 ~ 0x0800 0000,128MB): 代码区始终从0x0000 0000开始,通过ICode和DCode总线访问。
        启动之后, CPU从地址0x0000 0000获取堆栈顶SP的地址,并从存储器的0x0000 0004指示的地址(程序计数器指针PC)执行代码
        之所以产生上述步骤,则因为不同厂商可能会把0x0000 0000以及0x0000 0004地址映射到其他地址。因此,根据映射到不同地址分为不同的启动方式(由BOOT引脚决定)
        在系统复位后,SYSCLK 的第4个上升沿,BOOT 引脚的值将被锁存。用户可以通过设置 BOOT1 和BOOT0 引脚的状态,来选择在复位后的启动模式
启动模式1:从Flash开始启动,正常的下载启动程序
启动模式2:从系统存储器( 存储BOOTLoader程序,用于串口下载,将下载好的程序刷新到Flash位置)开始启动,由于系统存储器存储串口下载程序,通过这种启动方式可以通过串口将程序下载到Flash。 串口程序下载完成后,需要设置为从Flash启动,这样复位后才能正常运行程序(只能通过USART1下载)
启动模式3:SRAM用来 存储程序运行过程中的临时变量,不能存储程序,所以该方式只用于调试程序
启动文件的执行流程:
复位中断函数:主要用来执行SystemInit()和main()
Flash(0x0800 0000 ~ 0x0801 FFFF,128KB): 存储编译后的程序代码
系统存储区 (0x1FFF F000 ~ 0x1FFF F800,8KB):存储用于串口下载程序
        系统存储器, 存储BOOTLoader程序,用于串口下载,将下载好的程序刷新到Flash位置。当从该位置启动, 其实是 执行串口下载程序,BOOTLoder会将下载的程序存放进Flash 。串口程序下载完成后,需要设置为 从Flash启动,这样复位后才能正常运行程序
选项字节 (0x1FFF F800 ~ 0x1FFF F80F,16B):存储一些独立于程序代码的配置参数
        读保护字节、看门狗、停机或待机是否产生复位、用户字节数据(0x1FFF F804 ~ 0x1FFF F806 )(这两字节可供用户独立使用)、写保护字节(Flash的每几页)
第二块(0x2000 0000 ~ 0x3FFF FFFF,512MB):
         SRAM(0x2000 0000 ~ 0x2000 4FFF,20KB): 存储程序运行过程中的临时变量
作用:
(1)选项字节中的数据不随程序的更新而改变,可以存放一些
(2)用上位机可以很方便修改,可以用在产品中可供用户配置的参数
第三块(0x4000 0000 ~ 0x5FFF FFFF,512MB):
        外设(0x4000 0000 ~ 0x4002 3FFF):外设寄存器空间地址
第八块(0xE000 0000 ~ 0xFFFF FFFF,512MB):
        Cortex_M3内核外设(0xE000 0000 ~ 0xE010 0000)
其他存储器区域均保留

一、DMA简介

        DMA( Direct Memory Access直接存储器存取/直接存储器访问, 可以提供外设与外设之间、外设与存储器之间、存储器和存储器之间的高速数据传输,无须CPU 干预,节省了 CPU 的资源
        在DMA传输前,CPU把总线控制权交给DMA控制器,在结束DMA传输后,DMA控制器立即把总线控制权交回CPU
DMA过程:DMA请求、DMA响应、DMA传输、DMA结束
12个独立可配置的通道: DMA1 7 个通道), DMA2 5 个通道)
每个通道都支持软件触发和特定的硬件触发
STM32F103C8T6 DMA 资源: DMA17个通道)

二、DMA结构

(1)每个通道都直接连接 专用的硬件DMA请求,每个通道都 同样支持软件触发。这些功能通过
软件来配置。
(2)在同一个 DMA 模块上,多个请求间的 优先权可以通过软件编程 设置 ( 共有四级:很高、高、
中等和低 ) 优先权相等时由硬件决定 ( 请求 0 优先于请求 1 ,依此类推 )
(3)独立数据源和目标数据区的传输宽度 ( 字节、半字、全字 ) ,模拟打包和拆包的过程。源和目
标地址必须按数据传输宽度对齐。
(4)循环模式/非循环模式
(5)每个通道都有 3 个事件标志 (DMA 半传输、 DMA 传输完成和 DMA 传输出错 ) ,这 3 个事件标志
逻辑或成为一个单独的中断请求。
(6)可编程的数据传输数目: 最大为65535
        DMA是AHB总线上的外设,有两个AHB端口:一个是从端口,用于配置DMA;另一个是主端口,用于设备间的数据传输。所以,DMA既是总线矩阵的主动单元,可以读写各种存储器;又是AHB总线上的被动单元,可被CPU进行配置
        STM32的Cortex-M3内核和DMA控制器通过总线矩阵连接到Flash控制总线、SRAM总线和AHB总线,进而通过AHB总线连接到AHB总线服务外设

DMA的工作流程:

(1)DMA传送
        当外设发送DMA请求,DMA控制器根据通道的优先权来处理请求。当DMA控制器开始访问外设时,DMA控制器首先向外设发送一个应答信号,外设得到应答信号后立即撤销请求,DMA控制器同时撤销应答信号
(2)仲裁器
        根据优先级管理各通道的请求以及启动外设/存储器访问的顺序
        软件:最高、高、中等、低
        硬件:如果两个通道请求的优先级相同,则 低编号的通道有高优先级
(3)DMA通道
        每个通道可以实现固定地址的外设寄存器和存储器地址之间的DMA传输。DMA传输的数据量是可编程的,最大达到65535,在 每次传输后递减
(4)地址自增
        外设和存储器的指针可以设置为在每次传输结束后自增
(5)中断
        3个事件标志 (DMA 半传输、 DMA 传输完成和 DMA 传输出错 ) ,这 3 个事件标志逻辑或成为一个单独的中断请求
(6)循环模式
        数据传输数目变为0时,将自动恢复为设置的初始值,DMA操作继续。循环模式用于处理循环缓冲区和连续的数据传输,例如,ADC的扫描模式
(7)存储器到存储器模式: 不可以与循环模式同时使用
(8)DMA请求映射
        从外设产生的7个请求,通过逻辑或输入到DMA控制器,这意味着 某一时刻只有一个DMA请求有效(分时复用)
        MEM2MEN(Memory to Memory,存储器到存储器),当此位为1时,由软件触发,不可以和循环模式同时使用
可编程的数据传输宽度、对齐方式和数据大小端
         当源数据宽度 = 目标数据宽度,正常传输
        当源数据宽度 < 目标数据宽度,高位补0
        当源数据宽度 > 目标数据宽度,高位舍弃,只保留低位

三、DMA相关库函数

(1)初始化:DMA_Init()

(2)设置计数器:DMA_SetCurrDataCounter()
可以单独设置DMA_BufferSize的值,即传输计数器的值

四、DMA配置

(1)开启DMA时钟(AHB总线)
(2)配置DMA,完成初始化
	DMA_InitTypeDef DMA_InitStruct;
	DMA_InitStruct.DMA_PeripheralBaseAddr = source;  //外设基地址
	DMA_InitStruct.DMA_MemoryBaseAddr = destination;	 //内存基地址
	DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Enable;  //外设基地址是否递增:
	DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;	//内存基地址是否递增:
	DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;	//外设数据宽度:一字节
	DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;	//内存数据宽度:一字节
	DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;	//外设作为数据来源or数据目的地:数据来源
	DMA_InitStruct.DMA_BufferSize = number;  //DMA缓存数据的大小:传输计数器的大小
	DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;	 //工作模式  是否循环:不循环
	DMA_InitStruct.DMA_Priority = DMA_Priority_High;	  //优先级:高优先级
	DMA_InitStruct.DMA_M2M = DMA_M2M_Enable;  //内存到内存:使能
	DMA_Init(DMA1_Channel1, &DMA_InitStruct);
(3)使能DMA
DMA工作的三个条件:
DMA使能,打开开关
②传输计数器必须 大于0
必须有触发源
注:在写传输计数器的值时,必须 关闭DMA

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

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

相关文章

React间接实现一个动态组件逻辑

在开发一个浏览器插件的时候&#xff0c;用的plasmo框架和react支持的&#xff0c;里面使用react开发一个菜单功能&#xff0c;但是又不想使用react-router&#xff0c;所以就想着能不能使用一个很简单的方式做一个替代方案&#xff1f;那肯定是可以。 我在引入一个组件后&…

C语言 | Leetcode C语言题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, sequence, sizeof(int…

Golang | Leetcode Golang题解之第37题解数独

题目&#xff1a; 题解&#xff1a; func solveSudoku(board [][]byte) {var line, column [9][9]boolvar block [3][3][9]boolvar spaces [][2]intfor i, row : range board {for j, b : range row {if b . {spaces append(spaces, [2]int{i, j})} else {digit : b - 1line…

如何实现外网访问内网ip?公网端口映射或内网映射来解决

本地搭建服务器应用&#xff0c;在局域网内可以访问&#xff0c;但在外网不能访问。如何实现外网访问内网ip&#xff1f;主要有两种方案&#xff1a;路由器端口映射和快解析内网映射。根据自己本地网络环境&#xff0c;结合是否有公网IP&#xff0c;是否有路由权限&#xff0c;…

Vast+产品展厅 | Vastbase G100数据库是什么架构?(1)

Vastbase G100是海量数据融合了多年对各行业应用场景的深入理解&#xff0c;基于openGauss内核开发的企业级关系型数据库。 了解Vastbase G100的架构&#xff0c;可以帮助您确保数据库系统的高效、可靠和安全运行。 “Vast产品展厅”将分两期&#xff0c;为您详细讲解Vastbas…

Excel模板导入、导出工具类

1.引入maven依赖&#xff0c;利用hutool的excel读取 Hutool-poi对excel读取、写入 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> <depen…

手写Java设计模式之工厂模式,附源码解读

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

智慧园区引领产业智能化升级:科技创新驱动打造智慧化、高效化产业新未来

随着全球科技革命的深入推进&#xff0c;以大数据、云计算、物联网、人工智能等为代表的新一代信息技术正深刻改变着传统产业的发展模式。在这一背景下&#xff0c;智慧园区作为产业智能化升级的重要载体和平台&#xff0c;正以其前瞻性的规划、创新的科技和卓越的实践&#xf…

桥接模式【结构型模式C++】

1.概述 桥接模式是一种结构型设计模式&#xff0c;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦。 这种模式涉及到一个作为桥接的接口&am…

完整、免费的把pdf转word文档

在线工具网 https://www.orcc.online/pdf 支持pdf转word&#xff0c;免费、完整、快捷 登录网站 https://orcc.online/pdf 选择需要转换的pdf文件&#xff1a; 等待转换完成 点击蓝色文件即可下载 无限制&#xff0c;完整转换。

C语言-浮点数在内存中的存储

目录 C语言-浮点数在内存中的存储 练习 浮点数的存储 浮点数存的过程 浮点数在内存的存储 浮点数取的过程 C语言-浮点数在内存中的存储 常见的浮点数&#xff1a;3.14149、1E10&#xff08;科学计数法表示形式&#xff1a;1.0*10^10&#xff09;等&#xff0c;浮点数家族…

数据赋能(62)——要求:数据管理部门能力

“要求&#xff1a;数据管理部门能力”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据管理部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据管理部门应具备的关键能力如下。 数据治理与标准化能力 数据管…

数字技术重塑园区管理,数字园区开启智慧化新篇章,引领产业创新发展

目录 一、引言 二、数字技术重塑园区管理 1、智能化基础设施建设 2、数据驱动的决策管理 3、精细化服务模式 三、数字园区开启智慧化新篇章 1、智慧化运营管理 2、智慧化产业创新 3、智慧化生态环境 四、引领产业创新发展 1、推动传统产业转型升级 2、培育新兴产业…

A Geolocation Databases Study(2011年)第五部分:Evalution Model

下载地址:A Geolocation Databases Study | IEEE Journals & Magazine | IEEE Xplore 被引次数:195 Shavitt Y, Zilberman N. A geolocation databases study[J]. IEEE Journal on Selected Areas in Communications, 2011, 29(10): 2044-2056. 5. Discussion 在我们讨…

JavaSE——常用API进阶二(6/8)-ZoneId、ZoneDateTime、Instant(常见方法、用法示例)

目录 ZoneId 常见方法 用法示例 ZoneDateTime 常见方法 用法示例 Instant 常见方法 用法示例 如果在开发中我们有这样的需求&#xff1a;我们的系统需要获取美国现在的时间&#xff0c;或者其他地区的时间给用户观看&#xff0c;或者进行一些处理&#xff0c;那应该怎…

企业常用Linux正则表达式与三剑客企业生产环境及知识/企业中远程连接ssh工具,需要一定的配置(为什么连接有时慢?)

企业高薪思维: 1.学习去抓重点有价值知识 2.猛劲学&#xff0c;使劲学&#xff08;能否给别人将会&#xff0c;讲明白&#xff0c;写明白&#xff0c;练习明白&#xff09;&#xff0c;在学习过程中你觉得学会了60-80%&#xff0c;其实你只会了40-50%&#xff0c;你要讲明白会操…

毅速3D打印随形透气钢:革新传统,引领未来

透气钢&#xff0c;这种多孔金属材料&#xff0c;既融合了金属材料的坚固性&#xff0c;又具备了透气材料的通透性。尤其在注塑模具的制造中&#xff0c;透气钢的作用不可忽视。通过镶嵌透气钢&#xff0c;能够有效解决因困气产生的注塑问题&#xff0c;使成型加工更为完善&…

【云计算】云数据中心网络(三):NAT 网关

《云网络》系列&#xff0c;共包含以下文章&#xff1a; 云网络是未来的网络基础设施云网络产品体系概述云数据中心网络&#xff08;一&#xff09;&#xff1a;VPC云数据中心网络&#xff08;二&#xff09;&#xff1a;弹性公网 IP云数据中心网络&#xff08;三&#xff09;…

做一个答题pk小程序多少钱

在探讨“做一个答题pk小程序多少钱”这一问题时&#xff0c;我们首先需要明确的是&#xff0c;小程序的价格并非固定不变&#xff0c;而是受到多种因素的影响。这些因素包括但不限于小程序的复杂度、功能需求、开发周期、技术难度以及开发团队的规模和经验等。因此&#xff0c;…