当前位置: 首页 > news >正文

STM32获取SHT3X温湿度芯片数据

目录

一、概述

二、单次数据采集模式的测量

1、配置说明

2、代码实现方式

三、周期性数据采集模式的测量

1、配置说明

2、代码实现方式

四、完整代码下载链接


一、概述

        SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提供了线性化、温度补偿的数字输出,具有宽电源电压范围、高速I2C接口以及可选的地址设置等特点。

  1. 高精度:SHT3X提供了高精度的温湿度测量,湿度误差在±3%(SHT30)或±2%(SHT31)以内,温度误差在±0.3℃(SHT30)或±0.2℃(SHT31)以内。
  2. 宽电源电压范围:SHT3X的供电电压范围宽达2.4V至5.5V,确保了与各种组装情况的兼容性。
  3. 高速I2C接口:SHT3X配备了高速I2C接口,通信速度可达1MHz,并支持两个用户可选地址,方便多个传感器在同一总线上工作。
  4. 快速启动和测量时间:SHT3X具有非常快的启动和测量时间,能够快速响应环境变化。

        SHT3X的引脚包括供电引脚(VDD/VSS)、复位引脚(nRESET)、地址引脚(ADDR)、以及I2C通信引脚(SCL/SDA)。其中,ADDR引脚用于设置传感器的地址,SCL和SDA引脚分别用于I2C通信的时钟和数据线。

        通过ADDR引脚的适当接线,可以选择I2C地址(见下表)。ADDR引脚可以连接到逻辑高电平或逻辑低电平。通过切换ADDR引脚上的电平,可以在运行期间动态改变传感器的地址。

SHT3x-DIScomes采用8引脚DFN封装,请参见下表所示。 

        SHT3X内部包含湿度传感器和温度传感器,通过ADC模块将模拟信号转换为数字信号。校准模块结合ADC模块输出的数值进行处理和线性化,然后通过I2C接口与外部通信。在传输过程中,每个数据值后面都会跟着CRC校验和,以确保数据的准确性。

二、单次数据采集模式的测量

1、配置说明

        在这种模式下,一个发出的测量命令触发一个数据对的采集。每个数据对包括一个16位温度值和一个16位湿度值(按此顺序)。在传输过程中,每个数据值后面总是跟着一个CRC校验和(参见下图所示)。在单次模式下,可以选择不同的测量命令。16位命令(参见下图所示)。它们在可重复性(低、中、高)和时钟延伸(使能或禁用)方面有所不同。重复性设置会影响测量持续时间,从而影响传感器的总能耗。

2、代码实现方式

在main主函数中调用初始化后,通过调用下面的函数实现两种方式的单次测量。

	// 演示带时钟拉伸的单次测量error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_CLKSTRETCH, 50);if(error != NO_ERROR){} // 在这里处理错误 HAL_Delay(50);// 演示带轮询的单次测量,超时50毫秒error = SHT3X_GetTempAndHumi(&temperature, &humidity, REPEATAB_HIGH, MODE_POLLING, 50);if(error != NO_ERROR){} // 在这里处理错误 HAL_Delay(50);
//----------------------------------------------------------------------------
// 获取温度和湿度
etError SHT3X_GetTempAndHumi(float* temperature, float* humidity,etRepeatability repeatability, etMode mode,uint8_t timeout)
{etError error; // 错误代码switch(mode){    case MODE_CLKSTRETCH: // 以时钟拉伸模式获取温度和湿度error = SHT3X_GetTempAndHumiClkStretch(temperature, humidity,repeatability, timeout);break;case MODE_POLLING:    // 以轮询模式获取温度和湿度error = SHT3X_GetTempAndHumiPolling(temperature, humidity,repeatability, timeout);break;default:              error = PARM_ERROR; // 参数错误break;}return error; // 返回错误代码
}//----------------------------------------------------------------------------
// 使用时钟拉伸获取温度和湿度
etError SHT3X_GetTempAndHumiClkStretch(float* temperature, float* humidity,etRepeatability repeatability,uint8_t timeout)
{etError 		error;        // 错误代码uint16_t    rawValueTemp; // 从传感器获取的温度原始值uint16_t    rawValueHumi; // 从传感器获取的湿度原始值// 以时钟拉伸模式开始测量// 根据所需的可靠性使用相应的命令switch(repeatability){case REPEATAB_LOW:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L);break;case REPEATAB_MEDIUM:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M);break;case REPEATAB_HIGH:error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H);break;default:error = PARM_ERROR; // 参数错误break;}// 如果没有错误,开始读取访问if(error == NO_ERROR) error = SHT3X_StartReadAccess();// 如果没有错误,读取温度原始值,读取湿度原始值uint32_t		rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, timeout);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;// 如果没有错误,计算温度(℃)和湿度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回错误代码
}//----------------------------------------------------------------------------
// 使用轮询获取温度和湿度
etError SHT3X_GetTempAndHumiPolling(float* temperature, float* humidity,etRepeatability repeatability,uint8_t timeout)
{etError 		error;           // 错误代码uint16_t    rawValueTemp;    // 从传感器获取的温度原始值uint16_t    rawValueHumi;    // 从传感器获取的湿度原始值// 以轮询模式开始测量// 根据所需的可靠性使用相应的命令switch(repeatability){case REPEATAB_LOW:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_L);break;case REPEATAB_MEDIUM:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_M);break;case REPEATAB_HIGH:error = SHT3X_WriteCommand(CMD_MEAS_POLLING_H);break;default:error = PARM_ERROR; // 参数错误break;}// 如果没有错误,等待直到测量完成if(error == NO_ERROR){// 每1毫秒轮询一次,直到测量完成或超时while(timeout--){// 检查测量是否完成error = SHT3X_StartReadAccess();// 如果测量已完成 -> 退出循环if(error == NO_ERROR) break;HAL_Delay(1);}// 检查超时错误if(timeout == 0) error = TIMEOUT_ERROR; // 发生超时错误}// 如果没有错误,读取温度和湿度原始值if(error == NO_ERROR){uint32_t		rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 0);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;}// 如果没有错误,计算温度(℃)和湿度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回错误代码
}

三、周期性数据采集模式的测量

1、配置说明

        在这种模式下,一个发出的测量命令产生一个数据对流。每个数据对包括一个16位温度值和一个16位湿度值(按此顺序)。在周期模式下,可以选择不同的测量命令。相应的16位命令(参见下图所示)。它们在可重复性(低、中和高)和数据采集频率(每秒0.5、1、2、4、10次测量)方面有所不同。在此模式下不能选择时钟拉伸。数据采集频率和重复性设置会影响传感器的测量持续时间和电流消耗。

        测量数据的传输可以通过相应的16位命令(参见下图所示),启动读取数据。如果没有测量数据,I2C读取头会响应一个NACK时,通信停止。


2、代码实现方式

 在main主函数中调用初始化后,通过调用下面的函数实现两种方式的连续测量。

error = SHT3X_StartPeriodicMeasurment(REPEATAB_HIGH, FREQUENCY_1HZ);			// 读取测量缓冲区
error = SHT3X_ReadMeasurementBuffer(&temperature, &humidity);if(error == NO_ERROR)
{// 点亮蓝色LED以提示新温度和湿度值//LedBlueOn();//DelayMicroSeconds(10000); // 延时10毫秒//LedBlueOff(); // 关闭蓝色LED
}
else if (error == ACK_ERROR)
{// 如果缓冲区没有新值,则忽略此错误//error = NO_ERROR;
}
//----------------------------------------------------------------------------
// 启动周期性测量
etError SHT3X_StartPeriodicMeasurment(etRepeatability repeatability,etFrequency frequency)
{etError error;        // 错误代码// 根据所需的可靠性和频率使用相应的命令switch(repeatability){case REPEATAB_LOW: // 低可靠性switch(frequency){case FREQUENCY_HZ5:  // 低可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_L);break;          case FREQUENCY_1HZ:  // 低可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_L);break;          case FREQUENCY_2HZ:  // 低可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_L);break;          case FREQUENCY_4HZ:  // 低可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_L);break;          case FREQUENCY_10HZ: // 低可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_L);break;          default:error = PARM_ERROR; // 参数错误break;}break;case REPEATAB_MEDIUM: // 中等可靠性switch(frequency){case FREQUENCY_HZ5:  // 中等可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_M);break;case FREQUENCY_1HZ:  // 中等可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_M);break;        case FREQUENCY_2HZ:  // 中等可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_M);break;        case FREQUENCY_4HZ:  // 中等可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_M);break;      case FREQUENCY_10HZ: // 中等可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_M);break;default:error = PARM_ERROR; // 参数错误break;}break;case REPEATAB_HIGH: // 高可靠性switch(frequency){case FREQUENCY_HZ5:  // 高可靠性, 0.5 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_05_H);break;case FREQUENCY_1HZ:  // 高可靠性, 1.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_1_H);break;case FREQUENCY_2HZ:  // 高可靠性, 2.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_2_H);break;case FREQUENCY_4HZ:  // 高可靠性, 4.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_4_H);break;case FREQUENCY_10HZ: // 高可靠性, 10.0 Hzerror = SHT3X_WriteCommand(CMD_MEAS_PERI_10_H);break;default:error = PARM_ERROR; // 参数错误break;}break;default:error = PARM_ERROR; // 参数错误break;}return error; // 返回错误代码
}//----------------------------------------------------------------------------
// 读取测量缓冲区
etError SHT3X_ReadMeasurementBuffer(float* temperature, float* humidity)
{etError  		error;        // 错误代码uint16_t		rawValueTemp; // 从传感器获取的温度原始值uint16_t		rawValueHumi; // 从传感器获取的湿度原始值// 读取测量值error = SHT3X_WriteCommand(CMD_FETCH_DATA);if(error == NO_ERROR) error = SHT3X_StartReadAccess();  uint32_t		rawValueTemp_rawValueHumi;if(error == NO_ERROR) error = SHT3X_Read4BytesAndCrc(&rawValueTemp_rawValueHumi, 100);rawValueTemp = rawValueTemp_rawValueHumi>>16;rawValueHumi = rawValueTemp_rawValueHumi&0xffff;// 如果没有错误,计算温度(℃)和湿度(%RH)if(error == NO_ERROR){*temperature = SHT3X_CalcTemperature(rawValueTemp);*humidity = SHT3X_CalcHumidity(rawValueHumi);}return error; // 返回错误代码
}

四、完整代码下载链接

完整代码下载链接:https://download.csdn.net/download/qq_26043945/89982127

数据手册:https://sensirion.com/media/documents/213E6A3B/63A5A569/Datasheet_SHT3x_DIS.pdf

相关文章:

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器,基于CMOSens技术。它提…...

卸载miniconda3

1. 找到miniconda目录&#xff0c;删除。 rm -rf miniconda3/ 2. 编辑bashrc sudo vim .bashrc setup路径改回anaconda3的&#xff0c;注释掉“>>> conda initialize >>>”和"<<< conda initialize <<<"之间的miniconda的语…...

游戏中的设计模式及杂项

概述 如果要做以下游戏功能会用到哪些设计模式。比如创建一个人物角色&#xff0c;这个角色可以装备刀&#xff0c;然后角色可以用刀砍怪物&#xff0c;造成流血。 对于这个游戏功能&#xff0c;可以使用以下设计模式&#xff1a; 工厂模式&#xff08;Factory Pattern&#x…...

Docker网络和overlay的基础讲解

本人发现了两篇写的不错的文章&#xff1a;Docker网络 - docker network详解-CSDN博客&#xff0c;Docker 容器跨主机通信 overlay_docker overlay 网络-CSDN博客 因为这两篇文章中含有大量的例子&#xff0c;新手看起来毫不费力。于是我偷了个小懒&#xff0c;在本篇文章中没有…...

分布式数据库:深入探讨架构、挑战与未来趋势

引言 在数字化时代&#xff0c;数据已成为企业的核心资产。随着数据量的爆炸性增长和业务需求的多样化&#xff0c;传统的集中式数据库已难以满足现代应用对于高可用性、可扩展性和性能的需求。分布式数据库以其独特的优势&#xff0c;如数据的高可用性、容错性和可扩展性&…...

基于Springboot+Vue的仓库管理系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…...

基于立体连接与开源链动 2+1 模式的新商业路径探索

摘要&#xff1a;本文深入剖析了立体连接的内涵&#xff0c;包括其核心关键词、连接路径与主体&#xff0c;同时详细阐述了开源链动 2 1 模式、AI 智能名片和 S2B2C 商城小程序源码的特点与功能。在此基础上&#xff0c;深入研究这些要素的融合方式及其在商业实践中的应用&…...

开启鸿蒙开发之旅:核心组件及其各项属性介绍——布局容器组件

写在前面 组件的结构 rkTS通过装饰器 Component 和 Entry 装饰 struct 关键字声明的数据结构&#xff0c;构成一个自定义组件。 自定义组件中提供了一个 build 函数&#xff0c;开发者需在该函数内以链式调用的方式进行基本的 UI 描述 今天我们要学习的就是写在build 函数里的系…...

RabbitMQ 全面解析:语法与其他消息中间件的对比分析

1. 引言 在分布式系统和微服务架构中&#xff0c;消息中间件扮演着重要的角色。它们能够解耦服务、平衡负载、提高系统的可扩展性和可靠性。RabbitMQ 是其中广受欢迎的一种。本文将从 RabbitMQ 的基础概念、语法介绍、以及与其他消息中间件的对比角度&#xff0c;全面剖析其在…...

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…...

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「IDE」集成开发环境&#x1f4da;全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…...

MySQL-初识数据库

目录 一、数据库基础概念 1、SQL 2、数据&#xff08;Data&#xff09; 3、数据库&#xff08;DB&#xff09; 4、数据库管理系统DBMS 5、数据库系统DBS 6、关系模型&#xff08;Relational Model&#xff09; 7、E-R图 8、常见的数据库 9、数据库基本操作 一、数据库…...

初始 html

html 文件结构 html 标签是整个 html 文件的根标签(最顶层标签) head 标签中写页面的属性. body 标签中写的是页面上显示的内容 title 标签中写的是页面的标题 <html><head><title>这是一个标题</title></head><body></body> <…...

前端 call、bind、apply的实际使用

目录 一、call 1、继承的子类可以使用父类的方法 2、可以接收任意参数 二、call、apply、bind比较 1、案例一 2、案例二 三、总结 这个三个方法都是改变函数的this指向的方法。 一、call 代码&#xff1a; const obj{uname:"pink"}function fn(){console.log…...

非关系型数据库NoSQL的类型与优缺点对比

NoSQL数据库根据数据模型和应用场景主要分为四种类型&#xff1a;键值型、列族型、文档型和图形型。以下是对每种类型的详细描述&#xff0c;包括其应用场景、优缺点的比较&#xff1a; 1. 键值型数据库 (Key-Value Store) 典型代表 RedisMemcachedAmazon DynamoDB 应用场景…...

面试击穿mysql

Mysql三大范式: 第一范式&#xff08;1NF&#xff09;&#xff1a; 不符合第一范式的典型情况是在一个字段中存放多种不同类型的详细信息。例如&#xff0c;在商品表中&#xff0c;若将商品名称、价格和类型都存储在同一个字段中&#xff0c;会带来诸多弊端。首先&#xff0c;在…...

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…...

Android OpenGL ES详解——纹理:纹理过滤GL_NEAREST和GL_LINEAR的区别

目录 一、概念 1、纹理过滤 2、邻近过滤 3、线性过滤 二、邻近过滤和线性过滤的区别 三、源码下载 一、概念 1、纹理过滤 当纹理被应用到三维物体上时&#xff0c;随着物体表面的形状和相机视角的变化&#xff0c;会导致纹理在渲染过程中出现一些问题&#xff0c;如锯齿…...

Elasticsearch实战应用:从入门到精通

在当今这个数据爆炸的时代&#xff0c;如何快速、有效地从海量数据中检索信息&#xff0c;已经成为了许多企业和开发者面临的挑战。Elasticsearch&#xff0c;作为一个基于Lucene的搜索引擎&#xff0c;以其强大的全文搜索能力、分布式特性以及易用性&#xff0c;成为了解决这一…...

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Go语言多线程问题

打印零与奇偶数&#xff08;leetcode 1116&#xff09; 方法1&#xff1a;使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...