文章目录

  • 一、实验工具
  • 二、DMA介绍
  • 三、配置工程
    • 1.新建工程
    • 2.引脚配置
    • 3.设置RCC
    • 4.设置串口
    • 5.DMA设置
    • 6.时钟源设置
    • 7.项目文件设置
    • 8.创建代码
  • 四、Keil中修改代码
    • 1.在main.c中添加:
    • 2.将main.c 的while修改为:
  • 五、烧录程序
  • 六、实验结果
  • 七、总结
  • 八、参考资料

一、实验工具

软件:STM32CubeMX:6.6.1
Keil 5.31
mcuisp
硬件:STM32F103C8T6

二、DMA介绍

DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据。因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理。

DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。
DMA定义:
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA传输方式:
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
----外设到内存
----内存到外设
----内存到内存
----外设到外设
DMA传输参数:
我们知道,数据传输,首先需要的是:1.数据的源地址 2 .数据传输位置的目标地址 3 .传递数据多少的数据传输量 4 .进行多少次传输的传输模式 DMA所需要的核心参数,便是这四个。
当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。
也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。
DMA的主要特征:
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
----在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)
----独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
----支持循环的缓冲器管理;
----每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
----存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
----闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
----可编程的数据传输数目:最大为65535。
STM32的DMA资源:
对于大容量的STM32芯片有2个DMA控制器 两个DMA控制器,DMA1有7个通道,DMA2有5个通道。每个通道都可以配置一些外设的地址。
DMA工作系统框图:

上方的框图,我们可以看到STM32内核,存储器,外设及DMA的连接,这些硬件最终通过各种各样的线连接到总线矩阵中,硬件结构之间的数据转移都经过总线矩阵的协调,使各个外设和谐的使用总线来传输数据。
DMA传输步骤:
----从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
----存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
----执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。
DMA传输方式:
方法1:DMA_Mode_Normal,正常模式,
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
方法2:DMA_Mode_Circular ,循环传输模式
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式

仲裁器的作用是确定各个DMA传输的优先级
仲裁器根据通道请求的优先级来启动外设/存储器的访问。
优先权管理分2个阶段:
软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:最高优先级、高优先级、中等优先级、低优先级
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。
指针递增模式:
根据 DMA_SxCR 寄存器中 PINC 和 MINC 位的状态,外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值
通过单个寄存器访问外设源或目标数据时,禁止递增模式十分有用。
如果使能了递增模式,则根据在 DMA_SxCR 寄存器 PSIZE 或 MSIZE 位中编程的数据宽度,下一次传输的地址将是前一次传输的地址递增 1个数据宽度、2个数据宽度或 4个数据宽度。
存储器到存储器模式:
DMA通道的操作可以在没有外设请求的情况下进行,这种操作就是存储器到存储器模式。
当设置了DMA_CCRx寄存器中的MEM2MEM位之后,在软件设置了DMA_CCRx寄存器中的EN位启动DMA通道时,DMA传输将马上开始。当DMA_CNDTRx寄存器变为0时,DMA传输结束。存储器到存储器模式不能与循环模式同时使用。
这里要注意仅 DMA2 的外设接口可以访问存储器,所以仅 DMA2 控制器支持存储器到存储器的传输,DMA1 不支持。
存储器到存储器模式不能与循环模式同时使用。
DMA库函数配置过程:
1.使能DMA时钟:RCC_AHBPeriphClockCmd();
2.初始化DMA通道:DMA_Init();
//设置通道;传输地址;传输方向;传输数据的数目;传输数据宽度;传输模式;优先级;是否开启存储器到存储器。
3.使能外设DMA;
4.使能DMA通道传输;
5.查询DMA传输状态。

三、配置工程

1.新建工程

2.引脚配置

3.设置RCC

4.设置串口

  • 点击USATR1
  • 设置MODE为异步通信(Asynchronous)
  • 基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
  • GPIO引脚自动设置 USART1_RX/USART_TX
  • NVIC Settings 一栏使能接收中断

5.DMA设置

  • 点击DMASettings 点击 Add 添加通道
  • 选择USART_RX USART_TX 传输速率设置为中速
  • DMA传输模式为正常模式
  • DMA内存地址自增,每次增加一个Byte(字节)
    DMA基础设置
    右侧点击System Core 点击DMA

    DMA Request : DMA传输的对应外设
    注意: 如果你是在DMA设置界面添加DMA 而没有开启对应外设的话 ,默认为MENTOMEN
    Channel DMA传输通道设置:
    DMA1 : DMA1 Channel 0~DMA1 Channel 7
    DMA2: DMA2 Channel 1~DMA1 Channel 5
    Dirction : DMA传输方向
    四种传输方向:
  • 外设到内存 Peripheral To Memory
  • 内存到外设 Memory To Peripheral
  • 内存到内存 Memory To Memory
  • 外设到外设 Peripheral To Peripheral
    Priority: 传输速度
  • 最高优先级 Very Hight
  • 高优先级 Hight
  • 中等优先级 Medium
  • 低优先级 Low
    2DMA传输模式

    Normal:正常模式
    当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
    Circular: 循环模式
    传输完成后又重新开始继续传输,不断循环永不停止
    3DMA指针递增设置

    Increment Address:地址指针递增
    左侧Src Memory 表示外设地址寄存器
    功能:设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节。
    右侧Dst Memory 表示内存地址寄存器
    功能:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节。
    这个Src Memory一样,只不过针对的是内存。

6.时钟源设置

7.项目文件设置


8.创建代码

四、Keil中修改代码

1.在main.c中添加:

 /* USER CODE BEGIN Init */uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n   UART DMA Test \r\n   Zxiaoxuan";  //定义数据发送数组/* USER CODE END Init */

2.将main.c 的while修改为:

  while (1){/* USER CODE END WHILE */HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));HAL_Delay(1000);/* USER CODE BEGIN 3 */}

五、烧录程序

六、实验结果

VID_20221018_204905

七、总结

介绍关于DMA的基础知识,实现了串口DMA发送数据。

八、参考资料

【STM32】HAL库 STM32CubeMX教程十一—DMA (串口DMA发送接收)
STM32 HAL CubeMX 串口IDLE接收空闲中断+DMA
【STM32】系统时钟RCC详解(超详细,超全面)

STM32采用串口DMA方式实现发送数据相关推荐

  1. 嵌入式作业STM32采用串口DMA方式发送数据

    目录 前言 要求 一.DMA的基本介绍 DMA的基本定义 DMA的主要特征 STM32F411x系列芯片DMA控制器 二.通过CubeMX配置项目 1.创建项目 2.选择芯片STM32F103C8T6 ...

  2. STM32F103C8T6核心开发板下,采用串口DMA方式向上位机连续发送数据的实例详解

    STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 文章目录 STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据 前言 一.DMA应用初步 ...

  3. STM32 USART串口DMA 接收和发送的源码详解!

    硬件平台:STM32F103ZET6: 开发环境:KEIL 4: 先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信 ...

  4. stm32使用串口进行通讯之发送数据

    前提准备: 1.库函数基础模板 2.stlink下载器.USB-TTL下载器.单片机最小开发板stm32F103C8T6 3.面包板及相关接线 4.vscode与keil的联合开发更流畅 5.串口软件 ...

  5. STM32使用串口DMA方式发送数据

    1.cubemx设置 1.1基本设置 1.2 打开DMA和中断 2.代码实现 HAL_UART_Transmit_DMA(&huart1,(uint8_t*)str,strlen(str)); ...

  6. linux 串口 dma,STM32 USART串口DMA 接收和发送流程详解

    1.dma发送流程 1.配置DMA发送中断 - NVIC_Init 2.配置串口中断 - NVIC_Init 3.GPIO配置 - GPIO_Init 4.DMA发送配置 -DMA_Init  DMA ...

  7. android 串口一直打开_STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  8. STM32 HAL库 串口DMA接收不定长数据

    STM32 HAL库 串口DMA接收不定长数据 整体思路:我是用的CUBEMX软件生成的工程,使能了两个串口,串口2用来接收不定长的数据,串口1用来发送串口2接收到的数据:串口2我找了一个UBLOX卫 ...

  9. 【嵌入式系统开发13】采用串口中断方式完成单字符接受与字符串接受

    本文目的是主要介绍通过STM32F103C8T6接收到字符"s"时,停止持续发送"hello windows!"; 当接收到字符"t"时,持 ...

最新文章

  1. HTML做3D立体特效,html5 3D立体粒子波浪动画特效代码
  2. mybatis 创建session, 缓存, 执行SQL
  3. C语言文件操作解析(二)
  4. 如何DoDelete(Delete)中的Delete文本值传到DoDelete方法,报错信息为:Delete未定义!...
  5. vmware网络模式设置(说的最简单的一篇文章)
  6. QT的QFormLayout类的使用
  7. Vue 实现ToDoList
  8. JMP M16:64
  9. PS 基础教程,调整图像品质「1」如何调整亮度和对比度?
  10. SpringCloud实战(一)基于nacos实现订单+视频服务的调用
  11. 安装python时无法安装python包_无法安装Python包
  12. [转载] 非诚勿扰2
  13. 基于vscode编写markdown导出带书签(目录)的pdf
  14. kill the one(pjone歌词摘录)
  15. 数据立方体的基本计算
  16. 让WiFi更安全的新协议WPA3,再也不用担心妈妈的WiFi?
  17. 学习汇编语言-输入十进制数转为十六进制和二进制
  18. 工控安全PLC固件逆向一
  19. JSch执行shell命令
  20. CST学习笔记1--------CST基础建模

热门文章

  1. Android性能优化典范(二)
  2. 0-1000随机自然数生成
  3. 14位医疗AI专家齐聚一堂,「新一代人工智能院士高峰论坛」圆满落幕...
  4. 再见2019,你好2020
  5. 基于边缘计算的电力智慧物联系统设计与实现(论文研读)
  6. 物联网无线传感器复习
  7. 国内INCSGO能开龙驹咆哮的CSGO开箱网站推荐
  8. 输入手机号的html语言,关于html里插入javascript对手机号码格式验证
  9. IT人论房价 (四) 泡沫和破灭
  10. pintia浙大习题集7-46 爬动的蠕虫