【STM32 RTC实时时钟如何配置!超详细的解析和超简单的配置,附上寄存器操作】

STM32 里面RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。因为系统对后备寄存器和RTC相关寄存器有写保护,所以如果想要对后备寄存器和RTC进行访问,则需要通过操作相应的寄存器来解除某些限制。

文章有点长,想要理解RTC原理的可以认真阅读。如果只想要源码的,可以直接拉到文章最下面

接下来进入正题:

一、解除寄存器操作限制

第一步首先需要设置RCC_APB1ENR的PWREN和BKPEN位。使能电源和后备接口时钟
在这里插入图片描述
第二步是设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问
在这里插入图片描述

二、配置RTC

完成上面两步之后,我们就可以操作后备寄存器和RTC相关的寄存器了。但我们先来看看RTC的简单框图吧
在这里插入图片描述
从图可以看出来,要想让RTC工作,得让它先有一个时钟,也就是图中RTCCLK时钟的选择。
1、RTC时钟的选择
RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。除非备份域复位,此选择不能被改变。

LSE时钟在备份域里,但HSE和LSI时钟不是。因此:

● 如果LSE被选为RTC时钟:

─ 只要V BAT 维持供电,尽管V DD 供电被切断,RTC仍继续工作。

● 如果LSI被选为自动唤醒单元(AWU)时钟:

─ 如果V DD 供电被切断, AWU状态不能被保证。

● 如果HSE时钟128分频后作为RTC时钟:

─ 如果V DD 供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。

RTC的时钟源有三个,但只有LSE(外部低速振荡器,一般为32.678kHz)在VDD供电被切断后,仍能继续工作,因此我们一般都选择它。

RTC时钟源的选择需要操作备份域控制寄存器(RCC_BDCR)
在这里插入图片描述
配置时钟步骤

1)打开外部振荡器(LSEON置1)

2)然后等待LSE就绪,也就是等待LSERDY置1

3)选择RTC时钟源,也就是配置RTCSEL[1:0]

4)使能RTC时钟(RTCEN置1)

2、配置RTC相关寄存器
从RTC框图可以知道,RTC时钟选择后就应该配置RTC预分频器(RTC_PRL寄存器)和RTC_CNT计数器和闹钟计数器RTC_ALR。

一般我们通过预分频器将RTCCLK的时钟进行分频,让预分频器的输出时钟TR_CLK的频率变成1Hz,也就是周期为1s。然后RTC_CNT在TR_CLK频率下递增。如果RTC_CNT里面的值和RTC_ALR里面的数值相等,则会触发闹钟标志,即ALRF标志位置1。在每个TR_CLK的周期都会触发一次秒标志,即SECF标志位会置1.

一般如果用于时钟时钟的话,RTC_CNT可以设置为当前的时间。

如果需要配置RTC的 RTC_PRL、RTC_CNT、RTC_ALR寄存器。则必须判断RTC寄存器是否处于更新中,只有RTC寄存器不是处于跟新中才可以进行配置,可以通过RTC_CR寄存器里面的RTOFF位来判断。在配置前还必须将RTC_CRL寄存器里面的CNF位置1,进入配置模式,等待配置后,还要退出配置模式。

配置过程

1)查询RTOFF位,直到RTOFF的值变为‘1’

2)置CNF为1,进入配置模式

3)对一个或多个RTC寄存器进行写操作

4)清除CNF标志位,退出配置模式

5)查询RTOFF,直到RTOFF变为1,才代表写操作完成

注意:只有当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期

在正式进入配置之前我们先来看看RTC几个寄存器

RTC控制寄存器高位RTC_CRH

在这里插入图片描述
这几位是用来使能中断的,可以配合前面的RTC框图“食用”

RTC控制寄存器低位RTC_CRL
在这里插入图片描述
在这里插入图片描述
注意:标志位都需要由软件清零

RTC预分频转载寄存器(RTC_PRLH/RTC_PRLL)

该寄存器是用于配置预分频器的分频比的,只有前20位有效,即PRL[19:0]有效,总共20位。

时钟计算公式fTR_CLK = fRTCCLK /(PRL[19:0]+1)。

当LSE位32.678kHz时,只需将RTC_PRLL配置成32677即可。

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

该32寄存器可以通过配置来设定初值,并且在TR_CLK的基准下进行计数

RTC闹钟寄存器(RTC_ALRH/RTC_ALRL)

该32位寄存器用来配置闹钟的数值。

现在基本知识框架都已经介绍好了正式进入配置阶段

首先我先给出直接操作寄存器的版本,后面我也会给出操作固件库的版本。

我相信通过前面的讲解,直接操作寄存器反而会更简单!代码也很容易看懂

//寄存器版本
void RTC_Init(void)
{
//这里是第一步解除写保护
	RCC->APB1ENR |= RCC_APB1ENR_PWREN;//电源接口时钟使能
	RCC->APB1ENR |= RCC_APB1ENR_BKPEN;//备份接口时钟开启
	PWR->CR |= PWR_CR_DBP;//允许写入RTC和后备寄存器
//这里是第二步进入配置
	RCC->BDCR |= RCC_BDCR_LSEON;//打开外部32kHz振荡器
	while(!(RCC->BDCR & RCC_BDCR_LSERDY));//等待外部32kHz振荡器就绪
	RCC->BDCR |= RCC_BDCR_RTCSEL_LSE;//选择外部32kHz振荡器作为RTC时钟源
	RCC->BDCR |= RCC_BDCR_RTCEN;//RTC时钟使能
	while(!(RTC->CRL &RTC_CRL_RTOFF));//等待上一次写操作完成
	RTC->CRL |= RTC_CRL_CNF;//进入配置模式
	RTC->PRLL = 32767;//fTR_CLK = fRTCCLK /(PRL[19:0]+1),周期为1Hz
	RTC->CNTL = 0;//配置当前时间
	RTC->CNTH = 0;
	RTC->ALRH = 0;//配置闹钟时间
	RTC->ALRL = 2;
	RTC->CRH |= (RTC_CRH_ALRIE + RTC_CRH_SECIE);//使能秒中断和闹钟中断	
	RTC->CRL &= ~(RTC_CRL_CNF);//退出配置模式
}

### 回答1: STM32CubeMX是一个用于STM32微控制器的图形化配置工具,可以帮助用户快速配置各种外设和时钟。在STM32CubeMX中配置RTC时钟需要以下步骤: 1. 打开STM32CubeMX软件,选择对应的STM32微控制器型号。 2. 在“时钟配置”选项卡中,勾选“RTC时钟”选项。 3. 在“RTC时钟”选项卡中,选择RTC时钟源和分频系数。常用的RTC时钟源有LSI和LSE,分频系数可以根据需要进行配置。 4. 点击“生成代码”按钮,生成相应的代码。 5. 在生成的代码中,可以找到RTC时钟初始化函数和RTC时钟中断处理函数,根据需要进行修改和调用。 以上就是STM32CubeMX的RTC时钟配置的基本步骤。需要注意的是,RTC时钟的配置需要根据具体的应用场景进行调整,以保证系统的稳定性和可靠性。 ### 回答2: STM32CubeMX是STMicroelectronics公司推出的一款自动生成STM32系列微控制器程序框架的软件工具,支持多种嵌入式开发环境,如Keil MDK、IAR、GCCR等。其中,RTC时钟配置STM32CubeMX中的一个重要功能,在嵌入式系统中常被使用。 首先,RTC(Real Time Clock)是一种能够在STM32微控制器中存储和计算时间信息的电路模块,通常用于时钟管理、计时、定时等应用。RTC模块工作时需要使用独立的振荡器,因此使用RTC需要单独配置其时钟源。下面是关于STM32CubeMX中RTC时钟配置详细步骤: 1.初始化RTC时钟配置 打开STM32CubeMX,进入“Clock Configuration”页面,选择“RTC”时钟配置选项,勾选“LSE”以使RTC时钟使用外部低速振荡器(LSE),勾选“RTC输出来源”以选择RTC时钟输出源(可选)。 2.配置LSE振荡器 在“Pinout & Configuration”页面中,选中“Crystal OSC”菜单,在振荡器引脚配置区域中,选择使用外部低速振荡器(LSE)并设置其频率(例如32.768kHz)。此处需要注意,LSE型号和其供应商要与使用的开发板相对应,同时需要进行测试以确保振荡器正常工作。 3.启用RTC时钟 在“Clock Configuration”页面中,勾选“RTC时钟输出开启”选项即可启用RTC时钟功能,同时选择“RTC输出来源”以选择其时钟源。 4.生成代码 当完成以上配置后,单击“GENERATE CODE”按钮生成代码,STM32CubeMX会自动生成用于配置RTC时钟的C代码,同时将其添加到启动文件中。 上述过程中,还可以对RTC时钟进行其他配置,如时钟中断、闹钟配置等。在STM32CubeMX中,RTC时钟配置非常方便快捷,使得我们能够在嵌入式系统中高效地管理时间,实现定时、计时等功能。同时,还要注意振荡器的选择和质量,以保证RTC时钟的准确性和可靠性。 ### 回答3: STM32CubeMX是一款集成开发环境,可以帮助嵌入式系统开发人员快速搭建STM32微控制器的开发环境,方便用户快速配置微控制器的外设、系统时钟等。 在STM32CubeMX中,RTC实时时钟)是一个重要的外设。RTC是一种独立的时间计数器,常用于需要精确时间计量的嵌入式应用。在STM32系列微控制器中,RTC可以使用外部低速晶振提供时钟信号,可以提供最大到210年的时间计数。 RTC的时钟配置主要包括以下几个步骤: 1. 设置外部低速晶振:在STM32CubeMX中,需要在RCC(Reset and Clock Control)中设置RTC的外部时钟源。用户需要先确定自己所用的外部低速晶振的频率,然后选择相应的外部时钟源。在选择完毕后,需要点击“Clock Configuration”按钮来确认设置。 2. 配置RTC时钟:在STM32CubeMX中,RTC时钟可以和主系统时钟分离,因此需要在RTC中进行配置。用户需要在RTC Configuration中选择“Clock Source”为“LSE”(即外部低速晶振),并设置预分频器,从而得到具体的RTC时钟频率。在确认完毕后,需要点击“Clock Configuration”按钮来保存设置。 3. 生成代码:在配置完毕后,用户需要点击“Generate Code”来生成相应的代码。STM32CubeMX会自动生成相应的初始化代码,用户只需要将其复制到自己的工程中即可。 4. 初始化RTC:在自己的工程中,用户需要调用HAL_RTC_Init()函数来初始化RTC。在初始化过程中,STM32CubeMX会设置RTC的时钟源和预分频器,从而保证RTC能够正常工作。 以上就是STM32CubeMX中RTC时钟配置的步骤,用户可以根据自己的实际情况进行修改。在RTC时钟配置过程中,需要特别注意时钟源的选择和预分频器的设置,这一点对于RTC的正常工作非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值