STM32 HAL库 RTC实时时钟打印时间日期 掉电不清零 CubeMX

这篇具有很好参考价值的文章主要介绍了STM32 HAL库 RTC实时时钟打印时间日期 掉电不清零 CubeMX。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CubeMX配置

启用HSE和HSI

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

启用RTC和Calendar功能,选择内部唤醒

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

设置参数

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

  • Hour Format:小时格式(12小时或24小时制)
  • Asynchronous Predivider value:异步分频系数
  • Synchronous Predivider value:同步分频系数
    异步分频系数和同步分频系数共同决定RTC的频率。当使用32.768KHz的LSE时,RTC分频后的时钟频率为 f = 32.768 K H z ( A P V + 1 ) ∗ ( S P V + 1 ) f = \frac{32.768KHz}{(APV+1)*(SPV+1)} f=(APV+1)(SPV+1)32.768KHz,当APV=127,SPV=255时, f = 1 H z f=1Hz f=1Hz,即RTC时钟周期为1秒。
  • Data Format:二进制或BCD码

剩下的就不讲了,很容易看懂

  • Wake Up Clock:定期唤醒时钟的频率
  • Wake Up Counter:定期唤醒的计数值。设置为0时,实际寄存器写入值为1,即每1秒钟触发一次唤醒中断

启用唤醒中断

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

时钟设置

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件
注意想要RTC在掉电情况下继续计时的话建议启用LSE(外部低速时钟)。RTC时钟源一般可选LSE、LSI或HSE,但是LSI精度较低,且可能发生温漂。分频后的HSE可作没有LSE时的备选。

启用USART

stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

MDK部分编写(打印时间日期至串口)

重定向printf至串口

#include <stdio.h>

int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

While(1)

获取RTC日期和时间的这部分代码可以在唤醒中断里写(确保唤醒是一秒钟一次),也可以在While(1)里写。

  while (1)
  {
  RTC_TimeTypeDef gTime;
  RTC_DateTypeDef gDate;

  HAL_RTC_GetTime(&hrtc,&gTime,RTC_FORMAT_BIN);
  HAL_RTC_GetDate(&hrtc,&gDate,RTC_FORMAT_BIN);

  printf("%04d-%02d-%02d-%02d\r\n",2000 + gDate.Year,gDate.Month,gDate.Date,gDate.WeekDay);
  printf("%02d:%02d:%02d",gTime.Hours,gTime.Minutes,gTime.Seconds);
  printf("\r\n");
      
  HAL_Delay(1000);

  }

注意HAL_RTC_GetTime必须在HAL_RTC_GetDate前面,同理SetTime也必须在SetDate前面。HAL库官方已经在这四个函数的定义里写得很明白了(但是不少人似乎不知道):

“You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock thevalues in the higher-order calendar shadow registers to ensure consistency between the time and date values. Reading RTC current time locks the values in calendar shadow registers until current date is read to ensure consistency between the time and date values.”
“必须在 HAL_RTC_GetTime() 之后调用 HAL_RTC_GetDate() 来解锁高阶日历影子寄存器中的值,以确保时间和日期值之间的一致性。读取 RTC 当前时间会锁定日历影子寄存器中的值,直到读取当前日期为止 确保时间和日期值之间的一致性。”

编译,下载
stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件

MDK部分编写(掉电后RTC不清零)

上面那种方法虽然能很简单的实现RTC输出时间和日期的功能,但是当RTC断电或者系统复位后,RTC会重新初始化,回到最开始的时间。要想RTC在掉电后仍能继续计时、再次上电后还能保持准确的时间,必须满足两个要求:

  • VBAT网络必须连接到可靠的电源(如纽扣电池)
  • 代码中RTC被正确初始化

为了方便,我们重写一遍HAL库里的SetTime和SetDate函数:


HAL_StatusTypeDef rtc_set_time(uint8_t hour, uint8_t min, uint8_t sec)
{
    RTC_TimeTypeDef rtc_time_handle;

    rtc_time_handle.Hours = hour;
    rtc_time_handle.Minutes = min;
    rtc_time_handle.Seconds = sec;
    rtc_time_handle.TimeFormat = 0;
    rtc_time_handle.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
    rtc_time_handle.StoreOperation = RTC_STOREOPERATION_RESET;

    return HAL_RTC_SetTime(&hrtc, &rtc_time_handle, RTC_FORMAT_BIN);
}


HAL_StatusTypeDef rtc_set_date(uint8_t year, uint8_t month, uint8_t date, uint8_t week)
{
    RTC_DateTypeDef rtc_date_handle;

    rtc_date_handle.Date = date;
    rtc_date_handle.Month = month;
    rtc_date_handle.WeekDay = week;
    rtc_date_handle.Year = year;

    return HAL_RTC_SetDate(&hrtc, &rtc_date_handle, RTC_FORMAT_BIN);
}

我们的思路是,通过备份寄存器BKUP_DRx的值来判断RTC是否是第一次被初始化。如果RTC是第一次被初始化,那么通过rtc_set_time和rtc_set_date向RTC写入初始值;如果RTC不是第一次初始化,那么在HAL_RTC_init()后直接退出MX_RTC_init(),让RTC继续工作。

重写后的函数:

void MX_RTC_Init(void)
{
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */

  #define RTC_DEFINE_CODE (0x1818)		//定义后备寄存器状态值

  if (HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0) != RTC_DEFINE_CODE)		//如果DR0读取值不为0x1818
  {
    HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,(uint16_t)RTC_DEFINE_CODE);	//向DR0写入0x1818,表明已被初始化
    rtc_set_time(15, 30, 0);	//设置初始时间
    rtc_set_date(24, 3, 25, 1);		//设置初始日期

    __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
  if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
  {
    Error_Handler();
  }
  }
  return;
}

注意,在调试程序前务必保证DR0是空值,可以先跑一个空白只有让DR0清零功能的的例程让DR0清零。不然可能会出bug。

CubeMX5.3版本前的固件包可能会碰到掉电一整天后日期计数不正确的情况,可以尝试更新一下固件包,或是参考这两篇文章:文章1 文章2

编译,下载
stm32 hal rtc断电清零,stm32,实时音视频,嵌入式硬件
15:54:32时开发板断电,间隔十秒后再次上电,可以看到RTC计时正确。文章来源地址https://www.toymoban.com/news/detail-860242.html

到了这里,关于STM32 HAL库 RTC实时时钟打印时间日期 掉电不清零 CubeMX的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32--RTC实时时钟

    Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 。 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量。 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。 GMT : GMT(Greenwich Mean Time), 格林威治平时(也称格林

    2024年02月10日
    浏览(40)
  • STM32——RTC实时时钟

    Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 底层使用秒计数器可以节省硬件设计电路,

    2024年01月23日
    浏览(33)
  • STM32-RTC实时时钟

    目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 STM32的RTC外设,实质上是一个 掉电后还继续运

    2024年02月06日
    浏览(40)
  • 【STM32】RTC(实时时钟)

    本质:计数器 RTC中断是外部中断(EXTI) 当VDD掉电的时候,Vbat可以通过电源---实时计时 STM32的RTC外设(Real Time Clock),实质是一个   掉电   后还继续运行的定时器。从定时器的角度来说,相对于通用定时器TIM外设,它十分简单, 只有很纯粹的计时和触发中断的功能 ;但从

    2024年02月03日
    浏览(42)
  • STM32-RTC实时时钟详解

    RTC的本质很简单,就是一个时钟经过精确分频最后得到的一个1Hz的时钟,也可以说是计数器,其他大部分功能都是基于这个计数器设计的数字逻辑。 本文讲的RTC是基于STM32F030来讲的,相比与F1系列的RTC来说,M0的将很多原本需要软件实现的功能硬件化了,使用起来更加便利。

    2024年02月04日
    浏览(39)
  • 【STM32学习】实时时钟 —— RTC

    STM32RTC实时时钟实验讲解,从入门到放弃 【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下 关于STM32使用RTC唤醒停止模式的设置 RTC(Real Time Clock):实时时钟,是指可以像时钟一样输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。总之,RTC只是个能靠电

    2024年02月01日
    浏览(40)
  • STM32-实时时钟RTC-2

                                     

    2024年01月20日
    浏览(38)
  • STM32基础10--实时时钟(RTC)

     目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量  重写周期唤醒回调函数 重写闹钟中断函数         在做51单片机项目时,如果需

    2023年04月11日
    浏览(29)
  • STM32学习笔记(十二)丨RTC实时时钟

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断   

    2024年02月16日
    浏览(41)
  • STM32中的RTC实时时钟和配套闹钟设置

    主要初始化函数,以及设置闹钟函数,闹钟中断函数 RTC.c RTC.h main.c

    2024年04月23日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包