STM32 RTC掉电不走时

今天调试RTC使用LSI调试,后来改外部晶振不起振。可是使用内部晶振使用后备电池又不走时。网上找到答案

http://blog.chinaunix.net/uid-27106528-id-4288509.html

最初调试STM32的万年历,使用的是内部的 LSI晶振作为RTC晶振来源,发现有两个问题:
     第一:由于LSI晶振频率大约在40KHZ附近,实际上会在30~60KHZ之间波动,导致计时不准,基本上一个小时会有1分钟左右的偏差。
     第二: 由于LSI内部晶振,在断电的时候,并不在后备供电区域范围内,而外接的3.3V电池连接到VBAT上,只给后备供电区域供电,导致系统断电后,电池只能维持后备RTC的计数,并没有给LSI晶振供电(见下图所示:),导致RTC总是保持在断电之前的时间。虽然重新上电后又可以继续运行。但是需要重新校准了


    最后使用了外界的32.768KHZ的外部LSE晶振作为RTC晶振来源,调试过程中发现,反复修改,问题和之前使用LSI没有区别。
后面仔细回想才发现了问题所在,因为调试过程中加了if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)的判断,由于电池一直接到MCU上,
虽然反复的刷程序,都没有改变备份数据寄存器的值。而RTC的晶振来源一经确定,中途是不能改变的,除非全部复位备份域。
最后通过暂时取下电池(或暂时短路电池),又或者复位备份域,才成功重新设置为外部LSE晶振。时间精度的问题和断电RTC依旧运行的问题得到了解决。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结论:使用LSI掉电使用后备电池不能走时。要改用LSE要系统全掉电并重启,否则LSE无法就绪。

#include"RTC.h"

Time sysTime;

//是否使用外部晶振
#define USE_EXTERNEL_CRYSTAL

void RTC_NVIC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
    
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;   //指定是RTC全局中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);  
}

void RTC_Configuration(void)
{  	
  
  
  /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
    {
            BKP_DeInit();//BKP寄存器全部设为缺省值
    #ifdef USE_EXTERNEL_CRYSTAL
            RCC_LSEConfig(RCC_LSE_ON);  //RCC打开了LSE时钟
            while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待LSE就绪,如果谐振不对,就会死在这里.
            RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//RTC使用时钟源LSE
    #else            
            RCC_LSICmd(ENABLE);// Enable the LSI OSC           
            while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); // Wait till LSI is ready 
            RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);// Select the RTC Clock Source 
    #endif
     
        RCC_RTCCLKCmd(ENABLE);// Enable RTC Clock 
        RTC_WaitForSynchro();//RTC等待同步
        RTC_WaitForLastTask();//等待就绪
        RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断
       //RTC_SetPrescaler(32767);//RTC预分频,32768HZ
        RTC_SetPrescaler(40000);//RTC预分频,32768HZ
        RTC_WaitForLastTask();

        BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//往备份域寄存器中写一个特殊的字符
       // SetDateTime((TagDateTime *)&DefaultSystime);  //设置一个初始时间
        PWR_BackupAccessCmd(DISABLE);//禁止RTC后备寄存器 
        RCC_ClearFlag();  //清除RCC重启标志
    }
    else
    {  
#ifdef USE_EXTERNEL_CRYSTAL
        RCC_LSEConfig(RCC_LSE_ON);  //RCC打开了LSE时钟
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待LSE就绪,如果谐振不对,就会死在这里.
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//RTC使用时钟源LSE
#else      
        RCC_LSICmd(ENABLE);// Enable the LSI OSC     
        while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);// Wait till LSI is ready 
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); // Select the RTC Clock Source 
#endif
     // Enable RTC Clock 
        RCC_RTCCLKCmd(ENABLE);
        RTC_WaitForSynchro();//RTC等待同步
        //AdjustRtcTime();//配置系统时间,主要是考虑到断电重启如何恢复系统时间
        RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断
        RTC_WaitForLastTask();
        PWR_BackupAccessCmd(DISABLE);//禁止RTC后备寄存器 
        RCC_ClearFlag();  //清除RCC重启标志
    }
    RTC_NVIC_Config();
}




  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Arduino STM32RTC 是一个在 Arduino 开发板上使用的实时时钟模块。它能够提供精确的时间和日期信息,并且在掉电的情况下可以保持数据的准确性。但是,如果掉电STM32RTC 不更新时间和日期,可能有以下几个原因。 首先,可能是 RTC 电池已经耗尽或损坏。RTC 电池是供电于实时时钟模块的,当主电源断开时它能够维持 RTC 的工作。如果 RTC 电池出现问题,它将无法提供持续的电源给 RTC,这就会导致时间和日期不更新。您可以尝试更换 RTC 电池解决这个问题。 其次,可能是设置了错误的时钟源或者配置参数。在 Arduino STM32RTC 中,您需要正确配置时钟源和其他参数,以确保 RTC 正常工作。如果配置不正确,RTC 可能不会更新时间和日期。您可以检查您的代码,确保正确配置了时钟源和参数。 此外,可能是在掉电后未正确初始化 RTC,导致它无法继续更新时间和日期。在 Arduino 中,您可以通过软件或硬件重置 RTC,并确保在初始化后它能够正常更新。如果 RTC掉电后没有正确初始化,您可以尝试在开机时重新初始化它。 最后,可能是硬件故障导致 RTC 无法更新。如果以上的解决方法都没有解决问题,那可能是 RTC 模块本身出现了故障。在这种情况下,您可以尝试更换 RTC 模块,以恢复其正常功能。 总结来说,如果 Arduino STM32RTC掉电后不更新,可能是 RTC 电池耗尽或损坏、配置错误、未正确初始化或硬件故障等原因。通过检查和修复这些问题,您应该能够解决 RTC 不更新的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值