《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 业界动态 > STM32 - RTC 配置解说

STM32 - RTC 配置解说

2015-11-03
关键词: STM32 RTC

       STM32RTC 时钟配置因为涉及了许多的寄存器,如:BKP、PWR、RTC ,弄得很杂乱,现在由我来做个RTC 配置的总结。
       RTC 简介:RTC 是一个实时时钟是一个独立的定时器,RTC 模块拥有一组连续计数的计数器,
       在相应软件配置下,可以提供时钟、日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
配置RTC 前需知:
BKP:RTC 模块和时钟配置系统的寄存器是在后备区域的(即BKP),通过BKP 后备区域来存储RTC
配置的数据可以让在系统复位或待机模式下唤醒后RTC 里面配置的数据维持不变。
PWR:PWR 为电源的寄存器,我们需要用到的是电源控制寄存器(PWR_CR),通过使能PWR_CR 的DBP位来取消后备区域BKP 的写保护。
RTC :由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC 的预分频模块,它可编程产生最长为1 秒的RTC 时间基准TR_CLK 。RTC 的预分频模块包含了一个20
位的可编程分频器(RTC 预分频器) 。如果在RTC_CR 寄存器中设置了相应的允许位,则在每个实时时钟(RTC)TR_CLK 周期中RTC 产生一个中断( 秒中断) 。第二个模块是一个32 位的可编
程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK 周期累加并与存储在RTC_ALR 寄存器中的可编程时间相比较,如果RTC_CR 控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。

捕获.JPG

需知部分告一段落,如果想更详细的了解可以打开你的stm32 使用手册查看。
下面讲解下配置整体过程:
第一步: 通过设置寄存器RCC_APB1ENR 的PWREN 和BKPEN 位来打开电源和后备接口的时钟调用库函数:RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR |RCC_APB1Periph_BKP,ENABLE );
第二步:电源控制寄存器(PWR_CR) 的DBP 位来使能对后备寄存器和RTC 的访问
调用库函数:PWR_BackupAccessCmd(ENABLE );
第三步:初始化复位BKP 寄存器调用库函数:BKP_DeInit ();
第四步:设置RTCCLK,如下图:

捕获111.JPG

我们需要将RTCCLK 设置为LSE OSC 这个32.768KHZ 的晶振。
调用的库函数:
RCC_LSEConfig (RCC_LSE_ON);
While(!RCC_GetFlagStatus (RCC_FLAG_HSERDY));//设置后需要等待启动
第五步:将RTC 输入时钟选择为LSE 时钟输入并使能RTC,等待RTC 和APB 时钟同步
调用库函数:
STM32 RTC(实时时钟) 配置解说作者:蓝天翔
RCC_RTCCLKConfig (RCC_RTCCLKSource_LSE);//选择LSE 为RTC 设备的时钟
RCC_RTCCLKCmd (ENABLE );//使能RTC
RTC_WaitForSynchro();//等待同步
第六步:配置RTC 时钟参数。
1. 查询RTOFF 位,直到RTOFF

2. 置CNF 值为1 ,进入配置模式
3. 对一个或多个RTC 寄存器进行写操作
4. 清除CNF 标志位,退出配置模式
5. 查询RTOFF,直至RTOFF 位变为’1’ 以确认写操作已经完成。
仅当CNF 标志位被清除时,写操作才能进行,这个过程至少需要3 个RTCCLK 周期。
好!就按照上述步骤用库函数来配置:
/* 1. 查询RTOFF 位,直到RTOFF 的值变为’1’ */
RTC_WaitForLastTask();//大家可以打开函数库看看这个函数内部的代码,就是查询RTOFF
的值
/*
2. 置CNF 值为1 ,进入配置模式
3. 对一个或多个RTC 寄存器进行写操作
4. 清除CNF 标志位,退出配置模式
*/
RTC_SetPrescaler(32767); // 这里配置了预分频值,大家可以打开函数库看看这个函数的
内部的代码,里面就有包含了2、3、4 讲述的操作。
补充:根据以下公式,这些位用来定义计数器的时钟频率:
fTR_CLK = fRTCCLK/(PRL[19:0]+1) , 我们LSE 是
32.768KHZ = 32768Hz,由上述公式就可以知道最终f TR_CLK =
1Hz 那么刚刚刚好就是1 秒
记住了没完成一个操作一般都要查询RTOFF 来判断是否RTC 正在更新数据,如果是则等待
他完成!!!

RTC_WaitForLastTask();//等待更新结束
RTC_ITConfig(RTC_IT_SEC, ENABLE);//配置秒中断
RTC_WaitForLastTask();//等待更新结束
}
好了,整个RTC 的配置也就是按照这个步骤配置下来,大家好好理解下吧,多多打开你的
STM32 使用手册和STM32 官方库说明书,看多几遍几个寄存器几个函数内部代码更有助
于理解!

整体配置RTC 代码:
void RTC_Configuration(void)
{
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,
ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable LSE */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{}
/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)*/
/* Wait until last write operation on RTC registers has finished */

RTC_WaitForLastTask();
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
如果有不正确的地方也请各位多多指教,本人及时纠正;欢迎大家来和我相互交流学习,谢
谢大家。

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。