[APM32F0] APM32F0xx RTC实时时钟的注意点

[复制链接]
 楼主| Alden 发表于 2024-7-30 23:31 | 显示全部楼层 |阅读模式
#申请原创# #技术资源#
APM32F051和APM32F072等M0+系列MCU都具有Vbat引脚功能,能够只有Vbat引脚供电的情况下,能有较低的功耗继续RTC实时时钟计数,芯片复位休眠也不受影响。但用SDK测试时发现芯片VDD断电和复位状态,RTC并没有继续运行而是暂停的计数。查看数据手册后发现了原因。
4061700246d9daba74b26503a129f47.png
94bd723473e2bf433ce337b6e0ac3e2.png
在数据手册电源方案这一块中可以看到,Vbat能在VDD、VDDA掉电后继续给LSECLK、RTC、备份寄存器供电。但是LSI时钟在RC振荡器是由VDDA供电,掉电和复位状态LSI就停止了,无法继续为RTC提供时钟源。
由此在需要Vbat供电的情况下,需要外接32.768Khz的外部低速晶振LSE在做时钟源,精度更高,并且能只用Vbat供电。将SDK中的RTC初始化修改如下。
  1. void RTC_Init(void)
  2. {
  3.     RTC_Config_T Struct;

  4.     /* Enable PMU Periph Clock */
  5.     RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU);

  6.     /* Backup Access */
  7.     PMU_EnableBackupAccess();

  8.     /* Enable LSE*/
  9.                 RCM_ConfigLSE(RCM_LSE_OPEN);
  10.     /* Wait until LSI is ready */
  11.     while (RCM_ReadStatusFlag(RCM_FLAG_LSERDY) == RESET)
  12.     {
  13.     }
  14.     /* Select LICT as RCM clock */
  15.     RCM_ConfigRTCCLK(RCM_RTCCLK_LSE);

  16.     /* Enable RTC clock */
  17.     RCM_EnableRTCCLK();

  18.     /* Disable RTC write Protection */
  19.     RTC_DisableWriteProtection();

  20.     /* Wait Synchro */
  21.     RTC_WaitForSynchro();

  22.     /* set LSI Prediv */
  23.     RTC_ConfigStructInit(&Struct);
  24.     Struct.AsynchPrediv = 0x7F;
  25.     Struct.SynchPrediv  = 0xFF;

  26.     RTC_Config(&Struct);
  27. }
APM32F0xx_SDK_v1.7 - RTC.zip (3.18 MB, 下载次数: 3)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部