STM32的RTC时钟及其相关寄存器

1.什么是RTC时钟:RTC时钟本质上上一个定时器系统,但是其定时器的计数值最终是以2020-1-30 16-27 类似这样的形式呈现的,说白了就是它就是实时时钟。并且这个时钟不怕断电,断电后它在后备区继续计时,而后备区是有电池供电的。

2.RTC(Real Time Clock)的框图:
在这里插入图片描述
个人见解描述:从最左面开始是RTCCLK,可以选择时钟源配置,在STM32的时钟系统里有这一部分:
在这里插入图片描述
由此可见RTCCLK的有三种来源:高速外部晶振的128分频,低速外部晶振,低速内部RC振荡器(一般不用这个来源,因为不太准)。RTCCLK作为时钟信号进入RTC预分频器,RTC_DIV则是在RTCCLK时钟信号驱使下每个脉冲周期减一直到0时输出一个脉冲即TR_CLK。RTC_DIV是一个32位的只读寄存器,其值由RTC_PRL预分频装载寄存器确定,在输出每个TR_CLK脉冲后RTC_DIV自动被设定为当前RTC_PRL的值。RTC_PRL可由软件设置,而RTC_DIV则是由硬件控制的。举个例子,如果RTC_PRL的值是128,那么RTC_DIV的初始值就是128,在RTCCLK时钟控制下自减,当减到0时产生一个TR_CLK脉冲,并且在这个脉冲作用下再次被RTC_PRL赋值。由此可见,TR_CLK的频率是RTCCLK的128分频。产生的TR_CLK作为时钟信号被输入给RTC_CNT计数器寄存器作为时钟信号,在TR_CLK的控制下,这部分与普通的计数器的行为特征一致,会产生溢出中断。并且其计数值会与RTC_ALR寄存器的值作比较,如果二者相等了就产生一个闹钟中断,就像是计数器的PWM输出中的OutPut Compare寄存器一样的作用。关于RTC除了上述两种中断还有一个秒中断,TR_CLK可以产生一个计数时间为1秒的定时,产生的相应的中断就是秒中断。RTC的寄存器是通过APB1接口访问的,配置的时候是有一定的要求的。

3.相关寄存器的配置
常用的一共有五个:RTC_CR控制寄存器,RTC_PRL预分频装载寄存器,RTC_DIV预分频余数寄存器 ,RTC_CNT计数器寄存器,RTC_ALR闹钟寄存器
其中只有RTC_DIV是只能读的,其他四个可读可写。这五个寄存器只有CR寄存器在前面没有说是做什么用的,下面说下CR寄存器是具体做什么的:
高16位是:包含了三个中断允许位
在这里插入图片描述
低十六位:
在这里插入图片描述
写相应寄存器的步骤:
1.查询RTOFF,一直到RTOFF被置1
2.把CNF位置1进入配置模式
3.对寄存器进行写操作
4.把CNF位置0退出配置模式
5.查询RTOFF判断是否完成写操作
读操作则要注意查询RSF位是否为1,为1时再读取CNT,PRL,ALR等寄存器。

4.相关库函数
(1)使能PWR和BKP时钟:RCC_APB1PeriphClockCmd();
(2)使能后备寄存器访问: PWR_BackupAccessCmd();
(3)配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig();
RCC_RTCCLKCmd();
如果使用LSE,要打开LSE:RCC_LSEConfig(RCC_LSE_ON);
(4)设置RTC预分频系数:RTC_SetPrescaler();对应PRL寄存器
(5)设置时间:RTC_SetCounter();对应CNT寄存器
(6)开启相关中断(如果需要):RTC_ITConfig();
(7)编写中断服务函数:RTC_IRQHandler();
注意:部分操作要等待写操作完成和同步。
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成,查询RTOFF位
RTC_WaitForSynchro(); //等待RTC寄存器同步 ,查询RSF位
设置闹铃值:
void RTC_SetAlarm(uint32_t AlarmValue);//设置ALR

发布了74 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/naruhina/article/details/104116163