PY32F003F18之RTC

一、RTC振荡器

PY32F003F18实时时钟的振荡器是内部RC振荡器,频率为32.768KHz。它也可以使用HSE时钟,不建议使用。HAL库提到LSE振荡器,但PY32F003F18实际上没有这个振荡器。

缺点:CPU掉电后,需要重新配置RTC,这个确实不太友好,有点像是鸡肋,在要求不严格的场合,凑合使用吧。

RTC时钟框图如下:

二、RTC的HAL库有一个不是很严重的bug

 PY32F003F18的HAL库润年函数中有一个BUG,不是很严重,因为2400年是一个闰年,它把年定义为字节型变量,是没有办法分辨出是不是闰年。

闰年的计算方法:年数能被4整除,但不能被100年整除,为闰年;若年数能400年整除,也为闰年

HAL库确实不大好,它喜欢用全局变量来实现其功能,让人受不了。我改了,让它适合自己需要的。HAL处的好处,就是我们可以从中抠出自己需要的部分,修修改改,就可以了,比HAL库的灵活多了。时刻不忘黑它一把,因为人云亦云的人太多了。

三、非完全HAL库测试程序

如果你觉得HAL库,就用HAL中的程序,也是可以的。

#include "RTC.h"
#include "LED.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()uint8_t Century;//世纪,21世纪用20表示
RTC_DateTypeDef  RTC_DateStructureure;//用来保存读到的"年月日"
RTC_TimeTypeDef  RTC_TimeStructureure;//用来保存读到的"时分秒"
RTC_AlarmTypeDef RTC_AlarmStructureure;void RTC_Init(void);
void RTC_Display(void);//函数功能:读"RTC计数寄存器"
uint32_t Read_RTC_Time_Counter(void)
{uint16_t high1 = 0U, high2 = 0U, low = 0U;uint32_t timecounter = 0U;high1 = READ_REG(RTC->CNTH & RTC_CNTH_RTC_CNT);//读"RTC计数寄存器高位RTC_CNTH"low   = READ_REG(RTC->CNTL & RTC_CNTL_RTC_CNT);//读"RTC计数寄存器低位RTC_CNTL"high2 = READ_REG(RTC->CNTH & RTC_CNTH_RTC_CNT);//读"RTC计数寄存器高位RTC_CNTH"if (high1 != high2){//读"RTC计数寄存器低位RTC_CNTL"时,发现"RTC计数寄存器高位RTC_CNTH"中的数据发生改变了//In this case the counter roll over during reading of CNTL and CNTH registers,//read again CNTL register then return the counter valuetimecounter = (((uint32_t) high2 << 16U) | READ_REG(RTC->CNTL & RTC_CNTL_RTC_CNT));}else{//No counter roll over during reading of CNTL and CNTH registers, //counter value is equal to first value of CNTL and CNTHtimecounter = (((uint32_t) high1 << 16U) | low);}return timecounter;
}//函数功能:
//等待RTC写操作结束
//返回0,表示退出RTC配置模式,开始更新RTC寄存器
HAL_StatusTypeDef Enter_RTC_Init_Mode(void)
{uint32_t tickstart = 0U;tickstart = HAL_GetTick();/* Wait till RTC is in INIT state and if Time out is reached exit */while ( (RTC->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET ){//读"RTC控制寄存器RTC_CRL"中的RTOFF,若RTOFF=0,则上一次对RTC寄存器的写操作仍在进行if ((HAL_GetTick() - tickstart) >  RTC_TIMEOUT_VALUE){//RTC_TIMEOUT_VALUE=2000,最大等待时间为2000msreturn HAL_TIMEOUT;}}_HAL_RTC_WRITEPROTECTION_DISABLE(RTC);//将"RTC控制寄存器RTC_CRL"中的CNF=0,退出配置模式,开始更新RTC寄存器//Disable the write protection for RTC registersreturn HAL_OK;
}//函数功能:
//等待RTC写操作结束
//返回0,表示RTC写操作结束
HAL_StatusTypeDef Exit_RTC_Init_Mode(void)
{uint32_t tickstart = 0U;_HAL_RTC_WRITEPROTECTION_ENABLE(RTC);//将"RTC控制寄存器RTC_CRL"中的CNF=1,进入RTC配置模式tickstart = HAL_GetTick();while ((RTC->CRL & RTC_CRL_RTOFF) == RTC_CRL_RTOFF){//读"RTC控制寄存器RTC_CRL"中的RTOFF,若RTOFF=1,则上一次对RTC寄存器的写操作已经完成if ((HAL_GetTick() - tickstart) >  RTC_RTOFF_RESET_TIMEOUT_VALUE){//RTC_RTOFF_RESET_TIMEOUT_VALUE=4,最大等待时间为4msbreak;}}tickstart = HAL_GetTick();while ((RTC->CRL & RTC_CRL_RTOFF) == (uint32_t)RESET){//读"RTC控制寄存器RTC_CRL"中的RTOFF,若RTOFF=0,则上一次对RTC寄存器的写操作仍在进行if ((HAL_GetTick() - tickstart) >  RTC_TIMEOUT_VALUE){//RTC_TIMEOUT_VALUE=2000,最大等待时间为2000msreturn HAL_TIMEOUT;}}return HAL_OK;
}//函数功能:将TimeCounter写入"RTC计数寄存器"
HAL_StatusTypeDef Write_RTC_Time_Counter( uint32_t TimeCounter )
{HAL_StatusTypeDef status = HAL_OK;if (Enter_RTC_Init_Mode() != HAL_OK){//等待RTC写操作结束//返回0,表示退出RTC配置模式,开始更新RTC寄存器status = HAL_ERROR;}else{WRITE_REG(RTC->CNTH, (TimeCounter >> 16U));//写"RTC计数寄存器高位RTC_CNTH"//Set RTC COUNTER MSB wordWRITE_REG(RTC->CNTL, (TimeCounter & RTC_CNTL_RTC_CNT));//写"RTC计数寄存器低位RTC_CNTL"//Set RTC COUNTER LSB wordif (Exit_RTC_Init_Mode() != HAL_OK){//等待RTC写操作结束status = HAL_ERROR;}}return status;
}//函数功能:读"RTC闹钟寄存器"
uint32_t Read_RTC_Alarm_Counter(void)
{uint16_t high1 = 0U, low = 0U;high1 = READ_REG(RTC->ALRH & RTC_CNTH_RTC_CNT);//读"RTC闹钟寄存器高位RTC_ALRH"low   = READ_REG(RTC->ALRL & RTC_CNTL_RTC_CNT);//读"RTC闹钟寄存器低位RTC_ALRL"return (((uint32_t) high1 << 16U) | low);
}//函数功能:将AlarmCounter写入"RTC闹钟寄存器"
HAL_StatusTypeDef Write_RTC_Alarm_Counter( uint32_t AlarmCounter)
{HAL_StatusTypeDef status = HAL_OK;/* Set Initialization mode */if (Enter_RTC_Init_Mode() != HAL_OK){//等待RTC写操作结束//返回0,表示退出RTC配置模式,开始更新RTC寄存器status = HAL_ERROR;}else{WRITE_REG(RTC->ALRH, (AlarmCounter >> 16U));//写"RTC闹钟寄存器高位RTC_ALRH",Set RTC COUNTER MSB wordWRITE_REG(RTC->ALRL, (AlarmCounter & RTC_ALRL_RTC_ALR));//写"RTC闹钟寄存器低位RTC_ALRL",Set RTC COUNTER LSB word/* Wait for synchro */if (Exit_RTC_Init_Mode() != HAL_OK){//等待RTC写操作结束status = HAL_ERROR;}}return status;
}//函数功能:返回0表示闰年
uint8_t Is_LeapYear(uint16_t nYear)
{uint16_t y;y=Century;//2023年9月26日y=y*100;//2023年9月26日nYear=y+nYear;//2023年9月26日if ((nYear % 4U) != 0U){return 0U;}if ((nYear % 100U) != 0U){return 1U;}if ((nYear % 400U) == 0U){return 1U;}else{return 0U;}
}//函数功能;读取星期几的值
uint8_t Read_RTC_WeekDay(uint32_t nYear, uint8_t nMonth, uint8_t nDay)
{uint32_t year = 0U, weekday = 0U;year = 2000U + nYear;if (nMonth < 3U){/*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/weekday = (((23U * nMonth) / 9U) + nDay + 4U + year + ((year - 1U) / 4U) - ((year - 1U) / 100U) + ((year - 1U) / 400U)) % 7U;}else{/*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/weekday = (((23U * nMonth) / 9U) + nDay + 4U + year + (year / 4U) - (year / 100U) + (year / 400U) - 2U) % 7U;}return (uint8_t)weekday;
}void Update_RTC_Date(RTC_DateTypeDef *update_RTCDate, uint32_t DayElapsed)
{uint32_t year = 0U, month = 0U, day = 0U;uint32_t loop = 0U;/* Get the current year*/year = update_RTCDate->Year;/* Get the current month and day */month = update_RTCDate->Month;day = update_RTCDate->Date;for (loop = 0U; loop < DayElapsed; loop++){if ((month == 1U) || (month == 3U) || (month == 5U) || (month == 7U) || \(month == 8U) || (month == 10U) || (month == 12U)){if (day < 31U){day++;}/* Date structure member: day = 31 */else{if (month != 12U){month++;day = 1U;}/* Date structure member: day = 31 & month =12 */else{month = 1U;day = 1U;year++;}}}else if ((month == 4U) || (month == 6U) || (month == 9U) || (month == 11U)){if (day < 30U){day++;}/* Date structure member: day = 30 */else{month++;day = 1U;}}else if (month == 2U){if (day < 28U){day++;}else if (day == 28U){if (Is_LeapYear(year))//不闰年{//返回0表示闰年day++;}else //闰年{month++;day = 1U;}}else if (day == 29U){month++;day = 1U;}}}if(year>=100)//2023年9月26日{Century++;year=year-100;}/* Update year */update_RTCDate->Year = year;/* Update day and month */update_RTCDate->Month = month;update_RTCDate->Date = day;/* Update day of the week */update_RTCDate->WeekDay = Read_RTC_WeekDay(year, month, day);//读取星期几的值
}HAL_StatusTypeDef Read_RTC_Time(RTC_DateTypeDef *update_RTCDate, RTC_TimeTypeDef *sTime)
{uint32_t counter_time = 0U, counter_alarm = 0U, days_elapsed = 0U, hours = 0U;counter_time = Read_RTC_Time_Counter();//读"RTC计数寄存器",总秒数hours = counter_time / 3600U;//计算有多少小时sTime->Minutes  = (uint8_t)((counter_time % 3600U) / 60U);//计算分钟数值sTime->Seconds  = (uint8_t)((counter_time % 3600U) % 60U);//计算秒数值if (hours >= 24U){days_elapsed = (hours / 24U);//计算"天"sTime->Hours = (hours % 24U);//计算今天的"小时时间"counter_alarm = Read_RTC_Alarm_Counter();//读"RTC闹钟寄存器"//Read Alarm counter in RTC registers/* Calculate remaining time to reach alarm (only if set and not yet expired)*/if ((counter_alarm != 0xFFFFFFFF) && (counter_alarm > counter_time)){//RTC_ALARM_RESETVALUE=0xFFFFFFFFUcounter_alarm -= counter_time;//计算"距离报警时间的差值"}else{/* In case of counter_alarm < counter_time *//* Alarm expiration already occurred but alarm not deactivated */counter_alarm = 0xFFFFFFFF;//RTC_ALARM_RESETVALUE=0xFFFFFFFFU}/* Set updated time in decreasing counter by number of days elapsed */counter_time -= (days_elapsed * 24U * 3600U);//计算"今天的总秒数"/* Write time counter in RTC registers */if (Write_RTC_Time_Counter(counter_time) != HAL_OK){//将"今天的总秒数"counter_time写入"RTC计数寄存器"return HAL_ERROR;}/* Set updated alarm to be set */if (counter_alarm != 0xFFFFFFFF){//RTC_ALARM_RESETVALUE=0xFFFFFFFFUcounter_alarm += counter_time;//报警时间 = "距离报警时间的差值" + "今天的总秒数"if (Write_RTC_Alarm_Counter(counter_alarm) != HAL_OK){//将AlarmCounter写入"RTC闹钟寄存器"return HAL_ERROR;}}else{/* Alarm already occurred. Set it to reset values to avoid unexpected expiration */if (Write_RTC_Alarm_Counter(counter_alarm) != HAL_OK){//将AlarmCounter写入"RTC闹钟寄存器"return HAL_ERROR;}}/* Update date */Update_RTC_Date(update_RTCDate, days_elapsed);}else{sTime->Hours = hours;}return HAL_OK;
}HAL_StatusTypeDef Read_RTC_Date(RTC_DateTypeDef *update_RTCDate,RTC_DateTypeDef *sDate)
{RTC_TimeTypeDef stime = {0U};/* Call HAL_RTC_GetTime function to update date if counter higher than 24 hours */if (Read_RTC_Time(update_RTCDate, &stime) != HAL_OK){return HAL_ERROR;}/* Fill the structure fields with the read parameters */sDate->WeekDay  = update_RTCDate->WeekDay;sDate->Year     = update_RTCDate->Year;sDate->Month    = update_RTCDate->Month;sDate->Date     = update_RTCDate->Date;return HAL_OK;
}void RTC_Init(void)
{RTC_HandleTypeDef RTC_HandleStructureure;RCC_OscInitTypeDef        RCC_OscInit_Structureure;RCC_PeriphCLKInitTypeDef  PeriphClkInit_Structureure;Century=20;//世纪,21世纪用20表示RTC_HandleStructureure.Instance = RTC;                       //选择RTCRTC_HandleStructureure.Init.AsynchPrediv = RTC_AUTO_1_SECOND; //RTC一秒时基自动计算//HAL_RTC_MspInit函数开始//RCC_OscInit_Structureure.OscillatorType =  RCC_OSCILLATORTYPE_LSI;RCC_OscInit_Structureure.LSIState = RCC_LSI_ON;HAL_RCC_OscConfig(&RCC_OscInit_Structureure);PeriphClkInit_Structureure.PeriphClockSelection = RCC_PERIPHCLK_RTC;PeriphClkInit_Structureure.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit_Structureure);__HAL_RCC_RTCAPB_CLK_ENABLE();//使能RTC APB外部设备时钟,Enable RTC peripheral Clocks__HAL_RCC_RTC_ENABLE();//使能RTC时钟,Enable RTC ClockHAL_NVIC_SetPriority(RTC_IRQn, 0x01, 0);//设置RTC中断优先级为0x01,0无意义NVIC_EnableIRQ(RTC_IRQn);//使能RTC中断__HAL_RTC_OVERFLOW_ENABLE_IT(&RTC_HandleStructureure, RTC_IT_OW);//使能溢出中断,Overflow interrupt__HAL_RTC_ALARM_ENABLE_IT(&RTC_HandleStructureure, RTC_IT_ALRA);//使能报警中断,Alarm interrupt__HAL_RTC_SECOND_ENABLE_IT(&RTC_HandleStructureure, RTC_IT_SEC);//使能秒中断,Second interrupt
//HAL_RTC_MspInit函数结束//HAL_RTC_Init(&RTC_HandleStructureure);//RTC初始化/设置日期: 2023/9/27 星期三/RTC_DateStructureure.Year = 23;RTC_DateStructureure.Month =9;RTC_DateStructureure.Date = 27;RTC_DateStructureure.WeekDay = RTC_WEEKDAY_WEDNESDAY;HAL_RTC_SetDate(&RTC_HandleStructureure, &RTC_DateStructureure, RTC_FORMAT_BIN);//设置RTC日期/设置时间: 09:00:00/RTC_TimeStructureure.Hours = 9;RTC_TimeStructureure.Minutes =00;RTC_TimeStructureure.Seconds = 00;HAL_RTC_SetTime(&RTC_HandleStructureure, &RTC_TimeStructureure, RTC_FORMAT_BIN);//设置RTC时间/设置RTC闹钟,时间到09:01:00产生中断/RTC_AlarmStructureure.AlarmTime.Hours = 9;RTC_AlarmStructureure.AlarmTime.Minutes = 1;RTC_AlarmStructureure.AlarmTime.Seconds = 00;HAL_RTC_SetAlarm_IT(&RTC_HandleStructureure, &RTC_AlarmStructureure, RTC_FORMAT_BIN);
}void RTC_Display(void)
{Read_RTC_Time(&RTC_DateStructureure,&RTC_TimeStructureure);
//	Read_RTC_Date(&RTC_DateStructureure,&RTC_DateStructureure);//	RTC_HandleTypeDef RTC_HandleStructureure;//	RTC_HandleStructureure.Instance = RTC;//选择RTC
//  printf("RTC_IT_SEC\r\n");
//  HAL_RTC_GetTime(&RTC_HandleStructureure, &RTC_TimeStructureure, RTC_FORMAT_BIN);//读取"RTC时间"
//  HAL_RTC_GetDate(&RTC_HandleStructureure, &RTC_DateStructureure, RTC_FORMAT_BIN);//读取"RTC日期"printf("%02d%02d-%02d-%02d %02d:%02d:%02d\r\n", Century,RTC_DateStructureure.Year,RTC_DateStructureure.Month,RTC_DateStructureure.Date,RTC_TimeStructureure.Hours, RTC_TimeStructureure.Minutes, RTC_TimeStructureure.Seconds);//显示时间格式为 : YY-MM-DD hh:mm:ssif(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_SUNDAY) printf("Sunday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_MONDAY) printf("Monday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_TUESDAY) printf("Tuesday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_WEDNESDAY) printf("Wednesday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_THURSDAY) printf("Thursday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_FRIDAY) printf("Friday\r\n");if(RTC_DateStructureure.WeekDay==RTC_WEEKDAY_SATURDAY) printf("Saturday\r\n");
}//函数功能;RTC中断服务函数
void RTC_IRQHandler(void)
{if (_HAL_RTC_SECOND_GET_FLAG(RTC,RTC_FLAG_SEC)){if (_HAL_RTC_SECOND_GET_FLAG(RTC, RTC_FLAG_OW)){//RTC计数器溢出中断
/HAL_RTCEx_RTCEventCallback函数开始/printf("%s","\r\nRTC Overflow!!!\r\n");
/HAL_RTCEx_RTCEventCallback函数结束/_HAL_RTC_OVERFLOW_CLEAR_FLAG(RTC, RTC_FLAG_OW);//清除溢出中断}else{//RTC产生秒中断
/HAL_RTCEx_RTCEventCallback函数开始/MCU_LED_Toggle();
/HAL_RTCEx_RTCEventCallback函数结束/}_HAL_RTC_SECOND_CLEAR_FLAG(RTC, RTC_FLAG_SEC);}if (_HAL_RTC_ALARM_GET_FLAG(RTC, RTC_FLAG_ALRAF) != (uint32_t)RESET){//RTC产生报警中断
/HAL_RTC_AlarmAEventCallback函数开始/printf("%s","\r\nRTC Alarm!!!\r\n");
/HAL_RTC_AlarmAEventCallback函数结束/_HAL_RTC_ALARM_CLEAR_FLAG(RTC, RTC_FLAG_ALRAF);//Clear the Alarm interrupt pending bit}
}
#ifndef __RTC_H
#define __RTC_H#include "py32f0xx_hal.h"#define _HAL_RTC_SECOND_GET_FLAG(__INSTANCE__, __FLAG__)        (((((__INSTANCE__)->CRL) & (__FLAG__)) != RESET)? SET : RESET)
#define _HAL_RTC_OVERFLOW_CLEAR_FLAG(__INSTANCE__, __FLAG__)      ((__INSTANCE__)->CRL) = ~(__FLAG__)
#define _HAL_RTC_SECOND_CLEAR_FLAG(__INSTANCE__, __FLAG__)      ((__INSTANCE__)->CRL) = ~(__FLAG__)
#define _HAL_RTC_ALARM_GET_FLAG(__INSTANCE__, __FLAG__)        (((((__INSTANCE__)->CRL) & (__FLAG__)) != RESET)? SET : RESET)
#define _HAL_RTC_ALARM_CLEAR_FLAG(__INSTANCE__, __FLAG__)      ((__INSTANCE__)->CRL) = ~(__FLAG__)
//#define _HAL_RTC_ALARM_ENABLE_IT(__INSTANCE__, __INTERRUPT__)  SET_BIT((__INSTANCE__)->CRH, (__INTERRUPT__))#define _HAL_RTC_WRITEPROTECTION_ENABLE(__INSTANCE__)          CLEAR_BIT((__INSTANCE__)->CRL, RTC_CRL_CNF)
//将"RTC控制寄存器RTC_CRL"中的CNF=1,进入RTC配置模式#define _HAL_RTC_WRITEPROTECTION_DISABLE(__INSTANCE__)         SET_BIT((__INSTANCE__)->CRL, RTC_CRL_CNF)
//将"RTC控制寄存器RTC_CRL"中的CNF=0,退出配置模式,开始更新RTC寄存器
extern void RTC_Init(void);
extern void RTC_Display(void);#endif /* __RTC_H */
#include "py32f0xx_hal.h"
#include "SystemClock.h"
#include "delay.h"
#include "LED.h"
#include "SystemClock.h"
#include "USART2.h"
#include "stdio.h"  //getchar(),putchar(),scanf(),printf(),puts(),gets(),sprintf()
#include "string.h" //使能strcpy(),strlen(),memset()
#include "RTC.h"const char CPU_Reset_REG[]="\r\nCPU reset!\r\n";
int main(void)
{HSE_Config();
//	HAL_Init();//systick初始化delay_init();HAL_Delay(1000);USART2_Init(115200);
//PA0是为USART2_TX,PA1是USART2_RX
//中断优先级为0x01
//波特率为115200,数字为8位,停止位为1位,无奇偶校验,允许发送和接收数据,只允许接收中断,并使能串口printf("%s",CPU_Reset_REG);MCU_LED_Init();RTC_Init();while (1){delay_ms(1000);RTC_Display();}
}

四、误差分析

误差: 每10分钟误差6秒。1%的误差,还行。

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

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

相关文章

全国排名前三的直播公司无锋科技入驻天府蜂巢成都直播产业基地

最近&#xff0c;全国排名前三的直播公司——无锋科技&#xff0c;正式宣布入驻位于成都的天府蜂巢直播产业基地&#xff0c;这一消息引起了业内人士的高度关注。成都直播产业基地一直是中国直播产业的重要地标之一&#xff0c;其强大的技术和资源优势为众多直播公司提供了广阔…

每日一题——寻找右区间(排序 + 二分查找)

寻找右区间&#xff08;排序 二分查找&#xff09; 题目链接 理解题目 题目给定一个具有n行2列的二维数组intervals&#xff0c;对于intervals的每一行元素i&#xff0c;就表示一个区间数组&#xff0c;intervals[i][0]即这个区间数组的起始位置start&#xff0c;intervals[i…

十五.镜头知识之景深(Depth of Field)

十五.镜头知识之景深(Depth of Field) 文章目录 十五.镜头知识之景深(Depth of Field)15.1 概述15.2 景深(depth of field)定义15.3 景深原理15.3.1 弥散圆(circle of confusion) 15.4 景深总结 15.1 概述 先看两个例子&#xff0c;拍摄花、昆虫等照片时&#xff0c;背景拍的比…

iphone的safari浏览器实现全屏的pwa模式,并修改顶部状态栏背景颜色

要想修改顶部背景颜色&#xff0c;需要用到这个属性&#xff1a;content就是你要设置的颜色 <!-- 状态栏的背景色 --><meta name"theme-color" content"#f8f8f8" /> 然后再加上下面的设置&#xff1a; <!-- 网站开启对 web app 程序的支持…

使用领域引导图卷积神经网络GCNN增强基于脑电图EEG的神经疾病诊断完整代码

一种基于图卷积神经网络&#xff08;GCNN&#xff09;的新方法&#xff0c;用于改进使用头皮脑电图&#xff08;EEG&#xff09;进行神经系统疾病诊断。尽管脑电图是神经系统疾病诊断中主要使用的检测方法之一&#xff0c;但基于EEG的专家视觉诊断的敏感性仍然只有约50&#xf…

现代卷积网络实战系列4:PyTorch从零构建VGGNet训练MNIST数据集

&#x1f308;&#x1f308;&#x1f308;现代卷积网络实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 1、MNIST数据集处理、加载、网络初始化、测试函数 2、训练函数、PyTorch构建LeNet网络 3、PyTorch从零构建AlexNet训练MNIST数据…

【51单片机】10-蜂鸣器

1.蜂鸣器的原理 这里的“源”不是指电源。而是指震荡源。 也就是说&#xff0c;有源蜂鸣器内部带震荡源&#xff0c;所以只要一通电就会叫。 而无源内部不带震荡源&#xff0c;所以如果用直流信号无法令其鸣叫。必须用2K~5K的方波去驱动它。 有源蜂鸣器往往比无源的贵&#xff…

编译和链接

要闯入计算机的世界就逃不过编程这个词&#xff0c;编译和链接是编程过程中的两个重要步骤。在编写源代码后&#xff0c;需要通过编译和链接才能生成可执行文件。 引言——什么是编程 编程是编写程序的中文简称&#xff0c;就是让计算机代为解决某个问题&#xff0c;对某个计算…

C# 自定义控件库之Lable组合控件

1、创建类库 2、在类库中添加用户控件&#xff08;Window窗体&#xff09; 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…

pytorch的pixel_shuffle转tflite文件

torch.pixel_shuffle()是pytorch里面上采样比较常用的方法&#xff0c;但是和tensoflow的depth_to_space不是完全一样的&#xff0c;虽然看起来功能很像&#xff0c;但是细微是有差异的 def tf_pixelshuffle(input, upscale_factor):temp []depth upscale_factor *upscale_f…

关于表单快速开发低代码技术平台的内容介绍

运用什么样的表单快速开发软件平台可以实现高效率创收&#xff1f;随着科技的进步和飞速发展&#xff0c;专业的低代码技术平台已经走入了很多企业的办公职场中&#xff0c;它们灵活、轻量级、优质、高效、易维护等优势特点&#xff0c;可以高效助力广大企业提质增效&#xff0…

html、css学习记录【uniapp前奏】

Html 声明&#xff1a;该学习笔记源于菜鸟自学网站&#xff0c;特此记录笔记。很多示例源于此官网&#xff0c;若有侵权请联系删除。 文章目录 Html声明&#xff1a; CSS 全称 Cascading Style Sheets&#xff0c;层叠样式表。是一种用来为结构化文档&#xff08;如 HTML 文档…

ipaguard界面概览

ipaguard界面概览 ipaguard界面分左右2块&#xff1a;左边菜单导航栏&#xff0c;右边的功能区 左侧菜单&#xff1a;按模块分成启动界面&#xff0c;代码模块&#xff0c;文件模块&#xff0c;重签名与测试模块 右侧主功能区会随着功能变化&#xff0c;但是整体分3块&#xf…

vue下载在前端存放的pdf文件

vue下载在前端存放的pdf文件 注意&#xff0c;这里要在public文件夹中新建文件夹存放静态资源&#xff0c;不能在src文件夹中新建文件夹存放静态资源&#xff0c;因为public文件夹中的文件资源不会被npm run build打包编译。大家打包一下&#xff0c;就会发现 模板.pdf文件 是存…

简化任务调度与管理:详解XXL-Job及Docker Compose安装

在现代应用程序开发中&#xff0c;任务调度和管理是至关重要的一部分。XXL-Job是一个强大的分布式任务调度平台&#xff0c;它使得任务的调度和管理变得更加轻松和高效。本文将介绍XXL-Job的基本概念&#xff0c;并详细演示如何使用Docker Compose进行快速安装和配置。 什么是X…

05-前端基础CSS第三天

01-CSS三大特性之层叠性 1.CSS的三大特性 CSS有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 1.1 层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会**覆盖&#xff08;层叠&#xff09;**另一个冲突的样式。层叠性主要解决样式冲突的问题。…

C++——list(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月28日 内容&#xff1a;C——list内容讲解 目录 前言&#xff1a; list的const迭代器&#xff1a; const的iterator&#xff1a; const迭代器&#xff1a; operator->: 拷贝构造&#xff1a; 迭代器接口补充&…

船用白炽照明灯具

声明 本文是学习GB-T 3027-2012 船用白炽照明灯具. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了船用白炽照明灯具(以下简称灯具)的要求、试验方法、检验规则、标识、包装和储 存等。 本标准适用于电源电压在250V 以下的交流…

排序:简单选择排序算法分析

选择排序包括简单选择排序以及堆排序。 1.算法分析 每一趟在待排序元素中选取关键字最小的元素加入有序子序列。 n个元素的简单选择排序需要n-1趟处理。 2.代码实现 //交换 void swap(int &a, int &b) {int temp a;a b;b temp; }//简单选择排序 void SelectSort…

计算机毕业设计 基于SSM的垃圾分类管理系统(以医疗垃圾为例)的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…