打印

请教香主,RTC电池供电时间不准

[复制链接]
5036|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangxk|  楼主 | 2009-7-28 16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EK-STM32F开发板,JP7跳至VBAT端,电池供电。
USB供电时RTC准确的,拔掉USB后板上电池供电工作,24小时之后插上USB,时间慢了大约8小时10分钟,拔掉USB后测电池电压,为3.2V,电量应该可以的,请问这是什么原因?
沙发
香水城| | 2009-7-28 16:44 | 只看该作者

电池供电时RTC还在走吗?

似乎你的RTC晶振没有工作。

使用特权

评论回复
板凳
zhangxk|  楼主 | 2009-7-28 17:01 | 只看该作者

应该在走的

RTC不工作的话,时间应该差24小时的。

使用特权

评论回复
地板
香水城| | 2009-7-28 17:10 | 只看该作者

你能确定在这24小时中RTC的晶振都始终正常工作吗?

请看ST网站上的一篇应用笔记,是关于如何设计晶振电路的:AN2867 ST微控制器振荡器设计指南 英文原文 中文译文

使用特权

评论回复
5
香水城| | 2009-7-28 17:23 | 只看该作者

另外你能确定RTC晶振的频率正确吗?

你是否作了RTC的校准?

ST网站上有一篇RTC校准的应用笔记:AN2604 STM32F101xx和STM32F103xx的RTC校准

使用特权

评论回复
6
zhangxk|  楼主 | 2009-7-28 17:53 | 只看该作者

是万利的EK-STM32F开发板

万利的EK-STM32F开发板,设计上不该有问题的。
晶振应该是正常工作的,否则USB供电时RTC也应该不准的。
没有执行校准操作。

使用特权

评论回复
7
香水城| | 2009-7-28 18:16 | 只看该作者

你说有问题,我帮你分析可能的原因,但你却说设计上不该

那么你的意思是不是“我们见鬼了”,呵呵~~~~~

使用特权

评论回复
8
zhangxk|  楼主 | 2009-7-28 18:20 | 只看该作者

程序是这样设置的,有没有问题?

void Setup_RTC(void)
{
    struct tm now;

    if(BKP_ReadBackupRegister(BKP_DR1) != CONFIGURATION_DONE)
    {
        RTC_Configuration();
        now.tm_year = DEFAULT_YEAR;
        now.tm_mon  = DEFAULT_MONTH - 1; //转化成0-11月
        now.tm_mday = DEFAULT_DAY;
        now.tm_hour = DEFAULT_HOURS;
        now.tm_min  = DEFAULT_MINUTES;
        now.tm_sec  = DEFAULT_SECONDS;

        Time_SetCalendarTime(now);

        BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE);
    }
    else
    {
        /* Enable PWR and BKP clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE);

        /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);

        RCC_ClearFlag();

        RCC_RTCCLKCmd(ENABLE);

        /* Wait for RTC registers synchronisation */
        RTC_WaitForSynchro();

        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();

        /* Setting RTC Interrupts-Seconds interrupt enabled */
        /* Enable the RTC Second */
        RTC_ITConfig(RTC_IT_SEC, ENABLE);

        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();
    }

    BSP_IntVectSet(BSP_INT_ID_RTC, RTC_Handler);
    BSP_IntPrioSet(BSP_INT_ID_RTC, RTC_Second_UIP);
    BSP_IntEn(BSP_INT_ID_RTC);
}

void RTC_Configuration(void)
{
    /* Enables the clock to Backup and power interface peripherals */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to Backup Registers */
    PWR_BackupAccessCmd(ENABLE);

    /* Backup Domain Reset */
    BKP_DeInit();

    /* Enable 32.768 kHz external oscillator */
    RCC_LSEConfig(RCC_LSE_ON);

    /* Wait for LSE ready */
    while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

    /* Config RTC clock source (external clock: 32.768K) */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /* RTC Enabled */
    RCC_RTCCLKCmd(ENABLE);

    /* Wait until last write operation on RTC registers has finished */
//    RTC_WaitForLastTask();

    /* Wait for RTC registers synchronisation */
    RTC_WaitForSynchro();

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Setting RTC Interrupts-Seconds interrupt enabled */
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC,ENABLE);

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Set RTC prescaler: set RTC period to 1 sec */
    /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
    RTC_SetPrescaler(32763); 

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
}

使用特权

评论回复
9
zhangxk|  楼主 | 2009-7-28 18:24 | 只看该作者

EK-STM32F开发板也要怀疑?

EK-STM32F开发板是否官方的?所以设计上我没怀疑过它的问题。

使用特权

评论回复
10
香水城| | 2009-7-28 18:27 | 只看该作者

STM32的固件库中有例子

你可以参考那个例子。

使用特权

评论回复
11
zhangxk|  楼主 | 2009-7-28 18:29 | 只看该作者

有这样的现象

程序是download到flash的,插上USB通电后,RTC差不多慢3倍,然后慢慢的RTC越来越快到正常的时间速度。

使用特权

评论回复
12
zhangxk|  楼主 | 2009-7-29 14:06 | 只看该作者

STM32的RTC真是块难啃的骨头

早先RTC一直不工作,最后查出来是void RTC_Configuration(void)中下面两句的顺序问题,按下面的顺序是正常的,倒过来RTC就不工作。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);

现在又出现电池供电时的时间运行问题,程序设置都是按照STM32的固件库中的例子改的,真不知道现在该如何下手找原因了?

使用特权

评论回复
13
香水城| | 2009-7-29 15:46 | 只看该作者

根据你的描述,估计问题在于晶振电路

程序是download到flash的,插上USB通电后,RTC差不多慢3倍,然后慢慢的RTC越来越快到正常的时间速度。

建议按照4楼给出的文档检查晶振电路的余量,再按照文档的要求换一个晶体和对应的负载电容试试。

使用特权

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

本版积分规则

20

主题

69

帖子

1

粉丝