理解HAL_UARTEx_ReceiveToIdle_IT的工作过程

news2024/11/20 0:48:45

先只看没错误发生, 没开DMA时候的情况

将会面临3种结局,   

  • 收满数据时候IDLE正好发生,     
  • 数据发多了, 数据已经收满时候IDLE还没发生
  • IDLE发生了数据没收满,     

首先: 接收开始

 主要的动作是
1.  status =  UART_Start_Receive_IT(huart, pData, Size);  开始中断接口

2. SET_BIT(huart->Instance->CR1, USART_CR1_IDLEIE);     使能IDLE中断

上面开接收中断调用的这里

主要作用是打开了RXNE 中断

到目前为止, 打开了RXNE和IDLE两个中断

如果串口收到数据将会进入中断处理HAL_UART_IRQHander  , 中断处理里面一个部分是处理RXNE, 也就是收到的数据

当不是错误导致进入的中断, 而且SR的RXNE和CR1的RXNEIE都是被使能了 

去调用中断接收函数       UART_Receive_IT(huart);

 UART_Receive_IT, 在没收满要收的数量的时候, 展开状态:

 这里从DR拿一个字节, 把这个计数减一 RxXferCount.  

如果已经到了最后一个要读的字节, 再减就0了, 那么就顺便处理了收满了数据的动作

 

关各个中断 , 清标志, 如果这时候碰巧IDLE标志也发生了, 那就是IDLE时候正好收满了数据, 那把ILDE的标志也清了, 这里是清的SR里的IDLE, 顺便清了一次DR.  最后进入用户可以重新定义的weak回调函数, 顺手还把收到的数据数量(其实这里直接就传了要收的数据量!!!)传给了回调函数

这时候完成了一次数量对得上的接收, IDLE发生时候正好收到了要收的数据量.    结局1

如果这时候数据数量收满了,  但是没收到IDLE, 就是外界往串口发来了数量大于要收的数量的数据,    那就不会在这里清SR的IDLE标志,  但是也去调用了回调,  这是  结局2

HAL_UART_IRQHander   另一个部分是处理IDLE, SR的IDLE

这个情况就是接收数据量没满的时候, 由于IDLE进来了中断

这时候做了和UART_Receive_IT几乎一样的动作序列, 关中断最后调用回调, 这是结局3

但是,  解决3和结局1往回调函数里传的数据数量计数值是不一样的

结局1:(收满时候正好发生IDLE)

结局3:  (数据量没收满,  就因为IDLE进了中断)

重新梳理一下另一条线,  接收数量的计数值.   RxXferSize和RxXferCount

他们在HAL_UARTEx_ReceiveToIdle_IT时候, 调用UART_Start_Receive_IT, 一同被赋值为了用户要收的数据量

 RxXferSize 结局1(收满正好IDLE)时候 被传进回调函数给用户使用. 

 RxXferCount 在UART_Receive_IT里 先--, 在判断是否为0, 以此判断是否刚好收满了要收的数据

UART_Receive_IT是谁调用的?    是中断处理函数HAL_UART_IRQHandler,  也就是说是因为每次的RXNE时候进行减1.  

那么结局3 传递给回调函数的计数值就能理解了

count是从size往下减,  size-count的结果是当前实际收到的 字节数

coutn>0是没收满的意思, nb_rx_data>0是还真收到了不止一个字节的意思

至此  分析完毕!

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

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

相关文章

【国产虚拟仪器】基于 ZYNQ 的电能质量系统高速数据采集系统设计

随着电网中非线性负荷用户的不断增加 , 电能质量问题日益严重 。 高精度数据采集系统能够为电能质 量分析提供准确的数据支持 , 是解决电能质量问题的关键依据 。 通过对比现有高速采集系统的设计方案 , 主 控电路多以 ARM 微控制器搭配…

1992-2022年经过矫正的夜间灯光数据

夜间灯光数据是我们在各项研究中经常使用的数据!我们平时使用的夜间灯光数据主要来源于NPP/VIIRS和DMSP/OLS两种渠道,我们之前也分享过这两种来源的夜间灯光数据,包括: 2012-2021年逐年的NPP/VIIRS夜间灯光数据2012-2021年逐月的…

MySQL查询性能优化之索引覆盖、索引下推、索引潜水、索引合并

索引覆盖 什么是索引覆盖 select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。 如何实现索引覆盖? 最常见的方法就是:将被查询的字段,建立到联合索引(如果只有一…

python---变量(2)

此处,首次使用“”对a进行设置值,也就是对a的初始化。 后续位置对a使用“”,实际上是对a赋值。 因此两行代码得到的结果显然是不同的! 变量的种类 1.整数-int-根据数据大小自动扩容 python中的变量类型不需要显示声明&#…

关于 arduino 中的 constrain(x, a, b)函数

当我们需要将一个变量的值限制在某个范围内时,可以使用 constrain(x, a, b) 函数来实现。该函数可以将参数 x 的值限制在区间 [a, b] 之间,如果 x 小于 a,则返回 a,如果 x 大于 b,则返回 b,否则返回 x。下面…

第五篇、基于Arduino uno,获取超声波(HC04)传感器的距离数据——结果导向

0、结果 说明:先来看看串口调试助手显示的结果,显示的是一个距离值,如果是你想要的,可以接着往下看。 1、外观 说明:虽然超声波传感器形态各异,但是原理和代码都是适用的。 2、连线 说明:只…

材料力学-剪力和弯矩方向规定及关系

剪力和弯矩的方向规定方法 对水平梁的某一指定截面来说, 剪力:在它左侧的向上外力,或右侧的向下外力,将产生正的剪力;反之,即产生负的剪力。 自己的记法(可以不按我的来)&#xff1…

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时之网络安全新总结

ChatGPT:你真的了解网络安全吗?浅谈网络安全攻击防御进行时 网络安全新总结 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序,是人工智能技术驱动的自…

ChatGPT在数据分析中的应用

最近,机器学习和人工智能技术在数据分析领域中发挥着越来越大的作用。而chatgpt正是这个领域最受欢迎的仿人聊天 AI 。但是,对于许多数据科学家和分析师来说,chatgpt并不是他们首选的工具。相反,pandas、sk-learn是数据科学家的最…

一起来聊聊ERP

聊聊ERP 哈喽,哈喽,大家好!今天开始,我们就来讲ERP了。 什么是ERP ERP是Enterprise Resource Planning 的缩写,中文含义是企业资源计划。它代表了当前在全球范围内应用最广泛、最有效的一种企业管理方法,…

JVM系列-第12章-垃圾回收器

垃圾回收器 GC 分类与性能指标 垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器,…

gym不渲染画面的解决方案(gym版本号0.26.2)

确认gym版本号 我安装了新版gym,版本号是0.26.2,不渲染画面的原因是,新版gym需要在初始化env时新增一个实参render_mode‘human’,并且不需要主动调用render方法,官方文档入门教程如下 import gym import numpy as n…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(第一章——FreeRTOS的基本框架)

学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。 注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

day15 Servlet-Request-Response

请求对象(request) **请求对象的作用:**封装了所有请求的数据,有服务器实现这个对象,我们直接调用sercive()方法 HttpServletRequest对象的常用方法 request请求方法描述request.getMethod()获得请求方式post\getre…

基于SpringBoot+Uniapp的微信小程序二手购物商城(用户手册+测试报告+详细设计文档)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 这个微信小程序二手购…

LangChain使用调研

目录 一、LangChain是什么 二、LangChain提供的主要模块 三、Agent使用例子 四、zero-shot-react-description在ChatGPT和LLaMA-7B效果对比 一、LangChain是什么 LangChain是一个程序框架,它允许用户围绕LLM(基座)快速构建应用程序。 La…

多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测

多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测 目录 多维时序 | MATLAB实现GA-BiLSTM遗传算法优化双向长短期记忆网络的多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现GA-BiLSTM遗传算法优化双向长短…

宏工科技“全面”发力CIBF,助推电池智造“高效提质”

5月16-18日,第十五届中国国际电池技术展览会(CIBF2023)在深圳盛大举行。宏工科技携电池材料与电池匀浆领域的创新产品和系统解决方案精彩亮相。 据了解,宏工科技在新能源行业的业务涉及电池材料整线产线、电池匀浆、电池回收三个…

边沿检测电路

目录 同步信号的边沿检测 异步信号的边沿检测 所谓的边沿检测(幼教边沿提取),就是检测输入信号的上升沿和下降沿。在设计数字系统时,边沿检测是一种很重要的思想,实际编程时用的最多的时序电路应该就是边沿检测电路和…

为什么要把一个函数分解成三角函数?(傅利叶级数)

为什么要把一个函数分解成三角函数?(傅利叶级数) 笔记来源:【知识拼图】傅里叶变换从零到一 02集 傅里叶级数从起源到操作,真的很细 把一个函数分解成三角级数体现了化繁为简,一个复杂函数化成许多三角函数的叠加 先回顾一下向量…