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

RTC:实时时钟

RTC:实时时钟

  • 1、实时时钟
  • 2、闹钟中断
  • 3、秒中断
  • 4、输出功能
  • 5、BKP的读写
  • 6、BKP的侵入事件

1、实时时钟

①RTC.c

#include "RTC.h"/*** @brief:RTC初始化函数*/
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{/* 配置RTC的时钟源 */RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTCRTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);/* RTC的初始化配置 */__HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟__HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟__HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟hrtc.Instance = RTC;                        //选择RTChrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hzhrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出HAL_RTC_Init(&hrtc);
}/*** @brief:HAL_RTC_Init()调用函数*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{/* 其他的配置 */
}/*** @brief:日期转换为时间戳秒函数*/
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{struct tm DayData;              //定义结构体变量DayDataDayData.tm_year = Year - 1900;  //设置为2025年DayData.tm_mon = Mon;           //设置为1月DayData.tm_mday = Day;          //设置为2号DayData.tm_hour = Hour;         //设置为20时DayData.tm_min = Min;           //设置为04分DayData.tm_sec = Sec;           //设置为40秒time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位__HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护
}/*** @brief:将RTC中的计数器寄存器值转换为日期*/
struct tm* Time_Get(void)
{/* 读取数据寄存器的值 */time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);/* 将计数器的值转换为日期 */return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"struct tm* Day; 
int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);RTC_Init();printf("代码测试\r\n");Time_Set(2025,1,2,21,8,30);//2025-01-02 20:55:30while(1){Day = Time_Get();printf("%d-%d-%d %d:%d:%d\r\n",Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);HAL_Delay(1000);}	
}

在这里插入图片描述

2、闹钟中断

①RTC.c

#include "RTC.h"/*** @brief:RTC初始化函数*/
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{/* 配置RTC的时钟源 */RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTCRTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);/* RTC的初始化配置 */__HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟__HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟__HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟hrtc.Instance = RTC;                        //选择RTChrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hzhrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出HAL_RTC_Init(&hrtc);/* 开启闹钟中断 */__HAL_RTC_ALARM_CLEAR_FLAG(&hrtc, RTC_FLAG_ALRAF);  //清除闹钟标志__HAL_RTC_ALARM_ENABLE_IT(&hrtc, RTC_IT_ALRA);      //开启闹钟中断__HAL_RTC_ALARM_EXTI_ENABLE_IT();                   //开启闹钟外部中断线,EXTI17为闹钟事件__HAL_RTC_ALARM_EXTI_ENABLE_RISING_EDGE();          //上升沿触发HAL_NVIC_SetPriority(RTC_Alarm_IRQn,3,0);HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}/*** @brief:HAL_RTC_Init()调用函数*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{/* 其他的配置 */
}/*** @brief:日期转换为时间挫函数*/
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{struct tm DayData;              //定义结构体变量DayDataDayData.tm_year = Year - 1900;  //设置为2025年DayData.tm_mon = Mon;           //设置为1月DayData.tm_mday = Day;          //设置为2号DayData.tm_hour = Hour;         //设置为20时DayData.tm_min = Min;           //设置为04分DayData.tm_sec = Sec;           //设置为40秒time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位__HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护HAL_Delay(20);                                      //等待写保护成功,必须要有
}/*** @brief:闹钟时间转换为时间挫函数*/
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{struct tm DayData;              //定义结构体变量DayDataDayData.tm_year = Year - 1900;  //设置为2025年DayData.tm_mon = Mon;           //设置为1月DayData.tm_mday = Day;          //设置为2号DayData.tm_hour = Hour;         //设置为20时DayData.tm_min = Min;           //设置为04分DayData.tm_sec = Sec;           //设置为40秒time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护WRITE_REG(hrtc.Instance->ALRH,(temp >> 16));        //将转换好的时间挫写入RTC闹钟寄存器高16位WRITE_REG(hrtc.Instance->ALRL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC闹钟寄存器低16位__HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护HAL_Delay(20);                                      //等待写保护成功,必须要有
}/*** @brief:将RTC中的计数器寄存器值转换为日期*/
struct tm* Time_Get(void)
{/* 读取数据寄存器的值 */time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);/* 将计数器的值转换为日期 */return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"struct tm* Day; 
int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);RTC_Init();printf("代码测试\r\n");Time_Set(2025,1,2,21,8,30);         //2025-01-02 20:55:30AlarmTime_Set(2025,1,2,21,8,35);    //闹钟时钟为2025-01-02 20:55:35while(1){Day = Time_Get();printf("%d-%d-%d %d:%d:%d\r\n",Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);HAL_Delay(1000);}	
}

④stm32f1xx_it.c

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"/*** @brief:RTC闹钟中断服务函数*/
void RTC_Alarm_IRQHandler(void)
{HAL_RTC_AlarmIRQHandler(&hrtc);
}
/******************* 下面的中断的回调函数 ***************************/
/*** @brief:RTC闹钟中断回调函数函数*/
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{printf("起床啦!\r\n");
}

在这里插入图片描述

3、秒中断

①RTC.c

#include "RTC.h"/*** @brief:RTC初始化函数*/
RCC_PeriphCLKInitTypeDef RTCPeriphClkInit;  //RTC时钟配置结构体
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{/* 配置RTC的时钟源 */RTCPeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC; //需要配置的外设:RTCRTCPeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; //RTC时钟源:LSE(外部低速时钟)HAL_RCCEx_PeriphCLKConfig(&RTCPeriphClkInit);/* RTC的初始化配置 */__HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟__HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟__HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟hrtc.Instance = RTC;                        //选择RTChrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //时钟源的分频值,1Hzhrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;   //无输出HAL_RTC_Init(&hrtc);/* 开启秒中断 */HAL_RTCEx_SetSecond_IT(&hrtc);              //开启秒中断HAL_NVIC_SetPriority(RTC_IRQn,3,0);HAL_NVIC_EnableIRQ(RTC_IRQn);
}/*** @brief:HAL_RTC_Init()调用函数*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{/* 其他的配置 */
}/*** @brief:日期转换为时间挫函数*/
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{struct tm DayData;              //定义结构体变量DayDataDayData.tm_year = Year - 1900;  //设置为2025年DayData.tm_mon = Mon;           //设置为1月DayData.tm_mday = Day;          //设置为2号DayData.tm_hour = Hour;         //设置为20时DayData.tm_min = Min;           //设置为04分DayData.tm_sec = Sec;           //设置为40秒time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护WRITE_REG(hrtc.Instance->CNTH,(temp >> 16));        //将转换好的时间挫写入RTC计数寄存器高16位WRITE_REG(hrtc.Instance->CNTL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC计数寄存器低16位__HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护HAL_Delay(20);                                      //等待写保护成功,必须要有
}/*** @brief:闹钟时间转换为时间挫函数*/
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec)
{struct tm DayData;              //定义结构体变量DayDataDayData.tm_year = Year - 1900;  //设置为2025年DayData.tm_mon = Mon;           //设置为1月DayData.tm_mday = Day;          //设置为2号DayData.tm_hour = Hour;         //设置为20时DayData.tm_min = Min;           //设置为04分DayData.tm_sec = Sec;           //设置为40秒time_t temp = mktime(&DayData);                     //将设置的日期转换为时间挫数据__HAL_RTC_WRITEPROTECTION_DISABLE(&hrtc);           //关闭RTC写保护WRITE_REG(hrtc.Instance->ALRH,(temp >> 16));        //将转换好的时间挫写入RTC闹钟寄存器高16位WRITE_REG(hrtc.Instance->ALRL,temp & 0x0000FFFF);   //将转换好的时间挫写入RTC闹钟寄存器低16位__HAL_RTC_WRITEPROTECTION_ENABLE(&hrtc);            //开启RTC写保护HAL_Delay(20);                                      //等待写保护成功,必须要有
}/*** @brief:将RTC中的计数器寄存器值转换为日期*/
struct tm* Time_Get(void)
{/* 读取数据寄存器的值 */time_t temp = (READ_REG(hrtc.Instance->CNTH) << 16) | READ_REG(hrtc.Instance->CNTL);/* 将计数器的值转换为日期 */return localtime(&temp);//将时间戳转换为本地的年月日时分秒
}

②RTC.h

#ifndef __RTC_H
#define __RTC_H#include "stm32f1xx_hal.h"
#include <time.h>
extern RTC_HandleTypeDef hrtc;  //RTC配置结构体
void RTC_Init(void);
void Time_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
void AlarmTime_Set(int Year,int Mon,int Day,int Hour,int Min,int Sec);
struct tm* Time_Get(void);#endif

③main.c

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"
#include "LED.h"struct tm* Day; 
int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);LED_GPIO_Init();RTC_Init();printf("代码测试\r\n");Time_Set(2025,1,2,21,8,30);         //2025-01-02 20:55:30while(1){Day = Time_Get();printf("%d-%d-%d %d:%d:%d\r\n",Day->tm_year + 1900,Day->tm_mon,Day->tm_mday,Day->tm_hour,Day->tm_min,Day->tm_sec);HAL_Delay(1000);}	
}

④stm32f1xx_it.c

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"
#include "LED.h"/*** @brief:RTC秒中断服务函数*/
void RTC_IRQHandler(void)
{HAL_RTCEx_RTCIRQHandler(&hrtc);
}/******************* 下面的中断的回调函数 ***************************/
/*** @brief:RTC秒中断回调函数*/
void HAL_RTCEx_RTCEventCallback(RTC_HandleTypeDef *hrtc)
{LED_Turn();
}

4、输出功能

①RTC.c文件需要修改的代码如下

hrtc.Init.OutPut = RTC_OUTPUTSOURCE_SECOND; //输出:秒脉冲
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM ; //输出:闹钟脉冲
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_CALIBCLOCK; //输出:32768Hz/64后的脉冲

输出引脚是PC13,但是不用配置它。其他的代码不用修改

5、BKP的读写

BKP的读写需要RTC的配置,但是不需要开启LSE的时钟源。只需要打开RTC时钟+配置RTC总控结构体
①RTC.c文件的代码如下

#include "RTC.h"/*** @brief:RTC初始化函数*/
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
void RTC_Init(void)
{    /* RTC的初始化配置 */__HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟__HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟__HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟hrtc.Instance = RTC;                        //选择RTCHAL_RTC_Init(&hrtc);
}/*** @brief:HAL_RTC_Init()调用函数*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{/* 其他的配置 */
}

②main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"uint16_t Data = 0x1234;
int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);RTC_Init();										//初始化BKPprintf("代码测试\r\n");HAL_RTCEx_BKUPWrite(&hrtc, 1, Data);            //向BKP的第一个数据寄存器写入数据printf("%x\r\n",HAL_RTCEx_BKUPRead(&hrtc, 1));  //读取BKP的第一个数据寄存器的数据while(1){}	
}

在这里插入图片描述

6、BKP的侵入事件

若发生了侵入事件,会将BKP中的数据清除(主电源断电,侵入事件也有效)。侵入事件检测引脚为PC13且检测电平。但是我们不用配置PC13。
在这里插入图片描述当侵入事件产生后,应该先关闭侵入检测。需要侵入检测则重新调用API函数开启侵入检测。
①RTC.c文件的代码如下

#include "RTC.h"/*** @brief:RTC初始化函数*/
RTC_HandleTypeDef hrtc;                     //RTC配置结构体
RTC_TamperTypeDef Tamper;                   //侵入事件配置结构体
void RTC_Init(void)
{    /* RTC的初始化配置 */__HAL_RCC_RTC_ENABLE();                     //使能RTC的时钟__HAL_RCC_PWR_CLK_ENABLE();                 //使能PWR的时钟__HAL_RCC_BKP_CLK_ENABLE();                 //使能BKP的时钟hrtc.Instance = RTC;                        //选择RTCHAL_RTC_Init(&hrtc);/* 侵入事件配置 */Tamper.Tamper = RTC_TAMPER_1;                   //指定引脚:PC13Tamper.Trigger = RTC_TAMPERTRIGGER_HIGHLEVEL;   //高电平触发HAL_RTCEx_SetTamper_IT(&hrtc,&Tamper);          //配置侵入事件,开启中断HAL_NVIC_SetPriority(TAMPER_IRQn,3,0);HAL_NVIC_EnableIRQ(TAMPER_IRQn);
}

②main.c文件的代码如下

#include "stm32f1xx_hal.h"
#include "STM32_RCC_Init.h"
#include "RTC.h"
#include "UART.h"uint16_t Data = 0x1234;
int main(void){HAL_Init();HSE_RCC_Init(); UART1_Init(115200);RTC_Init();										//初始化BKP,初始化侵入事件printf("代码测试\r\n");HAL_RTCEx_BKUPWrite(&hrtc, 1, Data);            //向BKP的第一个数据寄存器写入数据printf("%x\r\n",HAL_RTCEx_BKUPRead(&hrtc, 1));  //读取BKP的第一个数据寄存器的数据while(1){}	
}

③stm32f1xx_it.c文件的代码如下

#include "stm32f1xx_hal.h"   
#include "stm32f1xx_it.h" 
#include "RTC.h" 
#include "UART.h"/*** @brief:RTC侵入事件中断服务函数*/
void TAMPER_IRQHandler(void)
{HAL_RTCEx_TamperIRQHandler(&hrtc);
}/******************* 下面的中断的回调函数 ***************************/
/*** @brief:RTC侵入中断回调函数*/
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)
{printf("发生侵入事件了\r\n");HAL_RTCEx_DeactivateTamper(hrtc, RTC_TAMPER_1);//关闭侵入事件
}

相关文章:

RTC:实时时钟

RTC&#xff1a;实时时钟 1、实时时钟2、闹钟中断3、秒中断4、输出功能5、BKP的读写6、BKP的侵入事件 1、实时时钟 ①RTC.c #include "RTC.h"/*** brief&#xff1a;RTC初始化函数*/ RCC_PeriphCLKInitTypeDef RTCPeriphClkInit; //RTC时钟配置结构体 RTC_HandleT…...

mqtt python rtsp拉流图传测试

GitHub - robmarkcole/mqtt-camera-streamer: Stream images from a connected camera over MQTT, view using Streamlit, record to file and sqlite 用这个项目&#xff0c;按照readme配置&#xff0c;把config里面的ip配置成接收端的ip地址。 该装的包装完之后&#xff0c…...

win32汇编环境,对话框程序中通过资源显示bmp图像

;运行效果 ;win32汇编环境,对话框程序中通过资源显示bmp图像 ;通过资源的方式&#xff0c;会把图像固定在exe文件里&#xff0c;会变大。通过读取文件的方式&#xff0c;没有固定在exe文件里&#xff0c;也可以随时换图像文件&#xff0c;所以exe文件较小 ;直接抄进RadAsm可编译…...

《探索人工智能的多元学派:符号主义、连接主义与行为主义》

在人工智能发展的进程中&#xff0c;不同学派从各自的角度诠释着智能的本质。其中符号主义、连接主义和行为主义学派占据着重要地位&#xff0c;它们以独特的方式推动着人工智能的发展。 符号主义学派&#xff1a;逻辑推理的核心 符号主义学派认为人工智能源于对逻辑符号的处…...

2024年终总结及计划

24年收获不少&#xff0c;早就想总结下&#xff0c;但是有的问题不想去思考&#xff0c;也不想去面对&#xff0c;就晚了几天&#xff0c;趁着加班总结反思下。 一、计划完成情况 1、生活 ①运动&#xff1a;继续坚持每周慢跑15公里&#xff0c;这是必须要做的。另外&#x…...

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题&#xff1a;具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系&#xff0c;所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…...

JVM实战—9.线上FGC的几种案例

大纲 1.如何优化每秒十万QPS的社交APP的JVM性能(增加S区大小 优化内存碎片) 2.如何对垂直电商APP后台系统的FGC进行深度优化(定制JVM参数模版) 3.不合理设置JVM参数可能导致频繁FGC(优化反射的软引用被每次YGC回收) 4.线上系统每天数十次FGC导致频繁卡顿的优化(大对象问题…...

STM32-BKP备份寄存器RTC实时时钟

一、原理 Unix&#xff1a; 一些系统是使用32bit有符号数存储&#xff0c;实际范围为-2,147,483,648到2,147,483,647‌即~ 经过计算int32数据会在2038年1月19日溢出&#xff0c;可以看到转换的为北京时间。 STM32的时间戳为无符号时间戳。 我们需要把秒计数器的时间通过计算…...

HTML-文本标签

历史上&#xff0c;网页的主要功能是文本展示。所以&#xff0c;HTML 提供了大量的文本处理标签。 1.<div> <div>是一个通用标签&#xff0c;表示一个区块&#xff08;division&#xff09;。它没有语义&#xff0c;如果网页需要一个块级元素容器&#xff0c;又没…...

香橙派5plus单独编译并安装linux内核无法启动的原因分析与解决记录

1 说明 我依照官方手册编译单独编译linux内核&#xff0c;安装后重启出现内核启动失败的问题,编译和安装步骤如下&#xff1a;# 1. 克隆源码 git clone --depth1 -b orange-pi-6.1-rk35xx https://github.com/orangepi-xunlong/linux-orangepi# 2 配置源码 make rockchip_linu…...

嵌入式应用软件开发中C语言方向面试题

嵌入式应用软件开发中C语言方向面试题随笔 前言一、C语言基础二、嵌入式开发相关三、硬件相关知识五、实际编程问题前言 做嵌入式开发这么多年了,简单记录下C语言方向常见面试题,这里是应用软件方向的。 一、C语言基础 C语言的指针与数组的区别是什么?指针:指针是一个变量…...

linux 系统配置ip

最常见的配置方法是通过 DHCP 获取动态 IP 地址&#xff0c;或者手动配置一个静态 IP 地址。下面我将详细说明这两种常见的配置方法。 通过 DHCP 自动获取 IP 地址 如果你的开发板连接到网络&#xff08;比如通过网线或者 Wi-Fi&#xff09;&#xff0c;并且网络环境支持 DHCP…...

低代码开发:开启企业数智化转型“快捷键”

一、低代码开发浪潮来袭&#xff0c;企业转型正当时 在当今数字化飞速发展的时代&#xff0c;低代码开发已如汹涌浪潮&#xff0c;席卷全球。从国际市场来看&#xff0c;诸多企业巨头纷纷布局低代码领域&#xff0c;像微软的 PowerApps、OutSystems 等平台&#xff0c;凭借强大…...

Tailwind CSS 实战:性能优化最佳实践

在现代网页开发中,性能优化就像是一场精心策划的马拉松。记得在一个电商项目中,我们通过一系列的性能优化措施,让页面加载时间减少了 60%,转化率提升了 25%。今天,我想和大家分享如何使用 Tailwind CSS 进行性能优化。 优化理念 性能优化就像是在打磨一块璞玉。我们需要通过各…...

[redux] useDispatch的两种用法

先重写2个方法先, 方便ts类型推导,如果你看不懂为什么这么写, 先看我这篇 [redux] ts声明useSelector和useDispatch-CSDN博客 export type RootState ReturnType<typeof store.getState>; export type AppDispatch typeof store.dispatch; export const useAppDispat…...

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…...

电脑找不到mfc110.dll文件要如何解决?Windows缺失mfc110.dll文件快速解决方法

一、mfc110.dll文件的重要性 mfc110.dll&#xff0c;全称Microsoft Foundation Class Library 110&#xff0c;是Microsoft Visual C Redistributable for Visual Studio 2012的一部分。这个动态链接库&#xff08;DLL&#xff09;文件对于支持基于MFC&#xff08;Microsoft F…...

Elasticsearch与数据库数据一致性:最佳实践与解决方案

在现代应用程序中&#xff0c;Elasticsearch&#xff08;ES&#xff09;作为一个高效的分布式搜索引擎&#xff0c;常常与数据库一同使用&#xff0c;以提供强大的搜索、分析和数据可视化功能。然而&#xff0c;数据库和Elasticsearch之间的同步与一致性常常成为一个挑战。如何…...

vue导入导出excel、设置单元格文字颜色、背景色、合并单元格(使用xlsx-js-style库)

npm i xlsx-js-style <template><button click"download">下载 Excel 表格</button><el-table :data"tableData" style"width: 100%"><el-table-column prop"date" label"日期" width"180…...

电子电气架构 --- 中央处理器HPC及软件架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...

代码实战:基于InvSR对视频进行超分辨率重建

Diffusion Models专栏文章汇总:入门与实战 前言:上一篇博客《使用Diffusion Models进行图像超分辩重建》中讲解了InvSR的原理,博主实测的效果是非常不错的,和PASD基本持平。这篇博客就讲解如何利用InvSR对视频进行超分辨率重建。 目录 环境准备 代码讲解 环境准备...

一文读懂主成分分析法(PCA)

主成分分析法&#xff08;PCA&#xff09; 主成分分析法&#xff08;PCA&#xff09;主成分分析的基本思想主成分的计算主成分分析的原理主成分分析的特点主成分分析的应用 主成分分析法&#xff08;PCA&#xff09; 主成分分析的基本思想 PCA是1901 年Pearson在研究回归分析…...

Redis(基础篇 + 实践篇 )

01 | 基本架构&#xff1a;一个键值数据库包含什么&#xff1f; Redis 作为一个内存数据存储系统&#xff0c;它的架构设计非常简洁&#xff0c;但功能非常强大。理解其核心架构对高效使用 Redis 至关重要。 客户端与服务器架构&#xff1a; 客户端通过 TCP 协议连接到 Redis …...

高质量C++小白教程:2.10-预处理器简介

当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。 相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改. 预处理器实际上不会以任何方式修改原始代码文件,预处理…...

一、二极管(模电理论篇)

导论&#xff1a;PN结&#xff08;结电容&#xff09;是构成二极管&#xff0c;三极管&#xff0c;场效应管的原理基础 1.二极管特性&#xff08;单向导电性&#xff09; 1.1 P型半导体与N型半导体 在单晶体硅&#xff08;原子核为正四价电子&#xff0c;可以形成四条共价键&…...

JAVA学习笔记_JVM

文章目录 初识jvm内存结构程序计数器(寄存器) 栈问题辨析内存溢出 线程诊断本地方法栈Heap堆内存溢出内存诊断 方法区内存溢出常量池 stringTable直接内存垃圾回收 初识jvm JRE JVM 基础类库 JDK JRE 编译工具 JavaSE JDK IDE工具 JavaEE JDK 应用服务器 IDE工具 jvm是…...

SQL 中复杂 CASE WHEN 嵌套逻辑优化

目标&#xff1a;优化复杂的 CASE WHEN 逻辑&#xff0c;提升 SQL 语句的可读性与执行效率&#xff0c;减少多层嵌套带来的复杂性。 1. CASE WHEN 的常见问题 嵌套过深&#xff1a;多个条件判断嵌套&#xff0c;难以阅读和维护。重复逻辑&#xff1a;相似逻辑在多个分支中重复…...

STM32-笔记34-4G遥控灯

4G接线 一、项目需求 服务器通过4G模块远程遥控开关灯。 二、项目实现 复制项目文件夹38-wifi控制风扇项目 重命名为39-4G遥控点灯 打开项目文件 加载文件 main.c #include "sys.h" #include "delay.h" #include "led.h" #include "ua…...

被催更了,2025元旦源码继续免费送

“时间从来不会停下&#xff0c;它只会匆匆流逝。抓住每一刻&#xff0c;我们才不会辜负自己。” 联系作者免费领&#x1f496;源&#x1f496;码。 三联支持&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…...

Java(day1)

注释 在Java中注释分为单行注释、多行注释还有文档注释 //我是单行注释/*我 是多行 注释 *//** 我是文档注释*/ 关键字 关键字&#xff1a;是被Java赋予了特定含义的英文单词 特点&#xff1a;关键字的字母都是c 在常用的代码编辑器中关键字都有特殊的高亮标记 在这个里…...