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

news2024/11/24 4:52:42

文章目录

  • 前言
  • 一、为什么要引入IDLE中断
  • 二、IDLE中断使用方式
    • 2.1 接收的三种情况
    • 2.2 函数的使用
      • 查询方式
      • 中断方式
      • DMA方式
      • 分析一个问题
  • 总结


前言

在嵌入式系统中,串口通信是一项关键的任务,而使用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中断也属于串口中断
在这里插入图片描述
下面就是如果有IDLE中断发生的代码:如果发现了IDLE中断,他会分两种情况处理
在这里插入图片描述
如果你使用DMA:
取消DMA,调用下面这个:
在这里插入图片描述
传入你收到了几个字符。

如果你使用中断:
禁止接收中断,调用下面这个:
在这里插入图片描述

传入你收到了几个字符。

当有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的支持下,配置串口通信变得更加简单,为嵌入式开发者提供了更高的开发效率。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaSE】数据类型和运算符

目录​​​​​​​ 前言 数据类型 1. 数据类型的分类 2. 基本数据类型 变量 1. 概叙 2. 整型变量 3. 字节型 & 短整型 & 长整型变量 4. 单 / 双精度浮点型变量 5. 字符型变量 6. 布尔型变量 类型转换 1. 自动类型转换(隐式) 2. 强制类型转换(显式) 补…

针对某终端安全自检钓鱼工具的分析

前言 朋友微信找到我,说某微信群利用0day通告进行钓鱼,传播名为“终端安全自检工具”的恶意文件,然后还给了两个IP地址,如下: 咱们就来详细看看这个工具吧。 样本信息 拿到样本,样本的图标,如…

[嵌入式系统-16]:RT-Thread -2- 主要功能功能组件详解与API函数说明

目录 一、RT-Thread主要功能组件 二、内核组件 2.1 概述 2.2 API 三、设备驱动 3.1 概述 3.2 API 四、通信组件 4.1 概述 4.4 API 五、网络组件 5.1 概述 5.2 API 5.3 补充:MQTT协议 六、文件系统 6.1 概述 6.2 API 七、GUI 组件 7.1 概述 7.2 …

LabVIEW卫星电视接收仿真系统

LabVIEW卫星电视接收仿真系统 随着卫星电视数字化的加速,传统模拟信号接收系统已无法满足需求。设计一套船载数字卫星电视接收系统,通过LabVIEW环境进行仿真实验,验证系统设计的可行性与有效性,满足数字信号接收的高精度要求&…

【从Python基础到深度学习】2. Ubuntu及插件安装

本期所有软件安装包:链接:https://pan.baidu.com/s/1UVEYm-12FivAnrE5NUXevg?pwdum60 一、安装Ubuntu 1.1 软件安装包:下载 VMware Workstation Pro | CN 一直点下一步即可 1.2 双击运行软件: 输入密钥 1 、VMware 15密钥 …

【数据结构】16 二叉树的定义,性质,存储结构(以及先序、后序、中序遍历)

二叉树 一个二叉树是一个有穷的结点集合。 它是由根节点和称为其左子树和右子树的两个不相交的二叉树组成的。 二叉树可具有以下5种形态。 性质 一个二叉树第i层的最大结点数为 2 i − 1 2^{i-1} 2i−1, i ≥ 1 i \geq 1 i≥1 每层最大结点可以对应完美二叉树(…

[ai笔记9] openAI Sora技术文档引用文献汇总

欢迎来到文思源想的ai空间,这是技术老兵重学ai以及成长思考的第9篇分享! 这篇笔记承接上一篇技术文档的学习,主要是为了做一个记录,记录下openai sora技术介绍文档提到的一些论文,再此特地记录一下! 1 原文…

机器学习 day38(有放回抽样、随机森林算法)

有放回抽样 有放回抽样和无放回抽样的区别:有放回可以确保每轮抽取的结果不一定相同,无放回则每轮抽取的结果都相同 在猫狗的例子中,我们使用”有放回抽样“来抽取10个样本,并组合为一个与原始数据集不同的新数据集,虽…

JavaSE-03笔记【继承~super】

文章目录 1. 继承1.1 继承概述(理解)1.2 如何继承(掌握)1.2.1 继承的语法格式1.2.2 具体举例 1.3 继承的相关特性(掌握)1.4 对继承自Object类的方法的测试(理解)1.5 难点解惑1.5.1 掌…

Leecode之合并两个有序链表

一.题目及剖析 https://leetcode.cn/problems/merge-two-sorted-lists/description/ 二.思路引入 用指针遍历两个链表并实时比较,较小的元素进行尾插,然后较小元素的指针接着向后遍历 三.代码引入 /*** Definition for singly-linked list.* struct ListNode {* int va…

云计算基础-快照与克隆

快照及克隆 什么是快照 快照是数据存储的某一时刻的状态记录,也就是把虚拟机当前的状态保存下来(快照不是备份,快照保存的是状态,备份保存的是副本) 快照优点 速度快,占用空间小 快照工作原理 在了解快照原理前,…

iTop-4412 裸机程序(二十二)- RTC时钟

目录 0.源码1. RTC2. iTop4412 中的 RTC使用的相关寄存器3. BCD编码4. 关键源码 0.源码 GitHub:https://github.com/Kilento/4412NoOS 1. RTC RTC是实时时钟(Real Time Clock)的缩写,是一种用于计算机系统的硬件设备&#xff0…

vscode写MATLAB配置

vscode写MATLAB python下载 官网说明Versions of Python Compatible with MATLAB Products by Release - MATLAB & Simulink 不确定这三列都表示什么意思,尽量安装这三列都有的python版本吧,我安装的 MATLAB R2023b,python选择的是3.11.5 …

2024 年 11 款最佳 iPhone 数据恢复软件和应用程序

数据丢失是任何人都无法承受的,因为它对每个人都至关重要。但导致数据丢失的原因有很多,一些常见的原因是意外删除数据、设备被盗、iOS 越狱、硬件损坏、病毒感染等。我们列出了 iOS 的顶级恢复工具,其中包括:将帮助您方便地恢复数…

LLM 参数,显存,Tflops? 训练篇(1)

如果你要训练一个模型大概会考虑哪些因素? 模型多大?参数 占用显存多少,能不能装的下 我需要多少算力来支撑 本文就针对一个标准的Transfomer模型的套路和大家简单说一下 为了后文大家看算式明白,我们先约定一下每个变量代表的意义 L: Trans…

网络安全最典型基础靶场-DVWA-本地搭建与初始化

写在前面: 之前也打过这个 DVWA 靶场,但是是在虚拟机环境下的一个小块分区靶场; 本篇博客主要介绍在本地搭建 DVWA 靶场以及靶场的初始化,后续会陆续更新通关教程。 由于我们是在本地搭建,则需要基于你已经装好 phpstu…

智能传感器阅读笔记-物联网用智能传感器技术的发展重点

物联网用智能传感器技术的发展重点包含边缘计算算法优化、身份认证算法优化和能量采集技术。 图1 物联网用智能传感器技术的发展重点 边缘计算算法优化 边缘计算是指在靠近物或数据源头的一侧(传感器侧),采用集检测、计算、存储、通信功能…

用tensorflow模仿BP神经网络执行过程

文章目录 用矩阵运算仿真BP神经网络y relu ( (X․W ) b )y sigmoid ( (X․W ) b ) 以随机数产生Weight(W)与bais(b)placeholder 建立layer函数改进layer函数,使其能返回w和b github地址https://github.com/fz861062923/TensorFlow 用矩阵运算仿真BP神经网络 impo…

关于内存相关的梳理

1 关键字 总结 (lowmemory,anr in) 2 知识储备 虚拟机原理 垃圾回收算法 又包含标记 和清除两种算法 标记:程序计数器-已过时,可达性分析 具体可见 http://help.eclipse.org/luna/index.jsp?topic%2Forg.ec…

C#,二进制数的非0位数统计(Bits Count)的算法与源代码

计算一个十进制数的二进制表示有多少位1? 1 遍历法(递归或非递归) 使用循环按位统计1的个数。 2 哈希查表法 利用一个数组或哈希生成一张表,存储不同二进制编码对应的值为1的二进制位数,那么在使用时,只…