STM32学习笔记(七) —— DMA传输(MTM)

DMA,全称是Direct Memory Access(直接内存访问)。可以在存储器和存储器之间或者外设和存储器之间传输数据,而不需要CPU的干预,这样可以节省CPU的资源,提高工作效率。

1.功能框图

在这里插入图片描述

STM32F103RCT6有两个DMA控制器,需要DMA传输的时候,外设会向DMA发送请求,DMA也会进行应答,随后会进行DMA传输。

2.DMA通道

在这里插入图片描述

在这里插入图片描述

两个DMA控制器一共有12个通道(DMA1有7个,DMA2有5个),上面图中列出了每个外设的请求与DMA通道的对应关系。当有多个DMA通道请求时,由于每次只能响应一个DMA通道请求,所以DMA仲裁器会根据软件优先级以及硬件优先级来确定先响应哪个通道。

3.优先级
1° 软件优先级可以在DMA_CCRx寄存器中设置,一共有最高优先级、高优先级、中等优先级、低优先级这4个等级。
2° 硬件优先级由通道号决定,通道号小的优先级高于通道号大的,比如通道2优先级高于通道4.
DMA仲裁器会优先对比软件优先级,软件优先级相同时再对比硬件优先级。

4.DMA传输模式
DMA传输的数据量可以通过DMA_CNDTRx寄存器最大编程为65535,每次传输后会递减,在传输了一半的数据和数据传输完成后都会有相应的标志位标识,并且可以使能相应的中断。
1° 当通道配置为非循环模式时,完成数据传输后将不再产生DMA操作,如果要开始新的DMA传输,需要在关闭DMA通道的情况下,重新配置要传输的数据个数(重新配置DMA_CNDTRx寄存器);
2° 在循环模式下,最后一次传输结束时,DMA_CNDTRx寄存器会被自动重载为初始数值。
3° 存储器到存储器模式。DMA的传输方向可以是存储器到外设、外设到存储器,也可以是存储器到存储器。这种情况下需要借用外设端口,当使用外设通道代表存储器时,通道可以随意选择,注意不能与循环模式同时使用。

5.软件编程
1° 在内存中开辟两个数组空间 mData_Buffer and pData_Buffer
2° 向 mData_Buffer 中存入数据
3° 使用 DMA 将 mData_Buffer 中数据移动到 pData_Buffer 中

/* 全局变量 */
char mData_Buffer[7] = "eckard";
char pData_Buffer[7] = "before";

  /* 在while循环之前添加 */
  //开启 DMA1 时钟, 使用外设之前一定要开启时钟
  RCC->AHBENR |= (uint16_t)0x01 << 0;
  
  //清除 CCR 寄存器
  DMA1_Channel1->CCR &= (uint16_t)0xffff8000;
  //数据从存储器读, 因为我们这里是要验证存储器到存储器模式
  DMA1_Channel1->CCR |= (uint16_t)0x01 << 4;
  //不执行循环操作, 注意存储器到存储器模式不能与循环模式同时使用
  DMA1_Channel1->CCR |= (uint16_t)0x00 << 5;
  //外设地址增量操作,地址递增的意思是传输完当前地址中的数据后,地址变为下一个要传输的数据的地址
  DMA1_Channel1->CCR |= (uint16_t)0x01 << 6;
  //存储器地址增量操作
  DMA1_Channel1->CCR |= (uint16_t)0x01 << 7;
  //外设数据宽度8位
  DMA1_Channel1->CCR |= (uint16_t)0x00 << 8;
  //存储器数据宽度8位
  DMA1_Channel1->CCR |= (uint16_t)0x00 << 10;
  //通道优先级低,这里的优先级是软件设置的优先级,硬件优先级由通道号决定的
  DMA1_Channel1->CCR |= (uint16_t)0x00 << 12;
  //启动存储器到存储器模式
  DMA1_Channel1->CCR |= (uint16_t)0x01 << 14;
  
  //数据传输数量,每次传输后会递减,如果在循环模式下,最后一次传输结束时,此寄存器会被自动重载为初始数值,比如7
  DMA1_Channel1->CNDTR = (uint16_t)7;
	
  //外设地址,我们上述设置的是从存储器读,所以数据传输的方向是mData_Buffer到pData_Buffer, 此地址为目标地址
  DMA1_Channel1->CPAR  = (uint32_t)pData_Buffer;
	
  //存储器地址, 此地址是源地址
  DMA1_Channel1->CMAR  = (uint32_t)mData_Buffer;
  
  printf("transfer start.\r\n");
  printf("mData_Buffer = %s\r\n", mData_Buffer);
  printf("pData_Buffer = %s\r\n", pData_Buffer);
  printf("\r\n");
  //开启通道
  DMA1_Channel1->CCR |= (uint16_t)0x01 << 0;
	
  //等待传输完成
  while(DMA1->ISR & ((uint32_t)0x01 << 1));
  /* 清除传输完成标志 */
  DMA1->IFCR |= (uint32_t)0x01 << 1;
    
  printf("transfer completed.\r\n");
  printf("mData_Buffer = %s\r\n", mData_Buffer);
  printf("pData_Buffer = %s\r\n", pData_Buffer);

将程序下载后,打开串口调试助手,可以查看打印的信息。

在这里插入图片描述

上述使用的是寄存器编程,下面使用STM32CubeMX来初始化DMA

在这里插入图片描述

在这里插入图片描述

生成代码后,发现新增了dma.c文件,已经完成了DMA的初始化

在这里插入图片描述

在main函数中也有调用

在这里插入图片描述

STM32CubeMX只能帮助我们初始化外设的配置,应用程序需要我们自己编写,我们这里需要调用HAL_DMA_Start函数来开启DMA传输

/* 全局变量 */
char mData_Buffer[7] = "eckard";
char pData_Buffer[7] = "before";

  /* 在while循环之前添加 */
  printf("transfer start.\r\n");
  printf("mData_Buffer = %s\r\n", mData_Buffer);
  printf("pData_Buffer = %s\r\n", pData_Buffer);
  printf("\r\n");

  /* 开启DMA传输 */
  HAL_DMA_Start (&hdma_memtomem_dma1_channel1, (uint32_t)mData_Buffer, (uint32_t)pData_Buffer, 7);
  /* 等待传输完成 */
  while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma1_channel1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_memtomem_dma1_channel1)) == RESET);
  /* 清除传输完成标志 */
  __HAL_DMA_CLEAR_FLAG(&hdma_memtomem_dma1_channel1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_memtomem_dma1_channel1));
  
  printf("transfer completed.\r\n");
  printf("mData_Buffer = %s\r\n", mData_Buffer);
  printf("pData_Buffer = %s\r\n", pData_Buffer);

将程序下载后,打开串口调试助手,可以查看到打印的信息与上述采用寄存器编程时是一样的。

本例程代码可以在HAL库工程模板这一章节的最后,百度网盘链接分享处获取

以上是通过开发板进行实际验证的,下面使用软件仿真,

我们进入调试界面,打开串口窗口,然后点击运行( 前面章节有提到,所以本篇以及后续章节都不再重复提及 )

运行结果如下,与在开发板上验证的结果一致。

在这里插入图片描述

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

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

相关文章

外汇天眼:8个平台被打击,有的因诈骗被处罚!

上周&#xff0c;澳大利亚证券和投资委员会&#xff08;ASIC&#xff09;取消了总部位于悉尼的Brava Capital的澳大利亚金融服务许可证&#xff08;AFSL&#xff09;&#xff0c;意大利公司和交易委员会CONSOB则将6个非法投资平台网站列入黑名单。另外&#xff0c;Reiwa-Capita…

蓝桥杯:C++队列、优先队列、链表

C普通队列 算法竞赛中一般用静态数组来模拟队列&#xff0c;或者使用STL queue。使用C的STL queue时&#xff0c;由于不用自己管理队列&#xff0c;因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列&#xff1a;优先队列。它的特点是最优数据…

C++智能指针的知识!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习一下智能指针。 文章目录 1.智能指针的概念 2.智能指针的思想 3.智能指针的作用 3.1 自动内存管理 3.2 共享所有权 3.3 避免悬挂指针…

春节如此“热辣滚烫”,可别把赚钱的机会都让给别人!2024如果创业适合干什么,2024创业新风口

春节期间&#xff0c;在国外抨击我们的旅客不出去旅行&#xff0c;造成了1300亿损失的时候&#xff0c;国内的消费可谓是“热辣又滚烫”&#xff0c;一片勃勃生机的景象。 各个地方纷纷的“亮底牌、放大招”&#xff0c;举办各式各样丰富多彩的文化活动&#xff0c;还进行“农…

自动驾驶中的 DCU、MCU、MPU、SOC 和汽车电子架构

自动驾驶中的 DCU、MCU、MPU 1. 分布式电子电气架构2. 域集中电子电气架构架构2.1 通用硬件定义 3. 车辆集中电子电气架构4. ADAS/AD系统方案演变进程梳理4.1 L0-L2级别的ADAS方案4.2 L2以上级别的ADAS方案 5. MCU和MPU区别5.1 MCU和MPU的区别5.2 CPU与SoC的区别5.3 举个例子 R…

力扣题目训练(15)

2024年2月8日力扣题目训练 2024年2月8日力扣题目训练507. 完美数520. 检测大写字母521. 最长特殊序列 Ⅰ221. 最大正方形237. 删除链表中的节点115. 不同的子序列 2024年2月8日力扣题目训练 2024年2月8日第十五天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包括…

基于Robei EDA--实现串口数据包接收

一、定义串口传输协议帧 控制字的数据大小为一字节&#xff0c;定义帧头为&#xff08;0xFE 0xDF&#xff09;帧尾为&#xff08;0xEF&#xff09; 模块框图 内模块&#xff1a;串口接收&#xff0c;output&#xff1a;8位data 串口命令&#xff1a;对单字节数据接收进行缓存…

去掉图片水印但是不伤原图?看完这些方法就知道了

小伙伴们&#xff0c;你们是不是经常在网上找一些好看的图片作为壁纸呢&#xff1f;有时候会遇到一些带着平台水印的图片&#xff0c;是不是觉得不太美观呢&#xff1f;别着急&#xff0c;其实我们可以使用一些去水印软件来将这些水印去除掉&#xff0c;让图片更加美观。那么&a…

贝塞尔曲线

一条 n n n 次贝塞尔曲线可以表示为 C ( u ) ∑ i 0 n B i , n ( u ) P i , 0 ≤ u ≤ 1 (1) \pmb C(u)\sum_{i0}^nB_{i,n}(u)\pmb{P_i},\quad 0\leq u\leq1\tag{1} C(u)i0∑n​Bi,n​(u)Pi​,0≤u≤1(1) 其中&#xff0c;基函数&#xff08;也称为混合函数&#xff09; {…

电商行业的机遇在哪?致淘宝平台API数据接口

在电商行业蓬勃发展的今天&#xff0c;我们不得不提及淘宝这个伟大的平台。它不仅为亿万用户提供了便捷的购物体验&#xff0c;更为无数的商家创造了一个财富的聚集地。而如今&#xff0c;随着技术的不断进步&#xff0c;淘宝开放了其强大的API接口&#xff0c;为广大开发者带来…

【开工大吉】推荐4款开源美观的WPF UI组件库

前言 经常有小伙伴在技术群里提问&#xff1a;WPF有什么好用的UI组件库&#xff1f;,今天大姚给大家推荐4款开源、美观的WPF UI组件库。 WPF介绍 WPF 是一个强大的桌面应用程序框架&#xff0c;用于构建具有丰富用户界面的 Windows 应用。它提供了灵活的布局、数据绑定、样式…

git分布式版本控制工具基本操作

Windows操作 1.1 git基本操作 1.设置用户签名 git config user.name xx git config user.email xxb163.com2.初始化本地库 git init3.查看本地库状态 git status4.添加暂存区 git add 文件名称 git add *5.提交本地库 git commit -m "描述信息" 文件6.查看版本…

基于SFLA算法的神经网络优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 SFLA的基本原理 4.2 神经网络优化 5.完整程序 1.程序功能描述 基于SFLA算法的神经网络优化。通过混合蛙跳算法&#xff0c;对神经网络的训练进行优化&#xff0c;优化目标位神经网络的…

springboot200个人博客系统的设计与实现

基于spring boot的个人博客系统的设计与实现 摘 要 随着国内市场经济这几十年来的蓬勃发展&#xff0c;突然遇到了从国外传入国内的互联网技术&#xff0c;互联网产业从开始的群众不信任&#xff0c;到现在的离不开&#xff0c;中间经历了很多挫折。本次开发的个人博客系统&a…

Day21--learning English

一、积累 1.stipulate 2.brutal 3.tatter 4.thermal 5.turnstile 6.tickle 7.patsy 8.extinguisher 9.leave well enough alone 10.tangle 11.twirl 12.despise 13.Hang out 14.crisp 15.dye 16.cement 17.stationery 18.sophisticated 19.gradient 20.funeral 二、练习 1.牛…

面试经典150题——螺旋矩阵

"The harder the conflict, the more glorious the triumph." - Thomas Paine 1. 题目描述 2. 题目分析与解析 2.1 思路一 看到题目&#xff0c;先仔细观察矩阵&#xff0c;题目要求我们给出顺时针遍历的结果即可&#xff0c;我们根据矩阵可以看出&#xff0c;首…

开源软件:推动软件行业繁荣的力量

文章目录 &#x1f4d1;引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 &#x1f4d1;引言 随着信息技术的飞速发展&#xff0c;软件已经…

Java Remote Debug(远程调试)

【华邦云使用过】&#xff1a; -agentlib:jdwptransportdt_socket,address9090,servery,suspendn SpringBoot远程Debug步骤 配置Maven 首先在Maven的pom.xml中配置好如下信息&#xff1a; <project> ... <build> ... <plugins> ... <plugin> &…

机器学习 | 实现图像加密解密与数字水印处理

目录 实现窗口可视化 数字图像加密 窗口布局设置 基于混沌Logistic的图像加密 基于三重DES的图像加密 数字图像解密 窗口布局设置 基于混沌Logistic的图像解密 基于三重DES的图像解密 基于LSB的数字水印提取 窗口布局设置 水印的嵌入与提取 实现窗口可视化 这里…

【力扣 - 环形链表】

题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…