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

STM32 低功耗模式下 RTC唤醒 和 PA0唤醒 的配合使用

STM32 低功耗模式不同唤醒源的配合使用   by  矜辰所致

前言

关于 STM32 如何实现低功耗模式,我之前写过一篇文章:

STM32 使用 STM32CubeMX HAL库实现低功耗模式

各种休眠模式如何实现文中已经讲得很清楚了,但是作为教学文章,文中每次的休眠都是单一的唤醒源,但是在实际应用中,有时候需要根据不同的场合,需要不同的唤醒源配合使用,所以 本文主要内容就是说明一下多种唤醒源如何配合使用。

我是矜辰所致,全网同名,尽量用心写好每一系列文章,不浮夸,不将就,认真对待学知识的我们,矜辰所致,金石为开!

目录

  • 前言
  • 一、 需求说明
  • 二、 设计实现
    • 2.1 确定唤醒源
    • 2.2 选择不同唤醒源
    • 2.3 RTC 相关问题
  • 三、 最终示例
  • 结语

一、 需求说明

本文使用一个示例来说明,需求如下:

我们要实现的功能是要做一个低功耗设备,检测外部信号,我们把外部信号连接至 STM32 的 PA0 。

如果检测到外部信号,执行某些工作(大概为200ms),但是呢,由于外部信号不是一次性的,而是持续一段时间的电平波动,所以在检测到一次外部信号以后,我们需要屏蔽PA0 一段时间,再重新开启 PA0 唤醒,为了保持低功耗,所以还是需要进入睡眠,除了PA0 唤醒后执行操作的 200ms 时间,其他时候都是在低功耗模式。

我们根据上面的需求,整理一下思路,同时介绍一下我们的实现平台
.
硬件平台: STM32L010F4
.
工作模式: Standby 模式
.
具体需求:
1、设备初次上电,直接进入 Standby 模式,设置只能通过 PA0 唤醒。
2、PA0 唤醒后,延时200ms 用来替换唤醒后需要处理的工作,延时完成后进入 Standby 模式,屏蔽 PA0 唤醒源,开启 RTC 唤醒,RTC 唤醒时间设定为 5s 。
3、5s 后 RTC 唤醒后,直接进入 Standby 模式,屏蔽 RTC 唤醒,开启 PA0 唤醒,设备只能通过 PA0 唤醒。
4、检测到 PA0 唤醒,重复步骤 2:PA0 唤醒后,延时200ms 用来替换唤醒后需要处理的工作,延时完成后进入 Standby 模式,屏蔽 PA0 唤醒源,开启 RTC 唤醒,RTC 唤醒时间设定为 5s 。
依次循环。

二、 设计实现

需求我们已经知道,接下来我们就来看看如何实现,首先第一点就是 如何判断芯片是从 RTC 唤醒还是通过 PA0 唤醒呢,在上一篇讲低功耗的文章中,我们通过 PWR_FLAG_SB 标志位来判断设备是不是从 Standby 模式唤醒,具体实现代码如下:

  if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == SET){__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);if(HAL_RTC_GetTime(&hrtc,&sTime,RTC_FORMAT_BIN) == HAL_OK){printf("RTC current time: %02d:%02d:%02d\r\n",sTime.Hours,sTime.Minutes,sTime.Seconds);}printf("standby reset\r\n");}else{printf("normal reset!!!\r\n");}

2.1 确定唤醒源

那我们现在要判断 RTC 还是 PA0 ,我们可以检查 RTC_ISR 寄存器中的 WUTF 标志位( WUTF 名为 Wake Up Timer Flag)。

如果芯片是从 RTC 唤醒,WUTF 标志位会被置位。

我们可以使用下面语句判断:

if (RTC->ISR & RTC_ISR_WUTF) {// RTC 唤醒触发
}

当然我们也可以使用 HAL 库:

if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(&hrtc, RTC_FLAG_WUTF)){printf("RTC reset\r\n");}

那即便我们知道了 可以通过 WUTF 标志位判断是否芯片是从RTC 唤醒,那我们如何加入上面的判断呢? 我们回头看一下我们以前是通过 PWR_FLAG_SB 标志位来判断设备是不是从 Standby 模式唤醒,那么肯定是在判断完 PWR_FLAG_SB 标志位以后再进行 RTC 和 PA0 唤醒的判断。

这里我就直接给出一个示例,后面再接着说明注意事项:

  if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == SET){// 判断具体唤醒源if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(&hrtc, RTC_FLAG_WUTF)){__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);printf("RTC reset\r\n");my_source = WAKEUP_SRC_RTC; }else{// PA0唤醒:执行首次操作__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);printf("PA0 reset\r\n");my_source = WAKEUP_SRC_PA0;  } __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);}else{printf("normal reset\r\n");my_source = WAKEUP_SRC_PA0;  // 下一次由PA0唤醒}

上面我们先通过 PWR_FLAG_SB 标志位判断设备是否从 Standby 模式唤醒,然后再通过判断 RTC_FLAG_WUTF 判断是否由RTC 唤醒,这里就有一点一定要注意一下!!!一定是先判断 RTC_FLAG_WUTF ,看是不是 RTC 唤醒,再确定是不是 PA0 唤醒,因为 PA0 唤醒没有标志位。

我们在上一篇低功耗文章中有说到过:

在这里插入图片描述

所以不管是 RTC 还是 PA0 唤醒 ,PWR_FLAG_WU 标志位都会置位,所以都需要清除一下。那因为我们知道是在 standby 模式下,只有通过唤醒引脚(PA0)上升沿、RTC闹钟中断,或者复位唤醒;所以,在我们确定是被唤醒源唤醒,而且不是 RTC 唤醒的情况下,一定是通过 PA0 唤醒。

2.2 选择不同唤醒源

完成唤醒源的判断,我们就可以按照我们的需求来进行接下来的设计,这里我也直接给出测试代码:

while (1){/*模拟工作状态,时间放长一点方便低功耗下的烧录*/printf("working ...\r\n");HAL_Delay(2000);if (my_source == WAKEUP_SRC_PA0) {  HAL_RTC_MspInit(&hrtc);HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);printf("open RTC ,stop PA0!!!\r\n");} else {// 关闭 RTC 唤醒HAL_RTC_MspDeInit(&hrtc);HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);printf("open PA0 ,stop RTC!!!\r\n");}// 关闭所有外设(根据需求调整)set_use_io_analog();// 进入Standby模式HAL_PWR_EnterSTANDBYMode();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

这里 RTC 的屏蔽开启使用了 HAL_RTC_MspInit ,逻辑上看着是没有什么问题,但是实际测试起来还是有点问题:

  1. RTC 唤醒的时间,本意是 5s 后唤醒,但是实际上不到 5s 就被唤醒了。
  2. 会意外的唤醒,应该是标志位的问题

我们虽然曾经说过 ,在实际使用中,进入 stop 或者 standby 模式之前,都得记得清除一下 PWR_FLAG_WU 标志位!!! 但是在确定唤醒源的时候,我们已经做了__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); 操作,想着开头都清除了,在 while 循环中就没有加上这句话。

所以在实际使用中,还是得加上这么一句,所以上面的程序部分改成如下:

 if (my_source == WAKEUP_SRC_PA0) {  HAL_RTC_MspInit(&hrtc);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);printf("open RTC ,stop PA0!!!\r\n");} else {HAL_RTC_MspDeInit(&hrtc);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);printf("open PA0 ,stop RTC!!!\r\n");}

所以还是得再次强调一遍,进入 stop 或者 standby 模式之前,务必清除一下 PWR_FLAG_WU 标志位!!!

2.3 RTC 相关问题

我们还要解决一个问题,就是上面 RTC 唤醒时间会早一点。

在此之前,我们还需要讲一个问题,在上面示例代码中,我是通过HAL_RTC_MspInit(&hrtc);HAL_RTC_MspDeInit(&hrtc); 来开启和屏蔽 RTC 唤醒,虽然这种做法可行,但是其实不是很建议,因因为这种做法是停掉 RTC 所有的资源,包括时钟、NVIC ,每次重新初始化都得重新打开 NVIC, 而且频繁的 Init / DeInit 可能会导致功耗增高。

官方有更加推荐的方式,使用HAL_RTCEx_DeactivateWakeUpTimer函数,这个函数功能明确:关闭 RTC 唤醒定时器功能(WakeUp Timer)。

所以我们如果屏蔽 RTC 唤醒,直接使用上面函数:

} else {// 关闭 RTC 唤醒HAL_RTCEx_DeactivateWakeUpTimer(&hrtc); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);printf("open PA0 ,stop RTC!!!\r\n");}

那接下来尝试解决一下为什么时间会提早的问题,我首先想到 STM32 的 Wakeup Timer 是一种 递减计数器,如果开启了的话他会一直计数,当我们调用 HAL_RTCEx_SetWakeUpTimer_IT() 时,它会立即开始计数,如果我们没有先关闭定时器,有没有可能旧的定时器的值没有被清除,RTC 正在计数又写入新的值产生异常? 这些是我们的推测,我们来把代码修改一下:

    if (my_source == WAKEUP_SRC_PA0) {HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);      // 禁用PA0唤醒  HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);         // 关闭 RTC__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);              // 清除上次唤醒标志HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 设置4+1=5s//HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2048 * 5, RTC_WAKEUPCLOCK_RTCCLK_DIV16);printf("open RTC ,stop PA0!!!\r\n");} else {// 关闭 RTC 唤醒...}

但是发现,即便这样还是不行,结果为大概 4s 左右:

在这里插入图片描述

在上一篇文章我们知道,RTC 的唤醒时间为 HAL_RTCEx_SetWakeUpTimer_IT 的第二个参数的值+1,这点也可以在STM32 官方文档在 RM0376: Reference Manual for STM32L0x1 的 RTC 章节里查到:

在这里插入图片描述

那这里肯定是有哪里没有注意到,但是呢,对于我们这个需求而言,如果实际效果和设置的第二个参数基本一致,那么也不是不能就这么用,于是乎,我测试了不同参数值:

在这里插入图片描述

发现虽然与预期的设定不符合,但是是稳定的,这个地方确实不知道是哪里疏忽了,这里暂时就这么用着吧(程序设计,能用就行…… = =!如果大家知道是哪里的问题,还望留言告知,在这里提前感谢了!)

三、 最终示例

那么经过上文的测试,我们基本上可以实现我们需求的主要功能了,再完善一下一些细节问题就好了,那么针对我们文章开头的需求,最终的程序主题部分如下:

int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_LPUART1_UART_Init();MX_RTC_Init();/* USER CODE BEGIN 2 */if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == SET){// 判断具体唤醒源if (__HAL_RTC_WAKEUPTIMER_GET_FLAG(&hrtc, RTC_FLAG_WUTF)){__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);printf("RTC reset\r\n"); my_source = WAKEUP_SRC_RTC; }else{// PA0唤醒:执行首次操作__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);printf("PA0 reset\r\n");my_source = WAKEUP_SRC_PA0;  } __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);}else{printf("normal reset\r\n");my_source = WAKEUP_SRC_PA0;  // 下一次由PA0唤醒}/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){if (my_source == WAKEUP_SRC_PA0) {HAL_Delay(200);  //执行唤醒操作printf("working ...\r\n");HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1);      // 禁用PA0唤醒  HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);         // 关闭 RTC__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);              // 清除上次唤醒标志HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 5, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // //HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 2048 * 5, RTC_WAKEUPCLOCK_RTCCLK_DIV16);printf("open RTC ,stop PA0!!!\r\n");} else {// 关闭 RTC 唤醒HAL_RTCEx_DeactivateWakeUpTimer(&hrtc); __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);printf("open PA0 ,stop RTC!!!\r\n");} // 关闭所有外设(根据需求调整)set_use_io_analog();// 进入Standby模式HAL_PWR_EnterSTANDBYMode();}}

结语

本文我们通过 RTC唤醒 和 PA0唤醒 配合使用完成了一个简单的示例,整体看来呢其实是很简单的,但是也得搞清楚不同的标志位的用途,然后再进入休眠模式之前务必清除 PWR_FLAG_WU 标志位。

当然,文章依然有一个 RTC 唤醒时间的疑问,再次希望有知道原因的朋友留言告知!

好了,本文就到这里,谢谢大家!

相关文章:

STM32 低功耗模式下 RTC唤醒 和 PA0唤醒 的配合使用

STM32 低功耗模式不同唤醒源的配合使用 by 矜辰所致前言 关于 STM32 如何实现低功耗模式,我之前写过一篇文章: STM32 使用 STM32CubeMX HAL库实现低功耗模式 各种休眠模式如何实现文中已经讲得很清楚了,但是作为教学文章,文…...

QML 弹窗控件:Popup的基本用法与样式

目录 引言相关阅读Popup基本属性工程结构示例实现Main.qml - 主界面SimplePopup.qml - 简单弹窗ModalPopup.qml - 模态弹窗CustomPopup.qml - 自定义样式弹窗AnimatedPopup.qml - 带动画的弹窗 总结工程下载 引言 在现代图形用户界面(GUI)开发中,弹窗(Popup)是一种…...

MCP基础学习三:MCP客户端开发与工具集成

MCP客户端开发与工具集成 文章目录 MCP客户端开发与工具集成一, 学习目标二, 学习内容1. MCP客户端与服务端的通信方式1.1 通信原理1.2 通信实现分析 2. 如何开发MCP工具并集成到客户端2.1 工具开发流程2.2 工具实现示例2.3 客户端集成 3. 如何集成外部API到MCP客户端3.1 集成流…...

NSS#Round30 Web

小桃的PHP挑战 <?php include jeer.php; highlight_file(__FILE__); error_reporting(0); $A 0; $B 0; $C 0;//第一关 if (isset($_GET[one])){$str $_GET[str] ?? 0;$add substr($str, 0, 1); $add;if (strlen($add) > 1 ) {$A 1;} else {echo $one; } } else…...

POSIX线程(pthread)库:线程的终止与管理

在POSIX线程&#xff08;pthread&#xff09;库中&#xff0c;线程的终止和管理涉及多个关键函数。以下是关于线程终止的pthread系列函数的详细介绍&#xff1a; 1. pthread_exit&#xff1a;线程主动退出 ✨ 功能&#xff1a; 允许线程主动终止自身&#xff0c;并返回一个退出…...

解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明

以下是解决 IntelliJ IDEA 中 Maven 项目左侧项目视图未显示顶层目录问题的详细步骤说明&#xff1a; 1. 切换项目视图模式 默认情况下&#xff0c;IDEA 的项目视图可能处于 Packages 模式&#xff0c;仅显示代码包结构&#xff0c;而非物理目录。 操作步骤&#xff1a; 点击…...

408 计算机网络 知识点记忆(6)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容&#xff0c;系统梳理核心知识记忆点和框架&#xff0c;既为个人复习沉淀思考&#xff0c;亦希望能与同行者互助共进。&#xff08;PS&#xff1a;后续将持续迭代优化细节&#xff09; 往期内容 408 计算机网络 知识…...

Multisim 仿真 DC Sweep 双源嵌套扫描嵌套

Multisim仿真工具箱里头有DC Sweep分析方法&#xff0c;分析中可以对两个源参数扫描分析 类似于编程的循环嵌套&#xff1a; for( Source 2 : start value; Increment; Source 2 : stop value;) {for( Source 1 : start value; Increment; Source 2 : stop value;){... //…...

Python | 绘制黑底的水平空间分布图

写在前面 记录一下之前为了做PPT汇报画的一张图&#xff0c;虽然最后也没怎么用上。为了方面以后再需要&#xff0c;这里把代码和数据整理放到GitHub上。有兴趣的也可以玩玩 需要的数据 风场数据可以从ERA5的官网下载 https://cds.climate.copernicus.eu/datasets/reanalys…...

京东与喜茶关系破裂:切断所有合作 禁止进入办公场所

快科技4月10日消息&#xff0c;据报道&#xff0c;京东集团近日被曝出内部下发全员禁令&#xff0c;全面封杀喜茶产品进入办公区域。 据知情人士透露&#xff0c;京东人力行政部门发布的通知明确规定&#xff1a;全国各职场禁止与喜茶品牌开展任何形式的合作&#xff1b;员工不…...

LangChain-记忆系统 (Memory)

记忆系统是LangChain的核心组件之一&#xff0c;允许应用程序记住和使用过去的交互信息。本文档详细介绍了LangChain中的记忆组件类型、工作原理和使用场景。 概述 在构建对话式AI应用时&#xff0c;能够记住上下文和之前的交互至关重要。LangChain的记忆组件负责&#xff1a…...

stm32开发(一)之创建工程与第一个程序

ps&#xff1a; 开发模式 1.基于库函数&#xff08;标准库&#xff09; 推荐 2.基于HAL库 图形化 3.基于寄存器 最直接 一、创建工程 1、打开keil5 new Project->路径->命名->保存 2、选择型号&#xff1a;stm32f103c8 初始创建工程我们不使用快捷项目建设 …...

【电商】基于LangChain框架将多模态大模型连接数据库实现精准识别

1. LangChain框架 LangChain是一个用于构建基于大语言模型的应用框架&#xff0c;通过模块化设计简化了LLM与外部工具&#xff0c;数据源和复杂逻辑的集成。 连接能力 将多个LLM调用&#xff0c;工具调用或者数据处理步骤串联成工作流 数据感知 外部数据集成 支持连接数据…...

鸿蒙HarmonyOS埋点SDK,ClkLog适配鸿蒙埋点分析

ClkLog埋点分析系统&#xff0c;是一种全新的、开源的洞察方案&#xff0c;它能够帮助您捕捉每一个关键数据点&#xff0c;确保您的决策基于最准确的用户行为分析。技术人员可快速搭建私有的分析系统。 ClkLog鸿蒙埋点SDK通过手动埋点的方式实现HarmonyOS 原生应用的前端数据采…...

详解 kotlin 相对 Java 特有的关键字及使用

文章目录 1. val 和 var2. fun3. when4. is 和 !is5. lateinit6. by7. reified8. companion 本文首发地址&#xff1a;https://h89.cn/archives/366.html 最新更新地址&#xff1a;https://gitee.com/chenjim/chenjimblog Kotlin 在兼容Java的基础上&#xff0c;引入了许多特有…...

湘西的未来交响曲

故事摘要 在中国湖南湘西的未来&#xff0c;苗族文化与高科技完美融合&#xff0c;构建出一个既传统又现代的世界。晨曦中的沱江&#xff0c;悬浮的吊脚楼面带着品位独特的织锦纹样&#xff0c;展示了令人惊叹的未来建筑美学。独特的工坊技术使得每件首饰都能感知佩戴者的情感&…...

STM32_HAL库提高中断执行效率

目录 中断流程分析我的解决办法优缺点 大家都在说STM32 HAL 库中断效率低下。具体哪里不行&#xff1f;如何优化&#xff1f; 我手里的项目要用到多个定时器TIM6、TIM7、TIM9、TIM10、TIM11、TIM12、TIM13&#xff0c;在处理这些定时器中断的时候&#xff0c;也发现了这个问题。…...

软件系统安全设计方案,信息化安全建设方案(Word原件)

1.1 总体设计 1.1.1 设计原则 1.2 物理层安全 1.2.1 机房建设安全 1.2.2 电气安全特性 1.2.3 设备安全 1.2.4 介质安全措施 1.3 网络层安全 1.3.1 网络结构安全 1.3.2 划分子网络 1.3.3 异常流量管理 1.3.4 网络安全审计 1.3.5 网络访问控制 1.3.6 完…...

什么是微前端?有什么好处?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一种架构理念&#xff0c;借鉴了微服务的思想&#xff0c;将一个大型的前端应用拆分为多个独立、自治的子应用&#xff0c;每个子应用可以由不同团队、使用不同技术栈独立开发和部署&#xff0c;最终聚合为一个整体产品…...

电机 断路器选型

一、断路器额定电流计算基础 ‌电机额定电流估算‌ 三相380V电机额定电流可按经验公式快速计算&#xff1a; I电机≈2P(P为功率/kW)I电机​≈2P(P为功率/kW) 例如&#xff1a;7.5kW电机额定电流约15A‌。 ‌断路器倍数选择范围‌ ‌通用标准‌&#xff1a;1.2~2.5倍电机额定电…...

Web前端之Vue+Element实现表格动态不同列合并多行、localeCompare、forEach、table、push、sort、Map

MENU 效果图公共数据数据未排序时&#xff08;需要合并的行数据未处于相邻位置&#xff09;固定合并行&#xff08;写死&#xff09;动态合并行方法&#xff08;函数&#xff09;执行 效果图 公共数据 Html <el-table :data"tableData" :span-method"chang…...

【教学类-102-07】剪纸图案全套代码07——Python点状虚线优化版本+制作1图2图6图

背景需求: 我觉得这个代码里面的输入信息分离太远(42行和241行),想重新优化一下 【教学类-102-05】蛋糕剪纸图案(留白边、沿线剪)04——Python白色(255)图片转为透明png再制作“点状边框和虚线边框”-CSDN博客文章浏览阅读864次,点赞14次,收藏27次。【教学类-102-0…...

Redis与Lua原子操作深度解析及案例分析

一、Redis原子操作概述 Redis作为高性能的键值存储系统&#xff0c;其原子性操作是保证数据一致性的核心机制。在Redis中&#xff0c;原子性指的是一个操作要么完全执行&#xff0c;要么完全不执行&#xff0c;不会出现部分执行的情况。 Redis原子性的实现原理 单线程模型&a…...

QT中怎么隐藏或显示最大化、最小化、关闭按钮

文章目录 方法一&#xff1a;通过代码动态设置1、隐藏最大化按钮2、隐藏最小化按钮3、隐藏关闭按钮方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手动控制按钮 4、同时隐藏最大化和最小化按钮5、同时隐藏最大化和关闭按钮6、…...

OpenSceneGraph相机系统

一、相机的核心原理 Open Scene Graph&#xff08;OSG&#xff09;中相机的核心原理围绕‌视图变换‌和‌投影变换‌展开&#xff0c;结合场景图的层次化结构实现三维空间的动态渲染。 1、视图变换&#xff08;View Transformation&#xff09; &#xff09;视图矩阵的作用‌…...

KTH5772 系列游戏手柄摇杆专用3D 霍尔位置传感器

产品概述 KTH5772是一款专为游戏手柄上的摇杆应用而设计的3D霍尔磁感应芯片&#xff0c;主要面向对线性度、回报率、灵敏度、功耗要求严格的摇杆应用。KTH5772基于3D霍尔技术&#xff0c;内部分别集成了X轴、Y轴和Z轴三个独立的霍尔元件&#xff0c;能够通过测量和处理磁通密度…...

Soybean Admin 使用tv-focusable兼容电视TV端支持遥控器移动焦点

环境 window10 pnpm 8.15.4 node 8.15.4 vite 5.1.4 soybean admin: 1.0.0 native-ui: 2.38.0 vue-tv-focusable: 2.0.1 小米电视 MIUI TV版本&#xff1a;MiTV OS 2.7.1886(稳定版) 飞视浏览器&#xff1a;https://www.fenxm.com/1220.html这里必须使用飞视浏览器&#xff0c…...

经济金融最优化:从理论到MATLAB实践——最大利润问题全解析

内容摘要 本文聚焦经济金融领域的最大利润问题&#xff0c;深入探讨不考虑销售影响和考虑销售影响两种情形下的利润最大化模型柯布 - 道格拉斯生产函数等理论构建与求解。 关键词&#xff1a;经济金融&#xff1b;最大利润问题&#xff1b;柯布-道格拉斯生产函数 1. 引言 在…...

大模型学习七:‌小米8闲置,直接安装ubuntu,并安装VNC远程连接手机,使劲造

一、说明 对于咱们技术人来说&#xff0c;就没有闲的蛋疼的时候&#xff0c;那不是现在机会来了 二、刷机器准备 1、申请解锁手机 申请解锁小米手机https://www.miui.com/unlock/download.html 下载工具&#xff0c;安装下面的步骤来&#xff0c;官网不欺人吧 打开开发者工…...

高可用之战:Redis Sentinal(哨兵模式)

参考&#xff1a;Redis系列24&#xff1a;Redis使用规范 - Hello-Brand - 博客园 1 背景 在我们的《Redis高可用之战&#xff1a;主从架构》篇章中&#xff0c;介绍了Redis的主从架构模式&#xff0c;可以有效的提升Redis服务的可用性&#xff0c;减少甚至避免Redis服务发生完…...