【江协科技STM32】读写备份寄存器RTC实时时钟(学习笔记)
参考相关文章理解:
【江协科技STM32】Unix时间戳(学习笔记)-CSDN博客
【江协科技STM32】BKP备寄存器&RTC实时时钟(学习笔记)_stm32断电保存时钟-CSDN博客
读写备份寄存器
接线图:VBAT是从STLINK的3.3V引出来的,注意不要接到5V的
BKP初始化:
①设置RCC_APB1ENR的PWREN和BKPEN,开启PWR和BKP时钟
②设置PWR_CR的DBP,使能对BKP和RTC的访问
代码较少,就没有对BKP单独进行封装,下面直接写
uint8_t KeyNum; //定义用于接收按键键码的变量uint16_t ArrayWrite[] = {0x1234, 0x5678}; //定义要写入数据的测试数组
uint16_t ArrayRead[2]; //定义要读取数据的测试数组int main(void)
{OLED_Init(); //OLED初始化Key_Init(); //按键初始化OLED_ShowString(1, 1, "W:");OLED_ShowString(2, 1, "R:");RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟/*备份寄存器访问使能*/PWR_BackupAccessCmd(ENABLE); //使用PWR开启对备份寄存器的访问while (1){KeyNum = Key_GetNum(); //获取按键键码if (KeyNum == 1) //按键1按下{ArrayWrite[0] ++; //测试数据自增,先加加在写入ArrayWrite[1] ++;BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]); //写入测试数据到备份寄存器BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);//ArrayWrite[0] ++; //测试数据自增,或者写入后再加加//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);}
}
相关函数:
void PWR_BackupAccessCmd(FunctionalState NewState)//启用或禁用对RTC和备份寄存器的访问
参数 | 说明 |
NewState | 访问RTC和备份寄存器的新状态;取值包括:ENABLE或DISABLE |
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data)//将用户数据写入指定的数据备份寄存器
参数 | 说明 |
BKP_DR | 指定数据备份寄存器,该参数可以是BKP_DRx,其中x:[1,42],STM32是中容量型芯片,DR是范围1~10;大容量和互联型才有42各DR |
Data | 写入的数据 |
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR)//从指定的数据备份寄存器读取数据
参数 | 说明 |
BKP_DR | 指定数据备份寄存器,该参数可以是BKP_DRx,其中x:[1,42],STM32是中容量型芯片,DR是范围1~10;大容量和互联型才有42各DR |
返回值:指定的数据备份寄存器的内容。
实验结果:
RTC实时时钟
接线图:
RTC初始化
具体步骤:
①和BKP一样,开启PWR和BKP时钟,使能对BKP和RTC的访问
②启动RTC时钟,计划使用LSE作为系统时钟,所以要使用RCC模块里的函数,开启LSE时钟,注意LSE时钟为了省电,默认是关闭的,所以需要我们自己手动开启
③ 配置RTCCLK这个数据选择器,指定LSE为RTCCLK,函数也是在RCC模块
④ 等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1和查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器
⑤配置预分频器,给PRL预重装载器一个合适的分频值,确保输出频率为1Hz
⑥配置CNT的值,给RTC一个合适的初始时间,之后需要闹钟或者中断就配置就可以
void HerRTC_Init(void)
{/*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //开启PWR的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE); //开启BKP的时钟/*备份寄存器访问使能*/PWR_BackupAccessCmd(ENABLE); //使用PWR开启对备份寄存器的访问if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) //通过写入备份寄存器的标志位,判断RTC是否是第一次配置//if成立则执行第一次的RTC配置{RCC_LSEConfig(RCC_LSE_ON); //开启LSE时钟while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET); //等待LSE准备就绪RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择RTCCLK来源为LSERCC_RTCCLKCmd(ENABLE); //RTCCLK使能RTC_WaitForSynchro(); //等待同步RTC_WaitForLastTask(); //等待上一次操作完成RTC_SetPrescaler(32768 - 1); //设置RTC预分频器,预分频后的计数频率为1HzRTC_WaitForLastTask(); //等待上一次操作完成HerRTC_SetTime(); //设置时间,调用此函数,全局数组里时间值刷新到RTC硬件电路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); //在备份寄存器写入自己规定的标志位,用于判断RTC是不是第一次执行配置}else //RTC不是第一次配置{RTC_WaitForSynchro(); //等待同步RTC_WaitForLastTask(); //等待上一次操作完成}
}
void RCC_LSEConfig(uint8_t RCC_LSE) //配置外部低速振荡器(LSE)
参数 | 说明 |
RCC_LSE | 指定LSE的新状态 |
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)//检查是否设置了指定的RCC标志
参数 | 说明 |
RCC_FLAG | 指定要检查的标志 |
返回值: RCC_FLAG的新状态(SET或RESET)
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource)//配置RTC时钟(RTCCLK)就是配置数据选择器
注意:一旦选择了RTC时钟,就不能更改它,除非重置备份域 。
参数 | 说明 |
RCC_RTCCLKSource | RTC时钟源 |
void RCC_RTCCLKCmd(FunctionalState NewState)//开启或关闭RTC时钟
注意:只有通过RCC_RTCCLKConfig函数选择了RTC时钟后,才能使用该功能。
参数 | 说明 |
NewState | RTC时钟的新状态取值为:ENABLE或DISABLE |
void RTC_WaitForSynchro(void)//等待RTC寄存器(RTC_CNT, RTC_ALR和RTC_PRL),设置RSF标志1
void RTC_WaitForLastTask(void)//等待RTC寄存器上的最后一次写操作完成,循环直到设置RTOFF标志
void RTC_SetPrescaler(uint32_t PrescalerValue)//设置RTC预分频器值
参数 | 说明 |
PrescalerValue | RTC预caler的新值 |
小细节:
对应上节RTC操作注意事项的第三点:
- 必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
进入和退出RTC的配置模式的代码不用我们自己额外调用,相关函数已经帮我们写好,我们知道有这个东西就可以
如果RTC晶振不起振的解决方法:戳看解决方法
接下来还要写两个函数,一个是设置时间,一个是读取时间。计划是,读取时间,我们就把读取到的秒数转换为年月日时分秒放在一个全局数组里,设置时间,我们再把年月日时分秒转换为秒数,再写入RTC的CNT。
RTC设置时间
定义数组注意:小细节
uint16_t MyRTC_Time[] = {2023, 1, 1, 23, 59, 55}; //定义全局的时间数组,数组内容分别为年、月、日、时、分、秒void MyRTC_SetTime(void); //函数声明,调用函数不能在函数定义前,所以要声明/*** 函 数:RTC设置时间* 参 数:无* 返 回 值:无* 说 明:调用此函数后,全局数组里时间值将刷新到RTC硬件电路*/
void MyRTC_SetTime(void)
{time_t time_cnt; //定义秒计数器数据类型struct tm time_date; //定义日期时间数据类型time_date.tm_year = MyRTC_Time[0] - 1900; //将数组的时间赋值给日期时间结构体time_date.tm_mon = MyRTC_Time[1] - 1;time_date.tm_mday = MyRTC_Time[2];time_date.tm_hour = MyRTC_Time[3];time_date.tm_min = MyRTC_Time[4];time_date.tm_sec = MyRTC_Time[5];time_cnt = mktime(&time_date) - 8 * 60 * 60; //调用mktime函数,将日期时间转换为秒计数器格式//- 8 * 60 * 60为东八区的时区调整RTC_SetCounter(time_cnt); //将秒计数器写入到RTC的CNT中RTC_WaitForLastTask(); //等待上一次操作完成
}
void RTC_SetCounter(uint32_t CounterValue)//设置RTC计数器值
参数 | 说明 |
CounterValue | RTC计数器新值 |
time_t mktime(struct tm*)函数文章开头unix时间戳篇有介绍
struct tm* localtime(const time_t*); 函数文章开头unix时间戳篇有介绍
time.h头文件在keil的小区别:time.h头文件
RTC读取时间
/*** 函 数:RTC读取时间* 参 数:无* 返 回 值:无* 说 明:调用此函数后,RTC硬件电路里时间值将刷新到全局数组*/
void MyRTC_ReadTime(void)
{time_t time_cnt; //定义秒计数器数据类型struct tm time_date; //定义日期时间数据类型time_cnt = RTC_GetCounter() + 8 * 60 * 60; //读取RTC的CNT,获取当前的秒计数器//+ 8 * 60 * 60为东八区的时区调整time_date = *localtime(&time_cnt); //使用localtime函数,将秒计数器转换为日期时间格式MyRTC_Time[0] = time_date.tm_year + 1900; //将日期时间结构体赋值给数组的时间MyRTC_Time[1] = time_date.tm_mon + 1;MyRTC_Time[2] = time_date.tm_mday;MyRTC_Time[3] = time_date.tm_hour;MyRTC_Time[4] = time_date.tm_min;MyRTC_Time[5] = time_date.tm_sec;
}
外部声明全局数组
main函数
int main(void)
{OLED_Init(); //OLED初始化MyRTC_Init(); //RTC初始化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(); //RTC读取时间,最新的时间存储到MyRTC_Time数组中OLED_ShowNum(1, 6, MyRTC_Time[0], 4); //显示MyRTC_Time数组中的时间值,年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); //显示32位的秒计数器OLED_ShowNum(4, 6, RTC_GetDivider(), 10); //显示余数寄存器}
}
uint32_t RTC_GetDivider(void)//获取RTC余数寄存器值
程序现象:
相关文章:
【江协科技STM32】读写备份寄存器RTC实时时钟(学习笔记)
参考相关文章理解: 【江协科技STM32】Unix时间戳(学习笔记)-CSDN博客 【江协科技STM32】BKP备寄存器&RTC实时时钟(学习笔记)_stm32断电保存时钟-CSDN博客 读写备份寄存器 接线图:VBAT是从STLINK的…...
Linux touch命令
参考资料 Linux 常用命令 - touch 【创建空文件与修改时间戳】 目录 一. 用法简介二. 配合扩展字符,批量创建文件三. 修改文件的时间戳3.1 -t 配置项3.2 -d 配置项3.3 配合find命令实现批量时间戳修改 四. 结合 find 批量创建相同时间的新文件 一. 用法简介 ⏹当指…...
PyTorch图像预处理--Compose
torchvision.transforms.Compose 是 PyTorch 中用于图像预处理的核心工具,可将多个图像变换操作组合成一个顺序执行的流水线。 1. 定义与作用 功能:将多个图像处理步骤(如缩放、裁剪、归一化等)串联为一个整体ÿ…...
CSP历年题解
CSP历年题解 csp历年题解,csp.cpp内容涵盖从2023年12月开始一直持续到第一次认证的所有前4题。所有的题解均为满分,在其中,有四道题非本人编写,而从网上搜集优质解答,并且已在文中附上了来源链接。其余则为自己编写&a…...
《索引江湖:B树索引与哈希索引的风云对决》
在数据库的神秘世界里,索引宛如一把把神奇的钥匙,帮助我们在海量数据中快速找到所需信息。而B树索引与哈希索引,则是其中两把最为耀眼的利刃,各自凭借独特的“武功秘籍”,在不同的应用场景中大放异彩。今天,…...
java八股文之JVM
1.什么是程序计数器 程序计数器是 JVM 管理线程执行的“定位器”,记录每个线程当前执行的指令位置,确保程序流程的连续性和线程切换的准确性。线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地…...
学习爬虫的第二天——分页爬取并存入表中
阅读提示:我现在还在尝试爬静态页面 一、分页爬取模式 以豆瓣Top250为例: 基础url:豆瓣电影 Top 250https://movie.douban.com/top250 分页参数:?start0(第一页)、?start25(第二页)等 每页显示25条数…...
Ubuntu与Windows之间相互复制粘贴的方法
一、打开Ubuntu终端 二、卸载已有的工具 sudo apt-get autoremove open-vm-tools 三、安装工具 sudo apt-get install open-vm-tools-desktop 四、重启 直接输入reboot 注:有任何问题欢迎评论区交流讨论或者私信!...
docker安装hyperf环境,连接本机redis问题处理
错误信息显示“Connection refused”,这通常说明 Docker 容器内的 Hyperf 项目无法连接到你本机的 Redis 服务。 1. 容器内的 127.0.0.1 指向问题 在 Docker 容器中,127.0.0.1 指的是容器本身,而不是宿主机(你的 Mac)…...
第12章:优化并发_《C++性能优化指南》notes
优化并发 一、并发基础与优化核心知识点二、关键代码示例与测试三、关键优化策略总结四、性能测试方法论多选题设计题答案与详解多选题答案: 设计题答案示例 一、并发基础与优化核心知识点 线程 vs 异步任务 核心区别:std::thread直接管理线程…...
Linux操作系统7- 线程同步与互斥7(RingQueue环形队列生产者消费者模型改进)
上篇文章:Linux操作系统7- 线程同步与互斥6(POSIX信号量与环形队列生产者消费者模型)-CSDN博客 本篇代码仓库:myLerningCode/l36 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 目录 一. 单生产单消费单保…...
学有所记——初探向量数据库Weaviate
目标: 了解向量数据库的连接、建库、插入数据、查询数据等基本用法以及关于语义相似度的一些基本概念。 背景: 前段时间尝试在自己的电脑上搭建OllamaDify平台,体验并探索大模型的强大功能。在使用过程中,尤其是在搭建RAG知识库…...
Ardupilot开源无人机之Geek SDK进展2025Q2
Ardupilot开源无人机之Geek SDK进展2025Q2 1. 源由2. 内容汇总2.1 【jetson-fpv】“Caution - Hot surface. Dont touch.”2.2 【jetson-fpv】1080P/720P显示设备配置 3. 遗留问题3.1 高优先级3.1.1 【jetson-fpv】1080P60FPS AI分析视频卡顿,丢包3.1.2 【jetson-fp…...
深入理解K8s与Docker的关系:容器化技术的双雄
友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台gpt-4-turbo模型生成,仅供参考。 在现代云计算及微服务架构的发展中,Docker与Kubernetes(K8s)作为两大核心技术,被广泛…...
QT高效文件I/O编程--实用指南与最佳实践
概述 在软件开发过程中,文件输入输出(I/O)操作是数据持久化和交换的核心部分。无论是简单的日志记录还是复杂的数据集处理,高效的文件I/O操作对于应用的整体性能至关重要 最佳实践 一、选择合适的文件模式 正确选择文件打开模式是确保操作意图明确且安全的第一步。不同…...
QT记事本
记事本应用程序提供了基本的文本编辑功能,支持文件的新建、打开、保存和另存为操作,同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp:程序的入口点,负责初…...
【leetcode hot 100 84】柱状图中最大的矩形
解法一:单调栈 class Solution {public int largestRectangleArea(int[] heights) {int len heights.length;int area 0;// 先做一些特殊判断if(len0){return 0;}if(len1){return heights[0];}// 进入栈后发现后面更短,可以得到当前这个能勾勒的面积 …...
Spring----ioc
1.Spring 是什么? 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的话来概括Spring, 那就…...
C++——重载
目录 一、函数重载 基本概念 函数重载的条件 编程示例 代码讲解 函数重载的注意事项 二、运算符重载 什么是运算符重载? 运算符重载的实质是什么? 运算符重载函数的写法 运算符重载的基本语法 可重载的运算符列表 基本原则 编程示例 代码解…...
答疑解惑:EMC VMAX3 MMCS控制台不定期重启原因分析
今天有个朋友咨询他们有一台EMC的VMAX100k设备,其中MMCS2的管理控制台定期重启,但始终无法找到重启原因,稍微花了点时间,帮客户看了下。先说结论,MMCS2确实不定期发生重启,每次reboot都是一样的message信息…...
单例模式(Singleton Pattern)
单例模式(Singleton Pattern) 任务管理器可以作为一个全局的任务配置管理类,使用单例模式保证全局只有一个实例。这样你可以避免在应用程序中创建多个任务管理对象,保持配置参数的统一。 示例: class TaskManager { …...
树莓派超全系列文档--(8)RaspberryOS实用程序
RaspberryOS实用程序 实用程序kmsprintvclogvcgencmdvcosversionget_throttledmeasure_tempmeasure_clock [clock]measure_volts [block]otp_dumpget_config [configuration item|int|str]get_mem typecodec_enabled [type]mem_oommem_reloc_statsread_ring_osc 文章来源&#…...
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
引言 在短视频、直播、影视制作等领域,视频水印是一种常见的工具,用于保护版权、提升品牌辨识度或满足合规性要求。然而,开发者在实现水印添加时往往面临以下挑战: 手动处理效率低:使用图像编辑软件(如 P…...
绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好,今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下,即使没有公网IP,你也能随时随地远程访问自己…...
如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载? 在 React 项目里,有时候组件功能多、体积大,要是一次性把所有组件都加载进来,网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...
虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战
目录 系列文章 1. 引言 2 技术栈Request 2.1请求头headers 2.2查找定位信息 2.3处理网页html结构化数据 2.4每页url规律 2.5逐条查找所需信息 2.6完整代码 3 数据存储至mysql 3.1新建数据库 3.2编写数据库写入py文件 3.2.1构建1个执行sql语句的函数 3.2.2构造一个…...
模型 阿米巴模式
系列文章分享模型,了解更多👉 模型_思维模型目录。小团队独立经营,企业活力无限。 1 阿米巴模式的应用 1.1 日航重生(航空业成功案例) 应用领域 航空运输业破产重组与组织激活 案例名称 日本航空(JAL&…...
针对stm32F103C8t6芯片调节USB串口的经验
1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操…...
【Linux网络】——Socket网络编程
前言 在当今数字化的时代,网络通信已经成为计算机领域不可或缺的一部分。无论是日常的网页浏览、社交媒体交互,还是大规模的企业级数据传输,都离不开高效可靠的网络通信。而在Linux操作系统中,Socket网络编程是实现各种网络应用的…...
基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
为了简化使用Coil加载网络图片和GIF的过程,我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法,以及可能的其他便捷方法,如加载圆形图片、设置占位图等。下面是一个示例: 首先&#x…...
Flink watermark的时间字段有空值,建表的时候,如何处理
在 Flink 中处理时间字段存在空值时,需通过 表定义阶段的特殊处理 和 Watermark 生成策略调整 来避免因空值导致的窗口计算异常或任务失败。以下是具体解决方案及实现方法: 1. 空值处理核心策略 1.1 查询时,过滤空值数据(推荐&am…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
【DevOps】DevOps and CI/CD Pipelines
DevOps 是一种将开发与运维实践相结合的模式,旨在缩短软件开发周期并交付高质量软件。 DevOps 是什么? 开发团队与运维团队之间的协作 • 持续集成与持续交付(CI/CD) • 流程自动化 • 基础设施即代码(IaC)…...
ROS--IMU数据包
IMU惯性测量单元 一:IMU二:ROS中三:IMU数据包三:总结 提示:以下是本篇文章正文内容,下面案例可供参考 一:IMU IMU(Inertial Measurement Unit,惯性测量单元)…...
【机器学习】手撕封装PCA——将高维数据映射到低维数据的过程
PCA将高维数据映射到低维数据的过程 一、摘要二、PCA的降维思路三、PCA代码实现降维过程3.1 PCA类的实现与封装3.2 PCA类的使用示例 四、PCA的恢复过程 一、摘要 本文详细介绍了主成分分析法(PCA)在高维数据降维中的应用。首先,阐述了PCA的基…...
LangChain开发(七)自定义输出格式(JSON/XML/YAML)
文章目录 JSON结构输出未使用PydanticPydantic流式处理 XML结构输出xml输出指定字段 YAML输出源码地址参考资料 JSON结构输出 虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型&…...
RustDesk部署到linux(自建服务器)
简介 RustDesk是一款开源的远程桌面软件,由中国开发者开发,使用Rust编程语言构建。它支持跨平台运行,可以在Windows、macOS、Linux、iOS、Android和Web等多个平台上使用。RustDesk的主要功能包括远程桌面访问、文件传输、文本聊天等&…...
分布式锁,redisson,redis
目录 什么是分布式锁分布式锁解决什么问题分布式锁的特点使用分布式锁的场景怎么使用分布式锁1. 添加依赖2. 配置 Redisson 客户端3. 使用 Redisson 实现分布式锁 什么是分布式锁 分布式锁是一种锁机制,用于在分布式环境下,解决多个线程并发访问同一共享…...
linux常用指令(9)
加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述:more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…...
深入解析 JVM 内存区域及核心概念
深入解析 JVM 内存区域及核心概念 Java 虚拟机(JVM)内部划分了多个内存区域,每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容: 程序计数器:记录当前线程正在执行的字节码指令及其“行号”信息&a…...
字节跳动春招研发部笔试题解
字节跳动春招研发部笔试题 1.万万没想到之聪明的编辑 我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发…...
java对象模型
java对象自身的存储模型JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。 a类。当我们在Java代码中,使用new创建一个对象的时候,JVM会在栈中给对象赋值,会在堆中创建一个instanceOopDesc对…...
深入理解指针(3)(C语言版)
文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…...
Linux内核 内存管理 物理内存初始化流程
1.ARM64页表初始化流程图 start_kernel()│▼ setup_arch() // 架构相关初始化│▼ early_fixmap_init() // 初始化Fixmap(临时映射设备树等)│▼ arm64_memblock_init() // 从设备树解析内存布局│▼ arm…...
Day23:和为s的数字
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。 示例 1: 输入:price [3, 9, 12, 15], target 18 输出:[3,15] 或者 [15,3]示例 2&#x…...
Transformer 通关秘籍2:利用 BERT 将文本 token 化
前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…...
电脑干货:万能驱动--EasyDrv8
目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具,一般又称为it天空万能驱动,万能驱动vip版,简称…...