STM32直接存储器存取DMA

news2025/1/15 22:41:16

前提知识:

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.coloradmin.cn/o/1608957.html

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

相关文章

k8s部署Eureka集群

部署有状态负载 镜像配置&#xff1a; 环境变量如下&#xff1a; AUTHENTICATE_ENABLEtrue JAVA_OPTS-Dauth.userName账号 -Dauth.password密码 MY_POD_NAMEmetadata.name BOOL_REGISTERtrue BOOL_FETCHtrue APPLICATION_NAME负载名称 EUREKA_INSTANCE_HOSTNAME${MY_POD_NA…

Java基础之JVM基础调优与常见问题

常见命令 以下命令的介绍&#xff0c;全部在jdk8环境下运行的&#xff1b; jps ☆☆☆☆☆ 查看当前运行的进程号&#xff1b; jmap ☆☆☆ jmap命令可以查看jvm的内存信息&#xff0c;class对应的实例个数以及占用的内存大小 jmap -histo 查看当前java进程 [rdVM-8-12-c…

光伏无人机勘探技术应用分析

光伏无人机勘探与传统勘探想必&#xff0c;具有智能化作业、测控精度高、环境适应性强等明显优势&#xff1b;卫星勘探辅助其能更快速甚至实时完成测绘拼图&#xff1b;在进行勘察时&#xff0c;可根据需要自由更换机载设备&#xff1b;自动诗经建模使数据更直观&#xff0c;工…

Python 基于docker部署的Mysql备份查询脚本

前言 此环境是基于docker部署的mysql&#xff0c;docker部署mysql可以参考如下链接&#xff1a; docker 部署服务案例-CSDN博客 颜色块文件 rootbogon:~ 2024-04-18 16:34:23# cat DefaultColor.py ######################################################################…

stm32二刷-GPIO

一 什么是 GPIO: GPIO(general porpose intput output), 通用输入输出端口 . 二 我们先认识芯片控制 GPIO 输出控制。 2.1LED 硬件原理如图&#xff1a; 当电流从这根电线流通&#xff0c; LED 亮。当电流不通过这根电线&#xff0c; LED 灭。 上面 PF** &#xff0c;芯片电…

如何安全、高速、有效地利用IP代理爬取数据

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;生活&#xff08;主要讲一下自己生活相关的内容&#xff09;生活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f934;本文简述&#xff1a;如何安全、高速、有效地利用IP代理爬取数据 &#x1f473…

HTX亮相迪拜Blockchain Life 2024:推动加密应用广泛落地

4月15-17日&#xff0c;HTX独家赞助于迪拜举办的Blockchain Life 2024峰会注册处&#xff0c;并以峰会蓝宝石赞助商身份亮相展区。 作为全球领先的头部交易所&#xff0c;HTX致力于推动区块链技术的创新与发展。此次赞助顶级加密峰会Blockchain Life 2024&#xff0c;不仅是对…

微信小程序酒店选择日期和入住人数(有效果图)

效果图 app.vue onLaunch:function(options){this.defaultcache()}defaultcache(){// 入住信息缓存var arr this.getDateTime();var ReserVation {reservType:0,//1 人数 2日期InCheckin:{},//入离日期peopleArr:[{title:成人,num:2},{title:儿童,num:0},{title:宝子,num:1…

外包干了6天,技术明显退步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年3月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

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 # 下载…

k8s配置configmap指定到容器的指定文件

我们需要将名称为walletkey.properties的文件做成configmap&#xff0c;然后将walletkey.properties文件单独挂载出来到/data/walletkey.properties&#xff0c;且不能覆盖/data目录&#xff0c;具体如下 1、创建configmap configmap文件内容 其中walletkey.properties: >-引…

统一SQL-支持CHAR和VARCHAR2 (size BYTE|CHAR)转换

统一SQL介绍 https://www.light-pg.com/docs/LTSQL/current/index.html 源和目标 源数据库&#xff1a;Oracle 目标数据库&#xff1a;Postgresql&#xff0c;TDSQL-MySQL&#xff0c;达梦8&#xff0c;LightDB-Oracle 操作目标 在Oracle中的CHAR和VARCHAR2数据类型&…

【STM32HAL库】外部中断

目录 一、中断简介 二、NVIC 1.寄存器 2.工作原理 3.优先级 4.使用NVIC 三、EXTI 1.简介 2.AFIO&#xff1a;复用功能IO&#xff0c;主要用于重映射和外部中断映射配置​编辑 3. 中断使用 4.HAL库配置使用 一、中断简介 中断的意义&#xff1a;高效处理紧急程序&#xff0c;不会…

小程序 前端如何用wx.request获取 access_token接口调用凭据

在微信小程序中&#xff0c;获取access_token通常是通过wx.request方法来实现的。以下是一个简单的示例代码&#xff1a; 1.获取小程序的appID 与 secret&#xff08;小程序密钥&#xff09; 登录之后,请点击左侧的"开发管理">点击"开发设置" 就可以找…

【AI开发:音频】一、GPT-SoVITS整合工具包的部署问题解决(GPU版)

前言 目前GPT-SoVITS的合成效果比较不错&#xff0c;相比较其他厂商的产品要规整的多。众多厂家中也是国内使用最多的一款了&#xff0c;并且这个整合包里携带了&#xff0c;除背景音、切割、训练、微调、合成、低成本合成等一些列完整的工具&#xff0c;也可以作为API进行使用…

C++ | Leetcode C++题解之第38题外观数列

题目&#xff1a; 题解&#xff1a; class Solution { public:string countAndSay(int n) {string prev "1";for (int i 2; i < n; i) {string curr "";int start 0;int pos 0;while (pos < prev.size()) {while (pos < prev.size() &&…

iOS -- 工厂设计模式

iOS -- 工厂设计模式 设计模式概念设计模式七大准则简单工厂模式优点缺点主要作用示例 工厂方法模式优点缺点主要作用&#xff1a; 抽象工厂方法缺点主要作用&#xff1a;文件分类 设计模式概念 所谓设计模式&#xff08;Design pattern&#xff09; 是解决软件开发某些特定问…

深入理解JAVA垃圾收集器CMS,G1工作流程原理 GC流程图 什么社会触发Minor GC?触发MinorGC过程。Full GC 过程。

java CMS&#xff0c;G1垃圾收集器工作流程原理浅析 JVM内存空间基础知识点&#xff08;基于JDk1.8&#xff09; 1.方法区&#xff1a;逻辑概念&#xff0c;元空间&#xff0c;方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分&#xf…

UE4_动画基础_根运动Root Motion

学习笔记&#xff0c;仅供参考&#xff01; 在游戏动画中&#xff0c;角色的碰撞胶囊体&#xff08;或其他形状&#xff09;通常由控制器驱动通过场景。然后来自该胶囊体的数据用于驱动动画。例如&#xff0c;如果胶囊体在向前移动&#xff0c;系统就会知道在角色上播放一个跑步…

C#语法知识之循环语句

5、循环语句 文章目录 1、while思考1 斐波那契数列思考2 判断一个数是否为质数思考3 找出100以内的质数 2、do...while3、for思考1 找水仙花数思考2 乘法表 1、while 1、作用 让代码重复去执行 2、语法相关 while(bool类型值){//当满足条件时&#xff0c;就会执行while语句…