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

2019-03-23 19:06发布

原先是程序中到23:59:59时间清零,如不能清零,开机时间肯定超过24小时,怎么办?? 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
zhaojun_xf
2019-03-24 06:07
/**************************************************************************************
* 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
    }
}

一周热门 更多>