STM32——DMA

一、DMA

DMA直接存储器存储

DMA提高外设到存储器,存储器到存储器之间的高速数据传输,无需CPU的干扰,减轻了CPU的负担;

SMT32的DMA有多个通道,每个通道都可以通过软件触发或者特定的硬件触发;

外设到存储器之间通过特定的硬件触发(例如ADC采集转换完成后,产生事件响应,触发DMA转运);

存储器到存储器之间通过软件触发(DMA会迅速的将所需要转运的内容转运到目标存储器中);

二、存储器

*计算机的基本组成由:运算器,控制器(运算器+控制器组成CPU),存储器,输入设备,输出设备组成;

存储器:将程序存储器、系统存储器,寄存器和输入输出端口组织在一个线性的4G空间内;

可以通过访问地址的方式访问存储器;

数据以字节形式存放在寄存器中;

三、ROM,RAM

STM32存储器分为两种:ROM(只读存储器),RAM(随机存储器)

ROM:只读存储器,介质是FLASH闪存,是一种非易失性的,掉电不丢失的设备;

由三部分组成:程序存储器FLASH,系统存储器,选项字节;

程序存储器:0x8000 0000 存放C语言编译后的代码;

系统存储器:0x1FFF F000 存放BOOTLOADER,用于串口下载;

选型字节:0x1FFF F800 存放独立于运行程序外的配置参数;

RAM:随机存储器,介质是SRAM,是一种易失性,掉电丢失的设备;

由三部分组成:运行内存SRAM,外设寄存器,内核外设寄存器;

运行内存SRAM:0x2000 0000存放运行过程中存放的变量;

外设寄存器:0x4000 0000存放外设的配置参数;

内核外设寄存器:0xE000 000存放内核外设的配置参数;

四、存储器映像:

存储器映射:32位的存储器,4G的寻址空间,所以STM32有很多为空;

从0x0000 0000开始执行,由BOOT配置映射到flash还是memory执行;

*需要查找地址,只需要参考手册+偏移即可得到地址;

演示:

ADC1->DR访问ADC1的DR寄存器;

STM32使用结构体访问寄存器;定义一个结构体指针,结构体本身就是外设的起始地址,结构体的每个成员就是正好映射每个寄存器;

所以就是起始地址+偏移;

五、系统架构

系统架构由总线矩阵协调四个主动单元和四个被动单元;

总线矩阵左边是四个主动单元:Cortex内核,Dcode总线,系统总线,DMA1,DMA2;

总线矩阵右边是四个被动单元:FLASH,SRAM,FSMC,AHP桥接的所有外设;

Dcode总线:将内核的数据总线连接在FLASH的数据接口,常量的加载,在此完成;

ICode总线:将内核的指令总线连接在FLASH的指令接口,指令的预取在此完成;

总线矩阵:协调DMA和系统总线对存储器的访问,当访问出现冲突时,内置仲裁器,当访问冲突时,暂停CPU的访问,但是仍会给CPU留下一半的线宽;

主动单元可以通过访问地址操作被动单元;

六、DMA结构图

DMA通过DMA总线连接在总线矩阵上,DMA也拥有对存储器的访问权,DMA总线分为:DMA1,DMA2,以太网;

DMA各个通道可以通过DMA总线对存储器进行访问,每个通道单独配置源地址和目标地址,数据转运独立运行,仲裁器的作用是每个通道单独转移数据,但是DMA总线只有一条,所以要对DMA总线进行分时复用,根据通道的优先级决定通道的访问顺序;

AHB从设备:通过AHB桥连接在总线矩阵上,DMA即是主动单元可以访问存储器,也是AHB上的被动单元,通过CPU配置DMA寄存器,配置DMA参数;

DMA请求:DMA触发方式,可以是软件触发也可以是特定的硬件触发

总的来说:1.DMA总线用于访问各个存储器;

  1. 内部12个通道,可以独立转运数据(必须打开对应的外设的DMA输出通道);
  2. 仲裁协调通道优先级;
  3. AHB从设备配置DMA;
  4. DMA请求外设硬件触发源;

七、DMA流程图

重要参数:起始地址,数据宽度,地址是否自增,方向;

起始地址:外设寄存器-数据转移的源地址,存储器-数据转移的目标地址,数据宽度:每次转移数据的大小,分为字节(8位,uint8_t),半字(16位,uint16_t),全字(32位,uint32_t);

地址是否自增(指针是否++,指向下一个地址),方向,传输的方向;

配置传输计数器:DMA转运次数,是自减计数器,每次转运后自减一次,减为0,判断是否自动重装;

自动重装器:开启重装器时,计数器为0时,恢复计数器值;

M2M数据选择器:选择是硬件触发还是软件触发;

软件触发时,不能开启自动重装,否则DMA将不会停下来;

DMA使能;

更改计数器的值时,首先要失能DMA,更改后,重新使能DMA;

八、DMA请求

DMA请求:外设完成一次后,产生事件响应,产生特定的硬件触发源,配置M2M数据选择器,选择硬件触发,使能DMA,产生DMA触发源,去申请数据转运;

九、数据对齐方式:

数据宽度和对齐方式:

如果源地址寄存器和目标寄存器都为八位,则一一对应;

如果源地址寄存器为8位,目标寄存器为16位,则对应位不足补0,

如果源地址寄存器位16位,目标寄存器位8位,则保留低位,舍弃高位;

十、API

10.1API1数据转移DMA

功能:实现将SRAM中的数组A的数据,转移到SRAM中的数组B中,并用OLED显示;

思路:

1.RCC开启DMA时钟;

2.开启DMA通道;

3.初始化DMA;

4.使能DMA;

库函数分析:

void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx);//复位DMA
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);//初始化DMA
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct);//初始化结构体
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);//使能DMA
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);//中断输出使能
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //传输寄存器配置
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx);//返回传输计数器的值
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG);//获取标志位状态
void DMA_ClearFlag(uint32_t DMAy_FLAG);//清除标志位状态
ITStatus DMA_GetITStatus(uint32_t DMAy_IT);//获取中断标志位
void DMA_ClearITPendingBit(uint32_t DMAy_IT);//清除中断标志位

 实现:

void DMA1_Init (uint32_t AddrA,uint32_t AddrB,uint16_t Size)第一个参数是源地址,第二个参数是目标地址

1.RCC开启DMA时钟; 

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

2.初始化DMA;   

      DMA_InitStructure.DMA_PeripheralBaseAddr=AddrA;外设地址

     DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;数据宽度为1个字节
    DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Enable;地址自增
    DMA_InitStructure.DMA_MemoryBaseAddr=AddrB;存储器地址
    DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte ;数据宽度为1个字节
    DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable ;地址自增
    DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;传输方向
    DMA_InitStructure.DMA_BufferSize=Size;缓存区大小->计数器大小
    DMA_InitStructure.DMA_M2M=DMA_M2M_Enable;触发方式
    DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;/传输模式,是否自动重装
    DMA_InitStructure.DMA_Priority=DMA_Priority_Medium ;优先级
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

4.使能DMA;

    DMA_Cmd(DMA1_Channel1, DISABLE);

改变计数器的值,先使能,在使能,判断标志位

功能:调用一次给DMA计数器赋值,并在此启动DMA;(可以使用重装器代替)

参数:无

返回值:无

void DMA_Trasfer(void)
{
    DMA_Cmd(DMA1_Channel1, DISABLE);
    DMA_SetCurrDataCounter(DMA1_Channel1, DMA_Size);
    DMA_Cmd(DMA1_Channel1, ENABLE);
    while(DMA_GetFlagStatus(DMA1_FLAG_TC1) == RESET){};
    DMA_ClearFlag(DMA1_FLAG_TC1);
}

其中DMA_Size要使用初始化函数中的Size,此时可以定义一个全局变量;全部流程如下;

最后OLED显示 

10.2API2AD扫描模式+DMA

 功能:实现将ADC采集后的数据通过硬件自动触发DMA转移到SRAM数组中,并用OLED显示;

思路:

1.RCC开启GPIO和ADC,DMA的时钟,这里DMA是挂载在AHB桥上的;

2.初始化GPIO,配置为模拟输入,读取引脚连续变化的模拟信号;

3.配置待测通道列表,配置通道号和通道次序;

4.配置来自ADC预分频器的时钟;

5.初始化ADC,配置ADC模式,连续模式和扫描模式,数据对齐方式和通道数,以及是否选择外部触发模式;

6.开启DMA通道;

7.使能ADC;

8.ADC校准;

9.选择软件触发ADC

10.初始化DMA,配置DMA外设寄存器的参数(起始地址,数据宽度,地址自增,方向,计数器,触发源,是否自动重装);

11.使能DMA;

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

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

相关文章

自动化测试——selenium工具(web自动化测试)

1、自动化测试 优点:通过自动化测试有效减少人力的投入,同时提高了测试的质量和效率。 也用于回归测试。随着版本越来越多,版本回归的压力越来越大,仅仅通过人工测试 来回归所以的版本肯定是不现实的,所以…

软考复习之数据结构篇

算法设计 迭代法:用于求方程的近似根。 1、若方程无解,则算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考查方程是否有解,并在程序中对迭代的次数给予限制。 2、方程虽有解&#…

浅谈安科瑞ASJ继电器在菲律宾矿厂的应用

摘要:对电气线路进行接地故障保护,方式接地故障电流引起的设备和电气火灾事故越来越成为日常所需。针对用户侧主要的用能节点,设计安装剩余电流继电器,实时监控各用能回路的剩余电流状态。通过实时监控用能以及相关电力参数、提高…

【喜报】进来沾喜气!

Dear 铁子们: 2023年9月份报名了PMP,11月份考试,今天终于是出成绩了!真是佩服他们的办事效率了😅,好在结果是好的,第一时间通知大家!📢📢📢 努力两…

【动态规划】【图论】【C++算法】1575统计所有可行路径

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 图论 LeetCode1575统计所有可行路径 给你一个 互不相同 的整数数组,其中 locations[i] 表示第 i 个城市的位置。同时给你 start,finish 和 fuel 分别表示出…

PMO和项目经理向老板提涨薪的成功秘籍有哪些?

一、PMO和项目经理向老板提涨薪的必备准备 作为PMO和项目经理,在向老板提涨薪之前,首先需要做好充分的准备。这不仅包括对自身工作的全面梳理,还需对公司目标、业务需求和市场环境有深刻的理解。了解公司目标意味着要清晰地了解公司对项目管…

Android画布Canvas裁剪区域clipRect,Kotlin

Android画布Canvas裁剪区域clipRect,Kotlin 只需要把clipRect放在Android系统的super.onDraw之前,就只绘制“剪切”出来的区域。意图很简单,只绘制中心区域宽高为800,600的那一小块: class MyImageView : AppCompatImageView {pr…

光学3D表面轮廓仪服务超精密抛光技术发展

随着技术的不断进步,精密制造领域对材料表面的处理要求越来越高,超精密抛光技术作为当下表面处理的尖端技术,对各种高精密产品的生产起到了至关重要的作用,已广泛应用于集成电路制造、医疗器械、航空航天、3C电子、汽车、精密模具…

Windows记事本不显示下划线的原因及解决方法

最近使用Windows 记事本敲代码发现一个问题:代码中的下划线无法显示!!!(字体为“微软雅黑”、字体大小为11下,代码中的下划线无法显示。当然每个人情况可能不同) 在 Windows 记事本中,下划线可能会因为 字体…

【深度优先搜索】【组合数学】【动态规划】1467.两个盒子中球的颜色数相同的概率

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及知识点 动态规划汇总 深度优先搜索 组合数学 LeetCode1467 两个盒子中球的颜色数相同的概率 桌面上有 2n 个颜色不完全相同的球,球上的颜色共有 k 种。给你一个大小为 k 的整数数组 balls …

Web前端开发工具总结

一、nvm,node,npm之间的区别 nodejs:在项目开发时的所需要的代码库。相当于JDK npm:nodejs 包管理工具,npm 可以管理 nodejs 的第三方插件。在安装的 nodejs 的时候,npm 也会跟着一起安装。相当于Maven。 …

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤,可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理,实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…