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); //设置时间 ,根据实际时间修改

浙公网安备 33010602011771号