STM32G474之CALIB输出

news2024/9/20 5:58:55

STM32G474之CALIB输出源是1Hz和512Hz的时钟源。通过测试输出波形,计算RTC输入时钟和理论值之间的误差,为“校准”服务的。

1、CALIB输出原理

 

2、CALIB输出测试程序

#include "RTC.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "LED.h"
#include "delay.h"


void RTC_Init(void);
void RTC_Display(void);
void RTC_Set_Date_And_Time(uint16_t syear,uint8_t smon,uint8_t sday,uint8_t week,uint8_t hour,uint8_t min,uint8_t sec,uint32_t Format);
uint8_t RTC_Set_Alarm(uint8_t mode,uint8_t sWeekDay,uint8_t hour,uint8_t min,uint8_t sec,uint8_t subSecond,uint32_t Format);
void RTC_CALIB_Output_On_RTCOUTx_Pin(RTC_HandleTypeDef *hrtc,uint8_t OutputPin);

void RTC_Init(void)
{
	RTC_HandleTypeDef hrtc;
	RCC_OscInitTypeDef        RCC_OscInitStruct;  //配置LSE/LSI时钟
	RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct;//用来为RTC选择时钟源

  __HAL_RCC_PWR_CLK_ENABLE();//Enable write access
	HAL_PWR_EnableBkUpAccess();//Enable the power clock

#ifdef RTC_CLOCK_SOURCE_LSE
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
  HAL_RCC_OscConfig(&RCC_OscInitStruct);
	//配置LSE时钟,关闭LSI时钟

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
	//选择LSE时钟为RTC时钟源

#elif defined (RTC_CLOCK_SOURCE_LSI)
  RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_LSI;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
	HAL_RCC_OscConfig(&RCC_OscInitStruct);
	//配置LSI时钟

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
	HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
	//选择LSI时钟为RTC时钟源
#endif /*RTC_CLOCK_SOURCE_LSE*/

  __HAL_RCC_RTCAPB_CLK_ENABLE();//使能RTC APB外部设备时钟,Enable RTC peripheral Clocks
  __HAL_RCC_RTC_ENABLE();//使能RTC时钟,Enable RTC Clock

  hrtc.Instance = RTC;                       //选择RTC
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;  //指定RTC小时的格式
  hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;//指定RTC异步预分法器的值。
  hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;  //指定RTC同步预分配器的值。

  RTC_CALIB_Output_On_RTCOUTx_Pin(&hrtc,1);//“RTC唤醒”输出从RTC_OUT1引脚输出
//  RTC_CALIB_Output_On_RTCOUTx_Pin(&hrtc,2);//“RTC唤醒”输出从RTC_OUT2引脚输出
  HAL_RTC_Init(&hrtc);

  if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2)
  {//读TAMP_BKPxR寄存器,因为RTC_BKP_DR0=0,所以是读TAMP_BKP0R寄存器

//		Test_RTC_Set_Date_And_Time();//设置时间为24年2月29日星期四23:59:50:00
//		RTC_Set_Date_And_Time(0x24,0x02,0x29,0x04,0x23,0x59,0x50,RTC_FORMAT_BCD);
		//设置时间为24年2月29日星期四23:59:50:00
		RTC_Set_Date_And_Time(24,2,29,4,23,59,50,RTC_FORMAT_BIN);
		//设置时间为24年2月29日星期四23:59:50:00

		HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0, 0x32F2);
		//写TAMP_BKPxR寄存器,因为RTC_BKP_DR0=0,所以是写TAMP_BKPxR寄存器
		//将0x32F2写入TAMP_BKP0R寄存器
		//Writes a data in a RTC Backup data Register0
  }

	HAL_RTCEx_SetCalibrationOutPut(&hrtc,RTC_CALIBOUTPUT_512HZ);
//	HAL_RTCEx_SetCalibrationOutPut(&hrtc,RTC_CALIBOUTPUT_1HZ);
}

//函数功能:显示“年月日和星期几”以及“时分秒”
void RTC_Display(void)
{
  RTC_DateTypeDef sdatestructureget;//用来保存“年月日和星期几”
  RTC_TimeTypeDef stimestructureget;//用来保存“时分秒”

  printf("RTC_IT_SEC\r\n");
  HAL_RTC_GetTime(NULL, &stimestructureget, RTC_FORMAT_BIN);//读取"RTC时间"
	//读RTC_TR寄存器bit21:20(HT[1:0]),HT[1:0]表示小时的十位数值
	//读RTC_TR寄存器bit19:16(HU[3:0]),HU[3:0]表示小时的个位数值
	//读RTC_TR寄存器bit14:12(MNT[2:0]),MNT[2:0]表示分钟的十位数值
	//读RTC_TR寄存器bit11:8(MNU[3:0]),MNU[3:0]表示分钟的个位数值
	//读RTC_TR寄存器bit6:4(ST[2:0]),ST[2:0]表示秒的十位数值
	//读RTC_TR寄存器bit3:0(SU[3:0]),SU[3:0]表示秒的个位数值
	//HAL库耍牛氓,我也耍牛氓

  HAL_RTC_GetDate(NULL, &sdatestructureget, RTC_FORMAT_BIN);//读取"RTC日期"
	//读RTC_DR寄存器bit23:20(YT[3:0]),YT[3:0]表示年的十位数值
	//读RTC_DR寄存器bit19:16(YU[3:0]),YU[3:0]表示年的个位数值
	//读RTC_DR寄存器bit15:13(WDU[2:0]),WDU[2:0]=001b表示星期1;WDU[2:0]=010b表示星期2......WDU[2:0]=111b表示星期日
	//读RTC_DR寄存器bit12(MT),MT表示月的十位数值
	//读RTC_DR寄存器bit11:8(MU[3:0]),MU[3:0]表示月的个位数值
	//读RTC_DR寄存器bit5:4(DT[1:0]),DT[1:0]表示日的十位数值
	//读RTC_DR寄存器bit3:0(DU[3:0]),DU[3:0]表示日的个位数值
	//HAL库耍牛氓,我也耍牛氓

	printf("%02d-%02d-%02d  day:%02d  ", sdatestructureget.Year,sdatestructureget.Month,sdatestructureget.Date,sdatestructureget.WeekDay);
  printf("%02d:%02d:%02d\r\n", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
	//显示时间格式为 : YY-MM-DD hh:mm:ss
}

//函数功能:设置时钟,24小时格式
//RTC_FORMAT_BIN:年月日时分秒的格式是十进数
//RTC_FORMAT_BCD:年月日时分秒的格式是BCD码
//RTC_Set_Date_And_Time(0x21,0x02,0x29,0X04,0x23,0x59,0x30,RTC_FORMAT_BCD);
//RTC_Set_Date_And_Time(21,2,29,4,23,59,30,RTC_FORMAT_BIN);
void RTC_Set_Date_And_Time(uint16_t syear,uint8_t smon,uint8_t sday,uint8_t week,uint8_t hour,uint8_t min,uint8_t sec,uint32_t Format)
{
	uint32_t tmpreg;
	uint32_t datetmpreg;
	uint32_t sTimeFormat;

	__HAL_RTC_WRITEPROTECTION_DISABLE(NULL);
	//RTC->WPR = 0xCAU;RTC->WPR = 0x53U;
  //在“备份域”被修改后,一些RTC寄存器会受到写保护,因此,再次配置,需要解锁。
  //解锁受保护的RTC寄存器的步骤:先将0xCA写入RTC_WPR寄存器,然后将0x53RTC_WPR寄存器
	//HAL库耍牛氓,我也耍牛氓

	RTC_EnterInitMode(NULL);
	//进入修改“RTC_TR和RTC_DR”模式
	//HAL库耍牛氓,我也耍牛氓

	CLEAR_BIT(RTC->CR, RTC_CR_FMT);
	//设置当前时间格式为“24小时格式”
  //RTC_CR寄存器bit6(FMT),令FMT=0表示24小时格式,FMT=1表示12小时格式
	sTimeFormat = 0x00U;//记录当前时间格式为“24小时格式”

	if (Format == RTC_FORMAT_BIN)//十进制数据
	{
		tmpreg = (uint32_t)(((uint32_t)RTC_ByteToBcd2(hour) << RTC_TR_HU_Pos) | \
                          ((uint32_t)RTC_ByteToBcd2(min) << RTC_TR_MNU_Pos) | \
                          ((uint32_t)RTC_ByteToBcd2(sec) << RTC_TR_SU_Pos) | \
                          (((uint32_t)sTimeFormat) << RTC_TR_PM_Pos));
		//RTC_ByteToBcd2()将两位十进制数转换成BCD格式的数据
		datetmpreg = (((uint32_t)RTC_ByteToBcd2(syear) << RTC_DR_YU_Pos) | \
                  ((uint32_t)RTC_ByteToBcd2(smon) << RTC_DR_MU_Pos) | \
                  ((uint32_t)RTC_ByteToBcd2(sday) << RTC_DR_DU_Pos) | \
                  ((uint32_t)week << RTC_DR_WDU_Pos));
	}
	else
	{//数据格式为BCD码:RTC_FORMAT_BCD
		tmpreg = (((uint32_t)(hour) << RTC_TR_HU_Pos) | \
                ((uint32_t)(min) << RTC_TR_MNU_Pos) | \
                ((uint32_t)(sec) << RTC_TR_SU_Pos) | \
                ((uint32_t)(sTimeFormat) << RTC_TR_PM_Pos));
		datetmpreg = ((((uint32_t)syear) << RTC_DR_YU_Pos) | \
                  (((uint32_t)smon) << RTC_DR_MU_Pos) | \
                  (((uint32_t)sday) << RTC_DR_DU_Pos) | \
                  (((uint32_t)week) << RTC_DR_WDU_Pos));
	}
	WRITE_REG(RTC->TR, (tmpreg & RTC_TR_RESERVED_MASK));//修改“时分秒”
	WRITE_REG(RTC->DR, (uint32_t)(datetmpreg & RTC_DR_RESERVED_MASK));//修改“年月日和星期几”

	CLEAR_BIT(RTC->CR, RTC_CR_BKP);
	//将RTC_CR寄存器的bit18(BKP),令BKP=0,取消记忆“夏令时被修改过”
	SET_BIT(RTC->CR, (RTC_DAYLIGHTSAVING_NONE | RTC_STOREOPERATION_RESET));
	//RTC_CR寄存器bit16(ADD1H),ADD1H=0,当前时间不增加1小时
	//RTC_CR寄存器bit18(BKP),BKP=0,不使用“夏令时”
		
  CLEAR_BIT(RTC->ICSR, RTC_ICSR_INIT);
	//RTC_ICSR寄存器bit7(INIT),INIT=0进入“自由运行模式”
  if (READ_BIT(RTC->CR, RTC_CR_BYPSHAD) == 0U)
  {//读RTC_CR寄存器bit5(BYPSHAD),BYPSHAD=0表示“日历值从影子寄存器读取”

    if (HAL_RTC_WaitForSynchro(NULL) != HAL_OK)
    {//等待“日历影子寄存器同步”
    }
  }
  else
  {//RTC_CR寄存器bit5(BYPSHAD),若BYPSHAD=1表示“日历值从日历计数器中读取”
    /* Clear BYPSHAD bit */
    CLEAR_BIT(RTC->CR, RTC_CR_BYPSHAD);
		//RTC_CR寄存器bit5(BYPSHAD),令BYPSHAD=0“日历值从影子寄存器读取”
    if (HAL_RTC_WaitForSynchro(NULL) != HAL_OK)
    {//等待“日历影子寄存器同步”
    }
    /* Restore BYPSHAD bit */
    SET_BIT(RTC->CR, RTC_CR_BYPSHAD);
		//RTC_CR寄存器bit5(BYPSHAD),若BYPSHAD=1表示“日历值从日历计数器中读取”
  }

	__HAL_RTC_WRITEPROTECTION_ENABLE(NULL);
	//RTC->WPR = 0xFFU;//RTC寄存器上锁,使能写保护
	//HAL库耍牛氓,我也耍牛氓
}

//在调用HAL_RTC_Init()之前调用RTC_CALIB_Output_On_RTCOUTx_Pin()
//RTC_CALIB_Output_On_RTCOUTx_Pin(&hrtc,1);//“RTC唤醒”输出从RTC_OUT1引脚输出
//RTC_CALIB_Output_On_RTCOUTx_Pin(&hrtc,2);//“RTC唤醒”输出从RTC_OUT2引脚输出
//配置RTC_OUT1输出“RTC唤醒溢出标志”,其电平时间和WUTF的保持时间有关
void RTC_CALIB_Output_On_RTCOUTx_Pin(RTC_HandleTypeDef *hrtc,uint8_t OutputPin)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	hrtc->Init.OutPutPolarity = RTC_OUTPUT_POLARITY_LOW; //报警TAMPALRM输出低电平;
	hrtc->Init.OutPutType = RTC_OUTPUT_TYPE_PUSHPULL;    //TAMPALRM为推挽输出
	hrtc->Init.OutPutPullUp = RTC_OUTPUT_PULLUP_ON;      //TAMPALRM输出上拉

	if(OutputPin==1)
	{
		__HAL_RCC_GPIOC_CLK_ENABLE();                   //GPIOC时钟使能

    GPIO_InitStruct.Pin = GPIO_PIN_13;              //选择引脚号码为13
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     //推挽输出模式
//	  GPIO_InitStruct.Pull = GPIO_NOPULL;             //引脚上拉和下拉都没有被激活
	  GPIO_InitStruct.Pull = GPIO_PULLUP;           //设置上拉
	  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的输出速度为120MHz
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
	  //根据GPIO_InitStruct结构变量指定的参数初始化GPIOC的外设寄存器

		hrtc->Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;      //RTC_OUT1输出使能,RTC_OUT2输出不使能;
	}
	else if(OutputPin==2)
	{
		__HAL_RCC_GPIOB_CLK_ENABLE();  //使能GPIOB外设时钟
	  GPIO_InitStruct.Pin = GPIO_PIN_2;//选择引脚编号2
	  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;      //复用功能推挽模式
//	GPIO_InitStruct.Pull = GPIO_NOPULL;          //引脚上拉和下拉都没有被激活
	  GPIO_InitStruct.Pull = GPIO_PULLUP;           //设置上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//引脚的输出速度为120MHz
    GPIO_InitStruct.Alternate = GPIO_AF0_RTC_50Hz; //将引脚复用为RTC_OUT2
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

		hrtc->Init.OutPutRemap = RTC_OUTPUT_REMAP_POS1; //RTC_OUT1输出不使能,RTC_OUT2输出使能;
	}
	hrtc->Init.OutPut = RTC_OUTPUT_DISABLE;    //设置“RTC唤醒”“RTC报警A”“RTC报警B”均不输出
}

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

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

相关文章

蓝桥杯4. Fizz Buzz 经典问题

题目描述 给定一个整数 NN&#xff0c;从 1 到 NN 按照下面的规则返回每个数&#xff1a; 如果这个数被 3 整除&#xff0c;返回 Fizz。如果这个数被 5 整除&#xff0c;返回 Buzz如果这个数能同时被 3 和 5 整除&#xff0c;返回 FizzBuzz。如果这个数既不能被 3 也不能被 5…

智能医学(四)——Elsevier特刊推荐

特刊征稿 01 期刊名称&#xff1a; Information Sciences 特刊名称&#xff1a; Open-world Multi-modal Machine Learning for Uncertain Medicine and Healthcare Big Data Analysis 截止时间&#xff1a; 提交开放日期&#xff1a;2024 年 6 月 15 日 最终手稿提交截止…

sass实现文字两侧横线

sass实现文字两侧横线 自我记录 mixin 的基本作用&#xff1a; 代码复用&#xff1a;把常用的样式封装在一起&#xff0c;不需要重复写相同的代码。参数化&#xff1a;可以通过参数动态生成样式&#xff0c;提高灵活性。逻辑处理&#xff1a;结合 Sass 的控制语句&#xff0…

CAD 3dsmax maya等autodesk系列专用卸载修复工具AutoRemove,一键完全彻底卸载删除软件的专用卸载工具

AutoRemove 是一款功能强大的软件卸载工具&#xff0c;专门设计用于彻底清除Autodesk系列软件&#xff0c;如AutoCAD、3ds Max、Revit、Maya、Inventor、Navisworks、civil 3d、sketchbook、Architecture、Electrical、Mechanical、、等&#xff0c;从您的系统中。它通过深度清…

learn C++ NO.13——list

前言 本文将从list的使用&#xff0c;再到根据sgi库对于list实现作为参考模拟实现一下list。通过模拟实现来增加对它的理解。 介绍list list是一个由带头双向循环链表实现的STL容器&#xff0c;它提供常规时间内对数据进行插入和删除操作。 list在内存中存储不连续的空间存储…

Kamailio-超强dispatcher负载均衡模块

Kamailio 负载均衡的功能主要依靠 Dispatcher 模块完成&#xff0c;模块官方文档参看 为什么要引入负载均衡&#xff1f;如何使用&#xff1f; 引入和配置功能路由调用命令行指令 为什么要引入负载均衡&#xff1f; Q: 如果单台VOIP服务的性能不能满足业务需求了&#xff0…

掌握ZooKeeper的二阶段提交及其优缺点

1. ZooKeeper的协议 1.1 ZAB协议 要深入学习ZooKeeper前&#xff0c;胡广认为我们要先学习ZooKeeper的核心理念&#xff0c;所有的ZooKeeper行为都是围绕这个核心来进行的。说了那么多&#xff0c;它就是——ZAB协议。 ZAB协议英文全称叫ZooKeeper Atomic Broadcast&#xf…

TIDB的整体架构和主要功能

1. 基础架构 PD &#xff1a;负责集群管理和调度。TiDB Server &#xff1a;负责 SQL 查询处理。TiKV/TiFlash&#xff1a;负责数据存储和事务处理。 1.1 PD (Placement Driver) Server 1.1.1 基础介绍 整个 TiDB 集群的元信息管理模块&#xff0c;负责存储每个 TiKV 节点实时…

让我们聊一下小团队也可以用的敏捷开发

使用敏捷开发的团队往往需要寻找一个更佳的平衡点&#xff1a; 较少的团队成员&#xff1a;通常更容易沟通和协作&#xff0c;减少了协调成本。小团队&#xff08;如 5 到 9 人&#xff09;能够更灵活地适应变化&#xff0c;且管理和决策过程较为高效。 较多的团队成员&#x…

喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”

近日&#xff0c;「AutoSec 2024第八届中国汽车网络安全周暨第五届智能汽车数据安全展」在上海盛大举行。本届大会由谈思实验室和谈思汽车主办、上海市车联网协会联合主办&#xff0c;以汽车“网络数据安全、软件安全、功能安全”为主题&#xff0c;设置了“31X”模式&#xff…

Docker学习笔记-部署MySQL-命令解读

部署MySQL 先停掉虚拟机中的MySQL&#xff0c;确保你的虚拟机已经安装Docker&#xff0c;且网络开通的情况下&#xff0c;在MobaXterm中执行下面命令即可安装MySQL。 docker run -d \--name mysql \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123456 \mysql …

c++修炼之路之AVL树与红黑树

目录 一&#xff1a;AVL树 1.AVL树的概念 2.AVL树插入数据后平衡因子及更新的情况 3.AVL树节点的定义 4.AVL树的插入及旋转 二&#xff1a;红黑树 1.红黑树的概念及性质 2.红黑树节点的定义 3.红黑树的插入操作情况 4.红黑树与AVL树的比较 接下来的日子会顺顺利利…

多方位实测运动耳机排行榜前十名,助你选出靠谱的运动耳机!

非常荣幸能与各位运动爱好者共聚本次的骨传导耳机知识分享&#xff01;作为一名深耕运动科技领域多年的专家&#xff0c;今天将主要跟大家分析一下市面上比较热门的骨传导耳机。骨传导耳机作为当下市面上非常新颖且有创意的耳机种类&#xff0c;相信有很多用户都想入手一款&…

流片为啥那么重要?

很多微电子与集成电路专业的学生、初入IC职场的工程师&#xff0c;以及电子/机械大类专业的同学&#xff0c;在进入芯片设计行业时&#xff0c;都或多或少听说了参与流片的重要性。 但是却并不是很清楚——流片到底有多重要&#xff1f;流片为什么重要&#xff1f; 研0的同学…

从基础到进阶:利用EasyCVR安防视频汇聚平台实现高效视频监控系统的五步走

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理、智慧城市构建等领域扮演着越来越重要的角色。一个高效智能的视频监控管理系统不仅能够提升监控效率&#xff0c;还能在预防犯罪、事故预警、数据分析等方面发挥巨大作用。 一、需求分析 在设计视频监控管理…

存在分包的微信小程序解包反编译还原(含报错处理与代码修复)

01前言 本文主要对微信小程序的解包步骤进行复现梳理&#xff0c;网上虽然已有明确详细的文章&#xff0c;但是实际复现过程中程序报错的情况并不少见。对此情况进行了梳理以及对相关工具的代码、调用方式等进行了优化修复。 本文内容&#xff1a; 常规微信小程序逆向解析的…

el-input设置后缀显示单位并阻止滚轮微调

项目中收集form表单信息时&#xff0c;有时会需要在el-input后面显示单位&#xff0c;效果如图&#xff1a; 当然&#xff0c;我们可以直接在输入框后面加上单位&#xff0c;但直接给输入框上加单位不管是视图上还是用户体验上看起来都要好一点 element-plus / element-ui给我…

MySQL数据库 — Explain命令

EXPLAIN 命令在 MySQL 查询优化中发挥了重要作用。通过 EXPLAIN 的输出&#xff0c;可以获取有关查询执行计划的详细信息&#xff0c;从而有助于优化和调试查询。不过&#xff0c;它也有一定的局限性。 使用Explain EXPLAIN 语句通过在查询前加上 EXPLAIN 关键字来展示查询的…

正则表达式三板斧

推荐练习网站&#xff1a;https://regex101.com/ 解释一下: 1、最常用的就是[]&#xff0c;表示匹配任意字符&#xff0c;[]中所有的变量只需要输入一次&#xff08;比如搜索三个点…&#xff0c;只需要输入[.]即可&#xff09; 2、*表示>0次&#xff0c;表示>1次&#x…

计算机毕业设计选题推荐-推拿知识互动平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…