STM32F207的RTC日期越变出错,怎么解决?

2020-01-10 19:46发布

比如:在2018-01-01 23:29:59变为2018-01-02 00:00:00过程中,可能会出现变成2018-01-01 00:00:00的情况,然后变为2018-01-02 00:00:01,恢复正常。

时间读取函数——

RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);

经测试,即使连续执行两次,

RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure1);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure1);

RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure2);
RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure2);

并且判断二者一致再取数,还是会出现上述异常。

请问大家有没有好的办法?
20条回答
prince2010
1楼 · 2020-01-13 05:17.采纳回答
styleno1 发表于 2018-5-25 17:24
看了下手册,每2个RTCCLK同步一次,可能是时间太长了。

确实比较长,我写了个程序测试——


while(1)
{
    RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);
    RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure);

    if((RTC_DateStructure.RTC_Year == (YearBack - 2000)) && (RTC_DateStructure.RTC_Month == MonBack) && (RTC_DateStructure.RTC_Date == DayBack))
    {
        if((RTC_TimeStructure.RTC_Hours * 3600 + RTC_TimeStructure.RTC_Minutes * 60 + RTC_TimeStructure.RTC_Seconds) < (HourBack * 3600 + MinBack * 60 + SecBack))
        {
            RetryTimes++;
            continue;
        }
    }

    break;
}

if(RetryTimes)
{
    printf("重读%u次! ", RetryTimes);
    RetryTimes = 0;
}

经测试,RetryTimes甚至超过100次。
t3486784401
2楼-- · 2020-01-11 09:02
LZ这是库编程吧,底层的RTC计数器是32位的,平均每秒增长一格。正常arm可以32位原子操作加载这个的,即使出现临界区问题,也应该是2^N秒的位置,而不是零点。目测库函数里加载了两次RTC->CNT,建议此处分一下库行为,不行就自己写吧
prince2010
3楼-- · 2020-01-11 13:36
t3486784401 发表于 2018-5-24 19:55
LZ这是库编程吧,底层的RTC计数器是32位的,平均每秒增长一格。正常arm可以32位原子操作加载这个的,即使出 ...

你说的是F1系列吧?
t3486784401
4楼-- · 2020-01-11 19:10
prince2010 发表于 2018-5-24 20:01
你说的是F1系列吧?

的确是F1。
没细看F2的配置,莫非不过这么明显的缺陷(临界区漏洞)不应该出现在硬件层面
prince2010
5楼-- · 2020-01-12 00:34
t3486784401 发表于 2018-5-24 20:06
的确是F1。
没细看F2的配置,莫非不过这么明显的缺陷(临界区漏洞)不应该出现在硬件层面 ...

F2和F1的RTC大不一样的。
t3486784401
6楼-- · 2020-01-12 01:36
 精彩回答 2  元偷偷看……
prince2010
7楼-- · 2020-01-12 06:11
t3486784401 发表于 2018-5-24 20:23
看了手册了,可能导致库出问题的是 APB1 时钟速度,写着应该是 7 倍 RTC 速度。

还就是 RSF 标志,不过目 ...

谢谢,我再看看。

一周热门 更多>