中级会员
 
- 积分
- 439
- 金钱
- 439
- 注册时间
- 2018-12-21
- 在线时间
- 126 小时
|
1金钱
- u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
- {
- u16 t;
- u32 seccount=0;
- if(syear<1970||syear>2099)return 1;
- for(t=1970;t<syear;t++) //°ÑËùÓÐÄê·ÝµÄÃëÖÓÏà¼Ó
- {
- if(Is_Leap_Year(t))seccount+=31622400;//ÈòÄêµÄÃëÖÓÊý
- else seccount+=31536000; //ƽÄêµÄÃëÖÓÊý
- }
- smon-=1;
- for(t=0;t<smon;t++) //°ÑÇ°ÃæÔ·ݵÄÃëÖÓÊýÏà¼Ó
- {
- seccount+=(u32)mon_table[t]*86400;//Ô·ÝÃëÖÓÊýÏà¼Ó
- if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//ÈòÄê2Ô·ÝÔö¼ÓÒ»ÌìµÄÃëÖÓÊý
- }
- seccount+=(u32)(sday-1)*86400;//°ÑÇ°ÃæÈÕÆÚµÄÃëÖÓÊýÏà¼Ó
- seccount+=(u32)hour*3600;//СʱÃëÖÓÊý
- seccount+=(u32)min*60; //·ÖÖÓÃëÖÓÊý
- seccount+=sec;//×îºóµÄÃëÖÓ¼ÓÉÏÈ¥
-
- //ÉèÖÃʱÖÓ
- RCC->APB1ENR|=1<<28;//ʹÄܵçԴʱÖÓ
- RCC->APB1ENR|=1<<27;//ʹÄܱ¸·ÝʱÖÓ
- PWR->CR|=1<<8; //È¡Ïû±¸·ÝÇøÐ´±£»¤
- //ÉÏÃæÈý²½ÊDZØÐëµÄ!
- RTC->CRL|=1<<4; //ÔÊÐíÅäÖÃ
- RTC->CNTL=seccount&0xffff;
- RTC->CNTH=seccount>>16;
- RTC->CRL&=~(1<<4);//ÅäÖøüÐÂ
- while(!(RTC->CRL&(1<<5)));//µÈ´ýRTC¼Ä´æÆ÷²Ù×÷Íê³É
- RTC_Get();//ÉèÖÃÍêÖ®ºó¸üÐÂÒ»ÏÂÊý¾Ý
- return 0;
- }
复制代码
这个函数中,有一段:for(t=1970;t<syear;t++) 这个循环感觉有问题,前面设置syear不得小于1970,也就是说如果syear=1970的话,按照for的行为先设置t=1970然后进入循环加上一年的秒数,随后t++变为t=1971不满足t<syear退出。
如果syear=1971的话,还是循环一次,然后t=1971不满足t<syear退出。
所以1970和1971不都一样了吗?都加了一年秒数,这是Bug吧?
该函数摘录于正点原子示例代码:修改日期:2014/3/8;版本V1.0。
|
|