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

STM32-RTC实时时钟

目录

RTC实时时钟

功能框图

UNIX时间戳

初始化结构体

RTC时间结构体

RTC日期结构体

RTC闹钟结构体

进入和退出配置函数

实验环节1:显示日历

常规配置

RTC配置

测试环节

实验现象

实验环节2:闹钟

常规配置

RTC配置

测试环节

实验现象


RTC实时时钟

STM32的RTC外设,实质上是一个掉电后还继续运行的定时器。类似于通用定时器TIM外设,可以计时和触发中断。

掉电指的是电源VDD断开时为了RTC外设掉电继续运行,必须接上锂电池给STM32的RTC、备份发卡通过Vbat引脚供电。当主电源VDD有效时由VDD给RTC外设供电,当CDD掉电后,由Vbat给RTC外设供电。但无论由什么电源供电,RTC的数据都保存在属于RTC的备份域中,若主电源VDD和Vbat都掉电,则备份域保存的所有数据将丢失。备份域除了RTC模块的寄存器,还有42个16位的寄存器可以在VDD掉电时保存用户程序的数据,系统复位或电源复位时,数据也不会清空。

从RTC的定时器特性来说,是一个32位的递增计数器。时钟源有三种:HSE/128、LSI和LSE。

使用LSI或HSE/8时钟源,在主电源VDD掉电时,这两个时钟来源都会受到影响,因此无法保证RTC正常工作。因此RTC一般使用LSE。在设计中,频率通常为32.768kHz

在主电源VDD有效并处于待机模式时,RTC还可以配置闹钟事件时STM32退出待机模式

功能框图

浅灰色部分属于备份域,VDD掉电时可在Vbat的驱动下继续运行。包括了RTC分频器、计数器、闹钟控制器。

若VDD电源有效,RTC可以触发RTC_Second(秒中断)、RTC_Overflow(溢出事件)和RTC_Alarm(闹钟中断)。从结构图可以分析出,定时器溢出中断无法被配置为中断。

若STM32处于待机模式,可由闹钟事件或WKUP事件(外部唤醒事件,属于EXTI模块,不属于RTC)退出待机模式。

闹钟事件在计数器RTC_CNT的值等于闹钟寄存器RTC_ALR的值时触发。

在备份域中所有寄存器都是16位的,RTC控制相关的寄存器也不例外。它的计数器RTC_CNT的32位由RTC_CNTL和RTC_CNTH这两个寄存器组成。

在配置RTC模块的时钟时,通常把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK = RTCCLK / 32768 =1Hz,计数周期为1s,计数器在TR_CLK的驱动下计数,即每秒计数器RTC_CNT的值+1。

由于备份域的存在,使得RTC核具有了完全独立于APB1接口的特性,也因此对RTC寄存器的访问要遵守一定的规则。

系统复位后,默认禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问:

        设置RCC_APB1ENR:PWREN、BKPEN位来使能电源和后备接口时钟。

        设置PWR_CR:DBP位使能对后备寄存器和RTC的访问。

设置后备寄存器为可写访问后,在第一次通过APB1接口访问RTC时,因为时钟频率的差异,所以必须等待APB1和RTC外设同步,确保被读取出来的RTC寄存器值是正确的。若在同步后,一直没有关闭APB1的RTC外设接口,就不需要再次同步了。

如果内核要对RTC寄存器进行任何写操作,在内核写出写指令后,RTC模块在3个RTCCLK时钟后才开始正式的写RTC寄存器操作。由于RTCCLK的频率比内核主频低得多,所以每次操作后都必须检查RTC关闭操作标志位RTOFF,当这个标志位被置1,写操作才正式完成。

当然,以上操作都具有对应的库函数,不需要具体的查阅寄存器。 

UNIX时间戳

RTC_CNT是32位寄存器,可存储的最大值为2^32-1,即约等于136年。

如某个时刻读取计数器的值为2天的秒数,以2011.1.1 0:0:0时间置0计数器的,则可以算出是2011.1.3 0:0:0时间,计数器会在2011+136年左右溢出。定时器被置0的时间为计数元年,相对计时元年的秒数为时间戳(计数器的值)。

大多数操作系统都是利用时间戳和计时元年来计算当前时间的,有个标准:UNIX时间戳和UNIX计时元年。

UNIX计时元年被设置为格林威治时间1970.1.1 0:0:0时间。

在这个计时系统上,使用的是有符号的32位整形变量来保存UNIX时间戳,因此最高位表示符号,时间戳能显示的范围更小了,会在2038.1.19 3:14:07时间溢出。

网页上可搜:UNIX时间戳。可实时查看。

初始化结构体

STM32 HAL库对RTC控制提供了完善的函数。

typedef struct {uint32_t AsynchPrediv;    /* 配置RTC_CLK的异步分频因子(0x00~0x7F ) ,具体由RTC_PRER:PREDIV_A[6:0]配置 */uint32_t OutPut;          /* RTCEx输出通道设置,指定哪一路信号作为RTC的输出,禁止输出/闹钟A输出/闹钟B输出/唤醒输出 */} RTC_InitTypeDef;

RTC时间结构体

用来设置初始时间,配置的是RTC时间寄存器RTC_TR。

 typedef struct {uint8_t Hours;    /* 小时设置。12小时制式时,0~11;24小时制式时,0~23 */uint8_t Minutes;  /* 分钟设置,0~59 */uint8_t Seconds;  /* 秒设置,0~59 */} RTC_TimeTypeDef;

RTC日期结构体

用来设置初始日期,配置的是RTC日期寄存器RTC_DR。

typedef struct {uint8_t WeekDay; /* 星期几设置,1~7 */uint8_t Month;   /* 月份设置,1~12 */uint8_t Date;    /* 日期设置,1~31 */uint8_t Year;    /* 年份设置,0~99 */} RTC_DateTypeDef;

RTC闹钟结构体

用来设置闹钟时间,设置的格式为[星期/日期]-[时]-[分]-[秒],4个字段,每个字段可以设置为有效或无效(MASK)。如果MASK掉[星期/日期]字段,则每天闹钟都会响。

typedef struct {RTC_TimeTypeDef AlarmTime;     /* 设定RTC时间寄存器的值:时/分/秒 */uint32_t Alarm;                /* RTC 闹钟选择:闹钟A、闹钟B */} RTC_AlarmTypeDef;

进入和退出配置函数

/*** @brief  进入 RTC 配置模式 .* @param  None* @retval None*/void RTC_EnterConfigMode(void){/* 设置 CNF 位进入配置模式 */RTC->CRL |= RTC_CRL_CNF;}/** @brief  退出 RTC 配置模式 .* @param  None* @retval None*/void RTC_ExitConfigMode(void){/* 清空  CNF 位退出配置模式 */RTC->CRL &= (uint16_t)~((uint16_t)RTC_CRL_CNF);}

实验环节1:显示日历

常规配置

USART1:带中断,支持printf输出。

RTC配置

RTC_HandleTypeDef hrtc;/* RTC init function */
void MX_RTC_Init(void)
{RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef DateToUpdate = {0};/* USER CODE BEGIN RTC_Init 1 *//* 判断是否首次上电 */if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5050){HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5050);	// 插入BKP数值判断/* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance = RTC;hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/** Initialize RTC and set the Time and Date*/sTime.Hours = 0x0;sTime.Minutes = 0x0;sTime.Seconds = 0x0;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;DateToUpdate.Month = RTC_MONTH_JANUARY;DateToUpdate.Date = 0x1;DateToUpdate.Year = 0x0;if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 */}/* USER CODE END RTC_Init 2 */
}void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
{if (rtcHandle->Instance == RTC){HAL_PWR_EnableBkUpAccess();	// 取消BKP区域写保护,才能进行时间保存和计时/* Enable BKP CLK enable for backup registers */__HAL_RCC_BKP_CLK_ENABLE();	// 开启BKP时钟/* RTC clock enable */__HAL_RCC_RTC_ENABLE();}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle)
{if (rtcHandle->Instance == RTC){__HAL_RCC_RTC_DISABLE();}
}

测试环节

#include "string.h"uint8_t RxBuffer[20];void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){}
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){// A5 5A 00 01 01 00 00 00if(RxBuffer[0]==0xA5 && RxBuffer[1]==0x5A){RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;RtcTime.Hours = RxBuffer[5];RtcTime.Minutes = RxBuffer[6];RtcTime.Seconds = RxBuffer[7];if (HAL_RTC_SetTime(&hrtc, &RtcTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}// 星期内部自动校正RtcDate.WeekDay = RTC_WEEKDAY_MONDAY;RtcDate.Month = RxBuffer[3];RtcDate.Date = RxBuffer[4];RtcDate.Year = RxBuffer[2];if (HAL_RTC_SetDate(&hrtc, &RtcDate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}memset(RxBuffer, 0, sizeof(RxBuffer));HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);}}	
}void test(void)
{RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);while(1){HAL_RTC_GetTime(&hrtc, &RtcTime,  RTC_FORMAT_BIN);	// 读出时间值HAL_RTC_GetDate(&hrtc, &RtcDate,  RTC_FORMAT_BIN);	// 一定要先读时间后读日期,这样才能校正星期参数printf("实时时间:%04d-%02d-%02d  %02d:%02d:%02d 星期:%2d\r\n", 2000+RtcDate.Year, RtcDate.Month, RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间HAL_Delay(1000);}
}

实验现象

实验环节2:闹钟

常规配置

USART1:带中断,支持printf输出。

蜂鸣器配置。

RTC配置

RTC_HandleTypeDef hrtc;void MX_RTC_Init(void)
{RTC_TimeTypeDef sTime = {0};RTC_DateTypeDef DateToUpdate = {0};RTC_AlarmTypeDef sAlarm = {0};/* USER CODE BEGIN RTC_Init 1 *//* 判断是否首次上电 */if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x5050){HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5050);	// 插入BKP数值判断/* USER CODE END RTC_Init 1 *//** Initialize RTC Only*/hrtc.Instance = RTC;hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;if (HAL_RTC_Init(&hrtc) != HAL_OK){Error_Handler();}/** Initialize RTC and set the Time and Date*/sTime.Hours = 0x0;sTime.Minutes = 0x0;sTime.Seconds = 0x0;if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;DateToUpdate.Month = RTC_MONTH_JANUARY;DateToUpdate.Date = 0x1;DateToUpdate.Year = 0x0;if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}/** Enable the Alarm A*/sAlarm.AlarmTime.Hours = 0x0;sAlarm.AlarmTime.Minutes = 0x1;sAlarm.AlarmTime.Seconds = 0x0;sAlarm.Alarm = RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}/* USER CODE BEGIN RTC_Init 2 */}/* USER CODE END RTC_Init 2 */
}void HAL_RTC_MspInit(RTC_HandleTypeDef *rtcHandle)
{if (rtcHandle->Instance == RTC){HAL_PWR_EnableBkUpAccess();/* Enable BKP CLK enable for backup registers */__HAL_RCC_BKP_CLK_ENABLE();/* RTC clock enable */__HAL_RCC_RTC_ENABLE();/* RTC interrupt Init */HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);}
}void HAL_RTC_MspDeInit(RTC_HandleTypeDef *rtcHandle)
{if (rtcHandle->Instance == RTC){__HAL_RCC_RTC_DISABLE();/* RTC interrupt Deinit */HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn);}
}

测试环节

#include "string.h"uint8_t RxBuffer[20];void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){}
}void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if(huart == &huart1){// A5 5A 00 01 01 00 00 00if(RxBuffer[0]==0xA5 && RxBuffer[1]==0x5A){RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;RTC_AlarmTypeDef RtcAlarm;RtcTime.Hours = RxBuffer[5];RtcTime.Minutes = RxBuffer[6];RtcTime.Seconds = RxBuffer[7];if (HAL_RTC_SetTime(&hrtc, &RtcTime, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}// 星期内部自动校正RtcDate.WeekDay = RTC_WEEKDAY_MONDAY;RtcDate.Month = RxBuffer[3];RtcDate.Date = RxBuffer[4];RtcDate.Year = RxBuffer[2];if (HAL_RTC_SetDate(&hrtc, &RtcDate, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}RtcAlarm.AlarmTime.Hours = RxBuffer[5];RtcAlarm.AlarmTime.Minutes = RxBuffer[6];RtcAlarm.AlarmTime.Seconds = RxBuffer[7] + 0x10;RtcAlarm.Alarm = RTC_ALARM_A;if (HAL_RTC_SetAlarm_IT(&hrtc, &RtcAlarm, RTC_FORMAT_BCD) != HAL_OK){Error_Handler();}memset(RxBuffer, 0, sizeof(RxBuffer));HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);}}	
}void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);
}void test(void)
{RTC_DateTypeDef RtcDate;RTC_TimeTypeDef RtcTime;初始化HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxBuffer, 8);while(1){HAL_RTC_GetTime(&hrtc, &RtcTime,  RTC_FORMAT_BIN);	// 读出时间值HAL_RTC_GetDate(&hrtc, &RtcDate,  RTC_FORMAT_BIN);	// 一定要先读时间后读日期,这样才能校正星期参数printf("实时时间:%04d-%02d-%02d  %02d:%02d:%02d 星期:%2d\r\n", 2000+RtcDate.Year, RtcDate.Month, RtcDate.Date, RtcTime.Hours, RtcTime.Minutes, RtcTime.Seconds, RtcDate.WeekDay);//显示日期时间HAL_Delay(1000);}
}

实验现象

上电运行,LED默认灭。一分钟后LED亮绿灯。

通过串口调试助手发送A55A231101000000,10秒后LED灭。

相关文章:

STM32-RTC实时时钟

目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 R…...

初学Flutter,实现底部导航切换

效果展示 flutter bottomNavBar 主要实现代码 入口文件:main.dart import package:flutter/material.dart; import package:flutter_demo/components/bottomNavBar.dart; import package:flutter_demo/views/cart.dart; import package:flutter_demo/views/cata.d…...

使用JMeter进行接口压力测试

1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试,结果反馈如下图...

ElasticSearch集群架构实战及其原理剖析

ES集群架构 为什么要使用ES集群架构 分布式系统的可用性与扩展性: 高可用性 服务可用性:允许有节点停止服务;数据可用性:部分节点丢失,不会丢失数据; 可扩展性 请求量提升/数据的不断增长(将数据分布…...

选择适合你的办公桌:提高工作效率的关键

​在如今的数字时代,越来越多的人将办公桌移到家里或办公室。但是,如何选择适合你的办公桌可能是个挑战。不同的工作需要和工作空间大小会影响你的选择。下面是一些简单的建议,帮助你找到适合你的办公桌,提高工作效率。 首先&…...

机器学习之多层感知机 MLP简洁实现 《动手深度学习》实例

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…...

使用C#在Windows上调用7-zip压缩文件

使用C#在Windows上调用7-zip压缩文件 可以设置输出文件的路径也可以留空,留空则会在压缩文件创建一个同名的.压缩包 可以设置压缩包的密码 可以设置压缩包的加密方式(ASE-256),可以使用LZMA但是加密码会报错 可以设置压缩包的格式(zip),可以使用7z但是加…...

京东数据平台:2023年Q3季度黄金市场数据分析

继9月国内黄金市场持续上涨后,进入10月中下旬后,黄金行情再度反转,多家品牌金饰价格再次突破600元/克,达到611元/克。 今年以来,黄金行情不断走俏,销售市场也有明显增长。根据鲸参谋平台的数据显示&#xf…...

https原理

首先说一下几个概念:对称加密、非对称加密 对称加密: 客户端和服务端使用同一个秘钥,分两种情况: 1、所有的客户端和服务端使用同一个秘钥,这个秘钥被泄漏后数据不再安全 2、每个客户端生成一个秘钥&…...

FFmpeg直播能力更新计划与新版本发布

// 编者按:客户端作为直接面向用户大众的接口,随着技术的发展进化与时俱进,实现更好的服务是十分必要的。FFmpeg作为最受欢迎的视频和图像处理开源软件,被相关行业的大量用户青睐,而随着HEVC标准的发布到广泛使用&am…...

面试算法55:二叉搜索树迭代器

题目 请实现二叉搜索树的迭代器BSTIterator,它主要有如下3个函数。 构造函数:输入二叉搜索树的根节点初始化该迭代器。函数next:返回二叉搜索树中下一个最小的节点的值。函数hasNext:返回二叉搜索树是否还有下一个节点。 分析 …...

Linux Crontab 定时任务

crond 服务 Linux 通过 crond 服务来支持 crontab。 查看 crond 服务是否已经安装 输入下面命令确认 crond 服务是否已安装。 systemctl list-unit-files | grep crond 如果为 enabled,表示服务正运行。 crontab 文件 crontab 要执行的定时任务都被保存在 /etc…...

HiveSQL高级进阶技巧

目录 1.删除2.更新:3.行转列:4.列转行:5.分析函数:6.多维分析7.数据倾斜groupby:join: 掌握下面的技巧,你的SQL水平将有一个质的提升! 1.删除 正常hive删除操作基本都是覆盖原数据&…...

【Flutter】Flutter 动画深入解析(1):掌握 AnimationController 的使用

【Flutter】Flutter 动画深入解析(1):掌握 AnimationController 的使用 文章目录 一、前言二、AnimationController 简介三、AnimationController 的主要功能四、Ticker 提供者五、AnimationController 的生命周期六、与 AnimationController 一起使用的 Future七、实际业务…...

安装富文本组件

安装vue-ueditor-wrap3.x: vue-ueditor-wrap3.x:一个“包装”了 UEditor 的 Vue 组件,支持通过 v-model 来绑定富文本编辑器的内容,让 UEditor 的使用简单到像 Input 框一样。省去了初始化 UEditor、手动调用 getContent&#xff…...

Tomcat下载地址(详细)

Apache Tomcat - Apache Tomcat 8 Software Downloadshttps://tomcat.apache.org/download-80.cgi2.找到Archives 3.选择下载的把版本 4.选择具体下载那个版本 5. 6.一般选择tar.gz结尾的压缩包...

领星ERP如何无需API开发轻松连接OA、电商、营销、CRM、用户运营、推广、客服等近千款系统

领星ERP(LINGXING)是一款专业的一站式亚马逊管理系统,帮助卖家构建完整的数据化运营闭环。,致力于为跨境电商卖家提供精细化运营和业财一体化的解决方案。 官网:https://erp.lingxing.com 集简云无代码集成平台&…...

Django实战项目-学习任务系统-自定义URL拦截器

接着上期代码框架,6个主要功能基本实现,剩下的就是细节点的完善优化了。 首先增加URL拦截器,你不会希望没有登录用户就可以进入用户主页各种功能的,所以增加URL拦截器可以解决这个问题。 Django框架本身也有URL拦截器&#xff0…...

[已解决]该主机与 Cloudera Manager Server 失去联系的时间过长。 该主机未与 Host Monitor 建立联系。

问题 调整hvie 的参数后导致该主机与 Cloudera Manager Server 失去联系的时间过长 思路 主机离家出走了! 出现问题后立马参数修改回来; 但是还是发现有这样的报错: 网上百度,各种操作,大概总结为2点&#xff1a…...

通过在Z平面放置零极点的来设计数字滤波器

文章来源地址:https://www.yii666.com/blog/393376.html 通过在Z平面放置零极点的来设计数字滤波器 要求:设计一款高通滤波器,用在音频信号处理过程中,滤掉100Hz以下的信号。 实现方法:通过在Z平面放置零极点的来设…...

大话软工笔记—需求分析概述

需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...