立即注册 找回密码

微雪课堂

搜索
微雪课堂 STM32 STM32CubeMX系列教程 查看内容

STM32CubeMX系列教程13:实时时钟(RTC)

2016-5-3 16:17| 发布者: MyMX1213| 查看: 89101| 评论: 14|原作者: MyMX1213

摘要: 摘要:本章介绍实时时钟(RTC)。1.RTC简介 实时时钟(RTC)是一个独立的BCD定时器/计数器。RTC提供具有可编程闹钟中断功能的日历时钟/日历。RTC还包含具有中断功能的周期性可编程唤醒标志。 两个32位寄存器包含二 ...
1.RTC简介

        实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。 RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。
        两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时( 12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为 2829(闰年)、30 和 31 天。
        只要芯片的备用电源一直供电,RTC上的时间会一直走。

2.新建工程
        本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。RTC选择内部唤醒开启RTC。为晶振管脚。


  


开启外部低速晶振,PC14,PC15配置


RTC时钟选择为外部低速晶振(LSE),频率为32.768。


在RTC配置中,设置时间和日期,其他为默认设置。(此处设置时间为2016/04/16 16:25:49)


生成报告以及代码,编译程序。


3.添加应用程序

在rtc.c文件中可以看到ADC初始化函数。在stm32f7xx_hal_rtc.h头文件中可以看到rtc时间和日期读写操作函数。


从操作函数中可以看到,时间和日期是以结构体的形式读写的。所以在main.c文件前面申明两个结构体变量存储读取的时间和日期数据。

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
RTC_DateTypeDef sdatestructure;
RTC_TimeTypeDef stimestructure;
/* USER CODE END PV */

在stm32f7xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDef,RTC_DateTypeDef这两个结构体的成员变量。

/** 
  * @brief  RTC Time structure definition  
  */
typedef struct
{
  uint8_t Hours;            /*!< Specifies the RTC Time Hour.
                          This parameter must be a number between Min_Data = 0 and Max_Data = 12                                                                                    
                           if the RTC_HourFormat_12 is selected.
                          This parameter must be a number between Min_Data = 0 and Max_Data = 23
                          if the RTC_HourFormat_24 is selected  */
 
  uint8_t Minutes;     /*!< Specifies the RTC Time Minutes.
                       This parameter must be a number between Min_Data = 0 and Max_Data = 59 */
   
  uint8_t Seconds;     /*!< Specifies the RTC Time Seconds.
                       This parameter must be a number between Min_Data = 0 and Max_Data = 59 */
   
  uint32_t SubSeconds;  /*!< Specifies the RTC Time SubSeconds.
                       This parameter must be a number between Min_Data = 0 and Max_Data = 59 */
 
  uint8_t TimeFormat;       /*!< Specifies the RTC AM/PM Time.
                                 This parameter can be a value of @ref RTC_AM_PM_Definitions */ 
   
  uint32_t DayLightSaving;  /*!< Specifies RTC_DayLightSaveOperation: 
                         the value of hour adjustment.
                         This parameter can be a value of @ref RTC_DayLightSaving_Definitions */
   
  uint32_t StoreOperation;  /*!< Specifies RTC_StoreOperation value to be written in the BCK bit 
                                 in CR register to store the operation.
                          This parameter can be a value of @ref RTC_StoreOperation_Definitions*/
}RTC_TimeTypeDef; 
   
/** 
  * @brief  RTC Date structure definition  
  */
typedef struct
{
  uint8_t WeekDay;  /*!< Specifies the RTC Date WeekDay.
                         This parameter can be a value of @ref RTC_WeekDay_Definitions */
   
  uint8_t Month;    /*!< Specifies the RTC Date Month (in BCD format).
                         This parameter can be a value of @ref RTC_Month_Date_Definitions */
 
  uint8_t Date;     /*!< Specifies the RTC Date.
                        This parameter must be a number between Min_Data = 1 and Max_Data = 31*/
   
  uint8_t Year;     /*!< Specifies the RTC Date Year.
                        This parameter must be a number between Min_Data = 0 and Max_Data = 99*/
                         
}RTC_DateTypeDef;

在while循环中添加应用程序,读取当前的时间和日期,并通过串口发送到电脑上显示。

  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */
 
  /* USER CODE BEGIN 3 */
        /* Get the RTC current Time ,must get time first*/
        HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);
        /* Get the RTC current Date */
        HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);
 
        /* Display date Format : yy/mm/dd */
        printf("%02d/%02d/%02d\r\n",2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date); 
        /* Display time Format : hh:mm:ss */
        printf("%02d:%02d:%02d\r\n",stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds);
 
        printf("\r\n");
        HAL_Delay(1000);
  }
  /* USER CODE END 3 */

        程序中使用HAL_RTC_GetTime(),HAL_RTC_GetDate()读取时间和日期,并保存到结构体变量中,然后通过串口输出读取的时间和日期。注意:要先读取时间再读取日期,如果先读取日期在读取时间会导致读取的时间不准确,一直都是原来设置的时间。
        编译程序并下载到开发板。打开串口调试助手。设置波特率为115200。串口助手上会显示RTC的时间日期。



810

顶一下

刚表态过的朋友 (810 人)

相关阅读

发表评论

最新评论

引用 GlenXu 2019-11-29 11:32
仿真的“真”有定义,应该事1/10
引用 GlenXu 2019-11-29 11:30
不错,我用STM32F303做试验
引用 游客 2019-2-3 14:06
引用 zhn 2018-12-17 10:30
read
引用 游客 2018-11-7 23:15
引用 游客 2018-1-23 14:10
RTC可以直接内部中断唤醒待机模式吗?不用wakeup脚触发
引用 游客 2018-1-11 10:39
В этом видеокурсе Вы узнаете о 5 приемах, которые используют все популярные каналы на Youtube. Применив полученные знания на практике, Вы быстро наберете первые несколькко тысяч подписчиков и превратите свой канал вв неиссякаемый источник новых клиентов для Вашего бизнеса.
С ...
引用 开始现在 2017-12-10 23:01
首先说明下开发条件:

1、开发板:秉火霸道,STM32F103ZET

2、软件:Cubemx V4.23(F1 V1.60库)



问题描述:Cubemx生成RTC代码会出现时间可以更新,日期复位以后就不能更新,恢复到2000/1/1的问题!



问题原因:断电以后 日期DateToUpdate的相关内容没有备份,而时间会通过RTC_WriteTimeCounter(hrtc, counter_time)进行备份!



解决思路:想办法将日期保存起来!



解决办法:

1、cubemx设置:

1512915790881090.jpg

1512915790773523.jpg

当然你也可以选择二进制设置,然后将生成的代码月份和星期都改成二进制显示,这样就可以从源头上解决问题:

日期和月份二进制.JPG

2、解决办法

    初始化函数改为

void MX_RTC_Init(void)

{

//  RTC_TimeTypeDef sTime;//在前面申明

//  RTC_DateTypeDef DateToUpdate;



    /**Initialize RTC Only  */

  hrtc.Instance = RTC;

  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;

  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;

  if (HAL_RTC_Init(&hrtc) != HAL_OK)

  {

    _Error_Handler(__FILE__, __LINE__);

  }



    /**Initialize RTC and set the Time and Date */

  if(HAL_RTCEx_BKUPRead( ...
引用 MyMX1213 2017-9-2 09:51
: 我用这程序为啥掉电了,重新上电后时间从最开始的时间开始了,我用了纽扣电池了的,楼主这什么原因啊
这个是正常的,因为每次启动都是设置RTC的时间的,所以每次都是从这个时间开启。不设置RTC时间就可以了。
引用 游客 2017-9-1 11:18
我用这程序为啥掉电了,重新上电后时间从最开始的时间开始了,我用了纽扣电池了的,楼主这什么原因啊
引用 游客 2017-5-25 19:09
: arduino 中有个mills函数。可以用来计算两个动作发生时候的cpu时间。请问stm32如何实现。
HAL库有一个HAL_GetTick()函数可以获取时间戳。
引用 游客 2017-5-25 15:32
arduino 中有个mills函数。可以用来计算两个动作发生时候的cpu时间。请问stm32如何实现。
引用 Ezio_神仙醋 2017-1-19 15:17
study
引用 风色幻想 2016-5-12 21:22
你好,谢谢分享。我最近在学这个,我学的是stm32f103vc型号的板子,rtc的时钟预分频是异步自动的,没其他选,写完程序因为现在没板子,用的是仿真,延时1秒获取一次时间,到了第十次输出秒钟才开始加1,显示1秒相当于10秒了,这是什么原因

查看全部评论(14)

CubeMX教程

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-3-29 16:35 , Processed in 0.024654 second(s), 21 queries .

返回顶部