打印
[STM32F4]

STM32F401VC RTC读秒时间 计数到9s之后就跳到了16s 这是怎么回事啊

[复制链接]
3719|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhu_chunyan86|  楼主 | 2015-5-15 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前我使用STM32F401VC做了一个板子 在调试RTC时 我调用RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure);函数,每1s钟在显示屏上显示时间。显示的时间发现 05、06、07、08、09、16、17、。。,并且每次秒钟计数到90时,分才+1,这是怎么回事啊?哪位遇到的大侠能帮忙解决一下啊。小女子不慎感谢。
沙发
luofeng2g| | 2015-5-15 16:55 | 只看该作者
那计数到90,实际经历时间是多少?估计是代码有问题

使用特权

评论回复
板凳
mmuuss586| | 2015-5-15 18:48 | 只看该作者

这个不好猜,楼主好好查下代码吧;

使用特权

评论回复
地板
Xflyan| | 2015-5-15 19:06 | 只看该作者
就是代码问题,没有将BCD码正常转换

使用特权

评论回复
5
airwill| | 2015-5-15 20:17 | 只看该作者
因为 RTC 里的寄存器数字是 BCD 码保存的. 这一点和 F1 系列的  RTC 不同. 要留意一下.

使用特权

评论回复
6
zhu_chunyan86|  楼主 | 2015-5-18 09:48 | 只看该作者

void CalendarConfig(void)
{
                RTC_InitTypeDef  RTC_InitStruct;
                RTC_TimeTypeDef  RTC_TimeStruct;
                RTC_DateTypeDef  RTC_DateStruct;
       
        // ÅäÖà RTC ʱÖÓÔ´
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
        PWR_BackupAccessCmd(ENABLE);//ʹÄܱ¸·Ý¼Ä´æÆ÷²Ù×÷
        RCC_LSEConfig(RCC_LSE_ON);
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);       
        RCC_RTCCLKCmd(ENABLE);
       
        RTC_WaitForSynchro();
       
//        if(RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x9527)                                // ¼ì²â RTC ÊÇ·ñÍê³É³õʼ»¯
//        {
                // delay 2*RTCCLK
               
                UpdataCalendar();
               
                RTC_WriteProtectionCmd(DISABLE);
                RTC_EnterInitMode();
               
                RTC_StructInit(&RTC_InitStruct);
       
                RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24;                        // ÅäÖÃʱ¼ä¸ñʽΪ24СʱÖÆ
                RTC_InitStruct.RTC_AsynchPrediv = (uint32_t)0x7F;                                // ΪÈÕÀúÉú³É1HZµÄʱÖÓ
                RTC_InitStruct.RTC_SynchPrediv = (uint32_t)0xFF;
                RTC_Init(&RTC_InitStruct);
       
                RTC_TimeStruct.RTC_Hours = SetupTime.RTC_Hours;
                RTC_TimeStruct.RTC_Minutes = SetupTime.RTC_Minutes;
                RTC_TimeStruct.RTC_Seconds = SetupTime.RTC_Seconds;
                RTC_TimeStruct.RTC_H12 = RTC_H12_PM;
                RTC_SetTime(RTC_Format_BCD, &RTC_TimeStruct);                                // ³õʼ»¯ RTC_TR ¼Ä´æÆ÷
       
                RTC_DateStruct.RTC_WeekDay = SetupDate.RTC_WeekDay;
                RTC_DateStruct.RTC_Month = SetupDate.RTC_Month;
                RTC_DateStruct.RTC_Date = SetupDate.RTC_Date;
                RTC_DateStruct.RTC_Year = SetupDate.RTC_Year;

                RTC_SetDate(RTC_Format_BCD, &RTC_DateStruct);                                // ³õʼ»¯ RTC_DR ¼Ä´æÆ÷               
       
                RTC_ExitInitMode();
                RTC_WriteBackupRegister(RTC_BKP_DR0,0X9527);
                RTC_WriteProtectionCmd(ENABLE);
                RTC_WriteBackupRegister(RTC_BKP_DR0,0x9527);  // ³õʼ»¯Íê³ÉºóÉèÖñê־λ
//        }
       
        PWR_BackupAccessCmd(DISABLE);
       
}
这是我的初始化代码,然后就是每隔50ms 读一次RTC_GetTime(RTC_Format_BCD,&CurrentTime);,在主程序中每隔1s钟更新显示一次时间。帮忙看看代码部分哪里有问题啊?

使用特权

评论回复
7
zhu_chunyan86|  楼主 | 2015-5-18 09:53 | 只看该作者
luofeng2g 发表于 2015-5-15 16:55
那计数到90,实际经历时间是多少?估计是代码有问题

刚刚仔细观察了一下,虽然是计数到90,但是因为中间有很多跳跃,所以实际计数次数为60下

使用特权

评论回复
8
zhu_chunyan86|  楼主 | 2015-5-18 10:01 | 只看该作者
谢谢各位的热心帮助,好像问题已经解决了,我将数据格式由原来的RTC_Format_BCD格式更换成RTC_Format_BIN格式就OK了。
但是我还不太了解为什么会这样。

使用特权

评论回复
9
ticomi| | 2015-5-18 13:20 | 只看该作者
RTC的计时按照BCD格式进行,使用时需要转换为BIN格式即可和我们的日常使用符合了。

使用特权

评论回复
10
lifangying| | 2015-6-12 15:38 | 只看该作者
0x10  BCD码 是10,而二进制码则为16,因此显示为16,而不是10

使用特权

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

本版积分规则

22

主题

111

帖子

1

粉丝