首页 > 其他分享 >STM32 cubemx配置USART DMA传输

STM32 cubemx配置USART DMA传输

时间:2023-08-02 14:35:39浏览次数:42  
标签:DMA USART STM32 传输 内存 串口 数据传输 CPU

(文章目录)


前言

本篇文章来讲解DMA的概念,并使用DMA来进行串口的数据收发。

一、DMA概念

DMA(Direct Memory Access,直接内存访问)是一种计算机系统的技术,允许外部设备(如硬盘驱动器、网络适配器或图形卡)直接与计算机内存进行数据传输,而不需要CPU的直接参与。这种直接的内存访问可以提高数据传输的效率,并减轻CPU的负担。 在没有DMA的情况下,数据传输通常需要通过CPU来完成,这涉及到CPU的中断处理程序从设备读取数据,然后将数据写入内存,或者从内存读取数据,然后将数据发送到设备。这种方式会消耗CPU的时间和计算资源,限制了系统的性能和吞吐量。 通过DMA技术,外部设备可以直接与系统内存进行数据传输,而不需要CPU的干预。在DMA传输开始之前,系统配置好DMA控制器,并提供一个DMA缓冲区,外部设备可以将数据直接写入到该缓冲区或者从该缓冲区读取数据。当DMA传输完成后,DMA控制器会发出一个中断信号,以通知CPU。

使用DMA的好处包括:

1.提高数据传输速度:由于数据传输不需要CPU的介入,DMA可以以更高的速度进行数据传输,从而提高系统性能和吞吐量。 2.减轻CPU负担:传统的数据传输需要CPU的参与,消耗CPU的时间和计算资源。而使用DMA进行数据传输时,CPU可以专注于其他的计算任务,减轻了CPU的负担。 3.支持大规模数据传输:DMA技术可以支持大规模的数据传输,例如高清视频流、大型文件和网络数据包的处理。

总之,DMA是一种能够提高系统性能和数据传输效率的技术,通过允许外部设备直接与内存进行数据传输,减少了CPU的介入。这在需要高速、大量或连续数据传输的场景中特别有用,如高性能计算、网络通信和存储系统等。

二、STM32 DMA数据手册分析

从DMA的描述来看在STM32 F103这款芯片中有DMA1和DMA2,DMA1有7个通道,DMA2有5个通道。 在这里插入图片描述 DMA架构图: DMA支持直接和SRMA进行数据的传输,不需要经过CPU,这样就可以让CPU去做其他的事情,提高系统的运行效率。

在这里插入图片描述 使用DMA(Direct Memory Access)进行数据传输时,通常需要经过以下步骤:

1.设置DMA控制器:首先,需要在系统中配置和设置DMA控制器。这包括设置DMA的源地址和目标地址,传输长度,传输方向(从内存到设备或从设备到内存),以及其他相关参数。

2.发送DMA请求:在数据传输之前,需要向DMA控制器发送DMA请求。该请求通常由CPU或设备发起,用于指示DMA控制器执行特定的数据传输操作。

3.DMA传输:一旦DMA请求被接收和识别,DMA控制器将启动数据传输。它将直接从源地址读取数据,并将数据传输到目标地址。在传输过程中,DMA控制器绕过CPU,直接控制内存和设备之间的数据传输,以提高数据传输效率并减轻CPU的负担。

4.中断或完成通知:一旦DMA传输完成,DMA控制器通常会生成一个中断信号或发送一个完成通知,以通知CPU或相关设备传输已经完成。

正常进行数据的发送:

不使用DMA进行串口的数据发送时,CPU需要从SRMA中读取出存储的数据,然后再发送给串口,发送少量数据是不会影响CPU执行其他事情的,假如我想发送10000个数据,那么这个时候就会让CPU处于一直在发送数据的状态,这样就会影响到其他程序的执行。

在这里插入图片描述 根据手册描述DMA和CPU共享总线来执行直接的内存传输。 在这里插入图片描述

DMA可以直接访问到外设和SRMA,那么这样就不需要CPU来进行数据的读取交换了,直接使用DMA就可以解决这个问题,那么这样的话就可以提高系统的运行效率了。 在这里插入图片描述

3.DMA模式介绍

下面我们来看到DMA的两种模式,一种是循环模式,一种是内存到内存的模式。 在这里插入图片描述

DMA的循环模式(Circular Mode): 在循环模式下,DMA传输的数据可以在源和目的地之间循环传输,以连续地进行数据传输操作。这种模式下,一旦DMA传输完成,它会自动重新开始下一轮传输,而无需软件干预。 循环模式对于需要在连续数据块之间进行重复传输的应用非常有用,如音频、视频流等。它可以在不中断DMA传输的情况下循环传输数据,大大提高了数据传输效率和系统性能。

DMA的内存到内存模式(Memory-to-memory Mode): 内存到内存模式允许DMA直接在两个内存区域之间进行数据传输,而无需外设的参与。在这种模式下,DMA通道可以从一个内存位置读取数据,并将数据直接写入另一个内存位置,而不需要CPU的介入。 内存到内存模式非常适用于需要在内存之间快速传输数据的应用场景,例如内存拷贝、内存填充等。通过使用这种模式,DMA可以独立地执行数据传输,减轻CPU的负担,提高传输效率。

总结:DMA的循环模式允许数据在源和目的地之间循环传输,连续进行数据传输操作,并在每次传输完成后自动重新开始下一轮传输。而DMA的内存到内存模式允许DMA直接在两个内存区域之间传输数据,而不需要外设的触发请求,并且能够快速、高效地在内存之间传输数据。这两种模式都有助于提高数据传输效率并减轻CPU的负担,适用于不同的应用场景。

4.cubemx配置

配置一个LED灯观察实验现象: 在这里插入图片描述 配置串口1: 在这里插入图片描述 开启串口中断: 这里不开启串口中断的话无法判断串口是否发送完成一次数据,这样串口就一直处于忙状态导致完成进行下一次的发送。

在这里插入图片描述 DMA通道设置:

TX设置为从内存到外设,因为串口的发送就是把内存中的数据取出来再发给外设,RX设置为从外设到内存,串口发送过来的数据将会保存在内存中。

模式选择Normal,循环模式的话只需要调用一次发送函数就会一直进行数据的发送了。

在这里插入图片描述

具体代码: 这里发送一个非常长的数据,同时让这个LED闪烁,看看串口的发送会不会影响到LED的闪烁,结果是不会的。

uint8_t msg[1024] = "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello";

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_UART_Transmit_DMA(&huart1, msg, strlen(msg) + 1);
		
		
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5);
		HAL_Delay(100);
  }

总结

本篇文章就讲解到这里,下篇文章我们讲解DMA的具体配置和DMA串口接收不定长数据。

标签:DMA,USART,STM32,传输,内存,串口,数据传输,CPU
From: https://blog.51cto.com/u_16153875/6937982

相关文章

  • 基于STM32设计的人体健康检测仪
    一、项目介绍当前文章介绍基于STM32设计的人体健康检测仪。设备采用STM32系列MCU作为主控芯片,配备血氧浓度传感器(使用MAX30102血氧浓度检测传感器)、OLED屏幕和电池供电等外设模块。设备可以广泛应用于医疗、健康等领域。可以帮助医生和病人更好地了解病情变化,提高治疗效果和生活质......
  • STM32采用主从计时器实现精确脉冲输出
         首先按前面所述的主从计时器要求配置好主从计时器,这是最基本的要求。主计时器负责设置脉冲输出的频率以及输出脉冲,从计数器所控制输出的脉冲数。具体过程是这样的,主进程启动主从计时器,从计时器通过主计时器输出的触发信号开始脉冲计数,当达到指定的计数值后,产生中......
  • stm32CubeIDE 串口UART+DMA+空闲中断接收不定长数据
    一、概述串口使用时,有时候会有接收不定长数据的需求,这时候用DMA+空闲中断的方式是最好的方法。二、cubeide的配置串口按照需求配置后,添加一个串口接收的DMA,如下图 三、代码编写部分1、在串口init函数 MX_UART4_Init(void)的末尾用户代码区域添加使能空闲中......
  • rdma-core之rping.c
    头部信息#define_GNU_SOURCE#include<endian.h>#include<getopt.h>#include<stdlib.h>#include<string.h>#include<stdio.h>#include<errno.h>#include<sys/types.h>#include<sys/socket.h>#include<netdb......
  • Rockchip RK3399 - Platform驱动(DMA&i2s0)
    Platfromdriver提供了配置/使能SoC音频接口的能力;Plaftrom驱动分为两个部分:snd_soc_platform_driver、snd_soc_dai_driver。snd_soc_platform_driver:负责管理音频数据,把音频数据通过DMA或其他操作传送至CPUDAI中;snd_soc_dai_driver:负责完成SoC一侧的DAI参数配置,同时也会通过......
  • STM32案例学习 GY-39环境监测传感器模块
    STM32案例学习GY-39环境监测传感器模块硬件平台野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块GY-39环境监测传感器模块GY-39是一款低成本,气压,温湿度,光强度传感器模块。工作电压3-5v,功耗小,安装方便。其工作原理是,MCU......
  • STM32入门学习笔记
     【1-1】、定时器定时中断&定时器外部时钟第一步:RCC开启时钟,是每个代码的第一步第二步:选择时基单元的时钟源,对于定时中断,我们选择内部时钟源第三步:配置时基单元,包括预分频器、自动重装器、计数模式等等,可以用结构体进行配置第四步:配置输出中断控制,允许更新中断输出到NVIC第五......
  • rdma-core之riostream.c
    头文件和库以及全局变量#include<stdio.h>#include<stdlib.h>#include<string.h>#include<strings.h>#include<errno.h>#include<getopt.h>#include<sys/types.h>#include<sys/socket.h>#include<sys/time.h>#i......
  • stm32cubeide ioc报错 This IOC file has been generated with CubeMX version 5.6.1
    STM32Cubemx文件的版本不一致导致打不开.ioc文件的问题问题:ThisIOCfilehasbeengeneratedwithCubeMXversion5.6.1YourcurrentCubeMXversionis5.0.0PleaseupdatetoanewestCubeMXversiontobeabletoopenthisIOC.笔者遇到这个问题后,就开始升级程序,但是升级......
  • stm32新建工程步骤
    新建基于标准库的工程操作步骤新建存放工程的文件夹可以在D/E盘下存放,这边放在桌面了。打开keil5软件,新建ProjectProject->NewμVisionProject...定位到刚新建的my_Stm32_Projects文件夹。此时再新建一个文件夹存my_new_project放本次工程:点进my_new_project文件夹,再给工程起一个......