你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32CubeMX配置RTC——基于(STM32G070+STM32CubeMX+HAL库+RTC)

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
实验目的:
通过STM32CubeMX进行简单配置生成HAL库实现内部晶振RTC。

一、STM32CubeMX配置如下:
1.时钟树配置:
因为板子没有外部RTC晶振,所以只能使用内部32KHz晶振,时钟树配置如下:

2020090915425866.png


2.RTC配置:

20201217151841576.png


(1)关于Asynchronous Predivider value 和 Synchronous Predivider value填写多少,请看下面:

2020090915482431.png


2020090915483789.png


因为内部晶振是32KHz,所以毫无疑问应该选择LSI=32KHz即:

Asynchronous Predivider value :127
Synchronous Predivider value :249

(2)关于Hours、Minutes等这些初值没啥好疑问的,直接填写,但是Year需要注意一下,它是从1970年开始算起的,所以比如填写50就是2020年的意思。
二、STM32CubeMX配置生成的HAL库如下:
  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>© Copyright (c) 2020 STMicroelectronics.
  10.   * All rights reserved.</center></h2>
  11.   *
  12.   * This software component is licensed by ST under BSD 3-Clause license,
  13.   * the "License"; You may not use this file except in compliance with the
  14.   * License. You may obtain a copy of the License at:
  15.   *                        opensource.org/licenses/BSD-3-Clause
  16.   *
  17.   ******************************************************************************
  18.   */

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

  21. /* USER CODE BEGIN 0 */
  22. RTC_TimeTypeDef GetTime;   //µ¥Æ¬»úÄÚ²¿RTC¶Áȡʱ¼ä
  23. RTC_DateTypeDef GetDate;   //µ¥Æ¬»úÄÚ²¿RTC¶ÁÈ¡ÈÕÆÚ
  24. uint8_t RTC_READ_Flag;
  25. /* USER CODE END 0 */

  26. RTC_HandleTypeDef hrtc;

  27. /* RTC init function */
  28. void MX_RTC_Init(void)
  29. {
  30.   RTC_TimeTypeDef sTime = {0};
  31.   RTC_DateTypeDef sDate = {0};

  32.   /** Initialize RTC Only
  33.   */
  34.   hrtc.Instance = RTC;
  35.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  36.   hrtc.Init.AsynchPrediv = 127;
  37.   hrtc.Init.SynchPrediv = 249;
  38.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  39.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  40.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  41.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  42.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  43.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }

  47.   /* USER CODE BEGIN Check_RTC_BKUP */

  48.   /* USER CODE END Check_RTC_BKUP */

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

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

  69. }

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

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

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

  80.   /* USER CODE END RTC_MspInit 1 */
  81.   }
  82. }

  83. void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
  84. {

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

  88.   /* USER CODE END RTC_MspDeInit 0 */
  89.     /* Peripheral clock disable */
  90.     __HAL_RCC_RTC_DISABLE();
  91.     __HAL_RCC_RTCAPB_CLK_DISABLE();
  92.   /* USER CODE BEGIN RTC_MspDeInit 1 */

  93.   /* USER CODE END RTC_MspDeInit 1 */
  94.   }
  95. }
复制代码


三、时间日期获取设置等:
1、自己重绘一个设置time的函数:
  1. /* USER CODE BEGIN 1 */
  2. void RTC_SetTime(u8 hour, u8 minute, u8 second)
  3. {
  4.   /*##-2- Configure the Time #################################################*/
  5.   GetTime.Hours = hour;
  6.   GetTime.Minutes = minute;
  7.   GetTime.Seconds = second;
  8. //  GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
  9.   GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  10.   GetTime.StoreOperation = RTC_STOREOPERATION_RESET;

  11.   if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
  12.   {

  13.   }
  14. }
  15. /* USER CODE END 1 */
复制代码

2、调用函数实现RTC:
1.首先初始化RTC时钟:
  1. MX_RTC_Init();
复制代码

2.接着设置time时间:
  1. RTC_SetTime(11,59,50);   //设置时间为11时59分50秒
复制代码

3.然后调用HAL库函数实现time和date获取,有个细节要注意一下,需要先获取日期再获取时间,亲测直接获取时间会有问题:
  1. HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
  2. HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新时间
复制代码

收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版