STM32 RTC时钟配置

一、RTC使用说明

  “RTC”是Real Time Clock 的简称,意为实时时钟。stm32提供了一个秒中断源和一个闹钟中断源,修改计数器的值可以重新设置系统当前的时间和日期。
  RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。但实际上,RTC就只是一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。其在掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。
  配置RTC前须知:
  BKP:后备区域,通过BKP后备区域来存储RTC配置的数据可以让其在系统复位或待机模式下唤醒后,RTC里面配置的数据维持不变。
  PWR:电源的寄存器,我们需要用到的是电源控制寄存器(PWR_CR),通过使能PWR_CR的DBP位来取消后备区域BKP的写保护。
  RTC:由一组可编程计数器组成,分成两个模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC)TR_CLK 周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时,将产生一个闹钟中断。

下面讲解下配置整体过程:
  第一步: 通过设置寄存器 RCC_APB1ENR 的 PWREN 和 BKPEN 位来打开电源和后备接口的时钟
  调用库函数:
  RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE );
  第二步:电源控制寄存器(PWR_CR) 的 DBP 位来使能对后备寄存器和 RTC 的访问
  调用库函数:
  PWR_BackupAccessCmd(ENABLE );
  第三步:初始化复位 BKP 寄存器
  调用库函数:
  BKP_DeInit ();
  第四步:设置 RTCCLK
  我们需要将 RTCCLK 设置为 LSE OSC 这个 32.768KHZ 的晶振。
  调用的库函数:  
  RCC_LSEConfig (RCC_LSE_ON);
  While(!RCC_GetFlagStatus (RCC_FLAG_HSERDY));//设置后需要等待启动
  第五步:将 RTC 输入时钟 选择为 LSE 时钟输入并使能 RTC,等待 RTC 和 APB 时钟同步
  调用库函数:
  RCC_RTCCLKConfig (RCC_RTCCLKSource_LSE);//选择 LSE 为 RTC 设备的时钟
  RCC_RTCCLKCmd (ENABLE );//使能
  RTC RTC_WaitForSynchro();//等待同步
  第六步:配置 RTC 时钟参数。
  1、查询 RTOFF 位,直到 RTOFF 的值变为’1’
  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 讲述的操作。
/*
每完成一个操作一般都要查询 RTOFF 来判断是否 RTC 正在更新数据,如果是则等待它完成!!!
*/
RTC_WaitForLastTask();//等待更新结束
RTC_ITConfig(RTC_IT_SEC, ENABLE);//配置秒中断
RTC_WaitForLastTask();//等待更新结束

二、RTC时钟配置代码

void RTC_Configuration(void){
    /* 使能PWR和BKP时钟 */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
    /* 使能对后备寄存器的访问 */ 
    PWR_BackupAccessCmd(ENABLE);
    /* 复位BKP寄存器 */ 
    BKP_DeInit();
    /* 使能LSE */ 
    RCC_LSEConfig(RCC_LSE_ON);
    /*等待启动完成 */
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {}
    /* 将 RTC时钟设置为LSE这个32.768KHZ的晶振*/ 
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    /* 使能RTC Clock */ 
    RCC_RTCCLKCmd(ENABLE);
    /* 等待同步 */ 
    RTC_WaitForSynchro();
    /* 等待对RTC寄存器最后的写操作完成*/             
    RTC_WaitForLastTask();
    /* 配置了预分频值: 设置RTC时钟周期为1s */
    RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)*/
    /* 等待对RTC寄存器最后的写操作完成 */
    RTC_WaitForLastTask();
    /* 使能RTC秒中断 */ 
    RTC_ITConfig(RTC_IT_SEC, ENABLE);
    /* 等待对RTC寄存器最后的写操作完成 */         
    RTC_WaitForLastTask();
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值