Unix时间戳BKP备份寄存器RTC实时时钟

Unix时间戳

Unix时间戳,也称为POSIX时间或Epoch时间,是一种在Unix和类Unix操作系统中使用的时间表示方法。它表示的是自1970年1月1日00:00:00 UTC(协调世界时)至当前时间经过的秒数,不考虑闰秒。Unix时间戳通常以秒为单位,也可以表示为毫秒、微秒等更小的时间单位。

Unix时间戳的特点:

  1. 简单性:Unix时间戳是一个10位数的整数(在32位系统中),表示从Epoch至某一时刻经过的秒数,易于计算和处理。

  2. 通用性:Unix时间戳被广泛用于Unix、Linux、macOS、Windows等操作系统中,以及各种编程语言和数据库系统中。

  3. 连续性:Unix时间戳是连续的,不受时区、夏令时等因素的影响。

  4. 易转换:Unix时间戳可以方便地转换为各种日期时间格式,如ISO 8601、RFC 2822等。

BKP备份寄存器

BKP是“Backup Registers”的缩写,中文意思是备份寄存器。它用于存储用户应用程序数据,在主电源VDD(2.0~3.6V)被切断的情况下,这些数据仍然由备用电源VBAT(1.8~3.6V)维持供电。BKP寄存器在STM32微控制器中通常用于存储重要的数据,如RTC(实时时钟)的校验值或其他关键信息,即使在系统断电的情况下也能保持数据不丢失。BKP寄存器是位于备份域的,当VDD电源被切断,它们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,它们也不会被复位。在STM32中,BKP寄存器的数量可能有所不同,例如STM32F103系列有10个16位宽度的BKP寄存器。

RTC实时时钟

在秒计数器读取时间,得到秒数,然后使用time.h里的localtime函数,就可以直到年月日时分秒的信息了,再填充struct tm结构体,用mktime函数得到秒数,写入32位计数器即可

1. 输入时钟源

  • PCLK1:这是来自微控制器的时钟信号,用于驱动RTC预分频器和备份区域。

  • RTCCLK:这是RTC模块的时钟输入,可以由外部晶振或内部RC振荡器提供。

2. RTC预分频器

  • RTC_PRL 和 RTC_DIV:这些寄存器用于设置RTC时钟的预分频值。通过调整这些值,可以控制RTC计数器的时钟频率。RTC_DIV来一个时钟自减一次,计数器溢出一次,产生一个输出脉冲,分频后是1hz

3. RTC计数器

  • 82位可编程计数器 RTC_CNT:这是RTC的核心计数器,用于跟踪时间。它是一个可编程的计数器,可以配置为不同的时间单位(如秒、分钟、小时等)。

4. RTC报警

  • RTC_ALR:RTC报警寄存器,用于设置一个特定的时间点,当RTC计数器达到这个时间点时,可以触发一个中断或事件。

5. RTC控制寄存器(RTC_CR)

  • SECIE, ALRIE, OWIE:这些是RTC的中断使能位,分别用于使能秒中断、报警中断和溢出中断。

  • SECIF, ALRIF, OWIF:这些是RTC的中断标志位,用于指示相应的中断事件是否发生。

6. 中断控制器

  • NVIC中断控制器:RTC模块可以通过NVIC(嵌套向量中断控制器)向微控制器的主处理器发送中断请求。

7. 备用区域

  • APB1总线和APB1接口:RTC模块通过APB1总线与微控制器的其他部分通信。APB1接口用于配置RTC和访问其寄存器。

8. 唤醒功能

  • WKUP pin:这是RTC的唤醒引脚,可以在RTC计数器达到预设值时唤醒微控制器。

首先三个时钟煊LSE当作RTCCLK,RTCCLK通过预分频器对时钟进行分频,余数寄存器是一个自减计数器,存储当前的计数值,重装寄存器是计数目标,决定分频值,分频之后,得到1hz的秒计数信号,通过CNT32位计数器,一秒自增一次

配置数据选择器,选择时钟来源;配置重装寄存器,可以选择分频系数;配置32位计数器,可以进行日期时间的读写

代码示例

代码1:读写备份寄存器

 

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Key.h"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]);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);}
}

没有备用电源,主电源掉电后不会备份

代码2:是实时时钟

第一步:开启PWR和BKP时钟,使能BKP和RTC访问

第二步:启动RTC时钟(手动开启LSE,这个时钟默认关闭)

第三步:配置RTCCLK这个数据选择器,指定LSE为RTCCLK

第四步:调用等待同步、等待上一次操作完成的函数

第五步:配置预分频器,给PRL重装寄存器一个合适的分频值,以确保输出给计数器的频率是1HZ

第六步:配置CNT的值,给RTC一个初始时间

#include "stm32f10x.h"                  // Device header
#include <time.h>uint16_t MyRTC_Time[] = {2023, 1, 1, 23, 59, 55};	//定义全局的时间数组,数组内容分别为年、月、日、时、分、秒void MyRTC_SetTime(void);				//函数声明/*** 函    数:RTC初始化* 参    数:无* 返 回 值:无*/
void MyRTC_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();								//等待上一次操作完成MyRTC_SetTime();									//设置时间,调用此函数,全局数组里时间值刷新到RTC硬件电路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);			//在备份寄存器写入自己规定的标志位,用于判断RTC是不是第一次执行配置}else													//RTC不是第一次配置{RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成}
}//如果LSE无法起振导致程序卡死在初始化函数中
//可将初始化函数替换为下述代码,使用LSI当作RTCCLK
//LSI无法由备用电源供电,故主电源掉电时,RTC走时会暂停
/* 
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_LSICmd(ENABLE);while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_SetPrescaler(40000 - 1);RTC_WaitForLastTask();MyRTC_SetTime();BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);}else{RCC_LSICmd(ENABLE);				//即使不是第一次配置,也需要再次开启LSI时钟while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) != SET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();}
}*//*** 函    数: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();							//等待上一次操作完成
}/*** 函    数: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;
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"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);	//显示余数寄存器}
}

 

 如果RTC晶振起振不了,可备选内部低数时钟LSI

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();								//等待上一次操作完成MyRTC_SetTime();									//设置时间,调用此函数,全局数组里时间值刷新到RTC硬件电路BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);			//在备份寄存器写入自己规定的标志位,用于判断RTC是不是第一次执行配置}else													//RTC不是第一次配置{RTC_WaitForSynchro();								//等待同步RTC_WaitForLastTask();								//等待上一次操作完成}
}

 

这段代码是用于配置和管理STM32微控制器中的实时时钟(RTC)模块的。代码的目的是确保RTC只被配置一次,通过检查备份寄存器(BKP)中的一个特定值来实现。以下是代码的详细解释:

  1. 检查备份寄存器

    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)

    这行代码读取备份寄存器BKP_DR1的值,并检查它是否不等于0xA5A5。如果不等于,说明RTC是第一次配置。

  2. 开启LSE时钟

    RCC_LSEConfig(RCC_LSE_ON);

    开启低速外部(LSE)时钟,LSE通常用于为RTC提供精确的时钟源。

  3. 等待LSE准备就绪

    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) != SET);

    等待LSE时钟准备就绪,确保时钟稳定。

  4. 配置RTC时钟源

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    将RTC的时钟源配置为LSE。

  5. 使能RTC时钟

    RCC_RTCCLKCmd(ENABLE);

    使能RTC时钟。

  6. 等待同步和上一次操作完成

    RTC_WaitForSynchro();
    RTC_WaitForLastTask();

    等待RTC同步和上一次操作完成,确保时钟设置正确应用。

  7. 设置RTC预分频器

    RTC_SetPrescaler(32768 - 1);

    设置RTC预分频器,使预分频后的计数频率为1Hz(每秒一个脉冲)。

  8. 再次等待上一次操作完成

    RTC_WaitForLastTask();

    再次等待上一次操作完成。

  9. 设置时间

    MyRTC_SetTime();

    调用自定义函数设置RTC的时间。

  10. 写入备份寄存器

    BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);

    在备份寄存器写入标志位0xA5A5,用于判断RTC是否已经配置过。

  11. 非首次配置

    else
    {RTC_WaitForSynchro();RTC_WaitForLastTask();
    }

    如果RTC不是第一次配置,只需等待同步和上一次操作完成。

这段代码确保RTC模块只被配置一次,通过在备份寄存器中写入一个特定的标志位来实现。它首先检查备份寄存器的值,如果未配置过,则进行一系列配置操作,包括开启LSE时钟、设置RTC时钟源、设置预分频器、设置时间,并在备份寄存器中写入标志位。如果已经配置过,则只需等待同步和上一次操作完成。这种设计可以避免重复配置RTC,确保系统的稳定性和可靠性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/73646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux内核系列】:进程板块与文件板块的综合

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生中成功只是一时的&#xff0c;失败却是人生的主旋律&#xff0c;但是如何面对失败却把人分成了不同的样子&#xff0c;有的人会被…

CellOracle|基因扰动研究基因功能|基因调控网络+虚拟干预

在gzh“生信小鹏”同步文章 论文来源: 发表期刊:Nature发表时间:2023年2月23日论文题目:Dissecting cell identity via network inference and in silico gene perturbation研究团队:Kenji Kamimoto 等,华盛顿大学医学院1. 研究背景与问题提出 细胞身份(Cell Identit…

专线、云 和 物联网(IoT)

专线、云 和 物联网&#xff08;IoT&#xff09; 是现代信息与通信技术&#xff08;ICT&#xff09;领域的三大重要组成部分&#xff0c;它们在企业和个人的数字化转型中扮演着关键角色。以下是对这三者的详细介绍及其相互关系&#xff1a; 1. 专线&#xff08;Leased Line&…

[Lc14_priority_queue] 最后一块石头重量 | 数据流中的第 K 大元素 | 前K个高频单词 | 数据流的中位数

目录 1.最后一块石头的重量 题解 2.数据流中的第 K 大元素 题解 3.前K个高频单词 题解 代码 ⭕4.数据流的中位数 题解 在C中&#xff0c;使用标准库中的priority_queue&#xff0c;默认情况下它是一个最大堆&#xff08;即大堆排序&#xff09;&#xff0c;这意味着最…

XSS漏洞靶场---(复现)

XSS漏洞靶场—&#xff08;复现&#xff09; 反射型 XSS 的特点是攻击者诱导用户点击包含恶意脚本的 URL&#xff0c;服务器接收到请求后将恶意脚本反射回响应页面&#xff0c;浏览器执行该脚本从而造成攻击&#xff0c;恶意脚本不会在服务器端存储。 Level 1(反射型XSS) 此漏…

2025/3.17 郭院安排会议与南京银行参访

目录 *郭院会议&#xff1a;服务外包*1.会遇到的问题以及解决方案2.考虑行业目前会碰到的瓶颈3.后端应该呈现处理图像的过程4.记得做报告、文档说明和视频等工作 *南京银行&#xff08;鑫合易家&#xff09;参访记录*1. 风险评分业务流程笔记![在这里插入图片描述](https://i-b…

Cloud Ace 宣布成为 Langfuse 亚太地区首个代理商,提供 LLM 全链路解决方案

Cloud Ace 宣布正式代理 Langfuse 产品&#xff0c;是 Langfuse 在亚太地区唯一的官方授权经销商&#xff0c;全面负责其商用许可证的销售、部署与技术支持服务。通过此次合作&#xff0c;Cloud Ace 将充分发挥 Langfuse 的先进技术能力与行业专业知识&#xff0c;为企业级客户…

Helm 的仓库管理与 Chart 搜索

在使用 Helm 管理 Kubernetes 应用的过程中&#xff0c;仓库管理与 Chart 搜索是两个核心功能。通过 Helm 仓库&#xff0c;用户可以方便地存储、分享和获取 Helm Chart&#xff0c;而搜索功能则帮助用户快速找到所需的 Chart。本文将详细介绍 Helm 仓库的概念、管理方法以及如…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学&#xff0c;一般都是研究其悬…

免训练指标(Zero-Cost Proxies)

1. 什么是免训练指标&#xff08;Zero-Cost Proxies&#xff0c;ZC proxies&#xff09;&#xff1f; 免训练指标是一类 无需完整训练模型即可评估其性能的度量方法&#xff0c;主要用于提高 神经架构搜索&#xff08;NAS&#xff09; 的效率。 传统 NAS 需要训练候选架构来评…

C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)

目录 1. 数组名与地址 2. 指针访问数组 3.一维数组传参本质 4.二级指针 5. 指针数组 6. 指针数组模拟二维数组 1. 数组名与地址 我们先看下面这个代码&#xff1a; int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数…

基于Python pyscard库采集ACS ACR122U NFC读卡器数据的详细操作步骤

步骤1&#xff1a;安装驱动 1. 下载驱动&#xff1a; - 访问ACS官网的驱动下载页面&#xff1a;[ACR122U驱动下载](https://www.acs.com.hk/en/drivers/6/acr122u-nfc-reader/)。 - 选择适用于Windows的驱动&#xff08;如 ACR122U Driver (Windows) V3.05.02.zip&#xff09;…

深度学习 Deep Learning 第1章 深度学习简介

第1章 深度学习简介 概述 本章介绍人工智能&#xff08;AI&#xff09;和深度学习领域&#xff0c;讨论其历史发展、关键概念和应用。解释深度学习如何从早期的AI和机器学习方法演变而来&#xff0c;以及如何有效解决之前方法无法应对的挑战。 关键概念 1. 人工智能的演变 …

python实现简单的图片去水印工具

python实现简单的图片去水印工具 使用说明&#xff1a; 点击"打开图片"选择需要处理的图片 在图片上拖拽鼠标选择水印区域&#xff08;红色矩形框&#xff09; 点击"去除水印"执行处理 点击"保存结果"保存处理后的图片 运行效果 先简要说明…

软件功能性测试有哪些步骤和挑战?软件测评服务机构分享

软件功能性测试是对软件系统进行验证的一种基本方法。其主要目标是确保软件系统能够按照预期的要求和功能进行操作。从用户的角度看&#xff0c;功能性测试旨在检查软件是否实现了所有要求的功能&#xff0c;保证用户体验的顺畅与满意。 一、软件功能性测试的测试步骤   1、…

《C#上位机开发从门外到门内》3-4:基于TCP/IP的远程监控系统设计与实现

文章目录 一、项目概述二、系统架构设计三、通信协议设计四、功能模块实现五、系统安全性与稳定性六、性能优化与测试七、实际应用案例八、结论 随着信息技术的飞速发展&#xff0c;远程监控系统在工业自动化、智能家居、环境监测等领域的应用日益广泛。基于TCP/IP协议的远程监…

在react当中利用IntersectionObserve实现下拉加载数据

目录 一、传统的下拉加载方案 二、存在问题 1.性能较差 2.不够精确 三、IntersectionObserve版本下拉加载 1、callback 2、options 四、IntersectionObserver实例 1、Intersection的优势 2、实现思路 3、代码实现 在进行前端开发的过程中&#xff0c;常常会碰到下拉…

深入理解C++编程:从内存管理到多态与算法实现

C 是一门功能强大的编程语言&#xff0c;广泛应用于系统编程、游戏开发和高性能计算等领域。本文将通过一系列经典问题&#xff0c;深入探讨 C 的核心知识点&#xff0c;包括内存管理、多态&#xff08;结合函数重载与覆盖&#xff09;、多线程、TCP/IP 模型、软链接与硬链接的…

相对论之光速

然而&#xff0c;基础物理学的进步很少全部由实验取得。为了解实验结果背后的机制&#xff0c;法拉第问道&#xff0c;既然磁铁没有接触导线&#xff0c;导线中怎么会产生电流?一股电流又怎么能使指南针指针发生偏转?有某种作用因素必然在磁铁、导线和指南针之间的空隙中传递…

文本检测-文本内容审核-文本过滤接口如何用PHP调用?

一、什么是文本检测接口呢&#xff1f; 文本内容审核过滤&#xff0c;提供对敏感事件、违规词语及监管要求封禁词语的识别审核能力&#xff0c;包含海量历史数据&#xff0c;有效过滤违禁违规、恶意推广、低俗辱骂、低质灌水、广告法审核&#xff0c;该接口应用场景广泛&#…