文章目录

  • 实验目标
  • 实验环境
  • 一. RCT基础
    • 什么是RTC?
    • 为什么我们需要一个单独的RTC?
    • RTC(Real Time Clock)的原理和机制
    • RTC具体流程:
    • RTC时钟选择
    • RTC复位过程
    • RTC中断
  • 二.创建CubeMX工程
  • RTC初始时间
  • 总结

实验目标

1)了解和掌握RTC基础知识,读取RTC初始时间,验证是否为 1970年1月1日零分零秒;

2)将RTC时间调整为当前时间,并以 2021年x月x日x分x秒的格式从串口输出(或输出到OLED屏),每1s改变一次;

3)如果输出内容中需加入“星期x”,请修改代码。

实验环境

1、芯片: STM32F407ZET6/ STM32F103ZET6

2、STM32CubeMx软件

3、IDE: MDK-Keil软件

4、STM32F1xx/STM32F4xxHAL库

知识概括:

通过本篇博客您将学到:

  • RTC时钟原理

  • STM32CubeMX创建RTC例程

  • HAL库定时器RTC函数库


一. RCT基础

什么是RTC?

RTC(实时时钟)是指安装在电子设备或实现其功能的IC(集成电路)上的时钟。当您在数字电路中称其为“时钟”时,您可能会想到周期信号,但在英语中,clock也意味着“时钟”。它还意味着将当前时间保持在北顶的时钟,因此它具有“实时”。但是,个人电脑显示屏、智能手机待机画面等下显示的时间不一定是RTC。这是因为CPU本身具有定时器功能和时钟功能,不用RTC也可以显示时间和调整时序。更重要的是,此功能非常准确。

为什么我们需要一个单独的RTC?

原因是上述CPU的定时器时钟功能只在“启动”即“通电时”运行,断电时停止。当然,如果时钟不能连续跟踪时间,则必须手动设置时间。如今,通过接收标准电波(传输各国标准时间的电波)来自动调整时间的手表越来越多,但它是一种不应该在室内携带的电子设备。

它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

RTC有一个与电脑单独分离的电源,如纽扣电池(备用电池),即使主机电源关闭,它也保持滴答作响,随时可以实时显示时间。然后,当计算机再次打开时,计算机内置的定时器时钟从RTC读取当前时间,并在此基础上供电的同时,时间在其自身机制下显示。增加。顺便说一句,由于纽扣电池相对便宜且使用寿命长,因此RTC可以以极低的成本运行。由于这个作用,它也可以用作内存。

RTC(Real Time Clock)的原理和机制

RTC原理框图

解读
这里我们把他分成两个部分:

APB1 接口:用来和 APB1 总线相连。 此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总 线时钟驱动,用来与 APB1 总线连接。

通过APB1接口可以访问RTC的相关寄存器(预分频值,计数器值,闹钟值)。

RTC 核心接口:由一组可编程计数器组成,分成两个主要模块


第一个模块是 RTC 的 预分频模块,它可编程产生 1 秒的 RTC 时间基准 TR_CLK。RTC 的预分频模块包含了一个 20 位的可编程分频器(RTC 预分频器)。如果在 RTC_CR 寄存器中设置了相应的允许位,则在每个 TR_CLK 周期中 RTC 产生一个中断(秒中断)。

第二个模块是一个 32 位的可编程计数器(RTC_CNT),可被初始化为当前的系统时间,一个 32 位的时钟计数器,按秒钟计算,可以记 录 4294967296 秒,约合 136 年左右,作为一般应用,这已经是足够了的。

RTC具体流程:

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1s,RTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断。

  • RTC_Second为秒中断,用于刷新时间,
  • RTC_Overflow是溢出中断。
  • RTC Alarm 控制开关机

RTC时钟选择

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下。这两个时钟来源都会受到影响,因此没法保证RTC正常工作。所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz,因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块.(在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式).

RTC复位过程

除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位。

RTC中断

秒中断:
这里时钟自带一个秒中断,每当计数加一的时候就会触发一次秒中断,。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。我们通过往秒中断里写更新时间的函数来达到时间同步的效果。

闹钟中断:
闹钟中断就是设置一个预设定的值,计数每自加多少次触发一次闹钟中断。

二.创建CubeMX工程

- 创建一个创建STM32F103C8工程


- 配置RCC(设置高速外部时钟,使能外部晶振LSE)
设置高速外部时钟HSE 选择外部时钟源
使能外部晶振LSE

RTC设备因为其独特的运行方式(即掉电依旧运行)使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,资源消耗太大,小小的纽扣电池根本吃不消。没法保证RTC正常工作.所以RTC一般都时钟低速外部时钟LSE

- 配置RTC(激活时钟源(Activate Clock Source)和日历(Activate Calendar))


①是Activate Clock Source 激活时钟源。
②Activate calendar激活日历。
这两个都要点,作用也很明显,先是使能时钟源,再使能RTC日历。
③作用是是否使能 tamper(PC13)引脚上输出校正的秒脉冲时钟。
tamper:x,作用是RTC入侵检测校验功能。

RTC校验功能,使能侵入检测功能。RTC时钟经64分频输出到侵入检测引脚TAMPER上当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件。侵入检测事件将所有数据备份寄存器内容清除。
也就是第一个是使能tamper(PC13)引脚作为时钟脉冲输出。
第二个是使能tamper(PC13)引脚作为入侵检测功能。

- 设置两个RTC的中断:
RTC全局中断RTC_IRQHandler()
闹钟中断函数RTCAlarm_IRQHandler()

此处设置时间为2022/11/5 12:30:00

Binary data format 十六进制
BCD data format BCD码进制

使用自动配置,初始化时间必须使用BCD data format,原因是库函数存在bug,如果使用Binary data format,月份配置会出错,比如说11月,配置时会赋值为RTC_MONTH_NOVEMBER,而此宏定义值为0x11,也就是说其十进制值为17

- 使能串口
使能(Enable): 负责控制信号的输入和输出.
使能一下串口,因为发送日期到上位机。

③:Asynchronous,异步,此处传输模块选择异步传输。

- 时钟源设置

外部晶振为8MHz

1选择外部时钟HSE 8MHz
2PLL锁相环倍频9倍
3系统时钟来源选择为PLL
4设置APB1分频器为 /2
5 使能CSS监视时钟
6 设置RTC时钟为LSE

32的时钟树框图参考文章链接:https://blog.csdn.net/as480133937/article/details/98845509

- 项目文件设置


- 创建工程文件
完成上述设置后,
点击创建工程

- 配置下载工具

新建的工程所有配置都是默认的 我们需要自行选择下载模式,勾选上下载后复位运行。

在工程文件上右键,选择以下选项:

进入以下界面配置:

- RTC_HAL库函数

以下是常用的RTC库函数

/*设置系统时间*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*设置系统日期*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*启动报警功能*/
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*报警时间回调函数*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*写入后备储存器*/
void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
/*读取后备储存器*/
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister  

系统的时间和日期开始的时候已经设置过了,所以我们这里只用两个读取函数

/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)

参数分析:*hrtc RTC结构体参数 例:&hi2c2
RTC_TimeTypeDef *sTime: 获取RTC时间的结构体,
Format: 获取时间的格式
RTC_FORMAT_BIN 使用16进制
RTC_FORMAT_BCD 使用BCD进制

/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)

参数分析:*hrtc RTC结构体参数 例:&hi2c2

RTC_DateTypeDef *sTime: 获取RTC日期的结构体,

Format: 获取日期的格式
RTC_FORMAT_BIN 使用16进制
RTC_FORMAT_BCD 使用BCD进制

在stm32f1xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDef,RTC_DateTypeDef这两个结构体的成员变量。注意,找头文件时,不要在软件里去找,打开工程文件。我的头文件路径如下,仅作参考。

/*时间结构体*/
typedef struct
{uint8_t Hours;            /*!< Specifies the RTC Time Hour.This parameter must be a number between Min_Data = 0 and Max_Data = 23 */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 */} RTC_TimeTypeDef;/*日期结构体*/
typedef struct
{uint8_t WeekDay;  /*!< Specifies the RTC Date WeekDay (not necessary for HAL_RTC_SetDate).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;

在main.c文件中重写fputc函数,完成printf函数的重定向

//添加头文件#include "stdio.h"
int fputc(int ch,FILE *f){uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);return ch;
}

在main.c中定义时间和日期的结构体用来获取时间和日期

RTC_DateTypeDef GetData;  //获取日期结构体RTC_TimeTypeDef GetTime;   //获取时间结构体

在main函数的while循环中添加以下代码

/* Get the RTC current Time */HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);/* Get the RTC current Date */HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);/* Display date Format : yy/mm/dd */printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);/* Display time Format : hh:mm:ss */printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);printf("\r\n");HAL_Delay(1000);

然后点击,开始编译。

RTC初始时间


RTC默认初始时间是0年1月1日零时零分零秒。


总结

本次实验,我了解了RTC时钟的基础知识,知道了它的工作原理,注意事项,学会用它做一些简单的小功能,通过调用HAL函数,获取时间日期,再添加头文件,用printf函数输出就可以了。

参考:https://blog.csdn.net/qq_45659777/article/details/121621521
https://blog.csdn.net/as480133937/article/details/105741893

STM32RTC时钟和日历相关推荐

  1. 基于51单片机的自动浇花系统设计/基于51单片机的智能抽奖系统控制设计/基于51单片机的数字时钟与日历显示控制设计 毕业设计

    1147基于51单片机的自动浇花系统设计 设计思路:通湿度传感器实时监测湿度,通过LCD显示出实时的湿度采集值,可以通过按键设定目标界限,当达到这个界限值时,浇花系统的电机装置运行. 电路包含:LCD ...

  2. EPSON RX8010SJ RTC 调试笔记之五, 时钟及日历解析

    硬件: EPSON RX8010 SJ 时钟及日历解板示例 RX8010SJ RTC 时钟芯片,除周寄存器(WEEK Register) 外,其它涉及时间的寄存器,均采用 8421 BCD 来表示. ...

  3. 怎样在计算机桌面上添加小工具日历,如何在电脑桌面添加时钟,日历等小工具。 在电脑桌面添加时钟,日历等小工具的方法。...

    今天给大家带来如何在电脑桌面添加时钟,日历等小工具.,在电脑桌面添加时钟,日历等小工具的方法.,让您轻松解决问题. 摆脱电脑右下角的死板数字时间,在电脑桌面上放一个可以移动的立体时钟,想起来就帅呆了~ ...

  4. android10.0 launcher3默认设置时钟和日历为动态图标

    1.概述 在10.0的系统产品开发中,在Launcher3长按屏幕 弹出的弹窗中 点击 主屏幕设置 在下面的下拉列表中 可以看到 动态图标 点击动态图标 可以看到 有 时钟 和 日历的 开关 但是发现 ...

  5. 日历记事本时钟java_java日历记事本(无敌版带提醒功能调整时区更换图片铃声功能)...

    3. 高级功能 1) 时区设置 我们为用户提供了多达75个时区的选择,点击更改时区即可将时间切换到当前用户所在的时区,可以满足用户去往不同国家的需求.是一款"国际化"日历. 2) ...

  6. STM32-RTC时钟学习笔记

    目录 RTC简介 2.RTC框图 3.寄存器 RTC 的控制寄存器, RTC 预分频装载寄存器, STM32 的备份寄存器 备份区域控制寄存器RCC_BDCR RTC 正常工作的一般配置步骤 几个函数 ...

  7. html 日历时钟插件,日历时钟 - Chrome生产工具插件 - 画夹插件网

    日历时钟的开发背景 在我们的电脑中通常可以很简单地查看到时间和日期,而Windows7早期的小工具中也存在着日期和时间的小工具,但是由于小工具的安全问题,最终Windows操作系统废弃掉.今天给大家推 ...

  8. 单片机c语言编程 时钟加日历转换,基于52单片机电子时钟日历系统的设计

    该系统是以52单片机为基础,以时钟日历芯片DSl2887为核心构建的时钟系统.完成的功能如下:显示年.月.日.星期.小时.分钟.秒钟,具有1OO年的日历,具有掉电不丢失性,能够通过按键调整时间.DS1 ...

  9. C语言电子时钟程序设计,单片机C语言电子时钟加日历显示编程

    一. 任务和要求 设计制作一个电子表并且能够显示日历,用LED数码管直接显示,并且能够通过按键调整时间.年月日,功能为按第一个键被调整的相应调整区域开始闪烁,第二个键加一,第三个减一,第四个确认,最后 ...

最新文章

  1. 计图MPI分布式多卡
  2. python3(十二)打开和关闭文件
  3. Packet Tracer 5.0 建构 CCNA 实验攻略——路由器实现 Vlan 间通信
  4. 多个notification引发的问题
  5. php多表条件排除然后输出,php – 从具有多个要求的两个表中选择值,但仅使用其中一个...
  6. .net weka ikvm java
  7. STM8S003F3 使用内置的Data EEPROM的操作接口
  8. Win10如何查看打印机端口号?
  9. 如何设置路由器wifi的用户黑名单?(使别人不能连接你家WIFI)
  10. 08-3 Kubernetes 调度器 - 污点
  11. [ArcPy] 1 ArcPy与栅格(Raster)
  12. JavaScript 获取当前周数
  13. 你迷茫的原因在于读书太少而想的太多,迷茫不知所措时,那就多读书吧!年轻是本钱,但不努力就不值钱
  14. PS从入门到精通第3节
  15. 虚幻引擎4简介,UE4简介--这是一个强大的游戏开发引擎
  16. 卷积神经网络的网络结构——ResNet
  17. 关于经济寒冬找工作为什么这么难?
  18. error 系统错误 错误码10007_在Java项目中打印错误日志的正确姿势,排查问题更方便,非常实用!...
  19. luogu P1710 地铁涨价
  20. Sawyer协作机械臂环境配置与执行(Ubuntu18.04)

热门文章

  1. PS3简易蓝光规格视频制作说明
  2. powerbi难点!
  3. python抢票代码_如何使用python爬取抢票?
  4. 宿主FL Studio水果音乐制作Daw20.9
  5. Distilled sesing
  6. lg-1 x 怎么算_从猫咪咖啡馆到颐和园落日 富士X-T3的京城冬季一日游记
  7. cyclone v 调试DDR3L时出现SEQ.C: CALIBRATION FAILED
  8. ThinkPHP5实现极验滑动验证码geetest功能
  9. html5 流星雨,canvas简单流星雨
  10. UDP GSO原理及应用