学习笔记:RTC时钟

article/2025/8/6 21:13:43

学习笔记:RTC时钟

1.什么是RTC

(1) RTC是个独立的定时器。RTC拥有一个连续计数的计数器。
(2)注意:RTC模块和时钟配置系统(RCC_BDCR寄存器)工作在后备区域,系统断电或者复位不会影响RTC的设置和事件,所以可以利用此特性来制作万年历。系统复位后,自动禁止访问后备寄存器和RTC,防止意外操作。
##2. RTC时钟源
(1)HSE时钟除以128
(2)LSE振荡器时钟:外部低速时钟(一般为32.767khz)
(3)LSI振荡器时钟:一般为(40khz)

3.RTC中断

(1)秒中断
(2)闹钟中断
(3)溢出中断

4.RTC计数器

32位可编程计数器,4,294,967,296位。
在这里插入图片描述

5.RTC工作原理

在这里插入图片描述a.分频区
在这里插入图片描述

b.计数比较区
在这里插入图片描述
c.各环节作用
RTC_PRL:在里面写入分频数据,将RTC_CLK分频
RTC_DIV:没经过一个周期,DIV减一。
TR_CLK:RTC_CLK经过RTC_PRL分频后的时钟周期
RTC_CNT:受到TR_CLK控制的32位计数器
RTC_ALR:可软件写入数据,当RTC_CNT与ALR数据相同时,触发闹钟中断。
注意
RTC内核独立与APB1接口,通过软件访问RTC相关寄存器时,只有在APB1时钟进行重新同步的RTC时钟的上升沿被更新。软件配置必须先等待寄存器同步标志位被1才可以读。

6.BKP

引用自STM32中文参考手册:
备份寄存器(BKP)
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和
STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控
制器。
互联型产品是指STM32F105xx和STM32F107xx微控制器。
除非特别说明,本章描述的模块适用于整个STM32F10xxx微控制器系列。
5.1 BKP简介
备份寄存器是42个16位的寄存器,可用来存储84个字节的用户应用程序数据。他们处在备份域
里,当VDD电源被切断,他们仍然由VBAT维持供电。当系统在待机模式下被唤醒,或系统复位或
电源复位时,他们也不会被复位。
此外,BKP控制寄存器用来管理侵入检测和RTC校准功能。
复位后,对备份寄存器和RTC的访问被禁止,并且备份域被保护以防止可能存在的意外的写操
作。执行以下操作可以使能对备份寄存器和RTC的访问。
● 通过设置寄存器RCC_APB1ENR的PWREN和BKPEN位来打开电源和后备接口的时钟
● 电源控制寄存器(PWR_CR)的DBP位来使能对后备寄存器和RTC的访问。

7.配置RTC寄存器

1.查询RTOFF位,直到变1
2.置CNF为1,开始配置
3.开始操作
4.退出配置模式(清除标志位)
5.等待写操作完成

8.实例:用RTC配置一个闹钟

一):分析

1.RTC初始化

  (1).初始化BKP时钟:BKP时钟,pwr时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);

(2).初始化RTC时钟
根据开发板选择相应时钟,一般的可选择lse时钟或者lsi时钟,在选择LSE时钟时,要先启动LSE时钟在RTC选择LSE时钟
example 引用LSI时钟(大约40khz)

BKP_DeInit();RCC_LSICmd(ENABLE);//使能LSIdelay_ms(100);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//RTC时钟选择LSIRCC_RTCCLKCmd(ENABLE);

(3)开启相应中断
a.开起中断要操作相应的RTC寄存器,所以要先等待上一次写完成
RTC_WaitForLastTask();
RTC_WaitForSynchro();

FOR EXAMPLE:开启秒中断和闹钟中断

       RTC_WaitForLastTask();RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC,ENABLE);//秒中断RTC_WaitForLastTask();RTC_WaitForLastTask();RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_ALR,ENABLE);//闹钟中断RTC_WaitForLastTask();

(4)配置分频值

RTC_SetPrescaler(40000);//1hz

(5)配置计数器的初始值
本例封装了一个函数来配置初始值

      RTC_WaitForLastTask();RTC_SETTIME(value);//³õʼ»¯¼ÆÊýÆ÷ÖµRTC_ExitConfigMode();******/void RTC_SETTIME(u32 CounterValue)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_SetCounter(CounterValue);RTC_WaitForLastTask();}	 

(6)init函数结束,但是还要配置中断函数
a. 中断分组

static void RTC_NVIC_Config(void)
{	NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		//RTCÈ«¾ÖÖжÏNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶1λ,´ÓÓÅÏȼ¶3λNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	//ÏÈÕ¼ÓÅÏȼ¶0λ,´ÓÓÅÏȼ¶4λNVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//ʹÄܸÃͨµÀÖжÏNVIC_Init(&NVIC_InitStructure);		//¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷
}

b.中断服务函数
(注意:中断服务函数是定义好的不可更改名称)

 void RTC_IRQHandler(void)
{if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)//秒中断{RTC_GETTIME();}if(RTC_GetITStatus(RTC_IT_ALR)==SET)//闹钟中断{RTC_ClearITPendingBit(RTC_IT_ALR);ALARM();}RTC_ClearITPendingBit(RTC_IT_SEC);RTC_WaitForLastTask();}

c.闹钟函数:ALARM();
自己定义的函数,放在了beep.c中,作用就是让闹钟到时间后蜂鸣器嚎叫

void ALARM(void)
{beep_con(1);delay_ms(1000);beep_con(0);}

(7)闹钟配置
因为要写一个闹钟,所以要先配置相应寄存器

void RTC_SERALRM(u32 CounterValue)//ÄÖÖÓ
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_SetAlarm(CounterValue);RTC_WaitForLastTask();}

闹钟配置和时间初始化差不多,都要开启PWR和BKP时钟,然后设置值(u32型)然后等待写结束
(8)获取时间函数
我们要将时间显示在lcd屏幕上,做一个数据可视化处理,所以要将计数器中的值读出,并显示,因此定义了一个结构体

typedef struct
{
vu8 hour;
vu8 min;
vu8 sec;}_calendar_obj;
extern _calendar_obj calendar;

然后通过获取计数器值经过计算赋予结构体值显示在LCD屏幕上

void RTC_GETTIME(void)
{u32 time=0;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);time=RTC_GetCounter();//获取计数器值calendar.hour=time/3600;calendar.min=(time%3600)/60;calendar.sec=(time%3600)%60;}

(9)主函数

#include "stm32f10x.h"
#include "lcd.h"
#include "key.h"
#include "stdio.h"
#include "beep.h"
#include "delay.h"
#include "rtc.h"
u32 TimingDelay = 0;void Delay_Ms(u32 nTime);
void xianshisec(u8 val)
{uint8_t temp[20];sprintf(temp,"sec=%d",val);LCD_DisplayStringLine(Line0,temp);
}
void xianshimin(u8 val)
{uint8_t temp[20];sprintf(temp,"min=%d",val);LCD_DisplayStringLine(Line1,temp);
}
void xianshihour(u8 val)
{uint8_t temp[20];sprintf(temp,"hour=%d",val);LCD_DisplayStringLine(Line2,temp);
}
//Main Body
int main(void)
{float num=0;int keya=0;u8 t=0;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);beep_init();delay_init();RTC_INIT(0x00000000);STM3210B_LCD_Init();LCD_Clear(Blue);LCD_SetBackColor(Blue);LCD_SetTextColor(White);SysTick_Config(SystemCoreClock/1000);key_inite();LCD_Clear(White);LCD_SetBackColor(White);	Delay_Ms(1000);LCD_SetTextColor(Black);Delay_Ms(1000);RTC_SERALRM(0x00000005);while(1){if(t!=calendar.sec){t=calendar.sec;xianshisec(calendar.sec);xianshimin(calendar.min);xianshihour(calendar.hour);}delay_ms(10);}return 0;
}//
void Delay_Ms(u32 nTime)
{TimingDelay = nTime;while(TimingDelay != 0);	
}

http://chatgpt.dhexx.cn/article/XwgEliyT.shtml

相关文章

STM32-RTC实时时钟

RTC实时时钟 RTC(Real Time Clock)是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄…

STM32的RTC时钟的获取

STM32的RTC时钟的获取 硬件 1.STM32F103RCT6最小系统板(mini) 2.下载器(我这里使用的ST-linkV2) 3.纽扣电池 软件 1.keil5 (MDK) 2.STM32CuBe MX(因为比较方便嘛,其实也可以拖库&…

STM32 RTC时钟掉电日期不更新 STM32 HAL库RTC时钟配置

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 STM32 RTC时钟掉电日期不更新 & STM32 HAL库RTC时钟配置 一、STM32CubeMX RTC配置二、RTC初始化三、RTC日期掉电不更新(F1...这里暂时只考虑F103,其他系列未测…

STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能

STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能 目录 STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能(一)工程配置(二)代码编写(三)运行效果 本章实现效果: RTC时钟获取周期…

STM32G4之RTC实时时钟

文章目录 前言一、RTC介绍二、STM32CubeMX配置三、部分源码总结 前言 一、RTC介绍 STM32 的 RTC 外设(Real Time Clock) ,实质是一个掉电后还继续运行的定时器。STM32G4 的 RTC,是一个独立的 BCD 定时器/计数器。 RTC 提供一个日历…

什么是RCT实时时钟?(STM32中RTC时钟源)

什么是RCT(Real Time Clock,实时时钟)? 一、RTC时钟简介 RTC(Real Time Clock,实时时钟)是指安装在电子设备或实现其功能的IC(集成电路)上的时钟,一般会是集成电路&am…

STM32:RTC实时时钟原理

RTC (Real Time Clock):实时时钟 RTC是个独立的BCD定时器/计数器。RTC 提供一个日历时钟,两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC还包含用于管理低功耗模式的自动唤醒单元。 两个32位寄存器包含二进码十进制格式…

STM32物联网项目-RTC时钟

RTC时钟 RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系…

十九、RTC实时时钟

一、.RTC实时时钟工作框图 RTC 由两个主要部分组成,第一部分(APB1 接口)用来和 APB1 总线相连。此单元还包含一组 16 位寄存器,可通过 APB1 总线对其进行读写操作。APB1 接口由 APB1 总线时钟驱动,用来与 APB1 总线连接。 RTC_PRL设置100&a…

STM32 RTC时钟读取时间

文章目录 一、RTC简介1.1 RTC1.2 RTC特征1.3 RTC原理框图1.4 RTC工作流程1.5 RTC时钟选择1.6 RTC复位过程1.7 RTC中断 二、CubeMX配置2.1 RCC配置2.2 SYS配置2.3 RTC配置2.4 串口配置2.5 时钟配置2.6 生成项目代码 三、代码编写3.1 重写printf3.2 RTC_HAL库函数/*设置系统时间*…

STM32 RTC实时时钟

我用的是STM32库函数:两个知识点: 一、RTC时钟框图分析(重要) 二、时间是怎样显示出来的(简析) 一、RTC时钟框图分析(重要) 先熟悉一下几个知识点: …

STM32之RTC时钟,闹钟,日历

RTC时钟的一些功能介绍 RTC时钟即实时时钟,它提供了用于管理所有低功耗模式的自动唤醒单元,还提供了具有可编程闹钟中断功能的日历时钟/日历。 并且可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。并且还可以进行夏令时…

深入学习RTC时钟库 DS1302

❤️博主介绍❤️ 😬 作者:单片机菜鸟哥 👉火爆博客:ESP8266 Arduino教程 零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇…

深入学习 RTC时钟库 DS3231

❤️博主介绍❤️ 😬 作者:单片机菜鸟哥 👉火爆博客:ESP8266 Arduino教程 零基础从入门到熟悉Arduino平台下开发ESP8266,同时会涉及网络编程知识。专栏文章累计超过60篇,分为基础篇、网络篇、应用篇、高级篇…

rtc时钟

一、设计效果 配置RTC时钟,初始化为2000年1月1日00:00:00;通过RTC时钟秒中断串口每秒打印一次当前时刻,并切换一次流水灯状态;配置闹铃为10:00:05,在闹铃中断中每秒切换一次蜂鸣器状态闹铃,直到按KEY1关闭…

RTC时钟实现实时日历

文章目录 1、RTC时钟简介1.2、初识RTC1.2、相关寄存器 2、创建项目23、完善代码4、总结 1、RTC时钟简介 1.2、初识RTC 1、简介: RTC—real time clock,实时时钟,主要包含日历、闹钟和自动唤醒这三部分的功能,其中的日历功能我们使…

STM32之RTC时钟

前言 了解实时时钟RTC的原理。STM32芯片自带RTC,因此不须像其他MCU需外接RTC模块。请编程实现STM32的日历读取、设置和输出。要求: 1)读取RTC初始时间,验证是否为 1970年1月1日零分零秒; 2)将RTC时间调整为…

【STM32】HAL库 STM32CubeMX教程十三---RTC时钟

前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软…

【STM32】详解RTC实时时钟的概念和配置示例代码

一、什么是RTC RTC(Real-time Clock):实时时钟,本质上是一个支持BCD编码的定时器/计数器。主电源断电后能够由电池供电,使其时钟跳转依然正常。 二、STM32F4芯片内的RTC功能 ①日历时钟(时分秒、年月日、星期) ②两个闹…

android小错误:Failure retrieving text 0x7f050001 in package

1.在启动android应用程序的过程中,logcat打印如下的错误: 报错的原因:资源的id没有找到。资源在R.java文件中,找到0x7f050001 对应的定义 R.java public static final int AppTheme0x7f050001; AppTheme这个文件在AndroidMan…