打印
[技术问答]

为什么NUC472的RTC时钟跳变,请见截图,谢谢!

[复制链接]
1601|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
NUC472的RTC时钟跳变比如说从5秒直接调到7秒,不经过6秒,程序如下:

main(void)
{
    S_RTC_TIME_DATA_T sInitTime, sReadRTC;

    SYS_Init();
    UART0_Init();

    /* Time Setting */
    sInitTime.u32Year       = 2013;
    sInitTime.u32Month      = 10;
    sInitTime.u32Day        = 15;
    sInitTime.u32Hour       = 12;
    sInitTime.u32Minute     = 30;
    sInitTime.u32Second     = 0;
    sInitTime.u32DayOfWeek  = RTC_TUESDAY;
    sInitTime.u32TimeScale  = RTC_CLOCK_24;

    RTC_Open(&sInitTime);

    printf("\n RTC Time Display Test (Exit after 5 seconds)\n\n");
while(1)
        {
    volatile unsigned int i;
        
    for(i=0;i<=2000000;i++)
                {;}
    RTC_GetDateAndTime(&sReadRTC);
    printf(" Current Time:%d/%02d/%02d %02d:%02d:%02d\n",sReadRTC.u32Year,sReadRTC.u32Month,sReadRTC.u32Day,sReadRTC.u32Hour,sReadRTC.u32Minute,sReadRTC.u32Second);
   
}
}


未命名.jpg (120.23 KB )

未命名.jpg
沙发
zhuotuzi| | 2017-3-8 11:33 | 只看该作者
应该没有跳变,是那个时间点没有采集到,因为串口要有个速度问题。如果刚好那个时间内没有能轮到读取时间。就这样了。

使用特权

评论回复
板凳
zhuotuzi| | 2017-3-8 11:34 | 只看该作者
for(i=0;i<=2000000;i++)
                {;}
问题就在这。你实时读取实时看,你就判断秒是不是跟上次一样,不一样就执行打印,否则丢弃。

使用特权

评论回复
地板
zhuotuzi| | 2017-3-8 11:35 | 只看该作者
RTC工作本来是正常的,只不过你读取的时间点可能刚好错过了那个24秒的时间段。

使用特权

评论回复
5
caoqing|  楼主 | 2017-3-8 12:34 | 只看该作者
本帖最后由 caoqing 于 2017-3-8 12:36 编辑

谢谢各位,但是时间秒速是对的啊?显示不对啊?不知你们听懂没有?把延时改小一样,只不过串口输出显示变快了。一样跳变

使用特权

评论回复
6
caoqing|  楼主 | 2017-3-8 12:46 | 只看该作者
好像每十秒钟快一秒,一秒一秒间隔是对的,就是跳变,总体时间变快了,不知各位听懂没有?

使用特权

评论回复
7
caoqing|  楼主 | 2017-3-10 07:34 | 只看该作者
本帖最后由 caoqing 于 2017-3-10 12:16 编辑

找到原因了,RTC不能用查询,要用中断,为什么?难道是芯片的BUg吗?

使用特权

评论回复
8
momososo| | 2017-3-10 21:14 | 只看该作者
你开着程序
对表
明天再来看有没有跳变

使用特权

评论回复
9
caoqing|  楼主 | 2017-3-11 11:38 | 只看该作者
程序改了,还是查询,没发生跳变,一晚上快半小时,请问什么样时间校准?

int main (void)
{
    S_RTC_TIME_DATA_T sInitTime, sReadRTC;

    SYS_Init();
    UART0_Init();
    sInitTime.u32Year       = 2017;
    sInitTime.u32Month      = 3;
    sInitTime.u32Day        = 10;
    sInitTime.u32Hour       = 22;
    sInitTime.u32Minute     = 30;
    sInitTime.u32Second     = 0;
    sInitTime.u32DayOfWeek  = RTC_TUESDAY;
    sInitTime.u32TimeScale  = RTC_CLOCK_24;
        printf("\n RTC Time Display Test \n\n");
       
        while(1){
                RTC_GetDateAndTime(&sReadRTC);
               if(sReadRTC.u32Second!=temp)
                {
                         printf("    %d/%02d/%02d %02d:%02d:%02d\n",
                                    sReadRTC.u32Year, sReadRTC.u32Month, sReadRTC.u32Day, sReadRTC.u32Hour, sReadRTC.u32Minute, sReadRTC.u32Second);
                        temp=sReadRTC.u32Second;
               
                }
        }
               

使用特权

评论回复
10
598330983| | 2017-3-11 12:05 | 只看该作者
时钟本身是不会跳变的,是你那个延时弄的了,当查询的时候已经过了那个时间点。

使用特权

评论回复
11
598330983| | 2017-3-11 12:05 | 只看该作者
更改后,你说不准,那很正常,晶振本身就不准,就跟便宜的电子手表一样,每天都能错几分钟。。就是晶振品质的问题。

使用特权

评论回复
12
caoqing|  楼主 | 2017-3-11 12:25 | 只看该作者
谢谢,我换个晶振看看,另外请问:时钟校准寄存器是如何加入和修改的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

76

主题

479

帖子

6

粉丝