【STM32】RTC(实时时钟)

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

1.RTC简介 

本质:计数器

RTC中断是外部中断(EXTI)

当VDD掉电的时候,Vbat可以通过电源--->实时计时

STM32的RTC外设(Real Time Clock),实质是一个 掉电 后还继续运行的定时器。从定时器的角度来说,相对于通用定时器TIM外设,它十分简单, 只有很纯粹的计时和触发中断的功能;但从 掉电还继续运行 的角度来说,它却是STM32中唯一一个具有如此强大功能的外设。 所以RTC外设的复杂之处并不在于它的定时功能,而在于它掉电还继续运行的特性。

stm32 rtc,STM32,stm32,嵌入式硬件

常用的RTC方案

1)一般都需要设计RTC外围电路(例如晶振,电源等)

2)一般都可以给RTC设置独立的电源(当内部Soc的内部电源VDD失效时,可以使用外部电源进行供电,实现掉电还能运行)

3)多数RTC的寄存器采用BCD码此处时间信息

stm32 rtc,STM32,stm32,嵌入式硬件

RTC使用场景

stm32 rtc,STM32,stm32,嵌入式硬件stm32 rtc,STM32,stm32,嵌入式硬件

2.STM32RTC框图介绍

一般分频后的时钟频率为1HZ

stm32 rtc,STM32,stm32,嵌入式硬件

浅灰色的部分都是属于备份域的,在VDD掉电时可 在VBAT的驱动下继续运行。这部分仅包括RTC的分频器,计数器, 和闹钟控制器。

时钟源的选择

它使用的时钟源有三种,分别为高速外部时钟 的128分频(HSE/128)、低速内部时钟LSI以及低速外部时钟LSE;使HSE分频时钟或LSI的话,在主电源VDD掉电 的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作。因此RTC一般使用低速外部时钟LSE,在设计中, 频率通常为实时时钟模块中常用的32.768KHz,这是因为32768 = 2^15,分频容易实现,所以它被广泛应用到RTC模块。

HSE(高速外部时钟)/128---》因为是需要使用到Soc内部的电源,所以不能使用

LSI(低速内部时钟)40KHZ---》因为容易受到温度影响,使用不使用

LSE32KHZ----》低速外设接口(32.768KHZ)

1.RTC预分频器

在配置RTC模块的时钟时,通常把输入的32768Hz的RTCCLK进行32768分频得到实际驱动计数器的时钟TR_CLK = RTCCLK/32768= 1 Hz,计时周期为1秒,计时器在TR_CLK的驱动下计数,即每秒计数器RTC_CNT的值加1。

stm32 rtc,STM32,stm32,嵌入式硬件

2.32位可编程计数器

1)从RTC的定时器特性来说,它是一个32位的计数器,只能向上计数

2)在备份域中所有寄存器都是16位的, RTC控制相关的寄存器也不例外。它的计数器RTC_CNT的32位由RTC_CNTLRTC_CNTH两个寄存器组成,分别保存定时计数值的低16位和高16位。

stm32 rtc,STM32,stm32,嵌入式硬件

3.待机唤醒

有2种唤醒方式

stm32 rtc,STM32,stm32,嵌入式硬件

4.RTC控制寄存器与APB1接口

stm32 rtc,STM32,stm32,嵌入式硬件

3.后备寄存器和RTC寄存器特性

1)当主电源VDD有效时,由VDD给RTC外设供电; 而当VDD掉电后,由VBAT给RTC外设供电。但无论由什么电源供电,RTC中的数据都保存在 属于RTC的备份域,若主电源VDD和VBAT都掉电,那么备份域中保存的所有数据 将丢失。

2)后备寄存器可以用于保存掉电时的数据

stm32 rtc,STM32,stm32,嵌入式硬件

4.RTC相关寄存器介绍

1.APB1 外设时钟使能寄存器(RCC_APB1ENR)

使能PWR&&BKP时钟

stm32 rtc,STM32,stm32,嵌入式硬件

2.电源控制寄存器(PWR_CR)

使能对后备寄存器和RTC的访问权限

stm32 rtc,STM32,stm32,嵌入式硬件

3.备份域控制寄存器 (RCC_BDCR)

1.开启RTC时钟

2.开启LSE时钟

3.选择RTC计数时钟源

stm32 rtc,STM32,stm32,嵌入式硬件

4.RTC控制寄存器低位(RTC_CRL)

stm32 rtc,STM32,stm32,嵌入式硬件

5.RTC控制寄存器高位(RTC_CRH)

stm32 rtc,STM32,stm32,嵌入式硬件

6.RTC预分频装载寄存器(RTC_PRLH/RTC_PRLL)

stm32 rtc,STM32,stm32,嵌入式硬件

7.RTC计数器寄存器 (RTC_CNTH / RTC_CNTL)

将年月日时分秒---》转换为“秒”

stm32 rtc,STM32,stm32,嵌入式硬件

5.RTC基本配置步骤

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

相关HAL库介绍

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

6.时间设置和读取

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

7.通过串口打印当前时间

1.rtc初始化

stm32 rtc,STM32,stm32,嵌入式硬件

2.rtc_msp

stm32 rtc,STM32,stm32,嵌入式硬件

3.rtc_set_time

将输入的时间转换形式写入寄存器

stm32 rtc,STM32,stm32,嵌入式硬件

//月份数据表											 
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表	  
//平年的月份日期表
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};

/*******************************************************************************
* 函 数 名         : RTC_Set
* 函数功能		   : RTC设置日期时间函数(以1970年1月1日为基准,把输入的时钟转换为秒钟)
						1970~2099年为合法年份
* 输    入         : syear:年  smon:月  sday:日
					hour:时   min:分	 sec:秒			
* 输    出         : 0,成功
        			 1,失败
*******************************************************************************/
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	//把所有年份的秒钟相加
	{
		if(Is_Leap_Year(t))seccount+=31622400;//闰年的秒钟数
		else seccount+=31536000;			  //平年的秒钟数
	}
	smon-=1;
	for(t=0;t<smon;t++)	   //把前面月份的秒钟数相加
	{
		seccount+=(u32)mon_table[t]*86400;//月份秒钟数相加
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;//闰年2月份增加一天的秒钟数	   
	}
	seccount+=(u32)(sday-1)*86400;//把前面日期的秒钟数相加 
	seccount+=(u32)hour*3600;//小时秒钟数
    seccount+=(u32)min*60;	 //分钟秒钟数
	seccount+=sec;//最后的秒钟加上去

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟  
	PWR_BackupAccessCmd(ENABLE);	//使能RTC和后备寄存器访问 
	RTC_SetCounter(seccount);	//设置RTC计数器的值

	RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成  	
	return 0;	    
}

4.rtc_get_time

将从寄存器获得的值进行展示

//得到当前的时间
//返回值:0,成功;其他:错误代码.
u8 RTC_Get(void)
{
	static u16 daycnt=0;
	u32 timecount=0; 
	u32 temp=0;
	u16 temp1=0;	  
    timecount=RTC_GetCounter();	 
 	temp=timecount/86400;   //得到天数(秒钟数对应的)
	if(daycnt!=temp)//超过一天了
	{	  
		daycnt=temp;
		temp1=1970;	//从1970年开始
		while(temp>=365)
		{				 
			if(Is_Leap_Year(temp1))//是闰年
			{
				if(temp>=366)temp-=366;//闰年的秒钟数
				else {temp1++;break;}  
			}
			else temp-=365;	  //平年 
			temp1++;  
		}   
		calendar.w_year=temp1;//得到年份
		temp1=0;
		while(temp>=28)//超过了一个月
		{
			if(Is_Leap_Year(calendar.w_year)&&temp1==1)//当年是不是闰年/2月份
			{
				if(temp>=29)temp-=29;//闰年的秒钟数
				else break; 
			}
			else 
			{
				if(temp>=mon_table[temp1])temp-=mon_table[temp1];//平年
				else break;
			}
			temp1++;  
		}
		calendar.w_month=temp1+1;	//得到月份
		calendar.w_date=temp+1;  	//得到日期 
	}
	temp=timecount%86400;     		//得到秒钟数   	   
	calendar.hour=temp/3600;     	//小时
	calendar.min=(temp%3600)/60; 	//分钟	
	calendar.sec=(temp%3600)%60; 	//秒钟
	calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);//获取星期   
	return 0;
}	 
//获得现在是星期几
//功能描述:输入公历日期得到星期(只允许1901-2099年)
//输入参数:公历年月日 
//返回值:星期号																						 
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{	
	u16 temp2;
	u8 yearH,yearL;
	
	yearH=year/100;	yearL=year%100; 
	// 如果为21世纪,年份数加100  
	if (yearH>19)yearL+=100;
	// 所过闰年数只算1900年之后的  
	temp2=yearL+yearL/4;
	temp2=temp2%7; 
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)temp2--;
	return(temp2%7);
}			  

8.使用CubeMX生成代码

【精选】STM32CubeMX学习笔记(14)——RTC实时时钟使用_bcd data format-CSDN博客

1.开启RTC

RTC是在时钟部分的

stm32 rtc,STM32,stm32,嵌入式硬件

2.使能时钟RCC

由于我们使用32.768MHZ(外部低速晶振),所以我们要使能低速时钟(LSE)

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

主时钟还是按照原来的时钟频率去设置(主时钟和RTC没有关系)

stm32 rtc,STM32,stm32,嵌入式硬件

3.RTC相关的设置

勾选 Activate Clock Source 激活时钟源,勾选 Activate Calendar 激活万年历

1.开启Activate Calendar

只有开启后才可以进行设置时间

stm32 rtc,STM32,stm32,嵌入式硬件

2.RTC OUT Disable

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

3.中断设置

stm32 rtc,STM32,stm32,嵌入式硬件

4.Calendar Time

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件

5.Calendar Day

stm32 rtc,STM32,stm32,嵌入式硬件

stm32 rtc,STM32,stm32,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-773323.html

到了这里,关于【STM32】RTC(实时时钟)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 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)
  • stm32-OLED屏+RTC实现简易实时时钟(上篇)

    oled屏选择ssd1306,使用RTC实现简易实时时钟 1、MCU接口选择 SSD1306单片机接口由8个数据引脚和5个控制引脚组成。通过BS[2:0]引脚上的硬件选择可以设置不同的MCU模式    通过控制BS[2:0]引脚可以设置MCU与OLED屏的通信方式。因为我使用的是正点原子的开发板,所以我用了适配的接

    2024年01月17日
    浏览(39)
  • stm32-OLED屏+RTC实现简易实时时钟(下篇)

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

    2024年01月18日
    浏览(39)
  • 蓝桥杯嵌入式(G4系列):RTC时钟

              关于RTC时钟的HAL库配置我也是第一次,之前都是用库函数的写法,这里写下这篇博客来记录一下自己的学习过程。         首先点击左侧的Timers的RTC,勾选以下选项         进入时钟树配置          进入时间设置,这里我把时间设置为了2023年3月12日20点20分,但

    2023年04月15日
    浏览(32)
  • 【STM32】读写BKP备份寄存器&RTC实时时钟

    目录 BKP BKP简介 BKP基本结构 BKP测试代码 RTC RTC简介 RTC框图 RTC基本结构 硬件电路 RTC操作注意事项 接线图 初始化 使用BKP解决只初始化一次时间  初始化参考代码 RTC设置时间 RTC读取时间 完整代码 MyRTC.c MyRTC.h main.c BKP(Backup Registers)备份寄存器 BKP可用于存储用户应用程序数据

    2024年04月22日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包