打印
[STM32F4]

关于STM32 RTC时钟使用内部/外部晶振的切换方法

[复制链接]
391|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梅花香自123|  楼主 | 2022-9-29 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于使用STM32单片开发项目的同志,经常会使用到STM32的RTC功能,而在配置RTC的功能时需要配置晶振的使用,可以使用内部晶振或外部晶振,配置流程参考官方的示例代码即可。

    但在之前的项目中遇到一个问题,由于一些产品的外部晶振损坏(时间长了有些外部晶振容易坏掉),导致RTC实时时钟时间异常。为了降低公司的维护成本,所以考虑通过修改程序,重新配置为STM32内部晶振来解决问题(我们的应用场景可以采用这种方法,因为服务器会固定时间同步产品时间)。

使用特权

评论回复
评论
梅花香自123 2022-9-29 10:39 回复TA
———————————————— 版权声明:本文为CSDN博主「断剑重铸」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xukao5671927/article/details/86063493 
沙发
梅花香自123|  楼主 | 2022-9-29 10:41 | 只看该作者
采用外部晶振的RTC部分配置代码:

    /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Allow access to RTC */
  PWR_BackupAccessCmd(ENABLE);

    /* Enable the LSE OSC */
  RCC_LSEConfig(RCC_LSE_ON);
   
    /* Wait till LSE is ready */
    do{                           
            tick++;
    }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && tick < 20000);
    tick = 0;

    /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
   
    RTC_StructInit(&RTC_InitStructure);
    RTC_Init(&RTC_InitStructure);
   
    /* Wait for RTC APB registers synchronisation */
  RTC_WaitForSynchro();

使用特权

评论回复
板凳
梅花香自123|  楼主 | 2022-9-29 10:42 | 只看该作者
最初以为改为内部晶振配置比较简单,只要将和外部晶振有关的配置代码改为内部晶振即可。后来发现,STM32芯片的RTC时钟选择一旦配置了之后,想要切切换的话需要多配置一点东西,后来查了手册果然如此,这里给出配置代码,具体手册的说明有时间再放过来,以下部分供同志们参考。

使用特权

评论回复
地板
梅花香自123|  楼主 | 2022-9-29 10:43 | 只看该作者
RTC从外部晶振切换为内部晶振配置代码:

    uint32_t tick = 0;
    uint32_t tmpreg1 = 0;
     
    /* Enable the PWR clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

  /* Allow access to RTC */
  PWR_BackupAccessCmd(ENABLE);

    /* 晶振切换时必须执行的步骤,但不能每次上电都执行,否则会清空时间,同志们根据实际需求自行考虑执行位置 */
    tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL));
    RCC_BackupResetCmd(ENABLE);        
    RCC_BackupResetCmd(DISABLE);
    RCC->BDCR = tmpreg1;
   
   
    /* Enable the LSI OSC */
    RCC_LSICmd(ENABLE);

    /* Wait till LSI is ready */
    do{
            
            tick++;
    }while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && tick < 20000);
    tick = 0;
               
    /* Select the RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

    /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
   
    RTC_StructInit(&RTC_InitStructure);
    RTC_Init(&RTC_InitStructure);
   
    /* Wait for RTC APB registers synchronisation */
  RTC_WaitForSynchro();

使用特权

评论回复
5
foxsbig| | 2022-10-2 14:07 | 只看该作者
之前好为什么要这么弄,
现在有需求 了,才知道真的需要

使用特权

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

本版积分规则

87

主题

1054

帖子

0

粉丝