RTC的BCD格式的天坑

1.项目背景:由GPS授时(即SMT32的RTC时间由GPS的串口传过来),设置RTC闹钟A和闹钟B

2.出现问题:设置闹钟的时间,但到点后不进入时间的回调函数

3.猜测原因:可能是16进制的原因(后面测试还真是)

4.解决办法:

由于原代码是直接将比如说15给了

sTime.Hours//RTC的小时变量

 你打印出来RTC时钟也是显示Hours为15(其实不是15)

但如果你给

sTime.Hours
传进去0x15
你会惊讶的发现RTC的Hours还是为15

但只有传0x15是有效的
总结:虽然你传15,RTC的时钟也会显示15但不是真正的15,只有在你传0X15的时候才是真正的15点
                                printf("time%s\r\n", GPS_Head);
                                time_gps = atoi(GPS_Head); // 获取纬度
//                                printf("time%d\r\n", time_gps);
                                flag_shi = (time_gps / 10000) + 8;//校准时
                                if(flag_shi > 23)
                                {
                                    flag_shi -= 24;
                                }
                                flag_fen = time_gps / 100 % 100;//校准分
                                flag_miao = time_gps % 100;//校准秒
                                printf("校准时间:%d:%d:%d\r\n", flag_shi, flag_fen, flag_miao);
                                                                
                               //修改RTC的值  begin
                                RTC_TimeTypeDef sTime = {0};
                   //下面注释的是原代码
//sTime.Hours = flag_shi; //sTime.Minutes = flag_fen; //sTime.Seconds = flag_miao;

sTime.Hours = flag_shi+(flag_shi/10)*6;//加上后面这一段之后,把10进制于相同数值的16进制的差值给补上了,所以就相当于传了0x15(比如说要传15点进去) sTime.Minutes = flag_fen+(flag_fen/10)*6; sTime.Seconds = flag_miao+(flag_miao/10)*6; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BCD); //设置时间 ,根据实际时间修改

 

 
posted @ 2025-04-20 17:26  TheRemember  阅读(69)  评论(0)    收藏  举报