STM32G474RE之RTC

news2024/11/15 17:53:04

STM32G474RE之RTC使用HAL库实现RTC时间配置,以及报警配置,支持双路报警。

1、STM32G474RE的RTC晶振引脚:

OSC32_IN为PC14,OSC32_OUT为PC15;

2、Vbat引脚

Vbat引脚是用来给外部晶振LSE和备份寄存器提供电源。当没有“外部电池”连接到Vbat引脚,RTC会使用VDD供电。因此Vbat也可以不接“外部电池”。1.55V<Vbat<3.6V

通过上图,连接到Vbat的外部电池,需要设计充电电路给它充电

3、RTC_OUT映射

RTC报警输出RTC_OUT1和RTC_OUT2
RTC_OUT1为PC13,RTC_OUT2为PB2;

RTC_CR寄存器的bit22:21(OSEL[1:0])
OSEL[1:0]=00b,输出不使能
OSEL[1:0]=01b,RTC报警器A输出使能
OSEL[1:0]=10b,RTC报警器B输出使能
OSEL[1:0]=11b,RTC唤醒输出使能

RTC_CR寄存器的bit31(OUT2EN)
OUT2EN=0,RTC_OUT2输出不使能;
OUT2EN=1,RTC_OUT2输出使能;

RTC_CR寄存器的bit23(COE)
COE=0校准输出不使能
COE=1校准输出使能

RTC_CR寄存器的bit19(COSEL)
COE=1且COSEL=0,CALIB输出为512Hz
COE=1且COSEL=1,CALIB输出为1Hz

 4、测试程序

RTC.c程序

RTC_HandleTypeDef hrtc;

void RTC_Init(void);
void RTC_Display(void);

void TEST_Hal_RTC_Set_Alarm_A(void);
void TEST_Hal_RTC_Set_Alarm_B(void);

void RTC_Init(void)
{
	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同步预分配器的值。
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  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

		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
  }


  TEST_Hal_RTC_Set_Alarm_A();
  TEST_Hal_RTC_Set_Alarm_B();
}

//函数功能:显示“年月日和星期几”以及“时分秒”
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年2月29日星期四23:59:50:00
void Test_RTC_Set_Date_And_Time(void)
{
  RTC_TimeTypeDef sTime = {0};  //用来设置时间“时分秒”
  RTC_DateTypeDef sDate = {0};  //用来设置日期“年月日和星期几”

	sTime.Hours = 0x23;      //这里是BCD码,0x23表示23小时
	sTime.Minutes = 0x59;    //这里是BCD码,0x59表示59分钟
	sTime.Seconds = 0x50;    //这里是BCD码,0x50表示50秒种
	sTime.SubSeconds = 0x00;
	//RTC_SSR寄存器bit15:0(SS[15:0])是只读的,这里设置为0x00没有意义
	sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
	//RTC_CR寄存器bit16(ADD1H),ADD1H=0,当前时间不增加1小时
	//若使用“夏令时”,ADD1H=1,表示当前时间增加1小时
	sTime.StoreOperation = RTC_STOREOPERATION_RESET;
	//RTC_CR寄存器bit18(BKP),BKP=0,不使用“夏令时”
	//现在已经废除了“夏令时”,不要去了解。
	HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD);
	//设置“时分秒”

	sDate.WeekDay = RTC_WEEKDAY_THURSDAY;
	//这里是BCD码,RTC_WEEKDAY_THURSDAY表示0x04,星期四
	sDate.Date = 0x29; //这里是BCD码,0x29表示29日
	sDate.Month = RTC_MONTH_FEBRUARY;
	//这里是BCD码,RTC_MONTH_FEBRUARY表示0x02,2月
	sDate.Year = 0x24; //这里是BCD码,0x24表示24年
	HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD);
	//设置“年月日”
}

//使用HAL设置报警,有点呆板
void TEST_Hal_RTC_Set_Alarm_A(void)
{
	RTC_AlarmTypeDef sAlarm = {0};//用来设置报警时间

	HAL_RTC_DeactivateAlarm(&hrtc,RTC_ALARM_A);
	//选择RTC_ALARM_A时,表示停用AlarmA报警:
	//不使能“Alarm A报警”和“Alarm A报警中断”,同时不选择“RTC报警事件”作为触发源
	//必须先停用AlarmA报警,才能配置AlarmA报警时间

	sAlarm.Alarm = RTC_ALARM_A; //指定配置RTC报警A寄存器(RTC_ALRMAR)
	sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT_24;  //指定RTC报警小时的格式

  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
	//指定RTC警报是按照日期报警
  sAlarm.AlarmDateWeekDay = 0x01;
	//每月1号报警

//  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
	//指定RTC警报是按照星期报警
//  sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_FRIDAY;
	//每个星期五报警

  sAlarm.AlarmTime.Hours = 0x00;    //这里是BCD码,0x00表示00小时
  sAlarm.AlarmTime.Minutes = 0x00;  //这里是BCD码,0x00表示00分钟
  sAlarm.AlarmTime.Seconds = 0x20;  //这里是BCD码,0x20表示20秒种
  sAlarm.AlarmTime.SubSeconds = 0x30;
	//RTC_ALRMASSR寄存器bit27:24(MASKSS[3:0]),bit14:0(SS[14:0])
	//当选择“RTC_ALARM_A”时,时间写入RTC_ALRMAR
	//当选择“RTC_ALARM_B”时,时间写入RTC_ALRMBR

//  sAlarm.AlarmMask = RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES|RTC_ALARMMASK_DATEWEEKDAY;
	//RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES|RTC_ALARMMASK_DATEWEEKDAY不关注日期小时和分钟,则每分钟报警一次
  sAlarm.AlarmMask = RTC_ALARMMASK_ALL;
	//RTC_ALARMMASK_ALL不关注日期,小时,分钟和秒,则每秒种报警一次

  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
	//需要匹配“子秒”
  HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);

  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 5, 0);
	//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
	//选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}

//使用HAL设置报警,有点呆板
void TEST_Hal_RTC_Set_Alarm_B(void)
{
	RTC_AlarmTypeDef sAlarm = {0};//用来设置报警时间

	HAL_RTC_DeactivateAlarm(&hrtc,RTC_ALARM_B);
	//选择RTC_ALARM_A时,表示停用AlarmB报警:
	//不使能“Alarm B报警”和“Alarm B报警中断”,同时不选择“RTC报警事件”作为触发源
	//必须先停用AlarmB报警,才能配置AlarmB报警时间

	sAlarm.Alarm = RTC_ALARM_B; //指定配置RTC报警B寄存器(RTC_ALRMBR)
	sAlarm.AlarmTime.TimeFormat = RTC_HOURFORMAT_24;  //指定RTC报警小时的格式

  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
	//指定RTC警报是按照日期报警
  sAlarm.AlarmDateWeekDay = 0x01;
	//每月1号报警

//  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY;
	//指定RTC警报是按照星期报警
//  sAlarm.AlarmDateWeekDay = RTC_WEEKDAY_FRIDAY;
	//每个星期五报警

  sAlarm.AlarmTime.Hours = 0x00;    //这里是BCD码,0x00表示00小时
  sAlarm.AlarmTime.Minutes = 0x00;  //这里是BCD码,0x00表示00分钟
  sAlarm.AlarmTime.Seconds = 0x20;  //这里是BCD码,0x20表示20秒种
  sAlarm.AlarmTime.SubSeconds = 0x30;
	//RTC_ALRMASSR寄存器bit27:24(MASKSS[3:0]),bit14:0(SS[14:0])
	//当选择“RTC_ALARM_A”时,时间写入RTC_ALRMAR
	//当选择“RTC_ALARM_B”时,时间写入RTC_ALRMBR

//  sAlarm.AlarmMask = RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES|RTC_ALARMMASK_DATEWEEKDAY;
	//RTC_ALARMMASK_HOURS|RTC_ALARMMASK_MINUTES|RTC_ALARMMASK_DATEWEEKDAY不关注日期小时和分钟,则每分钟报警一次
  sAlarm.AlarmMask = RTC_ALARMMASK_ALL;
	//RTC_ALARMMASK_ALL不关注日期,小时,分钟和秒,则每秒种报警一次

  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
	//需要匹配“子秒”
  HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD);

  HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 5, 0);
	//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
	//选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
  HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}

void RTC_Alarm_IRQHandler(void)
{
//  HAL_RTC_AlarmIRQHandler(&hrtc);
  uint32_t tmp = READ_REG(RTC->MISR);//Get interrupt status

  if ((tmp & RTC_MISR_ALRAMF) != 0U)//RTC ALARM A报警
  {//当选择“RTC_ALARM_A”时,时间与RTC_ALRMAR相同时报警
    WRITE_REG(RTC->SCR, RTC_SCR_CALRAF);
		//Clear the AlarmA interrupt pending bit
//    __HAL_RTC_ALARM_EXTI_CLEAR_IT();
//		LED1_On();//报警时,LED亮
		LED1_Toggle();
  }

  if ((tmp & RTC_MISR_ALRBMF) != 0U)//RTC ALARM A报警
  {
		//当选择“RTC_ALARM_B”时,时间与RTC_ALRMBR相同时报警
    WRITE_REG(RTC->SCR, RTC_SCR_CALRBF);
		//Clear the AlarmB interrupt pending bit
//    __HAL_RTC_ALARM_EXTI_CLEAR_IT();
		LED2_Toggle();
  }
	__HAL_RTC_ALARM_EXTI_CLEAR_IT();
}

RTC.h程序

#ifndef __RTC_H__
#define __RTC_H__

#include "stm32g4xx_hal.h"
//使能int8_t,int16_t,int32_t,int64_t
//使能uint8_t,uint16_t,uint32_t,uint64_t

//#define RTC_CLOCK_SOURCE_LSI    //RTC使用CPU内部LSI作为时钟源
#define RTC_CLOCK_SOURCE_LSE

#ifdef RTC_CLOCK_SOURCE_LSI
#define RTC_ASYNCH_PREDIV    0x7C
#define RTC_SYNCH_PREDIV     0xF9
#endif

#ifdef RTC_CLOCK_SOURCE_LSE
#define RTC_ASYNCH_PREDIV  0x7F
#define RTC_SYNCH_PREDIV   0xFF
#endif

extern void RTC_Init(void);
extern void RTC_Display(void);

#endif /*__ RTC_H__ */

5、测试结果

6、配置RTC_OUT引脚输出

//在调用HAL_RTC_Init()之前调用RTC_OUTx_Init()
//RTC_OUTx_Init(&hrtc,RTC_OUTPUT_ALARMA,1);//RTC报警器A从RTC_OUT1引脚输出
//RTC_OUTx_Init(&hrtc,RTC_OUTPUT_ALARMB,1);//RTC报警器B从RTC_OUT1引脚输出
//RTC_OUTx_Init(&hrtc,RTC_OUTPUT_ALARMA,2);//RTC报警器A从RTC_OUT2引脚输出
//RTC_OUTx_Init(&hrtc,RTC_OUTPUT_ALARMB,2);//RTC报警器B从RTC_OUT2引脚输出

注意:
配置RTC_OUT1输出“RTC报警器A的报警标志”,RTC_OUT1输出的电平时间和ALRAF的保持时间有关;
配置RTC_OUT2输出“RTC报警器A的报警标志”,RTC_OUT2输出的电平时间和ALRAF的保持时间有关;

配置RTC_OUT1输出“RTC报警器B的报警标志”,RTC_OUT1输出的电平时间和ALRBF的保持时间有关;
配置RTC_OUT2输出“RTC报警器B的报警标志”,RTC_OUT2输出的电平时间和ALRBF的保持时间有关

 

 调用举例:

 中断函数添加一个延时,否则,示波器差,会看不到波形

 

这里是为了演示RTC_OUT1和RTC_OUT2输出。 

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

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

相关文章

9.11 QT ( Day 4)

一、作业 1.Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> //定时器类 #include <QTime> #include <QtTextToSpeech> //文本转语音类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEcl…

Redis——通用命令

目录 Redis通用命令Redis中最核心的两个命令getset Redis全局命令keys语法注意事项 existsdel(delete)expirettlredis的key的过期策略是怎么实现的&#xff1f;**了解拓展** type总结 Redis通用命令 Redis的命令非常非常多&#xff0c;所以 1. 掌握常用命令&#xff08;多操作…

ardunio超声波测距实验

工作原理 模块有2个超声波换能器&#xff08;如图所示&#xff09;&#xff0c;一个发出声波&#xff0c;另一个接收物体反射回来的声波&#xff0c;这中间所经过的时间即声波传播的时间&#xff0c;再结合声速就能计算出&#xff1a; 距离 声速 * 时间 2 如何使用HC-SR04模块…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲&#xff0c;在演讲中Larry将AI技术和云战略推到了前所未有的高度&#xff0c;从新的Oracle 23c改名到Oracle23ai&#xff0c;到Oracl…

unity3d入门教程一

unity3d入门教程一 2.1-开发环境2.2 新建项目3.1编辑器页面3.2场景3.3添加资源4.1场景视图4.2游戏对象4.3坐标系4.4游戏对象的操作4.5摄像机 2.1-开发环境 https://unity.com/ https://unity.cn/ 安装时若卡住&#xff0c;打开路径自动安装 C:\Users\zhaocai\AppData\Local\T…

信息安全国内外现状及技术要求示例(R155/R156)

国际政策、 法规的现状与趋势 鉴于对交通安全、社会安全甚至国家安全的重要影响&#xff0c;汽车网络安全、数据安全得到各相关国家和地区的高度重视&#xff0c;纷纷出台相关法规、标准。 信息安全法规 R155 法规适用范围覆盖了乘用车及商用车&#xff0c;适用于 M 类、N 类…

北斗盒子:海上安全的智能守护者——落水报警应用案例

海上环境多变&#xff0c;无论是航行还是作业活动&#xff0c;安全始终是最重要的考量。近年来&#xff0c;我国大力发展海上经济&#xff0c;海上作业的增加也带来了溺水事故的频发&#xff0c;给家庭和社会带来沉重的伤痛。据世界卫生组织统计&#xff0c;溺水是世界各地非故…

SQL(结构性查询语句)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、SQL是什么&#xff1f;二、DDL三、DML四、DQL五、DCL总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、SQL是什么&#xff…

【R语言】删除数据框中所有行中没有大于200的数值的行

在Perl中还需要循环按行读入文件&#xff0c;而在R中&#xff0c;一行代码解决问题&#xff1a; df <- df[apply(df, 1, function(x) any(x > 200)), ]这是一个使用apply函数对数据框df进行操作的表达式。apply函数用于对数据框、矩阵或数组进行元素级别的操作。 df&am…

虚拟机安装教程

做一期详细的虚拟机安装教程 VM16.12版本下载地址&#xff1a;联想乐云 VM16版本许可证&#xff1a;ZF3R0-FHED2-M80TY-8QYGC-NPKYF 第一步双击打开安装包&#xff1a; 选择安装位置&#xff0c;选择空间充足的磁盘&#xff0c;一般不建议直接装c 取消勾选 等待安装 输入许可…

sqli-labs靶场自动化利用工具——第6关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

中信银行信用卡中心社招:TAS人才测评系统题库及通关攻略更新了!

中信银行信用卡中心&#xff08;以下简称“卡中心”&#xff09;是中信银行在深圳设立的对信用卡业务进行统一管理、集中操作、独立核算的专营机构。2002年底&#xff0c;由中信银行总行与中信嘉华银行在深圳合作筹建成立&#xff1b;卡中心自成立伊始&#xff0c;始终坚持“以…

Windows系统一键启动Redis脚本

Redis 是一个开源的、高性能的键值存储数据库&#xff0c;广泛应用于缓存、数据分析、消息队列等场景。无论是在开发环境还是生产环境中&#xff0c;快速启动 Redis 服务都是非常重要的。为此&#xff0c;本文将介绍如何在 Windows 系统中创建一键启动 Redis 的脚本&#xff0c…

网络安全 L2 Introduction to Cryptography 密码学

Definitions 1. crypto - hidden/secret grafia - writing 2. “the science and study of secret writing” 3. Cryptography is the science of protecting data, which provides means of converting data into unreadable form, so that 1. the data cannot be ac…

make 程序规定的 makefile 文件的书写语法(2)

&#xff08;13&#xff09;接着开始一个更复杂的例子&#xff0c;课程的素材 2 &#xff0c;先给出书写 makefile 的框架 &#xff1a; &#xff08;14&#xff09; &#xff08;15&#xff09; 谢谢

0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考&#xff1a; Nginx越界读取缓存漏洞 CVE-2017-7529 | PeiQi文库 (wgpsec.org)Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;复现分析 - qweg_focus - 博客园 (cnblogs.com) 一、fofa 搜索 nginx && port"80" 我这里写了个脚本将ip保存…

el-form之表单校验自动定位到报错位置问题,,提升用户体验

需求描述 由于需要填写的表单项太多&#xff0c;提交的时候校验不通过&#xff0c;如果没填写的表单项在最上面&#xff0c;用户看不到不知道发生了啥&#xff0c;所以需要将页面滚动定位到第一个报错的表单项位置&#xff0c;提升用户体验 实现步骤 点击保存校验 报错项class会…

opencv 之 实战项目 识别银行卡上的数字

OpenCV 之 实战项目&#xff1a;识别银行卡上的数字 引言 在日常生活中&#xff0c;银行卡的识别是一个常见的需求&#xff0c;特别是在金融领域。本实战项目旨在使用 OpenCV 库来识别银行卡上的数字。我们将通过模板匹配的方法&#xff0c;结合图像处理技术&#xff0c;来准…

【网络安全】基础知识详解(非常详细)零基础入门到精通

一、什么是网络安全&#xff1f; 百度上对“网络安全”是这么介绍的&#xff1a; “网络安全是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行&#xff0c;网络服务不中断。” 嗯…是不…

Xubuntu22.04之四种方式:查看U盘、硬盘格式(二百六十七)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…