当前位置: 首页 > news >正文

GD32F103待机模式与唤醒

GD32F103待机模式与唤醒,本程序使用RTC报警唤醒。

电源管理单元有3种省电模式:睡眠模式,深度睡眠模式和待机模式
进入待机模式的步骤如下:
若需要RTC闹钟输出,则需要将TAMPER-RTC映射到PC13引脚;
若需要LXTAL晶振32.768KHz,则将OSC32IN映射到PC14引脚,OSC32OUT映射到PC15引脚;现在出厂,都已经默认,不必重新映射。
当LXTAL晶振32.768KHz关闭时,OSC32IN和OSC32OUT可以用作PC14和PC15;
若需要WKUP引脚唤醒,则将WKUP引脚映射到PA0;
进入待机模式后,其他所有I/O都处于高阻态;
1,配置SLEEPDEEP=1
2,配置STBMOD=1
3,配置WUF=0,
4,执行WFI指令或执行2次WFE指令(不清楚原因),命令CPU进入待机模式。

在待机状态,无法烧录程序,必须使用外部复位唤醒,才可以烧录程序。待机前,最好添加延时程序,防止程序无法烧录。

待机模式的结果:
1,需要LDO1.2V供电的电路会被停止供电;
2,内部LDO停止1.2V输出;
3,IRC8M内部RC的8MHz振荡器被关闭;
4,HXTAL外部高速振荡器被关闭;
5,PLL锁相环被关闭;
6,IRC40K内部RC的40KHz振荡器工作,FWDGT独立看门狗定时器启动时会选择IRC40K作为时钟源;
7,LXTAL外部低速振荡器32.768Hz工作,原因是RTC产生报警会让CPU退出待机模式;

待机模式有4个唤醒源:
1,NRST引脚产生产生外部复位信号,CPU会退出待机模式;
2,RTC产生闹钟中断,CPU会退出待机模式;
3,FWDGT独立看门狗定时器产生复位信号,CPU会退出待机模式;
4,WKUP引脚出现上升沿信号,CPU会退出待机模式;

待机模式功耗最低,但唤醒时间最长;
进入待机模式后,SRAM和1.2V电源寄存器的内容会被丢失;
退出待机模式后,CPU产生上电复位;对于GD32芯片,它会从0x80000000地址开始执行代码;

#include "StandbyMode.h"/*
电源管理单元有3种省电模式:睡眠模式,深度睡眠模式和待机模式;
进入待机模式的步骤如下:
若需要RTC闹钟输出,则需要将TAMPER-RTC映射到PC13引脚;
若需要LXTAL晶振32.768KHz,则将OSC32IN映射到PC14引脚,OSC32OUT映射到PC15引脚;
当LXTAL晶振32.768KHz关闭时,OSC32IN和OSC32OUT可以用作PC14和PC15
若需要WKUP引脚唤醒,则将WKUP引脚映射到PA0;
其他所有I/O都处于高阻态;
1,配置SLEEPDEEP=1
2,配置STBMOD=1
3,配置WUF=0,
4,执行WFI指令或执行2次WFE指令(不清楚原因),命令CPU进入待机模式。待机模式的结果:
1,需要LDO1.2V供电的电路会被停止供电;
2,内部LDO停止1.2V输出;
3,IRC8M内部RC的8MHz振荡器被关闭;
4,HXTAL外部高速振荡器被关闭;
5,PLL锁相环被关闭;
6,IRC40K内部RC的40KHz振荡器工作,FWDGT独立看门狗定时器启动时会选择IRC40K作为时钟源;
7,LXTAL外部低速振荡器32.768Hz工作,原因是RTC产生报警会让CPU退出待机模式;待机模式有4个唤醒源:
1,NRST引脚产生产生外部复位信号,CPU会退出待机模式;
2,RTC产生闹钟中断,CPU会退出待机模式;
3,FWDGT独立看门狗定时器产生复位信号,CPU会退出待机模式;
4,WKUP引脚出现上升沿信号,CPU会退出待机模式;待机模式功耗最低,但唤醒时间最长;
进入待机模式后,SRAM和1.2V电源寄存器的内容会被丢失;
退出待机模式后,CPU产生上电复位;对于GD32芯片,它会从0x80000000地址开始执行代码;
*/void Enter_StandbyMode0_Use_WFI_CMD(void);
void Enter_StandbyMode0_Use_WFE_CMD(void);/*
注意:
在待机模式下,除了RESET引脚,配置为RTC功能的PC13,用作LXTAL晶振32.768KHz引脚的PC14和PC15,使能的WKUP引脚,
其他所有I/O都处于高阻态;
从待机唤醒后,除了"电源控制和状态寄存器(PMU_CS)"外,其它所有寄存器均被复位。
从待机模式唤醒后的代码执行等同于复位后的执行,"电源控制和状态寄存器(PMU_CS)"将会指示内核由待机状态退出。
*///函数功能:使用WFI命令使CPU进入进入待机模式
void Enter_StandbyMode0_Use_WFI_CMD(void)
{rcu_periph_clock_enable(RCU_PMU);//使能RCU_PMU外设时钟pmu_to_standbymode(WFI_CMD);//SLEEPDEEP=1,STBMOD=1,WURST=1使用WFI命令,使CPU进入待机模式//唤醒方式:NRST引脚,WKUP引脚,FWDGT复位,RTC闹钟报警
}//函数功能:使用WFE命令使CPU进入进入待机模式
void Enter_StandbyMode0_Use_WFE_CMD(void)
{rcu_periph_clock_enable(RCU_PMU);//使能RCU_PMU外设时钟pmu_to_standbymode(WFE_CMD);pmu_to_standbymode(WFE_CMD);//执行2次WFE指令(不清楚原因)后,CPU才会进入待机模式。//SLEEPDEEP=1,STBMOD=1,WURST=1使用WFE命令,使CPU进入待机模式//唤醒方式:NRST引脚,WKUP引脚,FWDGT复位,RTC
}

#include "RTC.h"
#include "delay.h"
#include "stdio.h"//PC13仅可以作为RTC功能引脚
//PC14和PC15可以作为通用I/O口或外部32.768KHz低速晶振引脚
u8 RTC_Alarm;
const u8 table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; 				    //月修正数据表	  
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //平年的月份日期表
_calendar_obj calendar;		   //时钟结构体 
_calendar_obj calendarAlarm; //报警时间结构体u8 Is_Leap_Year(u16 year);
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);
u8 RTC_Alarm_Set(u16 year, u8 month, u8 day, u8 hour, u8 min, u8 sec);
u8 RTC_Get(void);
u8 RTC_Alarm_After_xSecond(u16 xSecond);
u8 RTC_Get_Week(u16 year, u8 month, u8 day);//函数功能:设置RTC的中断优先级
void RTC_NVIC_Configuration(void)
{//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)//nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"nvic_irq_enable(RTC_IRQn,6,0);//设置RTC_IRQn的中断优先级,抢占优先级为6,子优先级为0
}//函数功能:配置RTC,并读取RTC时间保存在结构变量calendar中
u8 RTC_Init(void)
{u16 temp = 0;rcu_periph_clock_enable(RCU_BKPI); //使能"RCU_BKPI备份寄存器时钟"rcu_periph_clock_enable(RCU_PMU);  //使能"RCU_PMU电源管理单元时钟"pmu_backup_write_enable();//使能对备份域寄存器的写访问if (bkp_data_read(BKP_DATA_0) != 0xA5A5)//发现RTC掉电{bkp_deinit();rcu_osci_on(RCU_LXTAL);//启用"外部32.768KHz晶振"时钟源temp=0;while(rcu_flag_get(RCU_FLAG_LXTALSTB) == RESET && temp < 5000){temp++;delay_ms(1);}if(temp >= 5000)return 1;//初始化时钟失败,晶振有问题rcu_osci_stab_wait(RCU_LXTAL);//等待"外部32.768KHz晶振"时钟源稳定rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);//设置RTC时钟源选择外部32.768KHzrcu_periph_clock_enable(RCU_RTC);//使能"RCU_RTC"时钟rtc_register_sync_wait();//等待"寄存器与APB1时钟同步"rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_interrupt_enable(RTC_INT_SECOND);//秒中断使能rtc_interrupt_enable(RTC_INT_ALARM);//闹钟中断使能rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_configuration_mode_enter();//允许配置rtc_prescaler_set(32767);//将32767的值写入RTC预分频器rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"RTC_Set(2021,3,5,14,20,00);  	//设置时间rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_register_sync_wait();//等待"寄存器与APB1时钟同步"rtc_configuration_mode_exit();//不使能RTC配置//RTC_Alarm_Set(2021,3,5,14,25,00);//设置5分钟后RTC报警bkp_data_write(BKP_DATA_0, 0xA5A5);}else//系统继续计时{rcu_periph_clock_enable(RCU_PMU);//使能RCU_PMU外设时钟pmu_backup_write_enable();//使能对备份域寄存器的写访问rtc_register_sync_wait();//等待"寄存器与APB1时钟同步"rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_interrupt_enable(RTC_INT_SECOND);//秒中断使能rtc_interrupt_enable(RTC_INT_ALARM);//闹钟中断使能rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"}RTC_NVIC_Configuration();RTC_Get();//更新时间RTC_Alarm_After_xSecond(60);//设置1分钟后RTC报警return 0;//ok
}//函数功能:判断是否是闰年
//测试时间:2018年11月8日		
u8 Is_Leap_Year(u16 year)
{if(year % 4 == 0) //必须能被4整除{if(year % 100 == 0){if(year % 400 == 0)return 1; //如果以00结尾,还要能被400整除else return 0;}else return 1;}else return 0;
}//函数功能:设置时钟					 
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{u16 t;u32 seccount = 0;if(syear < 1970 || syear > 2099)return 1;for(t = 1970; t < syear; t++)	//把所有年份的秒钟相加{if(Is_Leap_Year(t))seccount += 31622400; //闰年的秒钟数else seccount += 31536000;			 //平年的秒钟数}smon -= 1;for(t = 0; t < smon; t++)	 //把前面月份的秒钟数相加{seccount += (u32)mon_table[t] * 86400;//月份秒钟数相加if(Is_Leap_Year(syear) && t == 1)seccount += 86400; //闰年2月份增加一天的秒钟数}seccount += (u32)(sday - 1) * 86400; //把前面日期的秒钟数相加seccount += (u32)hour * 3600; //小时秒钟数seccount += (u32)min * 60;	 //分钟秒钟数seccount += sec; //最后的秒钟加上去rcu_periph_clock_enable(RCU_BKPI); //使能"RCU_BKPI备份寄存器时钟"rcu_periph_clock_enable(RCU_PMU);  //使能"RCU_PMU电源管理单元时钟"pmu_backup_write_enable();//使能对备份域寄存器的写访问rtc_counter_set(seccount);//将预设时间(总秒数值)写入RTC计数器rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"return 0;   
}u8 RTC_Alarm_Set(u16 year, u8 month, u8 day, u8 hour, u8 min, u8 sec)
{u16 t;u32 seccount = 0;if(year < 1970 || year > 2099) return 1;for(t = 1970; t < year; t++){if(Is_Leap_Year(t)) seccount += 31622400;else seccount += 31536000;}month -= 1;for(t = 0; t < month; t++){seccount += (u32)mon_table[t] * 86400;if(Is_Leap_Year(year) && t == 1) seccount += 86400;}seccount += (u32)(day - 1) * 86400;seccount += (u32)hour * 3600;seccount += (u32)min * 60;seccount += sec;rcu_periph_clock_enable(RCU_BKPI); //使能"RCU_BKPI备份寄存器时钟"rcu_periph_clock_enable(RCU_PMU);  //使能"RCU_PMU电源管理单元时钟"pmu_backup_write_enable();//使能对备份域寄存器的写访问rtc_configuration_mode_enter();//允许配置rtc_alarm_config(seccount);//将"闹钟时间"(总秒数值)的值写入RTC闹钟寄存器rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_configuration_mode_exit();//不使能RTC配置return 0;
}//函数功能:获取时钟
u8 RTC_Get(void)
{static u16 daycnt=0;u32 timecount=0; u32 temp=0;u16 temp1=0;//RTC->CNTH和RTC->CNTL可以保存110年的总秒数是0xCEC42100//timecount=RTC->CNTH;//得到计数器中的值(秒钟数)//timecount<<=16;//timecount+=RTC->CNTL;timecount=rtc_counter_get();calendar.ReadTotalSecond=timecount;//记录总秒数	temp=timecount/86400;   //得到天数(秒钟数对应的)if(daycnt!=temp)//超过一天了{	  daycnt=temp;temp1=1970;	//从1970年开始while(temp>=365){				 if(Is_Leap_Year(temp1))//是闰年{if(temp>=366)temp-=366;//闰年的秒钟数else break;  }else temp-=365;	  //平年 temp1++;//年份加一  }   calendar.w_year=temp1;//保存年份temp1=0;while(temp>=28)//超过了一个月{if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2月份{if(temp>=29)temp-=29;//闰年的秒钟数else break; }else {if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年else break;}temp1++;  }calendar.w_month=temp1+1;	//得到月份calendar.w_date=temp+1;  	//得到日期 }temp=timecount%86400;     		//得到秒钟数   	   calendar.hour=temp/3600;     	//小时calendar.min=(temp%3600)/60; 	//分钟	calendar.sec=(temp%3600)%60; 	//秒钟//calendar.msec=(32767-RTC_GetDivider())*1000/32767;//读取毫秒值temp=rtc_counter_get();//Gets the RTC divider valuetemp=32767-temp;temp=temp*1000;calendar.msec=temp/32767;return 0;
}//函数功能:设置xSecond秒后报警
u8 RTC_Alarm_After_xSecond(u16 xSecond)
{u32 seccount;RTC_Get();seccount=calendar.ReadTotalSecond;seccount=seccount+xSecond;rcu_periph_clock_enable(RCU_BKPI); //使能"RCU_BKPI备份寄存器时钟"rcu_periph_clock_enable(RCU_PMU);  //使能"RCU_PMU电源管理单元时钟"pmu_backup_write_enable();//使能对备份域寄存器的写访问rtc_configuration_mode_enter();//允许配置rtc_alarm_config(seccount);//将"闹钟时间"(总秒数值)的值写入RTC闹钟寄存器rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"rtc_configuration_mode_exit();//不使能RTC配置return 0;
}//获得现在是星期几
//功能描述:输入公历日期得到星期(只允许1901-2099年)
//输入参数:公历年月日
//返回值:星期号
u8 RTC_Get_Week(u16 year, u8 month, u8 day)
{u16 temp2;u8 yearH, yearL;yearH = year / 100;yearL = year % 100;// 如果为21世纪,年份数加100if (yearH > 19)yearL += 100;// 所过闰年数只算1900年之后的temp2 = yearL + yearL / 4;temp2 = temp2 % 7;temp2 = temp2 + day + table_week[month - 1];if (yearL % 4 == 0 && month < 3)temp2--;return(temp2 % 7);
}const char RTC_rn_REG[]="\r\n";
//函数功能:RTC显示时间
void Time_Print_Display(void)
{printf("%s",RTC_rn_REG);printf("Date: %0.4d-%0.2d-%0.2d ",calendar.w_year,calendar.w_month,calendar.w_date);printf("Time: %0.2d:%0.2d:%0.2d:%0.3d",calendar.hour,calendar.min,calendar.sec,calendar.msec);
}//函数功能:RTC时钟中断
void RTC_IRQHandler(void)
{if (rtc_flag_get(RTC_FLAG_SECOND) != RESET){RTC_Get();//BEEP = 1;}if (rtc_flag_get(RTC_FLAG_ALARM) != RESET){//闹钟标志RTC_Alarm=1;RTC_Alarm_After_xSecond(60);    //设置1分钟后RTC报警rtc_flag_clear(RTC_FLAG_ALARM); //清除"闹钟"标志位rtc_interrupt_flag_clear(RTC_INT_FLAG_ALARM);//清除"闹钟"中断标志      }rtc_flag_clear(RTC_FLAG_SECOND);//清除"秒标志"位rtc_interrupt_flag_clear(RTC_INT_FLAG_SECOND);//清除"秒中断标志"rtc_lwoff_wait();//等待"上次对RTC寄存器写操作完成"
}
#ifndef __RTC_H
#define __RTC_H#include "sys.h"
//#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t,boolextern u8 RTC_Alarm;
typedef struct
{vu8 hour;vu8 min;vu8 sec;vu16 msec;vu16 w_year;vu8  w_month;vu8  w_date;vu8  week;u32  ReadTotalSecond;
}_calendar_obj;
extern _calendar_obj calendar;
extern _calendar_obj calendarAlarm;extern u8 Is_Leap_Year(u16 year);extern u8 RTC_Init(void);
extern u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec);
extern u8 RTC_Get(void);
extern u8 RTC_Alarm_After_xSecond(u16 xSecond);
extern u8 RTC_Get_Week(u16 year, u8 month, u8 day);
extern u8 RTC_Alarm_Set(u16 year, u8 month, u8 day, u8 hour, u8 min, u8 sec);
extern void Time_Print_Display(void);#endif

main.c如下:

#include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t
#include "delay.h"
#include "stdio.h"  //使能printf(),sprintf()
#include "UART3.h"
#include "StandbyMode.h"
#include "RTC.h"uint8_t MainCnt;
const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
//PC13仅可以作为RTC功能引脚
//PC14和PC15可以作为通用I/O口或外部32.768KHz低速晶振引脚
int main(void)
{//MySystemClockInit(1,1);//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"INTX_ENABLE();//开启所有中断GD32F103_UART3_Init(115200);//初始化UART3printf("%s",CPU_Reset_REG);//调试串口输出"\r\nCPU reset!\r\n"delay_init();RTC_Init();MainCnt=0;while(MainCnt<10){MainCnt++;delay_ms(500);Time_Print_Display();if(RTC_Alarm){printf("\r\nRTC_Alarm0");RTC_Alarm=0;}}printf("\r\nWFI\r\n");
//	Enter_StandbyMode0_Use_WFI_CMD();   //使用WFI命令使CPU进入待机模式Enter_StandbyMode0_Use_WFE_CMD(); //使用WFE命令使CPU进入待机模式//RTC报警后,退出待机模式后CPU复位///下面的语句不会执行///while(1){delay_ms(500);Time_Print_Display();if(RTC_Alarm){printf("\r\nRTC_Alarm1");RTC_Alarm=0;}}
}

相关文章:

GD32F103待机模式与唤醒

GD32F103待机模式与唤醒&#xff0c;本程序使用RTC报警唤醒。 电源管理单元有3种省电模式:睡眠模式,深度睡眠模式和待机模式&#xff1b; 进入待机模式的步骤如下&#xff1a; 若需要RTC闹钟输出&#xff0c;则需要将TAMPER-RTC映射到PC13引脚; 若需要LXTAL晶振32.768KHz&…...

【Linux初阶】基础IO - 动静态库 | 初识、生成、链接、加载

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;动静态库初识&#xff0c;库的含义&#xff0c;静态库的生成与链接&#xff0c;gcc/g默认链接方式&#xff0c…...

为Git仓库设置签名信息

前言 在首次使用git版本库或创建新的仓库时&#xff0c;需要为其仓库设定管理员和管理员邮箱。 在为仓库添加管理员和邮箱地址时&#xff0c;有以下两种情况&#xff1a; &#xff08;1&#xff09;全局模式&#xff1a;首次创建&#xff0c;后面做为默认使用&#xff0c;对当…...

iOS开发Swift开发UI页面链式调用库推荐

首页链接 https://github.com/zhiguangqiao/ChainableUIKit 安装方法 pod ChainableUIKit调用片段 UIButton import ChainableUIKitprivate let button UIButton().chain.setTitleColor(.init(hex: "#9583EB"), state: .normal).setTitle("全部视频",…...

ClickHouse SQL与引擎--基本使用(一)

1.查看所有的数据库 show databases; 2.创建库 CREATE DATABASE zabbix ENGINE Ordinary; ATTACH DATABASE ck_test ENGINE Ordinary;3.创建本地表 CREATE TABLE IF NOT EXISTS test01(id UInt64,name String,time UInt64,age UInt8,flag UInt8 ) ENGINE MergeTree PARTI…...

2023-08-07力扣今日七题-好题

链接&#xff1a; 剑指 Offer 11. 旋转数组的最小数字 154. 寻找旋转排序数组中的最小值 II 题意&#xff1a; 找一个数组里的最小值&#xff0c;这个数组是有非递减数组旋转而来的&#xff0c;旋转n次表示把前n个数移动到数组末尾 解&#xff1a; 很有趣的二分&#xff…...

支持多用户协同的思维导图TeamMapper

什么是 TeamMapper &#xff1f; TeamMapper 是基于 Mindmapp 开发的用于绘制思维导图的 Web 应用程序。它使得思维导图变得简单&#xff0c;你可以托管并创建您自己的思维导图。与您的团队分享您的思维导图会议并在思维导图上进行协作。 软件特点&#xff1a; 创建&#xff1…...

【Vue】Parsing error: No Babel config file detected for ... vue

报错 Parsing error: No Babel config file detected for E:\Study\Vue网站\实现防篡改的水印\demo02\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files.             …...

2023-08-07力扣今日五题

链接&#xff1a; 剑指 Offer 53 - II. 0&#xff5e;n-1中缺失的数字 题意&#xff1a; 如题 解&#xff1a; 长度n的递增数组里&#xff0c;要找0到n中没出现的那个数字&#xff0c;那么出现的下标是0到n-1&#xff0c;一一对应即可&#xff0c;都出现了就是n没有 实际…...

ETHERCAT转PROFIBUS连接到300plc的配置方法

由于捷米JM-DP-ECT&#xff0c;是自主研发的一款PROFIBUS从站功能的通讯网关&#xff0c;它的主要功能是将ETHERCAT设备接入到PROFIBUS网络中生产环境比较复杂有多个设备采用不同的协议这极大的阻碍了&#xff0c;各个设备的数据互通。 JM-DP-ECT这个小小的网关可不简单&#x…...

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…...

可解释性分析的一些类别(草稿)(视觉)

目录 1.交互性解释 2. 本身具有解释性的模型 3.如何将可解释性分析应用到生成模型 参考文献 视觉领域从2020年开始可以分为两块&#xff0c;一个是图像分类&#xff0c;一个是图像生成。 图像分类&#xff1a;输入一张图片&#xff0c;输出语义标签&#xff0c;就是这张图…...

HTTPS-RSA握手

RSA握手过程 HTTPS采用了公钥加密和对称加密结合的方式进行数据加密和解密 RSA握手是HTTPS连接建立过程中的一个关键步骤&#xff0c;用于确保通信双方的身份验证和生成对称加密所需的密钥 通过RSA握手过程&#xff0c;客户端和服务器可以协商出一个共享的对称密钥&#xff0c;…...

bigemap国土管理行业应用

由于国营企业单位&#xff0c;管理土地&#xff0c;必须要有这样的软件套图 客户之前用的谷歌&#xff0c;后来不能访问了&#xff0c;通过其他途径搜索到我们 客户使用软件一般都用于套坐标以及空间规划图&#xff0c;方便于项目选址和居民建房报建在卫星图上找到用地范围&am…...

深入探索 Splashtop Enterprise 的潜力

在当今高度技术化的环境中&#xff0c;远程访问解决方案已成为无数组织的支柱。远程访问解决方案缩短了员工与工作之间的地理差距&#xff0c;提高了工作的效率和灵活性&#xff0c;促进形成了无缝的工作体验。在众多远程访问解决方案中&#xff0c;Splashtop Enterprise 作为远…...

创建型模式-单例模式

文章目录 一、创建型模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现&#xff08;1&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;&#xff08;2&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;&#xff08;3&#xff09;懒汉式-方…...

2. Linux安装Git

yum安装 查看版本 版本太低&#xff0c;所以我们采用自己上传编译的方式进行 删除已安装的git yum remove git 下载最新安装包&#xff0c;并上传到服务器文件夹下 上传&#xff0c;解压 5.安装编译需要的依赖 yum install curl-devel expat-devel gettext-devel openssl-…...

检查网站是HTTP那种协议与获取域名的ipv6地址

前言 最近在做HTTPS的应用&#xff0c;可能需要使用ipv6的地址做SLB&#xff0c;但是怎么检查配置正确&#xff0c;总不能每次都看日志吧&#xff0c;实际上客户端也很容易查看&#xff0c;总结工作经验。 检查HTTP协议版本 笔者想到了使用浏览器方式&#xff0c;或者抓包&a…...

【转】金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读

原文链接&#xff1a;金融行业JR/T0197-2020《金融数据安全 数据安全分级指南》解读 《金融数据安全 数据安全分级指南》 解 读 随着IT技术的发展&#xff0c;银行的基础业务、核心流程等众多事务和活动都运营在信息化基础之上&#xff0c;金融机构运行过程中产生了大量的数字…...

FPGA学习——电子时钟模拟(新)

文章目录 一、数码管简介二、C4开发板数码管原理图三、代码实现四、实现效果五、总结 博主在之前曾经编写过一篇电子时钟的博客&#xff08;详情请见此篇博文&#xff09;&#xff0c;但曾经编写的电子时钟&#xff0c;未显示小数点位&#xff0c;同时当时的数码管模块是为了电…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...