[求助] STM32 RTC使用备份电池供电,当主电源断电,RTC到23:59:59时间如何清零?

caoqing   2013-10-29 08:38 楼主
原先是程序中到23:59:59时间清零,如不能清零,开机时间肯定超过24小时,怎么办??

回复评论 (2)

改成:算出的小时后增加对24取余,好像小时也显示不对

  THH =( TimeVar / 3600) % 24;      //对吗??
  TMM = (TimeVar % 3600) / 60;
  TSS = (TimeVar % 3600) % 60;
  printf("Time: %0.2d:%0.2d:%0.2d\r", THH, TMM, TSS);

[ 本帖最后由 caoqing 于 2013-10-29 08:48 编辑 ]
点赞  2013-10-29 08:42

回复 楼主caoqing 的帖子

/**************************************************************************************
* FunctionName   : RTCGetClock()
* Description    : 获取时钟
* EntryParameter : None
* ReturnValue    : None
**************************************************************************************/
void RTCGetClock(u8 *clk)
{
    u8 i;
    u32 temp   = 0;
    u16 temp1  = 0;
    u16 tmpYea = 0;
    u32 tmpSec = 0;
    RTC_CLOCK tmpClk, *pClk;
   
    pClk = &tmpClk;
   
    //----------------------------- 十进制运算 ---------------------------------
   
    tmpSec = RTC_GetCounter();                                                  // 获取秒计数器的值
    temp = tmpSec / 86400;                                                      // 得到天数(秒钟数对应的)
    if (temp > 0)                                                               // 超过一天
    {
        temp1 = 1970;
        while (temp >= 365)
        {
            if (RTC_LeapYear(temp1))                                            // 闰年
            {
                if (temp >= 366)
                {
                    temp -= 366;
                }
                else
                {
                    break;
                }
            }
            else
            {
                temp -= 365;
            }
            
            temp1++;
        }
    }
   
    tmpYea = temp1;                                                             // 得到年份
    temp1 = 0;
    while (temp >= 28)                                                          // 超过了一个月
    {
        if(RTC_LeapYear(tmpYea)&&temp1 == 1)                                    // 当年是不是闰年
        {
            if (temp >= 29)
            {
                temp -= 29;
            }
            else
            {
                break;
            }
        }
        else
        {
            if (temp >= RTC_MonTbl[temp1])
            {
                temp -= RTC_MonTbl[temp1];
            }
            else
            {
                break;
            }
        }
        
        temp1++;
    }
   
    pClk->Yea = tmpYea-2000;
    pClk->Mon = temp1 + 1;                                                      // 得到月份
    pClk->Day = temp + 1;                                                       // 得到日期
    temp     = tmpSec % 86400;                                                  // 得到秒钟数
    pClk->Hur = temp / 3600;                                                    // 小时
    pClk->Min = (temp%3600) / 60;                                               // 分钟
    pClk->Sec = (temp%3600) % 60;                                               // 秒钟
   
    //----------------------------- 十进制转BCD --------------------------------
   
    for (i=0; i<6; i++)
    {
        clk = CMDec2Bcd(*(&pClk->Yea+i));                                    // DEC2BCD
    }
}
我的博客
点赞  2013-10-29 10:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复