初级会员

- 积分
- 164
- 金钱
- 164
- 注册时间
- 2017-9-18
- 在线时间
- 42 小时
|
10金钱
下面代码中注释掉的是出错版本,未注释的是修改后的正确运行版
我发现如果不在一开始给cnt赋值0的话,时钟会从我设置时间的1分10秒左右开始计时,这是为什么?
还有 cnt+=(u32)min*60;和cnt+=sec;为什么前者要加一个强制类型转换,后者不用呢?
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
u16 temp1;
u32 cnt=0;
RTC_EnterConfigMode();
if(syear<1970||syear>2099)return 1;
for(temp1=1970;temp1<syear;temp1++)
{
if(Is_Leap_Year(temp1))cnt+=31622400;
else cnt+=31536000;
}
for(temp1=1;temp1<smon;temp1++)
{
cnt+=(u32)mon_table[temp1-1]*86400;//月份秒钟数相加
if(Is_Leap_Year(syear)&&(temp1==2))cnt+=86400;//闰年2月份增加一天的秒钟数
}
cnt+=(u32)(sday-1)*86400;
cnt+=(u32)hour*3600;
cnt+=(u32)min*60;
cnt+=sec;
RTC_SetCounter(cnt);
RTC_WaitForLastTask();
RTC_Get();
RTC_ExitConfigMode();
return 0;
//出错范例
// u16 temp1;
// u32 cnt; 注意!这里没有赋值0会导致错误,时钟显示和闹钟会在设置时间1分10秒后发生!!!
// RTC_EnterConfigMode();
// if(syear<1970||syear>2099)return 1;
// for(temp1=1970;temp1<syear;temp1++)
// {
// if(Is_Leap_Year(temp1))cnt+=31622400;
// else cnt+=31536000;
// }
// for(temp1=1;temp1<smon;temp1++)
// {
// if(Is_Leap_Year(syear)&&(temp1==2))cnt+=2505600;
// else cnt+=mon_table[temp1-1]*86400;
// }
// cnt+=(sday-1)*86400;
// cnt+=hour*3600;
// cnt+=min*60;
// cnt+=sec;
// RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
// PWR_BackupAccessCmd(ENABLE);
// RTC_SetCounter(cnt);
// RTC_WaitForLastTask();
// RTC_Get();
// RTC_ExitConfigMode();
// return 0;
}
|
最佳答案
查看完整内容[请看2#楼]
因为cnt不初始化为0的话,可能是其他值(局部变量的值如果不预先赋值,则可能是随机的)
前者min*60可能超过u8,而后面没有操作,不需要强制转换。
|