OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4634|回复: 9

STM32F429 执行RTC初始化后导致时间变慢

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-7-16
在线时间
18 小时
发表于 2020-12-1 15:29:42 | 显示全部楼层 |阅读模式
1金钱
各位大神,在开发STM32F429 RTC功能时发现,系统正常供电或使用电池供电的情况下,RTC运行是正常的;但是如果系统重复断电/上电(即重复执行RTC初始化),会导致RTC时间变慢,大概是断复电10次,时间变慢十多秒的样子。使用原子的阿波罗demo板下载配套的RTC程序,也是这种情况。有哪位大神遇到过此问题吗?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-12-1 16:39:59 | 显示全部楼层
是不是上电断电进行了RTC的操作,估计是操作了某些寄存器
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-7-16
在线时间
18 小时
 楼主| 发表于 2020-12-1 16:43:23 | 显示全部楼层
三叶草 发表于 2020-12-1 16:39
是不是上电断电进行了RTC的操作,估计是操作了某些寄存器

就是上电初始化调用了库函数“HAL_RTC_Init()”导致的,这个函数是对RTC相应的寄存器进行了设置,就是不知道是哪个寄存器导致的这个现象。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-12-1 21:47:20 | 显示全部楼层
wuwuliang2008 发表于 2020-12-1 16:43
就是上电初始化调用了库函数“HAL_RTC_Init()”导致的,这个函数是对RTC相应的寄存器进行了设置,就是 ...

这个会导致变慢的,要这么操作:首先判断是否进行了寄存器配置,是的话将不初始化,否则进行读写操作,然后写入备用寄存器已经配置的标志
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-7-16
在线时间
18 小时
 楼主| 发表于 2020-12-2 11:43:39 | 显示全部楼层
三叶草 发表于 2020-12-1 21:47
这个会导致变慢的,要这么操作:首先判断是否进行了寄存器配置,是的话将不初始化,否则进行读写操作,然 ...

这个方案我也试过,但是不初始化的话,在调用“HAL_RTC_SetTime”函数进行时间的设置时会失败,主要是因为RTC_EnterInitMode(hrtc)失败所致。
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
发表于 2020-12-2 17:13:30 | 显示全部楼层
  1. /**
  2.   ******************************************************************************
  3.   * File Name          : RTC.c
  4.   * Description        : This file provides code for the configuration
  5.   *                      of the RTC instances.
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * <h2><center>&#169; Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under Ultimate Liberty license
  13.   * SLA0044, the "License"; You may not use this file except in compliance with
  14.   * the License. You may obtain a copy of the License at:
  15.   *                             www.st.com/SLA0044
  16.   *
  17.   ******************************************************************************
  18.   */

  19. /* Includes ------------------------------------------------------------------*/
  20. #include "rtc.h"

  21. /* USER CODE BEGIN 0 */

  22. /* USER CODE END 0 */

  23. RTC_HandleTypeDef hrtc;

  24. /* RTC init function */
  25. void MX_RTC_Init(void)
  26. {
  27.   RTC_TimeTypeDef sTime = {0};
  28.   RTC_DateTypeDef sDate = {0};

  29.   /** Initialize RTC Only
  30.   */
  31.   hrtc.Instance = RTC;
  32.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  33.   hrtc.Init.AsynchPrediv = 127;
  34.   hrtc.Init.SynchPrediv = 255;
  35.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  36.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  37.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  38.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  39.   {
  40.     Error_Handler();
  41.   }

  42.   /* USER CODE BEGIN Check_RTC_BKUP */

  43.         if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0) == 0x5050)//是否第一次配置?
  44.         {
  45.           return;
  46.         }
  47.         HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x5050);//标记已经初始化过
  48.   /* USER CODE END Check_RTC_BKUP */

  49.   /** Initialize RTC and set the Time and Date
  50.   */
  51.   sTime.Hours = 11;
  52.   sTime.Minutes = 11;
  53.   sTime.Seconds = 11;
  54.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  55.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  56.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  57.   {
  58.     Error_Handler();
  59.   }
  60.   sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  61.   sDate.Month = RTC_MONTH_NOVEMBER;
  62.   sDate.Date = 11;
  63.   sDate.Year = 20;

  64.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  65.   {
  66.     Error_Handler();
  67.   }

  68. }

  69. void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
  70. {

  71.   if(rtcHandle->Instance==RTC)
  72.   {
  73.   /* USER CODE BEGIN RTC_MspInit 0 */

  74.   /* USER CODE END RTC_MspInit 0 */
  75.     /* RTC clock enable */
  76.     __HAL_RCC_RTC_ENABLE();
  77.   /* USER CODE BEGIN RTC_MspInit 1 */

  78.   /* USER CODE END RTC_MspInit 1 */
  79.   }
  80. }

  81. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
  82. {

  83.   if(rtcHandle->Instance==RTC)
  84.   {
  85.   /* USER CODE BEGIN RTC_MspDeInit 0 */

  86.   /* USER CODE END RTC_MspDeInit 0 */
  87.     /* Peripheral clock disable */
  88.     __HAL_RCC_RTC_DISABLE();
  89.   /* USER CODE BEGIN RTC_MspDeInit 1 */

  90.   /* USER CODE END RTC_MspDeInit 1 */
  91.   }
  92. }

  93. /* USER CODE BEGIN 1 */

  94. /* USER CODE END 1 */

  95. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码
希望对你有用,一直在用,没啥问题。
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-2 17:40:11 | 显示全部楼层
jiangyy 发表于 2020-12-2 17:13
希望对你有用,一直在用,没啥问题。

赞一个,我怎么没想到可以这么操作
回复

使用道具 举报

53

主题

567

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2107
金钱
2107
注册时间
2017-2-11
在线时间
307 小时
发表于 2020-12-2 17:41:38 | 显示全部楼层
旮旯旭 发表于 2020-12-2 17:40
赞一个,我怎么没想到可以这么操作

撸代码写少了
回复

使用道具 举报

4

主题

84

帖子

1

精华

高级会员

Rank: 4

积分
666
金钱
666
注册时间
2013-10-21
在线时间
88 小时
发表于 2020-12-2 17:44:19 | 显示全部楼层

有时候思维定式了,居然没想到 return,哎 丢人
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2020-7-16
在线时间
18 小时
 楼主| 发表于 2020-12-3 09:16:07 | 显示全部楼层
jiangyy 发表于 2020-12-2 17:13
希望对你有用,一直在用,没啥问题。

感谢指导。我看你也是上电执行了函数HAL_RTC_Init(&hrtc),但是我这边是发现只要执行了这个函数,时间就有可能变慢1S左右,具体没实测。因为这个初始化函数会调用另一个函数RTC_EnterInitMode(hrtc)让RTC进入初始化模式,导致RTC计数器暂停工作直到初始化完成后再恢复。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-14 13:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表