STM32F407单片机编程入门(十四) 内部RTC实时时钟详解及实战含源码

一.概要

RTC(Real-Time Clock)是一种用于追踪和记录实际时间的时钟系统。在STM32中,RTC通常用于提供实时时钟和日期信息,例如年、月、日、时、分、秒等。RTC在许多应用中都是重要的,尤其是需要记录事件发生时间的系统,如数据日志、定时器等。
RTC位于系统的后备区域,这意味着在系统复位时,其数据不会清零。此外,即使在电源VDD(2.0-3.6V)断开的情况下,RTC仍可以通过备份电源VBAT(1.8~3.6V)供电,继续运行。

本文介绍了STM32 RTC实时时钟的基本概念,内部结构,以及用内部RTC进行时间计时的例程。

二.RTC基本介绍

实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、两个可编程
闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含用于管理低功耗模 式的自动唤醒单元。
两个 32 位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(12 或 24 小时制)、星
期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。
系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时
补偿。
其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。
此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
上电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。
无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范
围内,RTC 便不会停止工作。

三.STM32单片机RTC内部结构图

RTC内部结构图如下

在这里插入图片描述
RTC 时钟源 (RTCCLK) 通过时钟控制器从 LSE 时钟、LSI 振荡器时钟以及 HSE 时钟三者中选择。
可编程的预分频器阶段可生成 1 Hz 的时钟,用于更新日历。为最大程度地降低功耗,预分
频器分为 2 个可编程的预分频器。
RTC 日历时间和日期寄存器可通过与 PCLK1(APB1 时钟)同步的影子寄存器来访问。这
些时间和日期寄存器也可以直接访问,这样可避免等待同步的持续时间,每隔两个RTCCLK 周期,便将当前日历值复制到影子寄存器。
● RTC_SSR 对应于亚秒
● RTC_TR 对应于时间
● RTC_DR 对应于日期

当应用读取日历寄存器时,它会访问影子寄存器的内容。也可以通过将 RTC_CR 寄存器的
BYPSHAD 控制位置 1 来直接访问日历寄存器。默认情况下,该位被清零,用户访问影子寄存器。

日历时间读取:
当 RTC_CR 寄存器中的 BYPSHAD 控制位清零时
要正确读取 RTC 日历寄存器(RTC_SSR、RTC_TR 和 RTC_DR),APB1 时钟频率 (fPCLK1) 必须等于或大于 RTCCLK RTC 时钟频率的七倍。这可以确保同步机制行为的安全性。
如果 APB1 时钟频率低于 RTC 时钟频率的七倍,则软件必须分两次读取日历时间寄存器和
日期寄存器。这样,当两次读取的 RTC_TR 结果相同时,才能确保数据正确。否则必须执
行第三次读访问。任何情况下,APB1 的时钟频率都不能低于 RTC 的时钟频率。

四.CubeMX配置一个RTC时间例程

硬件准备:

STLINK接STM32F407VET6开发板,STLINK接电脑USB口。
在这里插入图片描述

打开STM32CubeMX软件,新建工程
在这里插入图片描述
Part Number处输入STM32F407VE,再双击就创建新的工程
在这里插入图片描述

配置下载口引脚
在这里插入图片描述

配置外部晶振引脚
在这里插入图片描述
在这里插入图片描述
配置RTC
在这里插入图片描述

配置系统主频168Mhz,使用外部晶振
在这里插入图片描述
配置RTC使能LSE晶振
在这里插入图片描述

配置工程文件名,保存路径,KEIL5工程输出方式
在这里插入图片描述

生成工程
在这里插入图片描述

用Keil5打开工程
在这里插入图片描述

添加代码

在这里插入图片描述
在这里插入图片描述

static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
{
  RTC_DateTypeDef sdatestructureget;
  RTC_TimeTypeDef stimestructureget;

  /* Get the RTC current Time */
  HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  /* Get the RTC current Date */
  HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);
//  /* Display time Format : hh:mm:ss */
  sprintf((char *)showtime, "%2d:%2d:%2d", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
//  /* Display date Format : mm-dd-yy */
  sprintf((char *)showdate, "%2d-%2d-%2d", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
}
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_RTC_Init();//采用LSE 32.768K外部晶振
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	RTC_CalendarShow(aShowTime, aShowDate);//读取时间,日期保存到数组
  }
  /* USER CODE END 3 */
}


实验效果
查看aShowTime数组,能看到时间会一秒一秒走
在这里插入图片描述

五.CubeMX工程源代码下载

通过网盘分享的文件:16.RTC实时时钟实验.zip
链接: https://pan.baidu.com/s/193aLDBXAbOPq42eP-hYryw 提取码: k9qk

如果链接失效,可以联系博主给最新链接
程序下载下来之后解压就行

六.小结

RTC 可以为嵌入式系统提供精确的时间基准,用于各种定时任务和事件。RTC 可以用于智能家居设备中的时间控制,如智能门锁、智能照明等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值