stm32按键设置闹钟数进退位不正常?如何解决

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  stm32按键设置闹钟数进退位不正常。软件是keil5,板子是STM32F407ZGTx。程序想实现LCD屏实时显示时间,并有闹钟功能,按键可以更改设置时间和闹钟。

写的完整代码如下:

#include "stm32f4xx.h"
#include "system.h"
#include "Systick.h"
#include "LED.h"
#include "BEEP.h"
#include "Key.h"
#include "EXTI.h"
#include "TIME.h"
#include "PWM.h"
#include "Usart.h"
#include "stdio.h"
#include "IWDG.h"
#include "WWDG.h"
#include "tftlcd.h"
#include "Draw.h"
#include "rtc.h"
 
/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
u8 GetMaxDay(u16 year, u8 month) //每月最大天数
{
    u8 day;
    switch (month) 
        {
        case 1: case 3: case 5: case 7: case 8: case 10: case 12:
            day = 31;
            break;
        case 4: case 6: case 9: case 11:
            day = 30;
            break;
        case 2:
            // 判断是否是闰年
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
        {
                day = 29;
            } else 
        {
                day = 28;
            }
            break;
        default:
            day = 31;
            break;
    }
    return day;
}
 
 
int main()
{ 
    unsigned char time_str[10];
    unsigned char date_str[25];
    unsigned char clock_str[25];
    //按键状态定义
    u8 key = 0;
    u8 k0=0,k1=0;
    
    //初始化
    SysTick_Init(168);//时钟频率为168 MHz
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//配置NVIC的优先级分组,设置为优先级组2
    USART1_Init(115200);//波特率为115200
    LED_Init();//初始化LED模块
    TFTLCD_Init();//初始化TFT LCD显示屏
    KEY_Init();//初始化按键模块
    BEEP_Init();//初始化蜂鸣器模块
    RTC_Config();//配置实时时钟(RTC)
    
    FRONT_COLOR=BLACK;
    
    //初始化结构体变量
        RTC_DateStruct.RTC_Year = 24; // 假设年份为2024年
        RTC_DateStruct.RTC_Month = 6; // 假设月份为6月
        RTC_DateStruct.RTC_Date = 18; // 假设日期为18日
        RTC_DateStruct.RTC_WeekDay = 2; // 假设星期为周二
 
        RTC_TimeStruct.RTC_Hours = 11; // 假设小时为11
        RTC_TimeStruct.RTC_Minutes = 10;//假设分钟为10
        RTC_TimeStruct.RTC_Seconds = 0; // 假设秒为0
 
        RTC_AlarmStruct.RTC_AlarmDateWeekDay = 2; // 假设闹钟日期为周二
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = 11; // 假设闹钟小时为11
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = 11; // 假设闹钟分钟为11
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 0; // 假设闹钟秒为0
    
    
    RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0);//配置WAKE UP中断,1秒钟中断一次
    //RTC_Set_AlarmA(3,16,31,50);  //使用闹钟A,示例周3,16点31分50秒响
    RTC_Set_AlarmA(2,11,11,00);  //周2 11点11分00秒 蜂鸣器响
 
 
 
    while(1)
    {
        //按键改变
        
        key=Key_Scan(0);
        
        if(key == KEY0_PRESS)
        { 
            k0++;
            printf("按键k0依次设置顺序年、月、日、星期、时、分、秒、闹钟星期、闹钟时、闹钟分、闹钟秒,key_up加1,key_1减1\r\n");
                        if(k0 == 1)
                        {
                            printf("进入年份设置\r\n");
                            k1 = 1;
                        }
                        if(k0 == 2)
                        {
                            printf("进入月份设置\r\n");
                            k1 = 2;
                        }
                        if(k0 == 3)
                        {
                            printf("进入日设置\r\n");
                            k1 = 3;
                        }
                        if(k0 == 4)
                        {
                            printf("进入星期设置\r\n");
                            k1 = 4;
                        }
                        if(k0 == 5)
                        {
                            printf("进入时设置\r\n");
                            k1 = 5;
                        }
                        if(k0 == 6)
                        {
                            printf("进入分设置\r\n");
                            k1 = 6;
                        }
                        if(k0 == 7)
                        {
                            printf("进入秒设置\r\n");
                            k1 = 7;
                        }
                        if(k0 == 8)
                        {
                            printf("进入闹钟的星期设置\r\n");
                            k1 = 8;
                        }
                        if(k0 == 9)
                        {
                            printf("进入闹钟的时设置\r\n");
                            k1 = 9;
                        }
                        if(k0 == 10)
                        {
                            printf("进入闹钟的分设置\r\n");
                            k1 = 10;
                        }
                        if(k0 == 11)
                        {
                            printf("进入闹钟的秒设置\r\n");
                            k1 = 11;
                        }
                    }
        
//改变实时时钟的年份
 
        if((key == KEY_UP_PRESS) && (k1 == 1))
        {
            printf("进入年份加1判断\r\n");
            RTC_DateStruct.RTC_Year++;
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        if((key == KEY1_PRESS) && (k1 == 1))
        {
            printf("进入年份减1判断\r\n");
            RTC_DateStruct.RTC_Year--;
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        
//改变实时时钟的月份
 
        if((key == KEY_UP_PRESS) && (k1 == 2))
        {
            printf("进入月份加1判断\r\n");
            RTC_DateStruct.RTC_Month = (RTC_DateStruct.RTC_Month % 12) + 1; // 增加月份循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        if((key == KEY1_PRESS) && (k1 == 2))
        {
            printf("进入月份减1判断\r\n");
            RTC_DateStruct.RTC_Month = (RTC_DateStruct.RTC_Month + 10) % 12 + 1; // 减少月份循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        
//改变实时时钟的日
 
        if((key == KEY_UP_PRESS) && (k1 == 3))
        {
            printf("进入日加1判断\r\n");
            u8 max_day = GetMaxDay(RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month);
            RTC_DateStruct.RTC_Date = (RTC_DateStruct.RTC_Date % max_day) + 1; // 增加日期并循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        if((key == KEY1_PRESS) && (k1 == 3))
        {
            printf("进入日减1判断\r\n");
            u8 max_day = GetMaxDay(RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month);
            RTC_DateStruct.RTC_Date = (RTC_DateStruct.RTC_Date + max_day - 2) % max_day + 1; // 减少日期并循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        
//改变实时时钟星期
 
        if((key == KEY_UP_PRESS) && (k1 == 4))
        {
            printf("进入星期加1判断\r\n");
            RTC_DateStruct.RTC_WeekDay = (RTC_DateStruct.RTC_WeekDay % 7) + 1; // 增加星期并循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        if((key == KEY1_PRESS) && (k1 == 4))
        {
            printf("进入星期减1判断\r\n");
            RTC_DateStruct.RTC_WeekDay = (RTC_DateStruct.RTC_WeekDay + 5) % 7 + 1; // 减少星期并循环
            RTC_Set_Date(RTC_DateStruct.RTC_Year , RTC_DateStruct.RTC_Month , RTC_DateStruct.RTC_Date , RTC_DateStruct.RTC_WeekDay);
        }
        
//改变实时时钟的时
 
        if((key == KEY_UP_PRESS) && (k1 == 5))
        {
            printf("进入时加1判断\r\n");
            RTC_TimeStruct.RTC_Hours = (RTC_TimeStruct.RTC_Hours + 1) % 24; // 增加小时并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        if((key == KEY1_PRESS) && (k1 == 5))
        {
            printf("进入时减1判断\r\n");
            RTC_TimeStruct.RTC_Hours = (RTC_TimeStruct.RTC_Hours + 23) % 24; // 减少小时并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        
 
//改变实时时钟的分
 
        if((key == KEY_UP_PRESS) && (k1 == 6))
        {
            printf("进入分加1判断\r\n");
            RTC_TimeStruct.RTC_Minutes = (RTC_TimeStruct.RTC_Minutes + 1) % 60; // 增加分钟并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        if((key == KEY1_PRESS) && (k1 == 6))
        {
            printf("进入分减1判断\r\n");
            RTC_TimeStruct.RTC_Minutes = (RTC_TimeStruct.RTC_Minutes + 59) % 60; // 减少分钟并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        
 
//改变实时时钟的秒
 
        if((key == KEY_UP_PRESS) && (k1 == 7))
        {
            printf("进入秒加1判断\r\n");
            RTC_TimeStruct.RTC_Seconds = (RTC_TimeStruct.RTC_Seconds + 1) % 60; // 增加秒并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        if((key == KEY1_PRESS) && (k1 == 7))
        {
            RTC_TimeStruct.RTC_Seconds = (RTC_TimeStruct.RTC_Seconds + 59) % 60; // 减少秒并循环
            RTC_Set_Time(RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds,RTC_H12_AM);
        }
        
 
//改变闹钟的星期
 
        if((key == KEY_UP_PRESS) && (k1 == 8))
        {
            printf("进入闹钟星期加1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmDateWeekDay = (RTC_AlarmStruct.RTC_AlarmDateWeekDay % 7) + 1; // 增加星期并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        if((key == KEY1_PRESS) && (k1 == 8))
        {
            printf("进入闹钟星期减1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmDateWeekDay = (RTC_AlarmStruct.RTC_AlarmDateWeekDay + 5) % 7 + 1; // 减少星期并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        
        
 
//改变闹钟的时
 
        if((key == KEY_UP_PRESS) && (k1 == 9))
        {
            printf("进入闹钟的时加1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours + 1) % 24; // 增加小时并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        if((key == KEY1_PRESS) && (k1 == 9))
        {
            printf("进入闹钟的时减1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours + 23) % 24; // 减少小时并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        
 
//改变闹钟的分
 
        if((key == KEY_UP_PRESS) && (k1 == 10))
        {
            printf("进入闹钟的分加1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes + 1) % 60; // 增加分钟并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        if((key == KEY1_PRESS) && (k1 == 10))
        {
            printf("进入闹钟的分减1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes + 59) % 60; // 减少分钟并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        
//改变闹钟的秒
 
        if((key == KEY_UP_PRESS) && (k1 == 11))
        {
            printf("进入闹钟的秒加1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 1) % 60; // 增加秒并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        if((key == KEY1_PRESS) && (k1 == 11))
        {
            printf("进入闹钟的秒减1判断\r\n");
            RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = (RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 59) % 60; // 减少秒并循环
            RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay,RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours,RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes,RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
        }
        
        
        
        RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
        RTC_GetDate(RTC_Format_BIN,&RTC_DateStruct);
        RTC_GetAlarm(RTC_Format_BIN , RTC_Alarm_A , &RTC_AlarmStruct);
        
        
        
            
//LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12,"hello");
//snprintf(str, sizeof(str), "%d", num);  //整数变字符串
//LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,12,str);
        
    
        sprintf(date_str, "20%02d-%02d-%02d  week:%d", RTC_DateStruct.RTC_Year, RTC_DateStruct.RTC_Month, RTC_DateStruct.RTC_Date, RTC_DateStruct.RTC_WeekDay);  // 整形转字符串
        sprintf(time_str, "%02d:%02d:%02d", RTC_TimeStruct.RTC_Hours, RTC_TimeStruct.RTC_Minutes, RTC_TimeStruct.RTC_Seconds);   // 整形转字符串
        sprintf(clock_str, "week:%d %d:%d:%d", RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);  // 整形转字符串
 
        LCD_ShowString(10, 30, tftlcd_data.width, tftlcd_data.height, 24, date_str); // 实时时间LCD显示
        LCD_ShowString(10, 60, tftlcd_data.width, tftlcd_data.height, 24, time_str);  // 实时时间LCD显示
        LCD_ShowString(10, 90, tftlcd_data.width, tftlcd_data.height, 24, clock_str);  // 实时时间LCD显示
        
 
    }
}


烧录后发现,按键更改闹钟的秒数时,加减实现进位、退位有问题。

问题展示如图可见,第三行最右就是闹钟秒数。在闹钟秒为59时摁按键增加,没有跳转到00而是09,之后一直增加可到99,99再增加又跳到了10,10之后增加就是正常进位了;若在10时摁按键减少,就是99、89、79…到09这样子减少,继续减少又是59,59之后减少是正常的。按键调整其他,例如年月日星期什么的都是正常的,只有闹钟秒数这里有问题。

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  根据您的描述和代码,问题出现在处理闹钟秒数的进位和退位逻辑上。在您的代码中,对秒数的加1和减1操作使用了简单的模运算,但在处理边界情况(即59到60和0到-1)时,这种模运算会导致不正确的行为。

问题分析

  1. 加1问题:当秒数为59时,(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 1) % 60 的结果应该是0,但您的代码中是09,这可能是因为在显示时没有考虑到秒数从59到0的转换。

  2. 减1问题:当秒数为10时,(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds + 59) % 60 的结果应该是-49,模60后变成11,这显然不正确。正确的逻辑应该是当秒数为0时,减1应该变成59。

解决方案

对于加1和减1的操作,我们需要重新设计逻辑,确保在边界情况下能够正确处理。

改进的加1逻辑
if((key == KEY_UP_PRESS) && (k1 == 11))
{
    RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds++;
    if(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds > 59)
    {
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 0;
    }
    RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
}
改进的减1逻辑
if((key == KEY1_PRESS) && (k1 == 11))
{
    if(RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds == 0)
    {
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds = 59;
    }
    else
    {
        RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds--;
    }
    RTC_Set_AlarmA(RTC_AlarmStruct.RTC_AlarmDateWeekDay, RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours, RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes, RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds);
}

其他注意事项

  • 确保在修改时间或闹钟设置后,调用RTC_Set_AlarmA()函数时传入的参数是正确的。
  • 检查LCD显示函数LCD_ShowString是否正确处理了时间格式的显示,特别是在进位和退位后。
  • 如果可能,添加一些调试信息,打印出在按键操作前后的秒数,以便于跟踪问题。

  通过上述修改,应该能够解决您遇到的进位和退位不正常的问题。如果问题仍然存在,请检查其他可能影响显示和设置的部分代码。

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏《CSDN问答解惑-专业版》,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript-日期对象

日期对象 作用:用来表示时间的对象 获取当前时间 const datenew Date();console.log(date);可以得到日期对象,里面的属性有星期,年月日,时分秒 获取指定时间 const datenew Date(2023-05-01);console.log(date); 获取时间戳 时间…

Deepspeed : AttributeError: ‘DummyOptim‘ object has no attribute ‘step‘

题意:尝试在一个名为 DummyOptim 的对象上调用 .step() 方法,但是这个对象并没有定义这个方法 问题背景: I want to use deepspeed for training LLMs along with Huggingface Trainer. But when I use deepspeed along with trainer I get …

实习记录3

1.Mybaits懒加载 MyBatis 延迟加载(懒加载)一篇入门-腾讯云开发者社区-腾讯云 (tencent.com) 2.高级映射 106-高级映射之多对一映射第一种方式_哔哩哔哩_bilibili 3.TableId(type IdType.INPUT) Mybatis-plus 主键生成策略_mybatis-plus 自增主键等于…

和鲸科技荣耀入选2024 H1 「中国最具价值 AGI 创新机构 TOP 50」

以下文章来源于Founder Park,作者Founder Par 大模型的盛宴,不应该只属于那些无数光环加身的算法天才们。 模型的冰山一角下,是应用层的暗流涌动,这是一个更庞大,也更隐秘的蓝海。但发掘这一切的前提是,所…

redis哨兵模式搭建

先搭建主从结构 当需要运行多个Redis实例时,可以通过为每个实例使用不同的配置文件的方式来实现。 复制redis目录下的redis.conf文件将其重命名为redis6380.conf和redis6381.conf,或者将其放到单独文件夹中,这里为了偷懒,简单实现…

使用 MinIO 赢得 RAG 权利

人们常说,在人工智能时代,数据是你的护城河。为此,构建生产级 RAG 应用程序需要合适的数据基础架构来存储、版本控制、处理、评估和查询构成专有语料库的数据块。由于 MinIO 采用数据优先的 AI 方法,因此对于此类项目,…

TotalSegmentator---针对CT/MRI数据的自动分割

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享开源软件TotalSegmentator,该开源项目针对CT/MRI数据类型,对主要的解剖学结构进行自动分割,并且被集成到MITK中。希望对各…

Global Mapper:地理信息的温柔探索

引言 在这纷繁复杂的世界里,地理信息系统(GIS)如同一把利器,帮助我们剖析、理解和改造这个世界。而在众多GIS软件中,Global Mapper无疑是其中的佼佼者。作为一款功能全面且易于使用的GIS应用程序,Global M…

springboot养老院管理系统-计算机毕业设计源码00010

摘要 本文介绍了一种基于Spring Boot框架的养老院管理系统的设计与实现。该系统旨在帮助养老院管理者更有效地管理机构内的各项事务,并提供更好的服务于老年人。系统的设计考虑了养老院管理的特殊需求,包括系统用户、老人信息管理、服务分类管理、医疗服…

谷歌个人开发者账号14天封测审核通过技巧,你还不知道吗?

众所周知,目前在Google play应用商店上架应用已经不是那么容易了,谷歌各种政策的更新以及审核系统的升级,给开发者们带来了不少挑战。 尤其针对个人开发者账号需要20人连续14天的封测的要求,周期长,且随着政策执行力度…

[Vulnhub] IMF File Upload BypassBuffer Overflow

信息收集 IP AddressOpening Ports192.168.8.103TCP:80 $ nmap -p- 192.168.8.103 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http Apache httpd 2.4.18 ((Ubuntu)) |_http-title: IMF - Homepage |_http-server-header: Apache/2.4.18 (Ubunt…

揭秘!chatGPT核心技术应用

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5,将人工智能的发展推向了一个新的高度。2023年11月7日,OpenAI首届开发者大会被称为“科技界的春晚”,吸引了全球广大…

个人面试总结

写在前面:以下是自己在拟录用后回顾总结的了一下当时面试题目,把标答写了出来,供以后复习所使用,希望大家理性食用~~ 预祝大家都能找到心仪的工作 笔试题目: 1.1. java中Collection和Collections的区别 Collection…

怎样将aac转换mp3格式?推荐四个aac转MP3的方法

怎样将aac转换mp3格式?当需要将aac格式音频转换为MP3格式时,有几种方法可以轻松实现这一目标。MP3是一种广泛支持的音频格式,几乎所有设备和平台都能播放MP3文件,包括各种音乐播放器、手机、平板电脑和汽车音响系统。而且它也提供…

极狐Gitlab使用(1)

目录 续接上篇:极狐Gitlab安装部署-CSDN博客 1. 关闭注册功能 2. 创建群组 3. 创建用户 5. 邀请成员到群组 6. 设置导入导出项目源 7. 通过gitee导入库 8. 通过仓库URL导入 9. 自创建项目 10. 默认分支main的权限 11. 使用普通用户进入自建库 12. 创建用…

传统的springboot项目中,如何进行添加自定义静态资源访问路径实现对静态资源的访问?

如何配置可以实现在浏览器中配置路径实现对resource资源路径下的index.html个性化定制访问路径 要在Spring Boot项目中配置使特定前缀访问静态资源,可以在application.yml文件中配置路径映射。以下是一个示例配置: 打开你的application.yml文件&#xf…

N6 word2vec文本分类

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊# 前言 前言 上周学习了训练word2vec模型,这周进行相关实战 1. 导入所需库和设备配置 import torch import torch.nn as nn import torchvision …

04OLED简介和调试方法

OLED简介和调试方法 调试方式串口调试显示屏调试其他调试方法总结: OLED简介硬件电路OLED驱动函数 keil调试模式进入方法keil调试界面窗口简单功能说明更加强大的功能 调试方式 电脑想看什么变量可以直接打印到屏幕,但是单片机很多时候由于成本和电路结构…

多协议网关设计架构与实现,支持 RS485/232、CAN、M-Bus、MQTT、TCP 等工业协议接入(附代码示例)

一、项目概述 1.1 背景 随着物联网技术的快速发展,越来越多的设备需要接入网络进行数据交互。然而,不同设备往往采用不同的通信协议,例如工业现场常用的Modbus、CAN、电力载波等,以及物联网领域常用的MQTT、TCP/IP等&#xff0c…

C++类与对象-基础篇

目录 一、什么是类 1.1 语法定义 1.2 访问限定符 1.3 类域 二、类的实例化 2.1 什么是实例化 2.2 类的大小 三、this指针 3.1 引入 3.2 this指针的使用 一、什么是类 1.1 语法定义 class 类名 {}; 说明 类似于C语言中的结构体,括号后分号不能丢类内成员可…