【STM32 CubeMX】串口编程DMA+IDLE中断

这篇具有很好参考价值的文章主要介绍了【STM32 CubeMX】串口编程DMA+IDLE中断。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

在嵌入式系统中,串口通信是一项关键的任务,而使用DMA(直接内存访问)结合IDLE中断进行串口编程,尤其是在STM32 CubeMX环境中,能够提高系统的效率和性能。STM32 CubeMX为STM32微控制器提供了图形化的配置工具,可以简化初始化代码的生成过程,使得串口编程变得更加容易。通过结合DMA和IDLE中断,我们可以实现高效的异步串口通信,确保数据传输的可靠性,同时减轻CPU的负担。


一、为什么要引入IDLE中断

比如我们的stm32接了一个wifi模块esp8266,esp8266会发来数据,假设我现在想去读数据,我使用DMA方式读数据,我不知道esp8266给我发多少数据,但是肯定不超过1024字节吧,然后我调用函数去读,读1024字节,如果他给我发了刚好1024字节,欸,那么就读成功了。如果他发1000数据,而且这1000数据是完整的了,但DMA的中断并不会调用,DMA中断只会在接收到一半或者全部接收完才会调用。

我们如何知道他的发的这些东西已经完整了呢?
我们知道,当串口发送数据的时候,他必定有一个起始位,如果接收方在这一节数据之后,发现这个引脚一直没有开始信号,在10bit的时间里发现对方都没有数据,他就认为数据发送完了,这时就会产生IDLE空闲中断。

比如说对方发了1bit的数据,由于一些原因卡壳了,过了10bit的数据时间,这时就会调用IDLE中断,可是数据并不完整啊。所以对于这种情况,IDLE中断是无意义的。

注意:IDLE中断用来传输大量数据的时候才有意义。

二、IDLE中断使用方式

2.1 接收的三种情况

当我们使用IDLE中断来接收数据的时候,他完成会有三种情况

  1. 第一种就是确实接收到了指定数据,调用的完成的回调函数(HAL_UART_RxCpltCallback被调用)
  2. 第二种就是IDLE中断调用了(HAL_UARTEx_RxEventCallback被调用)
  3. 第三种就是有错误发生导致中断(HAL_UART_ErrorCallback被调用)

2.2 函数的使用

查询方式

我们可以使用下面这个函数进行IDLE中断的查询方式进行查询:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint16_t *RxLen,
                                           uint32_t Timeout);

UART_HandleTypeDef *huart:
作用: 传递一个指向UART_HandleTypeDef结构体的指针,该结构体包含了UART的配置和状态信息。
解释: 这个参数用于标识特定的UART外设,通过该参数,函数知道应该对哪个UART进行操作。

uint8_t *pData:
作用: 指向要接收数据的缓冲区的指针。
解释: 这个参数指定了存储接收数据的缓冲区。当函数接收到指定数量的字节或达到超时条件时,接收到的数据将存储在该缓冲区中。

uint16_t Size:
作用: 要接收的数据字节数。
解释: 它定义了期望接收的字节数目。当接收的字节数达到这个值时,函数将数据接收到空闲状态(IDLE)。

uint16_t *RxLen:
作用: 指向用于存储实际接收到的数据字节数的指针。
解释: 当函数成功接收到数据时,它将更新此指针指向的变量,以反映实际接收到的字节数。这对于知道接收了多少数据很有用。

uint32_t Timeout:
作用: 接收数据的超时时间。
解释: 定义了等待接收数据的最大时间。如果在超时时间内未接收到指定数量的字节,函数将返回适当的错误代码。

如果有IDLE状态,他放回HAL_OK

中断方式

我们可以使用下面这种方式进行IDLE中断的接收:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

这个函数就是去使能接收中断和IDLE中断。
如果发生了IDLE中断他会怎么做?
在串口1这里,IDLE中断也属于串口中断
【STM32 CubeMX】串口编程DMA+IDLE中断,从0带你学会如何像人类一样写STM32程序,stm32,单片机,嵌入式硬件,mcu,c,51单片机
下面就是如果有IDLE中断发生的代码:如果发现了IDLE中断,他会分两种情况处理
【STM32 CubeMX】串口编程DMA+IDLE中断,从0带你学会如何像人类一样写STM32程序,stm32,单片机,嵌入式硬件,mcu,c,51单片机
如果你使用DMA:
取消DMA,调用下面这个:
【STM32 CubeMX】串口编程DMA+IDLE中断,从0带你学会如何像人类一样写STM32程序,stm32,单片机,嵌入式硬件,mcu,c,51单片机
传入你收到了几个字符。

如果你使用中断:
禁止接收中断,调用下面这个:
【STM32 CubeMX】串口编程DMA+IDLE中断,从0带你学会如何像人类一样写STM32程序,stm32,单片机,嵌入式硬件,mcu,c,51单片机

传入你收到了几个字符。

当有IDLE中断时,调用HAL_UARTEx_RxEventCallback表示有IDLE中断了

DMA方式

我们可以使用下面这个函数进行DMA+IDLE接收:

HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

当他产生IDLE中断后,他会调用HAL_UARTEx_RxEventCallback回调函数

分析一个问题

UART 的 IDLE 中断何时发生?RxD 引脚一开始就是空闲的啊,难道 IDLE 中断一直产生?
不是的。当我们使能 IDLE 中断后,它并不会立刻产生,而是:至少收到 1 个数据后,发现
在一个字节的时间里,都没有接收到新数据,才会产生 IDLE 中断。


总结

串口编程对于嵌入式系统至关重要,而在STM32 CubeMX环境中,利用DMA和IDLE中断的组合可以使串口通信更为高效。DMA允许数据在内存和外设之间直接传输,减轻了CPU的负担,提高了系统的响应速度。IDLE中断则使得在没有数据传输时,系统能够进入低功耗状态,进一步降低功耗。通过这样的串口编程方式,我们能够在保证性能的同时,实现更加节能和可靠的嵌入式系统。在STM32 CubeMX的支持下,配置串口通信变得更加简单,为嵌入式开发者提供了更高的开发效率。文章来源地址https://www.toymoban.com/news/detail-828513.html

到了这里,关于【STM32 CubeMX】串口编程DMA+IDLE中断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32 CubeMX】串口编程DMA

    在嵌入式系统中,串口通信是一项至关重要的功能,它允许单片机与外部设备进行数据交换,如传感器、显示器或其他设备。然而,在高速数据传输的场景下,传统的串口通信方式可能会使CPU过于繁忙,从而影响系统的性能。为了解决这一问题,STM32系列微控制器提供了DMA(

    2024年02月20日
    浏览(56)
  • GD32实现串口空闲(IDLE)中断 + DMA机制接收数据

    前言 串口功能在单片机开发中,是比较常用的外设,熟练使用串口功能也是驱动开发必备的技能之一。 DMA 是一种CPU辅助手段,可以在CPU不参与的情况下,是做一些辅助CPU的事情,如通常的数据搬运。 在没有DMA之前,数据读取时,需要CPU的处理,在多任务处理时,增加资源紧

    2023年04月13日
    浏览(42)
  • 【STM32】CUBEMX之串口:串口三种模式(轮询模式、中断模式、DMA模式)的配置与使用示例 + 串口重定向 + 使用HAL扩展函数实现不定长数据接收

    目录   总览 使用CUBEMX创建工程的基本配置 CUBEMX中的配置 Keil中的配置 实物连接 串口轮询模式 轮询模式HAL库函数 特点 实验一:发送数据给单片机并让其返回相同值 串口重定向 串口中断模式 在CUBEMX中打开串口中断 中断模式HAL库函数 特点 实验二:使用中断回调完成实验一

    2024年04月10日
    浏览(65)
  • GD32或STM32:DMA循环模式与普通模式(串口IDLE)

    USART+DMA+循环队列接收不定长数据-CSDN博客 STM32 DMA 循环模式DMA_Mode_Circular详解-CSDN博客 推荐以上两个链接。 Normal(普通)模式的DMA+串口IDLE中断,流程如下: 1、初始化时:开启串口IDLE中断;dma_circulation_disable,失能DMA的循环; 2、在串口IDLE中断里面: (1) 清除idle的flag;dma_c

    2024年02月21日
    浏览(39)
  • STM32 UART串口通信IDLE空闲中断的使用步骤

    参考了各路大神的资料,蒙蔽了半天,终于学会了,记录一下,以后忘了可以回来复习参考。 一、首先在stm32cube中配置打开对应uart串口的中断 二、工程main函数调用 __HAL_UART_ENABLE_IT(huart1,UART_IT_IDLE);//hal库宏定义,使能串口空闲中断     HAL_UART_Receive_DMA(huart1,data,sizeof(data));//使

    2024年02月12日
    浏览(39)
  • 【STM32】HAL库 STM32CubeMX——DMA (串口DMA发送接收)

    软件: STM32CubeMX KEIL5 mcuisp 串口通信助手 硬件: STM32F103C8Tx 杜邦线,面包板,USB转TTL DMA,全称Direct Memory Access,即直接存储器访问。 DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。 我们知道系统的运

    2024年02月12日
    浏览(63)
  • STM32CubeMX配置ADC采样(轮询、中断、DMA)

    STM32CubeMX能够极大减小STM32外设配置的工作量,因此作者也借助空闲时间对STM32CubeMX相关配置进行了学习,本文介绍如何利用STM32CubeMX配置ADC采样,记录了作者学习过程中遇到的问题及解决办法,使大家少走弯路,并方便以后复习 先选择所使用的MCU,这里我使用的是STM32F407ZGT系

    2024年02月03日
    浏览(51)
  • STM32CubeMX系列05——ADC(轮询、中断、DMA)

    ==== 文章汇总(有代码汇总) ==== 正点原子Mini板,主控 STM32F103RCT6. 用到的外设: 串口1(PA9、PA10) 任意几个GPIO口(这里用PA1、PA2、PA3,对应ADC通道1、2、3)。 配置时钟源 配置debug模式(如果需要ST-Link下载及调试可以勾选) 配置时钟树(可以直接在HCLK那里输入72,然后敲回

    2024年02月10日
    浏览(42)
  • STM32 cubemx配置DMA+空闲中断接收不定长数据

    本篇文章给大家讲解一下DMA+串口空闲中断接收串口不定长数据,之前我们也是讲解过串口接收不定长数据的,那么本篇文章的话将使用DMA来接收不定长数据。 串口空闲中断是指在串口接收到数据后,在数据的传输结束之后,在一段连续的空闲时间内没有接收到新数据时触发

    2024年02月19日
    浏览(53)
  • Note10:基于STM32H7+HAL+CubeMX+DMA+SPI+串口中断+定时器+RTC的多传感器数据采集系统(2*ADXL355和ADXL375通过Sync时序同步)

    本文的初衷一方面是将我的一些关于STM32开发方面浅显的个人经验分享给初学者、并期望得到大佬的批评指正,另一方面是记录自己的实验过程便于回顾。 我预感应该要写很多,不过鉴于之前的数篇笔迹中,对于SPI/DMA/ADXL3XX系列加表的使用已经详细描述过了,所以这篇博客只

    2024年02月10日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包