STM32学习——RTC实时时钟(BKP与RTC外设)
RTC实时时钟
RTC实时时钟
想记录或读取日期和事件,就可以通过操作RTC实现
RTC与BKP和PWR经常同时出现
一般情况下,VBTA是电池供电口,需要接备用电池
在BKP备份寄存器写入两个数据,然后再读出之后显示,BKP的数据,需要VBAT的引脚接上备用电池来维持,才能保证断电不丢失。如果接了备用电池,BKP可以完成一些主电源掉电时,保存少量数据的任务
Unix时间戳
BKP和RTC外设结构
Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒
时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
优点:
1:简化硬件电路,在设计硬件电路的时候,直接用一个很大的秒寄存器来实现,不需要考虑进位
2:来进行一些时间间隔的计算时,非常方便
STM32中的RTC,核心的计时部分是一个32位可编程计数器
UTC/GMT
GMT(Greenwich Mean Time)格林尼治标准时间是一种以地球自转为基础的时间计量系统。它将地球自转一周的时间间隔等分为24小时,以此确定计时标准
UTC(Universal Time Coordinated)协调世界时是一种以原子钟为基础的时间计量系统。它规定铯133原子基态的两个超精细能级间在零磁场下跃迁辐射9,192,631,770周所持续的时间为1秒。当原子钟计时一天的时间与地球自转一周的时间相差超过0.9秒时,UTC会执行闰秒来保证其计时与地球自转的协调一致
时间戳函数
C语言的time.h模块提供了时间获取和时间戳转换的相关函数,可以方便地进行秒计数器、日期时间和字符串之间的转换
秒计数器数据类型:数据类型名为time_t
日期时间数据类型:类型名为struct tm
字符串数据类型:类型名为char*,就是char型数据的指针,用来指向一个表示时间的字符串
函数 | 作用 |
---|---|
time_t time(time_t*); | 获取系统时钟 |
struct tm* gmtime(const time_t*); | 秒计数器转换为日期时间(格林尼治时间) |
struct tm* localtime(const time_t*); | 秒计数器转换为日期时间(当地时间) |
time_t mktime(struct tm*); | 日期时间转换为秒计数器(当地时间) |
char* ctime(const time_t*); | 秒计数器转换为字符串(默认格式) |
char* asctime(const struct tm*); | 日期时间转换为字符串(默认格式) |
size_t strftime(char*, size_t, const char*, const struct tm*); | 日期时间转换为字符串(自定义格式) |
BKP与RTC外设
BKP简介
BKP(Backup Registers)备份寄存器
BKP可用于存储用户应用程序数据。当VDD(2.0-3.6V)电源被切断,他们仍然由VBAT(1.8-3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
TAMPER引脚产生的侵入事件将所有备份寄存器内容清除
RTC引脚输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
存储RTC时钟校准寄存器
用户数据存储容量:
20字节(中容量和小容量)/ 84字节(大容量和互联型)
BKP基本结构
橙色部分可以被称为后备区域,当VDD主电源掉电时,后备区域仍然可以由VBAT的备用电池供电,当VDD主电源上电时,后备区域供电会由VBAT切换到VDD
RTC简介
RTC(Real Time Clock)实时时钟
RTC是一个独立的定时器,可为系统提供时钟和日历的功能
RTC和时钟配置系统处于后备区域,系统复位时数据不清零,VDD(2.0-3.6V)断电后可借助VBAT(1.8-3.6V)供电继续走时
32位的可编程计数器,可对应Unix时间戳的秒计数器
20位的可编程预分频器,可适配不同频率的输入时钟
可选择三种RTC时钟源:
HSE时钟除以128(通常为8MHz/128)
LSE振荡器时钟(通常为32.768KHz)
LSI振荡器时钟(40KHz)
RTC框图
RTC基本结构
在程序中,配置数据选择器,可以选择始终来源;配置重装寄存器,可以选择分频系数;配置32位计数器,可以进行日期时间的读写,需要闹钟的话,配置32位闹钟值即可,需要中断的话,先允许中断,再配置NVIC,最后写对应的中断函数即可
配合RTC的外部硬件电路
主要需要电池和外部低速晶振
RTC操作注意事项
执行以下操作将使能对BKP和RTC的访问:
- 设置RCC_APB1ENR的PWREN和BKPEN,使能PWR和BKP时钟
- 设置PWR_CR的DBP,使能对BKP和RTC的访问
若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1
必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器
对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器
读写BKP与RTC
BKP代码配置步骤
第一步:开启PWR和BKP的时钟
第二步:使用PWR的一个函数,使能对BKP和RTC的访问
BKP相关库函数
void BKP_DeInit(void);
可以让BKP的数据都变成0
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
void BKP_TamperPinCmd(FunctionalState NewState);
用于配置TAMPER的侵入检测功能
void BKP_ITConfig(FunctionalState NewState);
中断配置,是否开启中断
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);
时钟输出功能的配置,可以选择在RTC引脚上输出时钟信号,输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);
设置RTC校准值,写入RTC校准寄存器
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
写备份寄存器,第一个参数指定要写在哪个DR里,第二个参数指定要写入的数据,是16位的整型数据
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
读备份寄存器,参数指定要读哪个DR,返回值就是DR里存的值
void PWR_BackupAccessCmd(FunctionalState NewState);
备份寄存器访问使能,设置PWR_CR寄存器里的DBP位
RTC初始化流程
第一步:在使用RTC外设之前,执行注意事项第一点,开启PWR和BKP的时钟,使能BKP和RTC的访问
第二步:启动RTC的时钟,使用LSE作为系统时钟,要使用RCC模块里的函数,开启LSE的时钟
第三步:配置RTCCLK这个数据选择器,指定LSE为RTCCLK,这一步函数也在RTC模块里面
第四步:调用两个等待的函数,等待同步,等待上一次操作完成
第五步:配置预分频器,给PRL重装寄存器一个合适的分频值,以确保输出给计数器的频率是1Hz
第六步:配置CNT的值,给RTC一个初始时间,需要闹钟的话可以配置闹钟值,需要中断可以配置中断
RCC相关库函数
void RCC_LSEConfig(uint8_t RCC_LSE);
配置LSE外设低速时钟
void RCC_LSICmd(FunctionalState NewState);
配置LSI内部低速时钟
void RCC_RTCCLKConfig(uint32_t RCC_RTCCLKSource);
RTCCLK配置,用来选择RTCCLK的时钟源,实际上就是配置数据选择器
void RCC_RTCCLKCmd(FunctionalState NewState);
启动RTCCLK
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG);
获取标志位,等待RCC有个标志位LSERDY置1之后,时钟才算启动完成,工作稳定
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
配置中断输出
void RTC_EnterConfigMode(void);
进入配置模式
void RTC_ExitConfigMode(void);
退出配置模式
uint32_t RTC_GetCounter(void);
获取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);
等待上次操作完成
void RTC_WaitForSynchro(void);
等待同步
代码示例
读写BKP
代码文件:main.c
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "Key.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:");//BKP的初始化//第一步:开启PWR和BKP的时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//第二步:使能对BKP和RTC的访问PWR_BackupAccessCmd(ENABLE);while(1){//按下按键,变更一下数据,再写入到BKP中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);}
}
实时时钟
代码文件:MyRTC.c
#include "stm32f10x.h" // Device header
#include <time.h>//在写C语言程序中,十进制前面不要补0,比如01,09
uint16_t MyRTC_Time[]={2023,1,1,23,59,55};void MyRTC_SetTime(void);void MyRTC_Init(void)
{//第一步:开启PWR和BKP的时钟,使能BKP和RTC的访问RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5){//第二步:开启LSE时钟,并等待LSE时钟启动完成RCC_LSEConfig(RCC_LSE_ON);//等待LSE启动完成while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);//第三步:选择RTCCLK时钟源RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);//调用等待的函数,一个是等待同步,一个是等待上一次写入操作完成RTC_WaitForSynchro();RTC_WaitForLastTask();//配置预分频器RTC_SetPrescaler(32768-1);RTC_WaitForLastTask();//设置初始时间,给32位的秒计数器RTC_SetCounter(1672588795);RTC_WaitForLastTask();MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1,0xA5A5);}else{RTC_WaitForSynchro();RTC_WaitForLastTask();}}//写两个函数,一个是设置时间,一个是读取时间
void MyRTC_SetTime(void)
{//第一步:把数组指定的时间,填充到struct tm结构体里//第二步:使用mktime函数,得到秒数//第三步:将秒数写道RTC的CNT中//将数组的时间转换为秒数,写入到CNT中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;RTC_SetCounter(time_cnt);//写入寄存器后,需要等待操作完成RTC_WaitForLastTask();
}void MyRTC_ReadTime(void)
{//第一步:读取CNT的秒数time_t time_cnt;struct tm time_date;time_cnt=RTC_GetCounter()+8*60*60;time_date=*localtime(&time_cnt);//第三步:把time_date的时间,转移到数组里面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.c
#include "stm32f10x.h" // Device header
#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);}
}
相关文章:
STM32学习——RTC实时时钟(BKP与RTC外设)
RTC实时时钟 RTC实时时钟 想记录或读取日期和事件,就可以通过操作RTC实现 RTC与BKP和PWR经常同时出现 一般情况下,VBTA是电池供电口,需要接备用电池 在BKP备份寄存器写入两个数据,然后再读出之后显示,BKP的数据&a…...
SQL打折日期交叉问题
1. 数据结构:数据为平台商品促销数据 表名:good_promotion 字段名:brand(品牌)、stt(打折开始日期)、edt(打折结束日期)。 2. 需求: ① 创建表 ② 计算每个…...
智能机器人加速进化:AI大模型与传感器的双重buff加成
Deepseek不仅可以在手机里为你解答现在的困惑、占卜未来的可能,也将成为你的贴心生活帮手! 2月21日,追觅科技旗下Dreamehome APP正式接入DeepSeek-R1大模型,2月24日发布的追觅S50系列扫地机器人也成为市面上首批搭载DeepSeek-R1的…...
AI大模型-提示工程学习笔记21-图提示 (Graph Prompting)
目录 1. 图提示的核心思想 (1) 传统提示的局限性 (2) Graph Prompting 的解决方案 2. Graph Prompting 的工作流程 (1) 图构建 (2) 图选择/子图提取 (3) 图编码 (4) 提示构建 (5) LLM 推理与生成 3. Graph Prompting 的关键组件 (1) 大语言模型 (LLM) (2) 图数据库…...
C++ 中的 for 循环语句教程
摘要 for 循环是 C 中最常用的循环结构之一,用于重复执行一段代码,直到满足特定条件。它特别适合在已知循环次数的情况下使用。本教程将详细介绍 for 循环的语法、用法以及一些常见示例。 1. for 循环的基本语法 for 循环的语法如下: for …...
UniApp 中封装 HTTP 请求与 Token 管理(附Demo)
目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习,上述实战代码来源:芋道源码/yudao-mall-uniapp 该代码中,通过自定义 request 函数对 HTTP 请求进行了统一管理,并且结合了 Token 认证机制 请求封装原理ÿ…...
paddlehub hub TypeError 错误
pip install paddlehub hub install chinese_ocr_db_crnn_mobile 提示错误: TypeError: Descriptors cannot be created directly. If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc > 3.19.0…...
机器学习--(随机森林,线性回归)
一、集成学习方法之随机森林 集成学习的基本思想就是将多个分类器组合,从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话:三个臭皮匠,赛过诸葛亮。集成算法大致可以分为:Bagging,B…...
和鲸科技推出人工智能通识课程解决方案,助力AI人才培养
2025年2月,教育部副部长吴岩应港澳特区政府邀请,率团赴港澳宣讲《教育强国建设规划纲要 (2024—2035 年)》。在港澳期间,吴岩阐释了教育强国目标的任务,并与特区政府官员交流推进人工智能人才培养的办法。这一系列行动体现出人工智…...
从暴力破解到时空最优:LeetCode算法设计核心思维解密
一、算法优化金字塔模型(时间复杂度/空间复杂度协同优化) 1.1 复杂度分析的本质 大O记号的三层认知: ① 理论复杂度边界(理想模型) ② 硬件架构影响(缓存命中率/分支预测) ③ 语言特性损耗&am…...
关于在java项目部署过程MySQL拒绝连接的分析和解决方法
前言 在最近一次部署项目一次项目部署过程中,由于没有对MySQL数据库的部分权限和远程连接进行授权,导致了在执行项目功能API时,出现MySQL连接异常或MySQL拒绝连接的问题。 问题 以下是部分报错截图: 分析 根据日志提示…...
『抓包工具』安卓抓包小黄鸟 lsp过检测 雷电模拟器root(保姆级图文)
目录 准备工作雷电9.0.74 64位下载对应工具通过面具鸭安装面具安装防检测模块设置Zygisk安装小黄鸟简易抓包教程总结欢迎关注 『抓包工具』 专栏,持续更新中 欢迎关注 『抓包工具』 专栏,持续更新中 请注意不要随便升级雷电模拟器了 不然你需要重新通过面具鸭安装面具 准备工…...
k8S通过代理将集群外的中间件引入集群内访问 —— 筑梦之路
背景说明 有部分中间件是跑在Kubernetes集群之外,我们希望通过service的方式来访问集群外的中间件,比如访问我们k8s集群外的elasticsearch集群。 ES节点本身又处在一个负载均衡IP:192.168.100.100 之后,但是代理的端口号是9202&am…...
【考试大纲】高级系统架构设计师考试大纲
目录 引言一、 考试说明1.考试目标2.考试要求3.考试科目设置二、 考试范围考试科目1:系统架构设计综合知识考试科目2:系统架构设计案例分析考试科目3:系统架构设计论文引言 最新的系统架构设计师考试大纲出版于 2022 年 11 月,本考试大纲基于此版本整理。 一、 考试说明…...
三个小时学完vue3 —— 简单案例(二)
三个小时学完vue3(二) 图片轮播案例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...
筑牢安全防线:工商业场所燃气泄漏防护新方案
燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所,可燃气体一旦泄漏,极易引发严重事故。如何实现精准监测、快速响应,成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域,推出的工业及…...
git上传仓库操作
在 Visual Studio Code (VSCode) 中,手动将本地仓库与远程仓库关联起来是一个常见的需求。以下是详细的操作步骤和解释: 前提条件 已安装 Git:确保你的系统中已经安装了 Git,并且可以通过命令行运行 git 命令。已初始化本地仓库&…...
广义线性模型下的数据分析(R语言)
一、实验目的: 通过上机试验,掌握利用R实现线性回归分析、逻辑回归、列联分析及方差分析,并能对分析结果进行解读。 数据: 链接: https://pan.baidu.com/s/1JqZ_KbZJEk-pqSUWKwOFEw 提取码: hxts 二、实验内容: 1、2…...
贪心算法精品题
1.找钱问题 本题的贪心策略在于我们希望就可能的保留作用大的5元 class Solution { public:bool lemonadeChange(vector<int>& bills) {std::map<int ,int> _map;for(auto ch:bills){if(ch 5) _map[ch];else if(ch 10){if(_map[5] 0) return false;else{_m…...
爱普生汽车用显示控制器IC:ScalerIC,汽车接口IC,相机接口IC
爱普生汽车显示控制器IC,汽车显示控制器芯片可以分为三类:爱普生显示控制芯片Scaler IC ,爱普生汽车接口IC,爱普生相机接口IC。下面就给大家分别介绍下这三类芯片的具体型号的特征及用途。 爱普生显示控制芯片 Scaler IC Scaler…...
深度学习基础--ResNet50V2网络的讲解,ResNet50V2的复现(pytorch)以及用复现的ResNet50做鸟类图像分类
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 前言 如果说最经典的神经网络,ResNet肯定是一个,从ResNet发布后,作者又进行修改,命名为ResNe50v2,…...
物理竞赛中的线性代数
线性代数 1 行列式 1.1 n n n 阶行列式 定义 1.1.1:称以下的式子为一个 n n n 阶行列式: ∣ A ∣ ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}\mathbf A\end{vmatrix} \begin{vmatrix} a_{11…...
OptiTrack光学跟踪系统:引领工厂机器人应用的革新浪潮
在现代化的工厂生产线上,一台机械臂正以惊人的毫米级精度执行着精密零件的装配任务。这一精准操作的背后,是OptiTrack光学跟踪系统的实时捕捉与优化,它正助力生产效率与产品质量迈向新的高度。如今,这一技术正在全球范围内广泛应用…...
Coze/Dify/Ollama在玩ai时候的用途
Coze、Dify 和 Ollama 是三种不同的工具或平台,它们各自有不同的定位和用途。以下是对它们的区别、优缺点以及部署和使用方式的详细分析。 1. Coze 简介 Coze 是一个专注于构建基于大语言模型(LLM)的应用程序的开发平台。它类似于 Dify&…...
使用Docker Compose部署 MySQL8
MySQL 8 是一个功能强大的关系型数据库管理系统,而 Docker 则是一个流行的容器化平台。结合使用它们可以极大地简化 MySQL 8 的部署过程,并且确保开发环境和生产环境的一致性。 安装 Docker 和 Docker Compose 首先,确保你的机器上已经安装了 Docker 和 Docker Compose。 …...
Golang快速上手02/Golang基础
4.控制语句 4.1条件控制语句 4.1.1if-elseif-else 与clang不同,if不需要加() if <condition1> {<block1> } else if <condition2> {<block2> } else {<block0> }示例 a : 10 if a > 5 {fmt.Println("a > 5") } els…...
Nginx处理http的流程
文章目录 前言一、发版本后旧版本可以用项目基本情况Nginx 配置**解释每一行的作用:****表现和行为:****适用场景**:资源的缓存策略 在这里插入图片描述 二, nginx处理http的流程Nginx 的 GitHub 源码地址 **Nginx 核心源码解读&a…...
算法之刷题汇总
剑指 Offer 剑指 Offer 题解 | CS-Notes 面试笔记 Leetcode Leetcode 题解 | CS-Notes 面试笔记 GitCode - 全球开发者的开源社区,开源代码托管平台...
【AIGC系列】4:Stable Diffusion应用实践和代码分析
AIGC系列博文: 【AIGC系列】1:自编码器(AutoEncoder, AE) 【AIGC系列】2:DALLE 2模型介绍(内含扩散模型介绍) 【AIGC系列】3:Stable Diffusion模型原理介绍 【AIGC系列】4࿱…...
【Python爬虫(81)】当量子计算邂逅Python爬虫:一场技术变革的预演
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…...
Java Web应用中获取客户端的真实IP地址
Java Web应用中获取客户端的真实IP地址,尤其在存在代理服务器的情况下。 代码示例: public static String getClientIP(HttpServletRequest request) {String ip = parseCommaSeparatedIPs(request.getHeader("X-Forwarded-For"));if (isInvalid(ip)) {ip = pars…...
R语言+AI提示词:贝叶斯广义线性混合效应模型GLMM生物学Meta分析
全文链接:https://tecdat.cn/?p40797 本文旨在帮助0基础或只有简单编程基础的研究学者,通过 AI 的提示词工程,使用 R 语言完成元分析,包括数据处理、模型构建、评估以及结果解读等步骤(点击文末“阅读原文”获取完整代…...
LangChain原理解析及开发实战指南(2025年最新版)
一、LangChain核心架构解析 1.1 框架设计理念 LangChain是基于提示工程(Prompt Engineering)构建的LLM应用开发框架,其核心思想是通过模块化组件实现大语言模型与业务系统的无缝对接。该框架采用分层设计: 接口层:统一对接OpenAI、DeepSee…...
赋能农业数字化转型 雏森科技助力“聚农拼”平台建设
赋能农业数字化转型,雏森科技助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天,农业领域也在积极探索转型升级之路。中农集团一直以“根植大地,服务三农”为核心,以“乡村振兴,农民增收”为目标,及时…...
CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析
胡未灭,鬓已秋,泪空流 此生谁料 心在天山 身老沧州 ——诉衷情 完整代码见: SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determinati…...
深度剖析Seata源码:解锁分布式事务处理的核心逻辑
文章目录 写在文章开头如何使用源码(配置转掉)基于AT模式详解Seata全链路流程Seata服务端启动本地服务如何基于GlobalTransaction注解开启事务客户端如何开启分布式事务RM和TC如何协调处理分支事务RM生成回滚日志事务全局提交与回滚小结参考写在文章开头 在当今分布式系统日益…...
python配置mmcv与mmdet环境
首先查看自己的cuda版本 nvcc --version 安装与cuda对应的torch版本,对应关系 Previous PyTorch Versions | PyTorch 安装对应的mmcv版本,使用下面命令可以自动安装匹配的版本,使用mim安装 mim install mmcv-full -f https://download.o…...
ESP 32控制无刷电机2
import machine import time import socket import network from machine import I2C, Pin, ADC def start_ap(): """ 启动ESP32的AP模式 """ ap network.WLAN(network.AP_IF) ap.active(True) ssid ESP32_APTest …...
【uniapp原生】实时记录接口请求延迟,并生成写入文件到安卓设备
在开发实时数据监控应用时,记录接口请求的延迟对于性能分析和用户体验优化至关重要。本文将基于 UniApp 框架,介绍如何实现一个实时记录接口请求延迟的功能,并深入解析相关代码的实现细节。 前期准备&必要的理解 1. 功能概述 该功能的…...
wps角标快速生成
使用^#符号匹配数字,将[^#]内容找到,随后在格式-字体中选择上标,逐个/批量替换即可(比一点点改效率翻倍)...
Azure Speech
1、文字转语音(Text-To-Speech, TTS) 2、语音转文字(Speech-To-Text): Azure Speech to Text 1- 环境配置:Microsoft Azure 注册使用免费服务: 需要信用卡,本人没有,所以没有完成注册...
SHELL32!ILCombine函数分析之连接两个idl
SHELL32!ILCombine函数分析之连接两个idl 第一部分: STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { // Let me pass in NULL pointers if (!pidl1) { if (!pidl2) { return NULL; …...
学习threejs,使用ShaderMaterial自定义着色器材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.ShaderMaterial1.1.1…...
使用 Selenium 和 Requests 自动化获取动态 Referer 和 Sign 的完整指南
在现代网络爬虫和自动化任务中,动态生成的参数(如 Referer 和 Sign)常常是绕过反爬虫机制的关键。本文将详细介绍如何使用 Python 的 Selenium 和 Requests 库,从目标网页中提取动态 Referer 和 Sign,并完成后续的请求…...
1.2.3 使用Spring Initializr方式构建Spring Boot项目
本实战概述介绍了如何使用Spring Initializr创建Spring Boot项目,并进行基本配置。首先,通过Spring Initializr生成项目骨架,然后创建控制器HelloController,定义处理GET请求的方法hello,返回HTML字符串。接着…...
Cursor+pycharm接入Codeuim(免费版),Tab自动补全功能平替
如题,笔者在Cursor中使用pycharm写python程序,试用期到了Tab自动补全功能就不能用了,安装Codeuim插件可以代替这个功能。步骤如下: 1. 在应用商店中搜索扩展Codeuim,下载安装 2. 安装完成后左下角会弹出提示框&#x…...
Ruby基础
一、字符串 定义 283.to_s //转为string "something#{a}" //定义字符串,并且插入a变量的值 something//单引号定义变量 %q(aaaaaaaaa) // 定义字符串,()内可以是任何数,自动转义双引号%Q("aaaaa"…...
wzl-django学习
####################################################总的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…...
《AI强化学习:元应用中用户行为引导的智能引擎》
在科技飞速发展的当下,元应用正以前所未有的速度融入我们的生活,从沉浸式的虚拟社交到高度仿真的工作模拟,元应用构建出一个个丰富多彩的虚拟世界。而在这背后,人工智能的强化学习技术宛如一位无形却强大的幕后推手,深…...
Django基础环境准备
Django基础环境准备 文章目录 Django基础环境准备1.准备的环境 win11系统(运用虚拟环境搭建)1.1详见我的资源win11环境搭建 2.准备python环境2.1 winr 打开命令提示符 输入cmd 进入控制台2.2 输入python --version 查看是否有python环境2.3在pyhton官网下…...