OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5688|回复: 4

RTC时钟为什么老出现两个00:00:00啊

[复制链接]

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
发表于 2013-4-21 22:46:25 | 显示全部楼层 |阅读模式
为啥要出现两次啊
中断处理里面写
 if(RTC_GetCounter()==0x0001517F)//Reset RTC Counter when Time is 23:59:59
  {  
    RTC_EnterConfigMode();/// 允许配置
    RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成 
   RTC_SetCounter(0x0);
   RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
    RTC_ExitConfigMode(); //退出配置模式
  }
Program Running!
Time: 23:59:54
Time: 23:59:55
Time: 23:59:56
Time: 23:59:57
Time: 23:59:58
Time: 00:00:00
Time: 00:00:00
Time: 00:00:01
Time: 00:00:02
Time: 00:00:03
23:59:59不见了,多了个00:00:00
如果把1517F改成15180的话,就成了如下
Program Running!
Time: 23:59:54
Time: 23:59:55
Time: 23:59:56
Time: 23:59:57
Time: 23:59:58
Time: 23:59:59
Time: 00:00:00
Time: 00:00:00
Time: 00:00:01
Time: 00:00:02
Time: 00:00:03
Time: 00:00:04
这样就多了1s。
有进步就好!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-22 00:03:52 | 显示全部楼层
回复【楼主位】caoyicheng626:
---------------------------------
得看你的时间获取函数了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
 楼主| 发表于 2013-4-22 08:38:54 | 显示全部楼层
回复【2楼】正点原子:
回复【楼主位】caoyicheng626: --------------------------------- 得看你的时间获取函数了.
---------------------------------
u32 Time_Regulate(void)

    u32 Tmp_HH,Tmp_MM,Tem_SS; 
    Tmp_HH = Hours; 
    Tmp_MM = Minutes; 
    Tem_SS = Seconds; 
    /*return the value to store in RTC counter register*/ 
    return((Tmp_HH*3600 + Tmp_MM*60 + Tem_SS));
}

void Time_Display(u32 TimeVar)

    u32 THH = 0,TMM = 0,TSS = 0; 
    THH = TimeVar/3600; 
    TMM = (TimeVar%3600)/60; 
    TSS = (TimeVar%3600)%60; 
    printf("Time: %0.2d:%0.2d:%0.2d\r\n",THH,TMM,TSS);
}

char RTC_Configuration_Flag()

    if(BKP_ReadBackupRegister(BKP_DR1) != 0X5A5A) return 1; 
    else return 0;
}

int main (void)

    SystemInit(); 
    UART1_Init(); 
    RTC_NVIC_Config(); 
    if(RTC_Configuration_Flag())  RTC_Config(); 
    printf("Program Running!\r\n"); 
    RTC_ITConfig(RTC_IT_SEC,ENABLE);//Enable the RTC Second Interrupt(使能秒中断) 
    //Clear reset flag:给RCC_CSR的bit24(RMVF)置“1”来清除所有复位标志 
    RCC_ClearFlag(); 
    while(1) 
    { 
        if(TimeDisplay == 1)//if 1s has passed 
        { 
            Time_Display(RTC_GetCounter());//Display current time 
            TimeDisplay = 0; 
        } 
    }


有进步就好!
回复 支持 反对

使用道具 举报

22

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2012-8-24
在线时间
0 小时
 楼主| 发表于 2013-4-22 09:06:32 | 显示全部楼层
我后来发现,
if(RTC_GetCounter()==0x0001517F)//Reset RTC Counter when Time is 23:59:59
  {  
    RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成 
   RTC_SetCounter(0x0);
    //RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成    
  }
如果注释掉函数里最后一行的话,就不会出现上述问题,要这句的话就会出现两次00:00:00,注释这行的话000000倒是对了但有时候会卡在23:59:59,不往串口发送数据了,按复位键就到24:XX:XX去了..
不知道为什么??!!??
再后来又发现,有时还是有两个00:00:00,有这个就算了,关键有时候卡在
卡在23:59:59,不往串口发送数据了,按复位键就到24:XX:XX去了..
这个问题不解决不行呀。。。
归结还是不稳定的原因吧
有进步就好!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-22 09:58:26 | 显示全部楼层
应该不是不稳定的原因,你那个if(RTC_GetCounter()==0x0001517F)是在中断里面做的处理吧?
用jtag仿真一下,可以辅助查找原因.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 02:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表