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.mzph.cn/pingmian/685.shtml

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

相关文章

用Python在PDF文档中插入单图像水印和平铺图像水印

PDF文档因其跨平台兼容性和内容保真度成为信息交换的标准载体&#xff0c;为应对版权侵犯、内容篡改以及未经授权的传播等风险&#xff0c;向PDF中插入图片水印成为一种强化文档安全性、彰显所有权及实施访问控制的有效手段。图片水印不仅能以直观的方式标示文档来源、强化版权…

Windows:web端UI自动化=python+selenium+pycharm框架

本篇写怎么写一个UI自动化代码。mac和Windows是一样的 都是这样写 不过&#xff0c;习惯用Windows了 如果python没有安装可以看我另一篇安装python的教程 先安装python先 下载完python 下载pip 1 安装pip $ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # 下载…

Sentinel + Nacos流控规则持久化配置

json参数对映sentinel 规则面板 [{"controlBehavior": 0,"count": 2,"grade": 1,"limitApp": "default","resource": "flow","strategy": 0} ] 第二步&#xff0c;告诉订单服务读取配置&…

Golang | Leetcode Golang题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; func countAndSay(n int) string {prev : "1"for i : 2; i < n; i {cur : &strings.Builder{}for j, start : 0, 0; j < len(prev); start j {for j < len(prev) && prev[j] prev[start] {j}cur.WriteStr…

Ubuntu的终端中启用鼠标左键即为选中复制,右键粘贴的功能

在Ubuntu终端中启用鼠标复制和粘贴的功能需要进行一些设置。 首先&#xff0c;打开终端窗口&#xff0c;在菜单栏中找到“Edit”选项&#xff0c;点击“Profile Preferences”。然后&#xff0c;在“General”选项卡中&#xff0c;勾选“Use custom font”选项&#xff0c;可以…

Excel中将单元格格式改成文本后,为何要双击数字才会改变?

将大批量的数值型数字转换成文本型数字&#xff0c;当然不能一个一个的去双击做转换了。以下说说有哪个可以将数值型数字转换成文本型数字的方法。 一、转换方法 方法1.数据分列功能 选中数据后&#xff0c;点击数据选项卡&#xff0c;分列&#xff0c; 分列向导的第一步和…

Transformer推理性能优化技术很重要的一个就是K V cache,能否通俗分析,可以结合代码?

原文&#xff1a;Transformer推理性能优化技术很重要的一个就是K V cache&#xff0c;能否通俗分析&#xff0c;可以结合代码? - 知乎 为什么要研究KV cache&#xff1f; 设输入序列的长度为 s &#xff0c;输出序列的长度为 n &#xff0c;模型深度为l&#xff0c;维度为h,以…

设计模式:简单工厂模式(Simple Factory)

设计模式&#xff1a;简单工厂模式&#xff08;Simple Factory&#xff09; 设计模式&#xff1a;简单工厂模式&#xff08;Simple Factory&#xff09;模式动机模式定义模式结构时序图模式实现测试模式分析实例&#xff1a;Qt 控件类优缺点适用环境模式应用 设计模式&#xff…

关基网络战时代,赛宁网安电力网络攻防靶场全面提升电网安全防护力

随着网络空间成为与陆地、海洋、天空、太空同等重要的人类活动新领域&#xff0c;自网络空间向物理电网发起攻击&#xff0c;破坏电力等国家关键基础设施成为当前大国博弈、大规模战争的重要手段和常态进攻形式。同时&#xff0c;新型电力系统建设发展驱动电力系统形态和控制方…

基于Springboot的社区待就业人员信息管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的社区待就业人员信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三…

TaskWeaver使用记录

TaskWeaver使用记录 1. 基本介绍2. 总体结构与流程3. 概念细节3.1 Project3.2 Session3.3 Memory3.4 Conversation3.5 Round3.6 Post3.7 Attachment3.8 Plugin3.9 Executor 4. 代码特点5. 使用过程5.1 api调用5.2 本地模型使用5.3 添加插件 6. 存在的问题与使用体验6.1 判别模型…

笔记本电脑坏了硬盘数据会丢失吗 笔记本电脑坏了如何取出硬盘的资料 数据恢复软件

笔记本电脑对我们真的非常重要了&#xff0c;是实现无纸化办公和学习的重要工具&#xff0c;但是如果笔记本电脑坏了我们存储在电脑里的资料该怎么办&#xff1f;笔记本电脑坏了硬盘数据会丢失吗&#xff1f;相信有许多朋友都会有这样的担忧。本文今天就为大家解决笔记本电脑坏…

【银角大王———Django学习DAY0——基础准备】

银角大王——Django学习前情提要 &#xff08;1&#xff09;在pycharm中下载Flask&#xff08;2&#xff09;使用Flask&#xff08;3&#xff09;下载BootStrap框架&#xff08;4&#xff09; 使用BootStrap框架 &#xff08;1&#xff09;在pycharm中下载Flask 在设置——项目…

【若依】代码生成详细教程(单表、主从表、树形表增删改查)

若依代码生成开发接口 修改代码生成配置一、单表实现增删改查1. 新建数据库表结构2. 新建模块&#xff0c;解决项目依赖3. 启动项目&#xff0c;新建菜单4. 导入数据表&#xff0c;自动生成代码5. 将生成代码粘贴到对应的模块&#xff0c;执行生成的sql&#xff08;用于生成菜单…

GitHub/R3D3项目环境配置踩坑记录

1、前言 项目链接地址&#xff1a;SysCV/r3d3 (github.com) 按照安装步骤容易出现的问题&#xff0c;environment.yaml文件中安装相关包&#xff0c;其中还有两个pip install githttps://github.com/..........这两个建议注释掉&#xff0c;后面再来安装这两个。 2、问题及解…

【C++题解】1020. 算算和是多少

问题&#xff1a;1020. 算算和是多少 类型&#xff1a;基本运算、拆位求解 题目描述&#xff1a; 输入一个三位正整数&#xff0c;然后与它倒过来的数相加&#xff0c;输出和。 如&#xff1a;输入167 &#xff0c;则和为167761928。 输入&#xff1a; 只有一行&#xff0c…

全开源小狐狸Ai系统 小狐狸ai付费创作系统 ChatGPT智能机器人2.7.6免授权版

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.4、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启ssl证书 具有文章改写、广告营销文案、编程…

PostgreSql-Install

PostgreSql源码安装 一、源代码下载二、操作系统配置三、编译安装四、启动数据库五、相关命令 PostgreSQL是一个强大的 开源对象关系数据库系统&#xff0c;它使用并扩展了SQL语言&#xff0c;并结合了许多功能&#xff0c;可以安全地存储和扩展最复杂的数据工作负载。 一、源…

gin框架提高篇(四)

参数校验&#xff08;一&#xff09; uuid包&#xff1a;https://github.com/satori/go.uuid 因为作者更改了参数限制&#xff0c;导致会出问题 → 问题解决 package mainimport ("fmt""github.com/gin-gonic/gin""github.com/go-playground/validato…

盲人盲杖:科技革新,助力视障人士独立出行

在我们的社会中&#xff0c;盲人朋友们以其坚韧的精神风貌&#xff0c;生动诠释着生活的多样与可能。然而&#xff0c;当我们聚焦于他们的日常出行&#xff0c;那些普通人视为寻常的街道、路口&#xff0c;却成为他们必须面对的严峻挑战。如何切实提升盲人盲杖的功能&#xff0…