你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32实例-RTC实时时钟实验②-RTC 配置步骤

[复制链接]
STMCU小助手 发布时间:2022-6-27 10:48
    接下来我们介绍下如何使用库函数对 STM32F1 的 RTC 进行配置。这个也是在编写程序中必须要了解的。具体步骤如下:(RTC 相关库函数在 stm32f10x_rtc.c和 stm32f10x_rtc.h 文件中)
(1)使能电源时钟和后备域时钟,开启 RTC 后备寄存器写访问要访问 RTC和 RTC 备份区域就必须先使能电源及后备域时钟,然后使能RTC 后备区域访问。电源时钟使能,通过 RCC_APB1ENR 寄存器来设置;RTC 及RTC 备份寄存器的写访问, 通过 PWR_CR 寄存器的 DBP 位设置。调用库函数为:
  1. <font face="Tahoma"><font size="3">RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//打开电源时钟</font></font><font face="Tahoma"><font size="3">RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);//打开 RTC 后备域时钟</font></font><font face="Tahoma"><font size="3">PWR_BackupAccessCmd(ENABLE);//打开后备寄存器访问</font></font>
复制代码

(2)复位备份区域,开启外部低速振荡器
    在取消备份区域写保护之后,我们可以先对这个区域复位,以清除前面的设置,当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要视情况而定。然后我们使能外部低速振荡器,注意这里一般要先判断 RCC_BDCR 的 LSERDY 位来确定低速振荡器已经就绪了才开始下面的操作。备份区域复位的库函数为:
  1. BKP_DeInit(); //复位备份区域
复制代码

开启外部低速振荡器的函数是:
  1. RCC_LSEConfig(RCC_LSE_ON);//开启外部 32.768K RTC 时钟
复制代码

(3)选择 RTC 时钟,并使能
    选择 LSE 为 RTC 时钟源库函数是:
  1. RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为RTC时钟
复制代码

使能 RTC 时钟库函数是:
  1. RCC_RTCCLKCmd(ENABLE);//使能 RTC 时钟
复制代码

(4)设置 RTC 的分频以及配置 RTC 时钟
    在开启了 RTC 时钟之后,我们要做的就是设置 RTC 时钟的分频数,通过
RTC_PRLH 和 RTC_PRLL 来设置,然后等待 RTC 寄存器操作完成,并同步之后,设置秒钟中断。然后设置 RTC 的允许配置位( RTC_CRH 的 CNF 位),设置时间(其实就是设置 RTC_CNTH 和 RTC_CNTL 两个寄存器)。
    在进行 RTC 配置之前首先要打开允许配置位(CNF),调用的库函数是:
  1. RTC_EnterConfigMode();// 允许配置
复制代码

在配置完成之后,千万不要忘记更新配置同时退出配置模式,调用的库函数是:
  1. RTC_ExitConfigMode();//退出配置模式,更新配置
复制代码

    设置 RTC 时钟分频数,调用的库函数是:
  1. void RTC_SetPrescaler(uint32_t PrescalerValue);
复制代码

    这个函数只有一个参数,就是 RTC 时钟的分频数,很好理解。然后是设置秒中断允许,RTC 使能中断的函数是:
  1. void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);
复制代码

    函数的第一个参数用来选择 RTC 的中断类型,可通过库文件的头文件查看,第二个参数用于使能还是失能。比如要使能 RTC 秒中断,如下:
  1. RTC_ITConfig(RTC_IT_SEC, ENABLE);
复制代码

    接下来便是设置时间了,设置时间实际上就是设置 RTC 的计数值,时间与计数值之间是需要换算的。库函数中设置 RTC 计数值的方法是:
  1. void RTC_SetCounter(uint32_t CounterValue);
复制代码

(5)更新配置,设置 RTC 中断分组
    在设置完时钟之后,我们将配置更新同时退出配置模式,这里还是通过RTC_CRH 的 CNF 来实现。调用库函数的方法是:
  1. RTC_ExitConfigMode();//退出配置模式,更新配置
复制代码

    在退出配置模式更新配置之后我们在备份区域 BKP_DR1 中写入 0XA0A0 代表我们已经初始化过时钟了,下次开机(或复位)的时候,先读取 BKP_DR1 的值,然后判断是否是 0XA0A0 来决定是不是要配置。接着我们配置 RTC 的秒钟中断,并进行分组。
    往备份区域写用户数据的函数是:
  1. void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
复制代码

    函数的第一个参数用来设置备份寄存器的标号, 这个在 rtc 库文件头文件内有定义,第二个参数是我们往备份寄存器写入的数据。比如我们向 BKP_DR1 中写入 0XA0A0。函数如下:
  1. BKP_WriteBackupRegister(BKP_DR1, 0XA0A0);
复制代码

    同样库函数还提供一个读取备份寄存器内容的函数,如下:
  1. uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);
复制代码

    函数参数作用和写备份寄存器是一样的功能,这个很好理解。
    使能中断后, 就需要设置 RTC 的中断优先级, 即调用 NVIC_Init 函数初始化,这个在前面很多章节中都介绍过,这里不多说。
(6)编写 RTC 中断服务函数
    前面步骤中我们配置好了RTC 的秒中断, 所以我们还需要编写对应的中断服务函数。RTC 中断服务函数名在 STM32F1 启动文件内可以查找到,RTC 中断函数名如下:
  1. RTC_IRQHandler
复制代码

    因为 RTC 的中断类型有很多,所以进入中断后,我们需要在中断服务函数开头处通过读取 RTC 状态寄存器的值判断此次中断是哪种类型, 然后做出相应的控制。库函数中用来读取 RTC状态标志位的函数如下:
  1. FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);
复制代码

    参数 RTC_FLAG 用来选择RTC 状态标志,参数选择如下:
    秒中断标志参数为 RTC_IT_SEC。在秒钟中断产生的时候,读取当前的时间值。在中断函数结束之前我们会清除下对应的中断标志。
    清除 RTC 秒中断标志函数如下:
  1. RTC_ClearITPendingBit(RTC_IT_SEC);
复制代码

    将以上几步全部配置好后,我们就可以正常使用 RTC 中断来更新时间了。

收藏 评论0 发布时间:2022-6-27 10:48

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版