STM32 低功耗模式详解
目录
一、什么是低功耗
二、低功耗的核心思想
三、STM32的3种低功耗模式
1、睡眠模式 (Sleep Mode)
2、停止模式 (Stop Mode)
3、 待机模式 (Standby Mode)
四、相关电源管理寄存器
1、PWR_CR (Power Control Register, 电源控制寄存器)
2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器)
五、其他降低功耗
1. 降低系统时钟频率
代码示例
2. 关闭未用的外设时钟
代码示例
六、FreeRTOS低功耗Tickless模式
1、FreeRTOS低功耗Tickless模式简介
2、工作原理
3、FreeRTOS 低功耗 Tickless 模式相关配置项
小结
一、什么是低功耗
低功耗指的是在系统设计中通过硬件和软件优化,使设备在执行任务时尽量减少能量消耗。特别是在嵌入式系统、物联网设备和电池供电的设备中,低功耗设计至关重要,因为它可以延长设备的工作时间,减少频繁充电或更换电池的需求。
二、低功耗的核心思想
1、减少不必要的资源消耗:尽量关闭不必要的模块或外设,减少芯片功耗。
2、降低工作频率和电压:通过降低系统的工作频率和电压来减少功耗。
3、进入低功耗模式:大多数微控制器(如STM32)有多种低功耗模式,可以根据需求选择不同的低功耗模式。
三、STM32的3种低功耗模式
STM32的这三种低功耗模式主要针对不同的功耗和性能需求,逐级降低功耗:
1、睡眠模式 (Sleep Mode)
特点:内核(CPU)停止运行,但系统时钟 (Systick) 和一些外设(如NVIC)仍然可以工作。这种模式非常适合短时间的休眠。
功耗优势:因为外设仍在运行,所以可以保持较快的响应时间,但功耗相对较高。
应用场景:适用于短暂的休眠,比如等待外设数据,或在周期性任务之间短暂进入低功耗状态。
进入方式:设置 __WFI
(Wait For Interrupt,指令让 CPU 暂停执行,直到有中断发生,适合在等待特定中断事件时使用。它能在没有中断时节省功耗,并在中断发生时自动唤醒 CPU)或 __WFE
(Wait For Event,指令让 CPU 暂停执行,直到有“事件”或中断发生,可以等待外设、系统事件或中断。在没有中断的情况下,也可以通过事件(比如唤醒事件)使 CPU 唤醒。)指令进入睡眠模式。
唤醒方式:任何中断都可以唤醒 CPU 并恢复正常工作。
// 使能睡眠模式
HAL_SuspendTick(); // 暂停Systick中断(可选)
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
// 唤醒后
HAL_ResumeTick(); // 恢复Systick中断
2、停止模式 (Stop Mode)
特点:系统时钟停止,1.8V内核电源继续工作,PLL(锁相环,关闭后,系统失去倍频效果)、HIS(高速内部振荡器,内部时钟源,不再为CPU和外设提供高速时钟)和HSE RC(高速外部振荡器,用于系统时钟的基准源,失去高精度的时钟源)振荡器关闭,寄存器和SRAM数据保留。只有低速时钟 (LSI或LSE) 可以工作,允许使用低功耗的外部中断来唤醒。
功耗优势:停止模式大大降低了功耗,因为大部分时钟已经关闭,但数据仍然保留,适合较长时间的低功耗状态。
应用场景:适合在处理任务后进入低功耗状态,等待外部事件或定时器唤醒。典型应用包括长时间采集数据的传感器设备。
进入方式:调用 HAL_PWR_EnterSTOPMode
,停止模式下,主调节器仍然供电,内存保持数据。
唤醒方式:通过外部中断(如 RTC、GPIO 中断)唤醒。
注:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。
// 进入停止模式
HAL_SuspendTick(); // 暂停Systick中断(可选)
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后,重新配置系统时钟
SystemClock_Config(); // 根据具体项目需要配置系统时钟
HAL_ResumeTick(); // 恢复Systick中断
3、 待机模式 (Standby Mode)
特点:内核电源关闭,所有寄存器和SRAM内容丢失,仅保留备份寄存器和待机电路供电。种模式能够实现最低功耗,适用于极限低功耗场景。
功耗优势:待机模式实现了最低功耗,但所有数据(除备份寄存器)都会丢失,重新唤醒后需要重新初始化。
应用场景:适合在设备长时间不使用时进入待机,比如按键唤醒的电池供电设备,或极低频次使用的物联网传感器节点。
进入方式:调用 HAL_PWR_EnterSTANDBYMode
,进入待机模式,关闭所有电源,仅保留RTC或待机引脚。
唤醒方式:通过唤醒引脚(如 WKUP
)、RTC 警报或重启(上电复位或IWDG复位等)。
注:待机模式下,所有I/O引脚处于高阻态,除了复位引脚、被使能的唤醒引脚等
待机模式下,不能下载程序,必须退出待机模式才能下载
// 清除唤醒标志,确保顺利进入待机模式
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
// 进入待机模式
HAL_PWR_EnterSTANDBYMode();
// 唤醒后将从复位开始
这三种模式适用于不同的应用场景,具体选择取决于功耗、响应时间以及数据保留需求。
根据最低电源消耗,最快启动时间和可用的唤醒源等条件,选择一种最佳的低功耗模式
四、相关电源管理寄存器
PWR_CR
和PWR_CSR
是 STM32 中的两个电源管理寄存器,用于配置和监视低功耗状态。
1、PWR_CR (Power Control Register, 电源控制寄存器)
作用:用于配置 STM32 的低功耗模式。设置PDDS位进入深度睡眠时进入待机模式。设置CWUF位,清除之前的WUF唤醒位。
LPDS (Low-Power Deep Sleep):在深度睡眠模式下启用低功耗调节器,减少功耗。
PDDS (Power Down Deep Sleep):当设置为 1 时,进入待机模式 (Standby Mode);否则进入停止模式 (Stop Mode)。
CWUF (Clear Wakeup Flag):写 1 来清除唤醒标志 (WUF),用于防止错误唤醒。
CSBF (Clear Standby Flag):写 1 来清除待机标志 (SBF)。
VOS (Voltage Scaling):控制电压缩放,可以通过降低工作电压进一步节省功耗。
通过设置 PWR_CR
中的这些位,用户可以控制进入哪种低功耗模式(如停止模式、待机模式),同时调节系统的电压和深度睡眠状态。
2、PWR_CSR (Power Control/Status Register, 电源控制/状态寄存器)
作用:用于监测电源状态和低功耗唤醒标志。 设置EWUP,使能WKUP引脚用于待机模式唤醒。WUF唤醒标志,用来判断是否发生唤醒事件。
WUF (Wakeup Flag):当有唤醒事件发生时,该位被置 1,用于指示是否有唤醒源。
SBF (Standby Flag):当进入待机模式时,该位被置 1,表示系统已经进入过待机状态。
EWUP (Enable Wakeup Pin):使能唤醒引脚,允许从待机模式中通过外部引脚唤醒。
PWR_CSR
用于监控进入低功耗模式后的状态和唤醒标志,通过读取 WUF
和 SBF
标志,用户可以判断系统是否因为某个事件唤醒,或是否处于待机状态。
五、其他降低功耗
在 STM32 中降低运行模式下的功耗,主要通过降低系统时钟频率和关闭未使用的外设时钟来实现。这种方式适用于系统运行中不能进入低功耗模式的情况,例如执行任务时,希望减少功耗而又保持一定的功能性。
1. 降低系统时钟频率
通过降低系统的主频,系统的功耗会大幅降低。STM32 的系统时钟可以通过修改配置来降低频率,如降低 AHB
总线和 APB
总线的时钟频率。
代码示例
以下代码降低系统时钟频率到指定值,可以在初始化时或在运行时动态调整:
void SystemClock_Config_LowPower(void) {RCC_ClkInitTypeDef clkInitStruct = {0};RCC_OscInitTypeDef oscInitStruct = {0};// 配置振荡器设置oscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;oscInitStruct.HSIState = RCC_HSI_ON;oscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;oscInitStruct.PLL.PLLState = RCC_PLL_ON;oscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;oscInitStruct.PLL.PLLM = 16;oscInitStruct.PLL.PLLN = 100; // 调整这个值来改变频率oscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;oscInitStruct.PLL.PLLQ = 4;HAL_RCC_OscConfig(&oscInitStruct);// 配置系统时钟分频器clkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;clkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;clkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2; // 降低 AHB 时钟clkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; // 降低 APB1 时钟clkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; // 降低 APB2 时钟HAL_RCC_ClockConfig(&clkInitStruct, FLASH_LATENCY_3);
}
在需要更低功耗的状态下,可以使用更低的分频值。在恢复正常工作时,可以重新设置更高的频率。
2. 关闭未用的外设时钟
STM32 的外设是通过 AHB
和 APB
总线时钟驱动的,未使用的外设时钟可以禁用,以进一步节省功耗。我们可以通过重置 RCC
寄存器的相关位来实现禁用未用外设。
代码示例
以下示例展示了如何禁用某些未使用的外设时钟,以减少功耗:
void DisableUnusedPeripheralClocks(void) {// 禁用 APB1 外设时钟__HAL_RCC_UART4_CLK_DISABLE();__HAL_RCC_UART5_CLK_DISABLE();__HAL_RCC_I2C3_CLK_DISABLE();__HAL_RCC_CAN1_CLK_DISABLE();__HAL_RCC_PWR_CLK_DISABLE();// 禁用 APB2 外设时钟__HAL_RCC_SPI1_CLK_DISABLE();__HAL_RCC_SDIO_CLK_DISABLE();__HAL_RCC_ADC1_CLK_DISABLE();// 禁用 AHB 外设时钟__HAL_RCC_DMA1_CLK_DISABLE();__HAL_RCC_DMA2_CLK_DISABLE();__HAL_RCC_CRC_CLK_DISABLE();
}
此函数可以在初始化时调用,关闭系统中不使用的外设。需要时也可以通过重新使能的方式开启外设时钟。例如,在 SPI
需要使用时可以调用 __HAL_RCC_SPI1_CLK_ENABLE()
恢复其时钟。
六、FreeRTOS低功耗Tickless模式
FreeRTOS的Tickless模式是一种减少系统功耗的机制。通常,FreeRTOS会以固定时间间隔(“Tick”)触发时钟中断,用于任务调度和系统计时。但这种频繁的中断在低功耗需求场景下会导致系统资源的浪费。Tickless模式通过在空闲时段停用Tick中断,大幅降低功耗,是常用的低功耗设计。Tickless低功耗模式的本质是通过调用指令 WFI 实现睡眠模式。
1、FreeRTOS低功耗Tickless模式简介
任务运行时间统计实验中,可以看出,在整个系统的运行过程中,其实大部分时间是在执行空闲任务(系统中的所有其它任务都阻塞或被挂起时才运行的)。
Tickless模式的核心思想是,当系统进入空闲状态并不需要频繁调度时,停止或减少时钟中断,使系统进入更深的低功耗模式。系统会根据需要再次唤醒,然后恢复时钟计数,这样可以避免因频繁的时钟中断唤醒而浪费功耗。
判断执行在vTaskStartScheduler()函数中,具体如下:
/* 此条件编译检查应使用不等于0的判断,而不是等于1。* 这样可以确保当用户定义的低功耗模式实现需要 configUSE_TICKLESS_IDLE * 设置为除1以外的值时,依然能够调用 portSUPPRESS_TICKS_AND_SLEEP()。*/
#if ( configUSE_TICKLESS_IDLE != 0 ){TickType_t xExpectedIdleTime;/* 不希望在空闲任务的每次循环中暂停并恢复调度器。* 因此,首先在调度器未暂停的情况下对预计空闲时间进行初步测试。* 此处的结果不一定有效,仅为初步估计。*/xExpectedIdleTime = prvGetExpectedIdleTime(); // 获取下一个任务解锁的时间,即进入低功耗模式的预计空闲时间/* 如果预计空闲时间大于等于设定的最小空闲时间,则进入低功耗模式 */if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){vTaskSuspendAll(); // 暂停调度器,防止在配置低功耗模式时发生任务切换{/* 现在调度器已暂停,可以重新获取准确的预计空闲时间 */configASSERT( xNextTaskUnblockTime >= xTickCount ); // 断言确保下一任务的解锁时间不早于当前Tick计数xExpectedIdleTime = prvGetExpectedIdleTime(); // 重新获取准确的预计空闲时间/* 定义以下宏以在应用程序不需要调用 portSUPPRESS_TICKS_AND_SLEEP()* 时将 xExpectedIdleTime 设为0。*/configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime ); // 用户自定义处理:可以在此进一步优化低功耗逻辑/* 如果 xExpectedIdleTime 仍大于等于设定值,则进入低功耗模式 */if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){traceLOW_POWER_IDLE_BEGIN(); // 跟踪低功耗状态开始,供调试或分析用portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime ); // 进入低功耗模式,抑制Tick中断traceLOW_POWER_IDLE_END(); // 跟踪低功耗状态结束}else{mtCOVERAGE_TEST_MARKER(); // 覆盖率测试标记,供测试覆盖率分析工具使用}}( void ) xTaskResumeAll(); // 恢复任务调度器}else{mtCOVERAGE_TEST_MARKER(); // 覆盖率测试标记,供测试覆盖率分析工具使用}}
#endif /* configUSE_TICKLESS_IDLE */
2、工作原理
- 判断空闲时间:当系统发现没有就绪任务,并进入空闲任务(Idle Task)时,FreeRTOS会评估空闲时间的长短。
- 关闭时钟中断:如果空闲时间足够长,则禁用Tick中断,让系统进入深度低功耗状态。
- 恢复运行状态:当预定的唤醒时间或某个事件发生时(如外部中断、定时器溢出等),系统唤醒并重新使能Tick中断。
- 调整Tick计数:系统恢复时,通过记录的休眠时间来调整Tick计数器,以保证时间精度。
Tickless模式常用于电池供电的物联网设备和嵌入式系统中,以延长电池寿命和降低系统功耗。
3、FreeRTOS 低功耗 Tickless 模式相关配置项
FreeRTOS 提供了一些配置项,用于设置和控制Tickless模式。这些配置项需要FreeRTOSConfig.h
中进行设置。
-
configUSE_TICKLESS_IDLE:启用Tickless模式的总开关设置
#define configUSE_TICKLESS_IDLE 1
-
configEXPECTED_IDLE_TIME_BEFORE_SLEEP:配置空闲时间的最小长度,只有超过此时长系统才会进入Tickless模式。这可以避免过于频繁地进入和退出低功耗模式
xExpectedIdleTime = prvGetExpectedIdleTime();
-
configPRE_SLEEP_PROCESSING:进入Tickless模式前的处理回调函数。可以在这个宏中定义进入低功耗模式前的操作(如关闭外设、降低电压等)
#define configPRE_SLEEP_PROCESSING( xModifiableIdleTime ) myPreSleepFunction( xModifiableIdleTime )
-
configPOST_SLEEP_PROCESSING:从低功耗模式中唤醒后的处理回调函数。用于恢复低功耗模式前关闭的外设、恢复系统时钟等。
#define configPOST_SLEEP_PROCESSING( xExpectedIdleTime ) myPostSleepFunction( xExpectedIdleTime )
-
configTICK_RATE_HZ:设定Tick的频率(即每秒的中断次数),对于低功耗应用,Tickless模式会减少系统实际的Tick中断频率,以降低功耗
#define configTICK_RATE_HZ 1000
小结
FreeRTOS的Tickless模式通过减少系统Tick中断的频率,在空闲时段进入低功耗模式,有效减少系统整体功耗。通过合理配置 configUSE_TICKLESS_IDLE
、configEXPECTED_IDLE_TIME_BEFORE_SLEEP
以及低功耗前后的处理函数,系统可以在满足实际应用需求的同时,实现尽可能低的功耗。
参考资料:
66,PWR-低功耗模式原理和配置讲解_哔哩哔哩_bilibili
第59讲 Tickless低功耗模式实战编程_哔哩哔哩_bilibili
相关文章:

STM32 低功耗模式详解
目录 一、什么是低功耗 二、低功耗的核心思想 三、STM32的3种低功耗模式 1、睡眠模式 (Sleep Mode) 2、停止模式 (Stop Mode) 3、 待机模式 (Standby Mode) 四、相关电源管理寄存器 1、PWR_CR (Power Control Register, 电源控制寄存器) 2、PWR_CSR (Power Control/St…...

我的第一个PyQt5程序
PyQt5的开发环境配置完成之后,开始编写第一个PyQt5的程序。 方法一:使用将.ui转换成.py文件的方法 import sys from FirstPyQt import Ui_MainWindow from PyQt5.QtWidgets import *#QtCore,QtGui,QtWidgets # from QtTest import Ui_MainWindow#导入Q…...

Unity调用Python
代码如下: if (useAI){/** 通过PaddlePaddle进行合成处理* */// 创建线程参数对象ThreadParameters parameters new ThreadParameters(){pythonPath "python", // 如果 Python 在系统路径中,可以直接使用 "python"pythonScript U…...

前端,location.reload刷新页面
location.reload() 是 JavaScript 中的一个方法,它用于重新加载当前页面。当你调用这个方法时,浏览器会重新加载当前页面的资源,就像用户点击了浏览器的刷新按钮一样。 基本用法 // 刷新当前页面 location.reload();带参数的用法 location…...

5G的发展演进
5G发展的驱动力 什么是5G [远程会议,2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下,ITU-R WP 5D#35e远程会议宣布3GPP 5G技术(含NB-IoT)满足IMT-2020 5G技…...

数据库参数备份
MySQL #!/bin/bash # 获取当前日期和时间的时间戳 TIMESTAMP$(date "%Y%m%d-%H%M%S")# 0、创建目录 mkdir /tmp/parameter_$TIMESTAMP/# 1、获取所有命名空间 echo "1、获取所有命名空间" NAMESPACES$(kubectl get ns | grep qfusion- | grep -v qfusion-…...

PG数据库 数据库时间字段 开始时间和结束时间,判断和查询条件的开始和截止时间存在交集,SQL如何编写
PG 数据库时间字段 开始时间和结束时间,判断和查询条件的开始和截止时间存在交集,SQL如何编写? 在 PostgreSQL 中,如果你想要查询那些时间段(由 开始时间 和 结束时间 定义)与给定的时间段有交集的记录&am…...

k8s服务内容滚动升级以及常用命令介绍
查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…...

机器学习: LightGBM模型(优化版)——高效且强大的树形模型
LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升决策树(GBDT)的框架,由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点,非常适合大规模数据的训练任务,尤…...

Wordpress常用配置,包括看板娘跨域等
一个Wordpress的博客已经搭建完成了,那么为了让它看起来更有人间烟火气一点,有一些常用的初始配置,这里整理一下。 修改页脚 页脚这里默认会显示Powered by Wordpress,还有一个原因是这里要加上备案信息。在主题里找到页脚&…...

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式
此去经年,再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路,可以极大的方便程序的开发最常见、最经典的设计模式,就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…...

Unity 网格模型及优化
一个模型中可以包含很多网格,一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格(Sub-Mesh)组成。 在渲染引擎的时候,每个子网格都要匹配一个材质球来做渲染,实际上一个子网格本身就是一个个普通的模型࿰…...

离线 快速搭建 docker docker-compose k8s 环境
所需资源 sealos_5.0.1_linux_arm64.tar.gzkubernetes.tar等docker-compose-linux-aarch64 离线安装sealos,用于安装k8sdocker 首先安装sealos工具 tar zxvf sealos_5.0.1_linux_arm64.tar.gz sealos && chmod x sealos && mv sealos /usr/bin*…...

Excel根据条件动态索引单元格范围
假如我是一个老板,下面有数不胜数的员工,我要检查他们每周的工作产出,列一个排行榜,提高员工积极性,毕竟多劳多得嘛。 每天去手动统计,未免显得不太聪明,我们可以利用公式来解决这个问题。 我们…...

【计算机网络五】HTTP协议!网站运行的奥秘!
目录 HTTP协议 1.HTTP是什么? 2.Fiddler抓包查看HTTP协议格式 3.HTTP请求 4.HTTP响应 HTTP协议 1.HTTP是什么? HTTP ( 全称为 " 超文本传输协议 ") 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 的前几个版本…...

开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-tool usage入门-Qwen-Agent深入学习(四)
一、前言 Qwen-Agent 是一个利用开源语言模型Qwen的工具使用、规划和记忆功能的框架。其模块化设计允许开发人员创建具有特定功能的定制代理,为各种应用程序提供了坚实的基础。同时,开发者可以利用 Qwen-Agent 的原子组件构建智能代理,以理解和响应用户查询。 本篇将换一种方…...

stream学习
Stream流 定义 Steam流,用于操作集合或者数组中的数据,大量结合了Lamda表达式的语法风格,代码简洁。 重点: 流只能收集一次 获取Stream流 Stream流要与数据源建立连接。 1.list 直接调用steam()即可 // list List<Stri…...

【数据结构】实验二 单链表的基本操作
一、实验目的 掌握线性表的链式存储结构的表示和实现方法。 掌握链表基本操作的算法实现,以及对相应算法的性能分析。 二、实验内容 1)根据输入的一系列整数,以0标志结束,用头插法建立单链表,并输出单链表中各元素…...

SQL 分组查询中的非聚合列要求及实例解析
在 SQL 查询中,当我们对数据进行分组时,通常会用到 GROUP BY 子句。SQL 标准要求:所有非聚合列(即没有使用聚合函数的列)都必须出现在 GROUP BY 子句中,或者是聚合函数的结果。这篇文章通过一个实例来说明这…...

Unity中实现战斗帧同步的高级技术
一、帧同步的基本原理 帧同步(Frame Synchronization)在网络游戏中指的是在每一帧上保证所有玩家所看到的游戏状态一致,而不是每个玩家单独计算自己的状态。实现帧同步通常需要每个客户端仅发送用户输入到服务器,并由服务器进行全…...

Qt 正则表达式提取文件中的 USB 设备 ID
Qt 正则表达式提取文件中的 USB 设备 ID flyfish 文档内容 Bus: 001 Device: 001 Description: 1d6b:0002 Linux Foundation 2.0 root hub Bus: 002 Device: 003 Description: 0e0f:0002 , Inc. USB Hub Bus: 002 Device: 002 Description: 0e0f:0003 , Inc. Mouse Bus: 002…...

使用 Python 和 OpenCV 实现摄像头人脸检测并截图
概述 在现代应用中,人脸检测是一项非常重要的技术,广泛应用于安全监控、身份验证等领域。本文将详细介绍如何使用 Python 和 OpenCV 库实现摄像头人脸检测并截图,并通过具体的代码示例来展示整个过程。 环境准备 在开始编写代码之前&#…...

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路
文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路: 这是一个二叉树的布尔评估问题。树的每个节点包含一个值,其中叶子节点值为 0 或 1࿰…...
【计算机视觉】FusionGAN
1. FusionGAN论文阅读 abreheret/FusionGAN: Pytorch implementation of "Generating a Fusion Image: One’s Identity and Another’s Shape" 1.1. WHY 在现实世界中,将对象或人物转换为期望的形状是一种常用技术,但现有的图像翻译方法在处理身份和形状时存在…...

问:SQL优化,七条实践总结?
SQL语句优化是数据库性能调优的重要部分,通过合理的优化可以显著提升查询速度和系统性能。文章总结几种常见SQL语句优化方法。 1. 优化Where子句的顺序 原则:表之间的连接条件应写在其他Where条件之前,能够过滤掉最大数量记录的条件应优先写…...

unity单例模式的不同声明(待完善
总结: 这段代码实现了一个泛型单例模式(Singleton Pattern),用于确保某个类(由泛型参数 T 指定)在整个应用程序中只有一个实例,并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…...

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手
本文来自腾讯蓝鲸智云社区用户: CanWay 背景 1、运维转型背景 蓝鲸平台从诞生之初,就一直在不遗余力地推动运维转型,让运维团队可以通过一体化PaaS平台,快速编写脚本,编排流程,开发运维工具,从被动地提供…...

vue2,vue3响应式的理解
vue2的话主要使用的是defineProperty对已有属性添加get,set,从而完成对数据的响应式控制,但每次需要for循环对属性进行遍历 function DefineReactive(target, key, value) {//存在多层嵌套的objectObserver(value);Object.defineReactive(target, key, {get() {retu…...

群控系统服务端开发模式-应用开发-前端退出功能
我们从未登录一直到退出,现在已经登录到操作,现在完成退出。退出有两种情况下会退出:第一种情况下是手动点击退出按钮,第二种情况下是登录过期时间到了自动退出的。 一、手动退出 因退出及个人信息页面都在公有页面,所…...

Web入门
Spring 官网:Spring | Home Spring是一个开源的Java企业级应用开发框架。Spring的主要目的是使Java EE(Java Platform, Enterprise Edition)开发更容易,并且通过提供一系列丰富的库和接口来促进良好编程实践,是…...