首页 > 其他分享 >串口使用DMA数据接收和发送

串口使用DMA数据接收和发送

时间:2024-10-05 17:01:17浏览次数:1  
标签:DMA 中断 发送 串口 数据 CPU 空闲

  串口DMA部分在这里我一共分3个部分进行介绍,第一部分介绍什么是DMA第二部分是介绍串口DMA+空闲中断实现不定长数据的收发。第三部分是串口DMA中断实现数据收发。

第一部分DMA介绍

一、基本概念

  DMA是直接寄存器,这是指一种高速的数据传输操作,允许在外部设备和存储器和寄存器与寄存器之间直接读写数据,既不通过CPU,也不需要CPU干预。整个数据传输操作在一个称为"DMA控制器"的控制下进行的。CPU除了在数据传输开始和结束时做一点处理外,在传输过程中CPU可以进行其他的工作,不需要CPU的参与。这样,在大部分时间里,CPU和输入输出都处于并行操作。因此,使整个计算机系统的效率大大提高。DMA12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道),每个通道都支持软件触发和特定的硬件触发,对于STM32F103C8T6 DMA资源:DMA1(有7个通道)

  1.DMA框图

 

2.DMA基本结构

我们要想使用DMA了我们就需要按照如图所示进行dma的配置,也开始dma的初始化

  

 

 

 

3.DMA请求

  stm32f103c8t6DMA一共有7个通道,分配如下:

 

例如,我们想使用串口1的DMA进行数据接收和发送,了我们对于表上来看我们就是使用了dma的通道4和通道5.。如下所示

 

 

 

 

二、工作原理  

1,DMA 控制器

  1.DMA 操作通常由一个 DMA 控制器来协调。DMA 控制器是一个特殊的硬件芯片,它可以独立于 CPU 工作。
  2.当一个设备(如硬盘)需要进行数据传输时,它向 DMA 控制器发送请求。
  3.DMA 控制器接收到请求后,与 CPU 进行交互,获得对系统总线(包括数据总线、地址总线和控制总线)的控制权。

2.数据传输过程

  1. 首先,DMA 控制器根据设备的需求设置内存地址、传输字节数等参数。
  2. 然后,设备开始直接向内存写入数据(在数据输出的情况下,如硬盘向内存写入数据)或者从内存读取数据(在数据输入的情况下,如网络适配器从内存读取要发送的数据)。
  3. 在整个数据传输过程中,CPU 可以继续执行其他指令,只要这些指令不涉及正在被 DMA 传输所使用的内存区域。一旦数据传输完成,DMA 控制器会通知设备和 CPU 传输已经结束,然后释放系统总线的控制权。
  4. 例如当DMA使用串口进行数据接收时,不需要CPU的参与,CPU可以去干其他的事情。当数据接收完成后CPU就会通过串口中断设置一个标志位告诉CPU数据接收完成,然后CPU进行处理。就不需要CPU一直在这里等待数据接收完成之后去处理数据了。可以大大的提高CPU的利用率。

第二部分串口DMA+空闲中断实现不定长数据的收发

一、空闲中断

  1.基本概念

  在串口通信中,当串口接收完一帧数据后,如果在一段时间内没有新的数据接收,此时就会产生串口空闲中断。这个中断可以让微控制器或处理器在没有持续数据传输时被通知,以便进行相应的处理。如下图所示,当串口接收完一帧数据后,如果在一段时间内没有新的数据接收,此时就会产生串口空闲中断,在中断里面去通知CPU进行相应的数据处理。不需要cpu反复的进入中断查看数据是否接收完成,大大减小了cpu的负担。也实现了不定长数据包的接收提供了更好的方法。

  

2.工作原理

 

    1. 串口监测:串口持续监测接收线上的数据。
    2. 空闲判断:当串口在一段时间内未检测到任何数据的起始位时,就认为处于空闲状态。
    3. 中断触发:一旦判断为空闲状态,就会触发串口空闲中断信号,通知处理器进行相应的操作。

 

3.作用

  1数据帧识别 

    在接收数据时,可以通过串口空闲中断来确定一个完整的数据帧已经接收完毕。因为当连续的数据传输之间出现空闲状态时,很可能意味着一个数据帧的结束。

    例如,在接收多个长度不固定的数据帧时,利用串口空闲中断可以准确地识别出每个数据帧的边界,从而方便后续的数据处理。

   2.提高系统效率

    避免处理器持续查询串口状态,节省处理器资源。如果没有串口空闲中断,处理器可能需要不断地查询串口是否有新数据到来,这会消耗大量的处理器时间和能量。

    当有大量数据需要处理或者系统资源有限时,串口空闲中断可以显著提高系统的效率和响应速度

  3.异常检测

    可以检测到串口通信中的异常情况。例如,如果在预期的数据传输过程中出现了长时间的空闲,可能意味着通信出现了问题,如发送端故障、传输线路中断等。

    此时,处理器可以通过串口空闲中断及时发现问题,并采取相应的措施,如进行错误处理、重新建立连接等。

 

例:在我们想使用串口空闲中断时我们必须打开串口空闲中断,如果下图所示通过这个函数开启串口的空闲中断。

 

二,串口空闲中断加DMA实验

  1,首先我们要初始化相关的串口。我这里使用串口USATRT1。代码如下

  

上面我们进行了串口的相关初始化,并且打开了串口接收中断和串口空闲中断,接下来我们就应该配置DMA部分的初始化代码了。

 

2.DMA,这里我们通过查看DMA的通道确定了串口1使用的是DMA1的通道4和5,所以在这里我们相应配置DMA通道的4通道和5通道。如下所示

 到这里我们就已经配置好了串口加DMA的相关初始化部分,接下来就是配置相关串口接收中断和串口空闲中断的相关处理了

 

 

 如上图所示,我们可以看见我们这里有2个标志位获取函数。分别是1代表的是串口空闲中断的判断2是串口接收中断的判断。在这里我们需要注意一下在进入串口中断后,我们需要清除一下中断标志位,如4所示,如果我们是要想清除接收中断标志位或者发送中断标志位我们都需要使用USART_ClearITPendingBit()函数来进行标志位的清除。在这里注意一下如果是要想清除串口空闲中断的标志位哇就不可以使用USART_ClearITPendingBit()这个函数来进行清除在这里是无效的有,要想清除我们必须先读一下SR寄存器再读一下DR寄存器这样我们就清除了相应的串口的空闲中断标志位。

 

后面部分代码如下所示,在这里注意一下当我们发送完成后,我们需要使用memset(uart1RecvData, '\0', sizeof(uart1RecvData));清除一下接收缓冲区,使下一次数据是从第一位开始存下的,也防止数据溢出。

 

这部分的讲解就到这里了。大概讲解了一下,还有很多细节部分没有讲清楚。

 

 第三部分串口DMA中断实现数据收发

    上面我们已经讲解了DMA使用串口空闲中断实现不定长数据的收发,现在我们来讲解一下关于串口使用DMA中断实现定长数据的收发。

下面直接进行代码的讲解,在这里和上面有一些不一样,在使用DMA中断时,顾名思义我们使用的是DMA的中断,所以在这里我们就不需要配置串口的相关中断配置,只需要配置DMA部分的中断。

如上面所示,我们没有配置串口相关的中断,只是开启了DMA相关的中断配置。

 

 下面是DMA的中断处理函数

 

总结

总体而言,2部分相差不大,在配置方面一个是使用了串口的串口空闲中断进行数据的收发,一个是直接使用了DMA的发送和接收中断进行了数据的收发。一个是可以实现不定长数据的收发,一个不可以实现,差别就在这里。在这里特别提醒一下使用串口空闲中断+DMA进行数据收发时,发送完成中断只有在正常模式下可以进行触发,在循环模式下不可以触发

 

标签:DMA,中断,发送,串口,数据,CPU,空闲
From: https://www.cnblogs.com/zfcm-0117-12/p/18447403

相关文章

  • DMA数据转运
    一.DMA数据转运基本信息DMA直接寄存器数据转运就是将数据在外设与寄存器,寄存器与寄存器之间来回转运有12个独立可配置通道:DMA1(7个)DMA2(5个).数据转运可以是外设寄存器到存储器,或者存储器内部的Flash到SRAM以及SRAM到SRAM.因为Flash是只读的所以不能进行SRAM到Flash,或者......
  • truffle 和 ganache 打印账号列表和发送eth
     打印ganache环境的账户列表constlocalhost="http://127.0.0.1:7545";const{Web3}=require("web3");constweb3=newWeb3(newWeb3.providers.HttpProvider(localhost));web3.eth.getAccounts().then(function(result){console.log("账......
  • 假设有一个client和server,要发送非常大的数据,如何设计数据的发送系统,如何保证数据发送
    目录数据发送系统的设计数据拆分与重组:负载均衡:水平扩展:异步处理:数据发送完整性的保证数据校验:加密与解密:数字签名:传输协议选择:异常处理与重试机制:日志记录与监控:使用netty怎么设计一、Netty框架简介二、数据传输系统设计三、数据完整性保证四、高并发优化示......
  • 【花雕学编程】Arduino动手做(232)---ESP32-S3 CAM使用模拟量霍尔检测磁场并设定阈值控
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来——小小的......
  • 教你如何免费获取股票数据用python、JavaScript (Node.js)、JAVA等多种语言的实例代码
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • N32L40x基于串口的IAP升级升级速度2Mbps+上位机工具
    1.软件升级流程mcu开机上位机发送0xaa,0xaa,0x55,0x55,通知mcu进入升级状态,在收到该指令后,mcu擦除旧的APP程序,发送进入升级状态的指令,通知上位机进入升级状态擦除完成后进入升级状态,等待上位机发送升级包上位机开始发送数据包mcu接收数据包,并等待一个完成的数据包,每个......
  • [CVPR2024]CDMAD Class-Distribution-Mismatch-Aware Debiasing for Class-Imbalanced
    Introduction在不平衡数据集上训练的分类器往往对头部类(majorityclasses)有偏好。在半监督学习(semi-supervisedlearning,SSL)设置下,生成伪标签的算法由于生成带偏置的伪标签,往往会进一步加剧偏置。带偏置的伪标签会降低表征学习质量。特别的,如果有标签集合和无标签集合的分布差异......
  • 首发!米尔全志T536核心板,17串口4CAN口、四核A55
    在智能制造与物联网技术日新月异的今天,一款集高性能、低功耗、高可靠性于一身的工业级核心板成为了推动产业升级的关键力量。米尔电子向市场推出——国产真工业级四核Cortex-A55米尔全志T536核心板,助力国产真工业级工控板快速发展,为工业自动化、工业控制、机器人等领域提供强大的......
  • 转串口国产GP232RL兼容FT232RL芯片SSOP28 动能世纪
    基本功能FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换,也可转换到同步、异步Bit-Bang接口模式。基本参数FT232RL,采用SSOP封装方式。基本功能:FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换,也可转换到同步、异步Bit-Bang接口模式。基本参数:FT232RLFT232FTDI......
  • cmd发邮件:Windows命令行发送邮件的教程!
    cmd发邮件怎么通过命令行实现?如何使用CMD发送邮件?通过cmd发邮件,你可以在不打开任何邮件客户端的情况下,直接从命令行发送邮件。AokSend将详细介绍如何使用cmd发邮件功能,让你轻松掌握这一实用技能。cmd发邮件:基本原理cmd发邮件的基本原理是通过调用Windows系统中的邮件发送工......