问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/zy2232652/article/details/142444971

STM32F407单片机的RTC(实时时钟)功能是嵌入式系统开发中的重要组成部分,它能够提供精确的时间基准,广泛应用于各种需要时间记录和定时控制的场景。本文将从基本概念、内部结构到实际配置,全面介绍如何使用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 可以用于智能家居设备中的时间控制,如智能门锁、智能照明等。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号