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

STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!

本文写于:2025.04.19

STM32开发板学习——第43节: [12-3] 读写备份寄存器&实时时钟

  • 前言
  • 开发板说明
  • 引用
  • 解答和科普
  • 一、读写BKP备份寄存器
  • 二、RTC实时时钟
  • 问题
  • 总结

前言

   本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
   欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
   在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
   另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!

开发板说明

   本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
   原理图如下
1、开发板原理图
在这里插入图片描述
2、STM32F103C6和51对比
在这里插入图片描述
3、STM32F103C6核心板
在这里插入图片描述

视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。

下图是实物图
在这里插入图片描述

引用

【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
在这里插入图片描述
数据手册
在这里插入图片描述

解答和科普

一、读写BKP备份寄存器

1、 读写BKP程序
PB1接一个按键,用于控制,VBAT引脚接STLINK的3.3V.
在这里插入图片描述
在这里插入图片描述
第一步,开启PWR和BKP的时钟,第二步使用PWR的一个函数,使能对BKP和RTC的访问,然后写入数据的话,BKP有个写入的函数,读取数据,BKP也有个读取的函数。
在这里插入图片描述
手动清空BKP所有的数据寄存器,这样BKP的数据,都会变为0;

void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);

这时时钟输出功能的配置,可以选择在RTC引脚上输出时钟信号,输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲。

void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
读写寄存器DR;
备份寄存器使能
void PWR_BackupAccessCmd(FunctionalState NewState);
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"uint8_t KeyNum;uint16_t ArrayWrite[] = {0x1234, 0x5678};
uint16_t ArrayRead[2];int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1, 1, "W:");OLED_ShowString(2, 1, "R:");RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);while (1){KeyNum = Key_GetNum();if (KeyNum == 1){ArrayWrite[0] ++;ArrayWrite[1] ++;BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);OLED_ShowHexNum(1, 3, ArrayWrite[0], 4);OLED_ShowHexNum(1, 8, ArrayWrite[1], 4);}ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(2, 3, ArrayRead[0], 4);OLED_ShowHexNum(2, 8, ArrayRead[1], 4);}
}

二、RTC实时时钟

2、RTC线路
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
初始化。第一步,执行注意事项:开启PWR和BKP时钟,使能BKP和RTC的访问。
第二步,启动RTC的时钟,计划使用LSE作为系统时钟,所以要使用RCC模块里的函数,开启LSE时钟,为了省电,默认是关闭的,所以要手动开启;
第三步,配置RTCCLK这个数据选择器,指定LSE为RTCCLK,这一步函数也是在RCC模块里的;
第四步,先不着急,要完成两个等待函数,一个是等待函数,另一个是这里的,等待上一次操作完成;
第五步,配置预分频器,给PRL重装器一个合适的分频值,确保输出给计数器的频率是1Hz;
第六步,配置CNT的值,给这个RTC一个初始时间,如果需要闹钟的话就配置闹钟,需要中断,可以配置中断;
并没有库函数配置RTC,没有Cmd函数,不需要启动一下。

void RCC_LSEConfig(uint8_t RCC_LSE);
启动LSE时钟就调用这个函数。
void RCC_LSICmd(FunctionalState NewState);
配置LSI内部低速时钟,如果出现外部时钟不起振,可以用这个内部时钟来进行实验; 
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
这个函数用来选择RTCCLK的时钟源,实际上就是配置数据选择器
void RCC_RTCCLKCmd(FunctionalState NewState);
启动RTCCLK,调用上面函数选择时钟之后,还需要调用这个Cmd函数,使能一下;
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
获取标志位,因为这个LSE时钟,不是说你让它启动,他就能立刻启动的,调用时钟启动后,还需要等待一下标志位,等RCC有个标志位LSERDY置1后,这个时钟才是启动完成,工作稳定。

在这里插入图片描述

void RTC_EnterConfigMode(void);
进入配置模式,置CRL的CNF为1,进入配置模式;必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
void RTC_ExitConfigMode(void);
退出配置模式,就是把CNF清零;
uint32_t  RTC_GetCounter(voi
获取,CNT计数器的值;读取时钟,就靠这个函数。
void RTC_SetCounter(uint32_t CounterValue);
写入计数器CNT的值;设置时间,就靠这个函数;
void RTC_SetPrescaler(uint32_t PrescalerValue);
写入预分频器,这个值会写入到预分频器的PRL重装寄存器中,用来配置预分频器的分频系数;
void RTC_SetAlarm(uint32_t AlarmValue);
写入闹钟值;
uint32_t  RTC_GetDivider(void);
读取预分频器中的DIV余数寄存器;为了得到更细的时间;
void RTC_WaitForLastTask(void);
等待上次操作完成;对应对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。
void RTC_WaitForSynchro(void);
等待同步,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1。
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);
标志位相关函数。

写入预分频器也要进入配置模式。只是不用我们写,库函数中包含了。
RTC晶振确实起振不了,为了观察到实验现象,可以备选内部低速时钟LSI,

在这里插入图片描述

void MyRTC_SetTime(void)	//数组的时间转换为秒数到CNT{time_t  time_cnt;struct tm time_data;time_data.tm_year =MyRTC_Time[0]-1900;time_data.tm_mon  =MyRTC_Time[1]-1;time_data.tm_mday=MyRTC_Time[2];time_data.tm_hour=MyRTC_Time[3];time_data.tm_min=MyRTC_Time[4];time_data.tm_sec=MyRTC_Time[5];time_cnt= mktime(&time_data);	//日期时间到秒数的计数RTC_SetCounter( time_cnt);		//写入计数器CNTRTC_WaitForLastTask();	}

第一步,把数组指定时间,填充到struct tm结构体,第二步,使用mktime函数,得到秒数,第三步将得到的秒数写入到RTC的CNT中
extern uint16_t MyRTC_Time[];
全局变量传参,数组不加也行,单个变量必须加;

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "OLED.h"
#include "MyRTC.h"int main(void)
{OLED_Init();MyRTC_Init();OLED_ShowString(1,1,"Date:XXXX-XX-XX");OLED_ShowString(2,1,"Time:XX:XX:XX");OLED_ShowString(3,1,"CNT :");OLED_ShowString(4,1,"DIV :");while(1){MyRTC_ReadTime();OLED_ShowNum(1,6,MyRTC_Time[0],4);OLED_ShowNum(1,11,MyRTC_Time[1],2);OLED_ShowNum(1,14,MyRTC_Time[2],2);OLED_ShowNum(2,6,MyRTC_Time[3],2);OLED_ShowNum(2,9,MyRTC_Time[4],2);OLED_ShowNum(2,12,MyRTC_Time[5],2);OLED_ShowNum(3,6,RTC_GetCounter(),10);OLED_ShowNum(4,6,RTC_GetDivider(),10);}
}

C

#include "stm32f10x.h"                  // Device header
#include <time.h>uint16_t MyRTC_Time[]={2023,1 ,1 ,23 ,59,55};
void MyRTC_SetTime(void);void MyRTC_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1)!= 0xA5A5){RCC_LSEConfig(RCC_LSE_ON);							//	启动外边LSE晶振while (RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);	//低速外部时钟源准备就绪(LSE)RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//数据选择器选择LSERCC_RTCCLKCmd(ENABLE);						//使能时钟//RTCCLK配置完成RTC_WaitForSynchro();	//等待同步RTC_WaitForLastTask();	//等待上次操作完成RTC_SetPrescaler(32768-1);    	//	配置分频器,写操作不是立即生效,等待写操作完成RTC_WaitForLastTask();			//等待上次操作完成//	RTC_SetCounter(1672588795);		//设定初始时间MyRTC_SetTime();//	RTC_WaitForLastTask();			//等待上次操作完成BKP_WriteBackupRegister(BKP_DR1,0xA5A5);}else{RTC_WaitForSynchro();	//等待同步RTC_WaitForLastTask();	//等待上次操作完成}}void MyRTC_SetTime(void)	//数组的时间转换为秒数到CNT{time_t  time_cnt;struct tm time_data;time_data.tm_year =MyRTC_Time[0]-1900;time_data.tm_mon  =MyRTC_Time[1]-1;time_data.tm_mday=MyRTC_Time[2];time_data.tm_hour=MyRTC_Time[3];time_data.tm_min=MyRTC_Time[4];time_data.tm_sec=MyRTC_Time[5];time_cnt= mktime(&time_data)-8*60*60;	//日期时间到秒数的计数RTC_SetCounter( time_cnt);		//写入计数器CNTRTC_WaitForLastTask();	}void MyRTC_ReadTime(void){time_t  time_cnt;struct tm time_data;time_cnt= RTC_GetCounter()+8*60*60;time_data = *localtime(&time_cnt);			//结构体赋值MyRTC_Time[0]=time_data.tm_year+1900;MyRTC_Time[1]=time_data.tm_mon+1;MyRTC_Time[2]=time_data.tm_mday;MyRTC_Time[3]=time_data.tm_hour;MyRTC_Time[4]=time_data.tm_min;MyRTC_Time[5]=time_data.tm_sec;}
#ifndef __MYRTC_H
#define __MYRTC_Hextern uint16_t MyRTC_Time[];void MyRTC_SetTime(void);
void MyRTC_Init(void);void MyRTC_ReadTime(void);#endif

问题

总结

本节课主要是了解这个BKP备份寄存的硬件在代码下的实现,RTC实时时钟的读取与设置,这用到了上节课时间戳讲的函数,由于STM32不能识别当地时间,所以在这里就是这里获取的时间都是伦敦时间,需要加一个偏移量。

相关文章:

STM32单片机入门学习——第43节: [12-3] 读写备份寄存器实时时钟

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.19 STM32开发板学习——第43节: [12-3] 读写备份寄存器&实时时钟 前言开发板说明…...

筛选法(埃氏筛法)C++

判断N个数是否质数 输入N个整数M&#xff0c;判断它们是否为质数。如果是输出“YES”&#xff0c;否则输出“NO”。&#xff08;1<n<10000&#xff09; 输入格式 第一行为N&#xff0c;第2&#xff5e;n1行每行为一个正整数M。&#xff08;1<M<1000000&#xff09;…...

PointCore——利用局部全局特征的高效无监督点云异常检测器论文与算法解读

概述 三维点云异常检测旨在从训练集中检测出异常数据点&#xff0c;是工业检测、自动驾驶等众多应用的基础。然而&#xff0c;现有的点云异常检测方法通常采用多个特征存储库来充分保留局部和全局特征表示&#xff0c;这带来了高昂的计算成本以及特征之间的不匹配问题。为解决…...

洛谷P1177【模板】排序:十种排序算法全解(1)

扯谈 之前我已经把十大排序算法全讲了一遍&#xff08;具体详见专栏C排序算法&#xff09;,今天我们来用一道简单的题目总结实战一下。 算法实现 一、桶排序&#xff08;Bucket Sort&#xff09; ‌适用场景‌&#xff1a;数据范围已知且较小&#xff08;需根据测试数据调整…...

Graham Scan算法求解二维凸包

一、凸包及其概念 凸包&#xff08;Convex Hull&#xff09;是计算几何中的一个重要概念。在一个实数向量空间中&#xff0c;对于给定的点集&#xff0c;凸包是指包含这些点的最小凸多边形。在二维平面上&#xff0c;凸包可以形象地理解为用一个橡皮圈将所有点紧紧包裹起来&am…...

【java实现+4种变体完整例子】排序算法中【希尔排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

以下是希尔排序的详细解析&#xff0c;包含基础实现、常见变体的完整代码示例&#xff0c;以及各变体的对比表格&#xff1a; 一、希尔排序基础实现 原理 希尔排序是插入排序的改进版本&#xff0c;通过分步缩小增量间隔&#xff0c;将数组分成多个子序列进行插入排序&#…...

【文件操作与IO】详细解析文件操作与IO (二)

本篇博客是上一篇文章的续写,重点介绍数据流,还包括三道练习题. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅&#x1f680; 要开心…...

【java实现+4种变体完整例子】排序算法中【基数排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格

基数排序详解及代码示例 基数排序原理 基数排序通过处理每一位数字进行排序&#xff0c;分为 LSD&#xff08;最低位优先&#xff09; 和 MSD&#xff08;最高位优先&#xff09; 两种方式。核心步骤&#xff1a; 确定最大值&#xff1a;计算数组中最大数的位数。逐位排序&am…...

Java中的函数式编程详解

Java中的函数式编程是一个在Java 8中引入的特性&#xff0c;它将计算视为数学函数的求值&#xff0c;避免使用可变状态和数据。其核心特性包括Lambda表达式、函数式接口和Stream API。以下将结合代码示例和具体场景详细讲解这些特性。 1. Lambda表达式 Lambda表达式是Java 8引…...

专精特新政策推动,B端UI设计如何赋能中小企业创新发展?

在当前数字化转型浪潮下&#xff0c;专精特新政策为中小企业提供了强大的支持&#xff0c;助力其在细分领域实现专业化、精细化、特色化和创新化发展。B端UI设计作为提升企业数字化产品用户体验和工作效率的重要手段&#xff0c;能够有效赋能中小企业创新发展。本文将探讨专精特…...

从零开始学A2A四:A2A 协议的高级应用与优化

A2A 协议的高级应用与优化 学习目标 掌握 A2A 高级功能 理解多用户支持机制掌握长期任务管理方法学习服务性能优化技巧 理解与 MCP 的差异 分析多智能体场景下的优势掌握不同场景的选择策略 第一部分&#xff1a;多用户支持机制 1. 用户隔离架构 #mermaid-svg-6SCFaVO4oDU…...

海关总署广东:广东外贸一季度进出口2.14万亿元 同期增长4.2%

大湾区经济网湾区财经报道&#xff0c;据海关总署广东分署统计&#xff0c;今年一季度&#xff0c;广东外贸进出口2.14万亿元&#xff0c;较去年同期&#xff08;下同&#xff09;增长4.2%&#xff0c;增速高于全国2.9个百分点。其中&#xff0c;出口1.34万亿元&#xff0c;增长…...

C++代码优化

前段时间写了一些代码&#xff0c;但是在运算过程中发现有些代码可以进行改进以提高运行效率&#xff0c;尤其是与PCL相关的部分&#xff0c;可以进行大幅度提高&#xff0e;特意在此进行记录&#xff0c;分享给大家&#xff0c;也供自己查看&#xff0e; pcl::PointCloud< …...

Manim教程:第七章 坐标系统

#什么是坐标系统?特点是什么? 坐标系统是一个用于确定空间中点位置的数学工具。它通过一组数值(坐标)来描述一个点在某个空间中的位置。不同类型的坐标系统可以用于不同的应用场景,最常见的包括: 笛卡尔坐标系:使用直角坐标系,通常用坐标轴(如x轴和y轴)来表示二维空间…...

U盘实现——双盘符实现

文章目录 双盘符实现描述符类特殊命名get max luninquiry上一篇文章中介绍了 U 盘的枚举过程 U盘实现——U 盘枚举过程 双盘符实现 描述符 双盘符的时候中,描述符的实现与上节完全一致,不同的只有类特殊命令 设备描述符配置描述符接口描述符输出端点描述符输入端点描述符上…...

【Linux】【阿里云服务器】【树莓派】学习守护进程编程、gdb调试原理和内网穿透信息

目录 一. 守护进程的含义及编程实现的主要过程 1.1守护进程 1.2编程实现的主要过程 二、在树莓派中通过三种方式创建守护进程 2.1nohup命令创建 2.2fork()函数创建 2.3daemon()函数创建 三、在阿里云中通过三种方式创建守护进程 3.1nohup命令创建 3.2fork()函数创建 …...

2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析

青少年软件编程(Python)等级考试试卷(二级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 老师要求大家记住四大名著的作者,小明机智地想到了可以用字典进行记录,以下哪个选项的字典格式是正确?( ) A. [‘曹雪芹’:‘红楼梦’, ‘吴承恩’:‘西游记’, ‘罗贯…...

【Linux系统篇】:System V IPC核心技术解析---从共享内存到消息队列与信号量

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;c篇–CSDN博客 文章目录 一.System V共享内存&#xff08;重点&#xff09;1.基本概念和原理…...

关于GPU的涡轮散热与被动散热

显卡涡轮散热与被动散热的深度解析 一、涡轮散热的定义与工作原理 涡轮散热技术是通过高速旋转的涡轮风扇配合封闭式风道设计,将冷空气吸入并强制排出热量的主动散热方案。其核心原理包含以下关键点: 气流动力学设计:涡轮风扇采用精密叶片(如离心式结构),在相同尺寸下能…...

namesapce、cgroup

dd&#xff1a; 制作磁盘镜像&#xff1a;借助 dd 指令能够把整个磁盘或者分区的数据复制到一个文件里&#xff0c;形成磁盘镜像文件。此镜像文件可用于备份数据或者在其他系统中恢复磁盘。 恢复磁盘镜像&#xff1a;可以把之前创建的磁盘镜像文件恢复到磁盘或者分区 磁盘初始…...

C++23 新特性:行拼接前去除空白符 (P2223R2)

文章目录 1\. 什么是行拼接前去除空白符2\. 为什么需要这一特性3\. 示例代码输出结果 4\. 编译器支持5\. 优势与应用场景5.1 提高代码可读性5.2 减少潜在错误5.3 适用于多行字符串 6\. 其他相关特性7\. 总结 C 语言一直在不断进化&#xff0c;以满足现代软件开发的需求。C23 标…...

算法思想之链表

欢迎拜访&#xff1a;雾里看山-CSDN博客 本篇主题&#xff1a;算法思想之链表 发布时间&#xff1a;2025.4.18 隶属专栏&#xff1a;算法 目录 算法介绍常用技巧 例题两数相加题目链接题目描述算法思路代码实现 两两交换链表中的节点题目链接题目描述算法思路代码实现 重排链表…...

《软件设计师》复习笔记(11.5)——测试原则、阶段、测试用例设计、调试

目录 1. 测试基础概念 2. 测试方法分类 3. 测试阶段 真题示例&#xff1a; 题目1 题目2 题目3 4. 测试策略 5. 测试用例设计 真题示例&#xff1a; 6. 调试与度量 真题示例&#xff1a; 1. 测试基础概念 定义&#xff1a;系统测试是为发现错误而执行程序的过程&…...

工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)

模式定义 工厂方法模式&#xff08;Factory Method Pattern&#xff09;是一种创建型设计模式&#xff0c;通过定义抽象工厂接口将对象创建过程延迟到子类实现&#xff0c;实现对象创建与使用的解耦。该模式特别适合需要动态扩展产品类型的场景。 自动驾驶感知场景分析 自动驾…...

Java 2025:解锁未来5大技术趋势,Kotlin融合AI新篇

各位Java开发者们好&#xff01;&#x1f680; 2025年的Java世界正在经历一场前所未有的技术变革。作为深耕Java领域多年的技术博主&#xff0c;今天我将带大家深入探索Java生态即将迎来的5大技术趋势&#xff0c;特别是Kotlin的深度融合和AI技术的新篇章。准备好了吗&#xff…...

抗辐照设计优化:商业航天高可靠系统设计的关键路径

随着商业航天领域的快速发展&#xff0c;航天器的可靠性和抗辐照能力已成为系统设计的核心需求。在严苛的太空辐射环境中&#xff0c;电子设备面临着单粒子效应、总剂量效应和位移损伤效应等多重挑战。抗辐照设计优化不仅是确保航天器任务成功的关键路径&#xff0c;更是推动商…...

颚式破碎机的设计

一、引言 颚式破碎机作为矿山、建材等行业的重要破碎设备&#xff0c;其性能优劣直接影响物料破碎效率与质量。随着工业生产规模的扩大和对破碎效率要求的提高&#xff0c;设计一款高效、稳定、节能的颚式破碎机具有重要意义。 二、设计需求分析 处理能力&#xff1a;根据目…...

1panel第三方应用商店(本地商店)配置和使用

文章目录 引言资源网站实战操作说明 引言 1Panel 提供了一个应用提交开发环境&#xff0c;开发者可以通过提交应用的方式将自己的应用推送到 1Panel 的应用商店中&#xff0c;供其他用户使用。由此衍生了一种本地应用商店的概念&#xff0c;用户可以自行编写应用配置并上传到自…...

ObjectOutputStream 深度解析

ObjectOutputStream 深度解析 ObjectOutputStream 是 Java IO 体系中的一个关键类,用于序列化(将对象转换为字节流),通常与 ObjectInputStream 配合使用,实现对象的持久化存储或网络传输。 1.作用:完成对象的序列化过程 2.它可以将JVM当中的Java对象序列化到文件中/网…...

如何学习和研究量子计算与量子计算机:从理论到实践的完整路径

量子计算作为量子力学与计算机科学的交叉领域&#xff0c;正在迅速改变我们对计算能力的认知。无论是破解经典加密算法&#xff0c;还是加速药物分子模拟&#xff0c;量子计算都展现出巨大的潜力。然而&#xff0c;学习这一领域需要系统化的理论知识和实践能力。以下是基于最新…...

数据结构学习笔记 :二叉搜索树与高效查找算法详解

目录 二叉搜索树&#xff08;BST&#xff09;实现 1.1 顺序存储实现 1.2 链式存储实现查找算法 2.1 顺序查找 2.2 折半查找 2.3 哈希查找总结与应用场景代码示例与完整实现 一、二叉搜索树&#xff08;BST&#xff09;实现 1. 顺序存储实现 BST的顺序存储基于完全二叉树的特…...

广搜bfs-P1443 马的遍历

P1443 马的遍历 题目来源-洛谷 题意 要求马到达棋盘上任意一个点最少要走几步 思路 国际棋盘规则是马的走法是-日字形&#xff0c;也称走马日&#xff0c;即x,y一个是走两步&#xff0c;一个是一步 要求最小步数&#xff0c;所以考虑第一次遍历到的点即为最小步数&#xff…...

Ubuntu22.04安装QT、px4安装环境

Ubuntu22.04安装QGC编译环境、QT、px4编译环境 安装QGC安装Ubuntu安装QT配置px4安装环境出现错误怎么办 安装QGC 我使用的是pixhawk V5飞控&#xff0c;在QGC4.4 Guide里&#xff0c;说 安装Ubuntu 直接去清华源里将Ubuntu镜像下载下来&#xff08;网址&#xff1a;清华源下…...

【IDEA2020】 解决开发时遇到的一些问题

目录 一、批量更新数据库数据 逐条更新 Db.updateEntitiesBatch() 二、Error running&#xff0c;Command line is too long. Shorten command line 报错场景 报错分析 解决方法 一、批量更新数据库数据 逐条更新 List<UserModel> ums userMapper.selectListBy…...

基于autoware1.14的实车部署激光雷达循迹,从建图、定位、录制轨迹巡航点、到实车运行。

1.首先安装autoware &#xff0c;大家可以以下一下博客进行安装&#xff0c;如果缺少库什么的直接问ai安装对应的库就行。ubuntu18.04安装Autoware1.14---GPU版 最全环境配置说明_autoware1.14安装教程-CSDN博客 安装成功后运行&#xff1a; source install/setup.bash roslau…...

抽象类和接口的区别

1. 定义 抽象类&#xff1a;用于描述一类事物的共性接口&#xff1a;用于描述行为。 2. 方法和变量 抽象类&#xff1a; 可以有普通方法和抽象方法。可以有普通成员变量和静态常量。 接口&#xff1a; JDK 8之前只支持抽象方法&#xff0c;JDK 8后支持默认方法和静态方法…...

自注意力机制self-attention

目录 简介&#xff1a; 输入和输出方式&#xff1a; Sequence Labeling&#xff1a; self-attention运作方式&#xff1a; 一&#xff1a;怎么从vector得到b1 二&#xff1a;利用矩阵的方法怎么得到 Multi-head Self-attention&#xff1a; positional encoding&#x…...

《Operating System Concepts》阅读笔记:p735-p737

《Operating System Concepts》学习第 62 天&#xff0c;p735-p737 总结&#xff0c;总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…...

2025-04-19 Python 强类型编程

文章目录 1 方法标注1.1 参数与返回值1.2 变参类型1.3 函数类型 2 数据类型2.1 内置类型2.2 复杂数据结构2.3 类别选择2.4 泛型 3 标注方式3.1 注释标注3.2 文件标注 4 特殊情形4.1 前置引用4.2 函数标注扩展4.3 协变与逆变4.4 dataclass 5 高级内容5.1 接口5.2 泛型的协变/逆变…...

RVOS的任务调度优化

12.系统优化–任务调度 12.1 改进任务管理功能 在原有基础上进⼀步改进任务管理功能。具体要求&#xff1a;改进 task_create()&#xff0c;提供更多的参数&#xff0c;具体改进后的函数如下所⽰&#xff1a; int task_create(void (*task)(void* param),void *param, uint8…...

【论文阅读20】-CNN-Attention-BiGRU-滑坡预测(2025-03)

这篇论文主要探讨了基于深度学习的滑坡位移预测模型&#xff0c;结合了MT-InSAR&#xff08;多时相合成孔径雷达干涉测量&#xff09;观测数据&#xff0c;提出了一种具有可解释性的滑坡位移预测方法。 [1] Zhou C, Ye M, Xia Z, et al. An interpretable attention-based deep…...

图像预处理-图像噪点消除

一.基本介绍 噪声&#xff1a;指图像中的一些干扰因素&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。常见的噪声类型包括高斯噪声和椒盐噪声。 滤波器&#xff1a;也可以叫做卷积核 - 低通滤波器是模糊&#xff0c;高通滤波器是锐化 - 低通滤波器就…...

PP-OCR的安卓端部署

EMO了几天 我浪费了几天的生命&#xff0c;去研究PP-OCR的模型微调、从训练模型导出预测模型&#xff0c;结果一个坑接着一个坑&#xff0c;没有善终。 找了好多资料&#xff0c;得到一些负面信息&#xff0c;比如说飞浆的团队修复问题不及时啦&#xff0c;代码仓库有好多年不…...

2048小游戏C++板来啦!

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 大家好呀&#xff0c;我是PingdiGuo_guo&#xff0c;今天我们来学习如何用C编写一个2048小游戏。 文章目录 1.2048的规则 2.步骤实现 2.1: 初始化游戏界面 2.1.1知识点 2.1.2: 创建游戏界面 2.2: 随机…...

研0大模型学习(第四、五天)

学习CSDN教程&#xff1a;VSCode Debug指南 但里面貌似主要是针对nodejs的&#xff0c;所以我在 CSDN教程&#xff1a;VSCode调试python程序 中学习&#xff0c;刚开始调试报错python版本太低&#xff0c;于是我安装了旧版本的pythondebugger&#xff0c;再把python解释器从原…...

编程规范之整数运算

在表达式中混用有符号数和无符号数时&#xff0c;可能会因隐式转换而导致非预期的结果。因此应尽量在表达式中使用相同符号类型的 变量。 对于无法使用相同符号类型的场景&#xff0c;应将不同类型的变量显式转换为相同类型&#xff0c;当表达式中的无符号数隐式转换为另一个有…...

【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南

MATLAB Gurobi YALMIP 综合优化教程&#xff08;进阶&#xff09; 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模&#xff0c;并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...

C++17 信号量模拟实现

C17 信号量模拟实现 一、实现原理 C17 标准库没有原生信号量(C20才有)&#xff0c;但可以通过 std::mutex std::condition_variable 模拟实现。以下是核心逻辑&#xff1a; #include <mutex> #include <condition_variable>class CountingSemaphore { private:…...

LINUX学习——守护进程的含义及编程实现

实验目的 理解守护进程的含义。掌握编程实现守护进程的主要步骤。 实验步骤 守护进程的含义&#xff1a; 守护进程是运行在后台的一种特殊进程&#xff0c;独立于控制终端&#xff0c;周期性地执行任务或等待处理事件。守护进程通常以 d 结尾&#xff0c;如 httpd、sshd 等。…...

Json 在线格式化 - 加菲工具

Json 在线格式化 打开网站 加菲工具 选择“Json 在线格式化” 或者直接进入 https://www.orcc.top/tools/json 输入Json&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...