程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)

STM32F103 RTC配置

本节我们将介绍RTC,实际上有关RTC我们在学习S3C2440的时候已经详细介绍过《Mini2440裸机开发之RTC》。

一、RTC

RTC,英文全称Real Time Clock,中文就是实时时钟,是一个可以为系统提供精确的时间基准的元器件,RTC一般采用精度较高的晶振作为时钟源,有些RTC为了在主电源掉电时还可以工作,需要外加电池供电。

1.1 概述

在断电情况下RTC仍可以独立运行,只要芯片的外加电池一直供电,RTC上的时间会一直走。

RTC本质上是个独立的定时器。RTC模块拥有一个连续计数的计数器。从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断),但其高级之处也就在于掉电之后还可以正常运行。

两个32位寄存器包含二进码十进数格式 (BCD) 的秒、分钟、小时(1224小时制)、星期几、日期、月份和年份。此外,还可提供二进制格式的亚秒值。系统可以自动将月份的天数补偿为2829(闰年)、3031天。

上电复位后,所有RTC寄存器都会受到保护,以防止可能的非正常写访问。

无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC不会停止工作。

1.2 特性

  • 可编程的预分频系数:分频系数高为220

  • 32位的可编程计数器,可用于较长时间段的测量;

  • 2个分离的时钟:用于APB1接口的PCLK1RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上);

  • 可以选择以下三种RTC的时钟源;

    • HSE时钟除以128
    • LSE振荡器时钟;
    • LSI振荡器时钟;
  • 2个独立的复位类型:

    • APB1接口由系统复位;
    • RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位;
  • 3个专门的可屏蔽中断;

    • 闹钟中断,用来产生一个软件可编程的闹钟中断;
    • 秒中断,用来产生一个可编程的周期性中断信号(长可达1秒);
    • 溢出中断,指示内部可编程计数器溢出并回转为0的状态;

1.3 RTC方框图

RTC由两个主要部分组成。

  • 第一部分(APB1接口):用来和APB1总线相连,此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作。APB1接口由APB1总线时钟驱动,用来与APB1总线连接;
  • 另一部分(RTC核心):由一组可编程计数器组成,分成两个主要模块;
    • 第一个模块是RTC的预分频模块(左下1):它可编程产生最长为1秒的RTC时间基准TR_CLKRTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个实时时钟(RTCTR_CLK周期中RTC产生一个中断(秒中断);
    • 第二个模块是一个32位的可编程计数器(左下2):可被初始化为当前的系统时间;系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
1.3.1 RTCCLK选择

我们在《STM32F103系统时钟配置》中介绍了STM32的时钟框图;

img

RTCCLK可以选择以下三种作为时钟源;

  • HSE时钟除以128
  • LSE振荡器时钟;
  • LSI振荡器时钟;

使用HSE分频时钟或者LSI的时候,在主电源VDD掉电的情况下,这两个时钟来源都会受到影响,因此没法保证RTC正常工作,所以RTC一般都时钟低速外部时钟LSE,频率为实时时钟模块中常用的32.768KHz

因为32768 = 2^15,分频容易实现,所以被广泛应用到RTC模块。在主电源VDD有效的情况下(待机),RTC还可以配置闹钟事件使STM32退出待机模式。

1.3.2 具体流程

RTCCLK经过RTC_DIV预分频,RTC_PRL设置预分频系数,然后得到TR_CLK时钟信号,我们一般设置其周期为1sRTC_CNT计数器计数,假如1970设置为时间起点为0s,通过当前时间的秒数计算得到当前的时间。

RTC_ALR是设置闹钟时间,RTC_CNT计数到RTC_ALR就会产生计数中断;

  • RTC_Second为秒中断,用于刷新时间;
  • RTC_Overflow是溢出中断;
  • RTC Alarm控制开关机。
1.3.3 RTC复位过程

除了RTC_PRLRTC_ALRRTC_CNTRTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRLRTC_ALRRTC_CNTRTC_DIV寄存器仅能通过备份域复位信号复位。

系统复位后,禁止访问后备寄存器和RCT,防止对后卫区域(BKP)的意外写操作。

1.3.4 读RTC寄存器

RTC内核完全独立于APB1接口,软件通过APB1接口对RTC相关寄存器访问。但是相关寄存器只在RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。所以软件必须先等待寄存器同步标志位(RTC_CRLRSF位)被硬件置1才读。

1.3.5 配置RTC寄存器

必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRLRTC_CNTRTC_ALR寄存器。

另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是1时,才可以写入RTC寄存器。

二、RTC相关寄存器

RTC相关的寄存器主要有:

  • RTC控制寄存器:RTC_CRHRTC_CRL
  • RTC预分频装载寄存器: RTC_PRLHRTC_PRLL
  • RTC预分频余数寄存器:RTC_DIVHRTC_DIVL
  • RTC计数器寄存器:RTC_CNTHRTC_CNTL
  • RTC闹钟寄存器:RTC_ALRHRTC_ALRL

2.1 RTC控制寄存器

2.1.1 RTC_CRH

作用:配置3个专门的可屏蔽中断(溢出中断、闹钟中断、秒中断)使能。

注意:系统复位后所有的中断被屏蔽,因此可通过写RTC寄存器来确保在初始化后没有挂起的中断请求。当外设正在完成前一次写操作时(标志位RTOFF=0),不能对RTC_CRH寄存器进行写操作。

2.1.2 RTC_CRL

一般用到该寄存器的345位:

  • 3RSF):寄存器同步标志位,我们在修改控制寄存器RTC_CRH/RTC_CRL 之前,必须先判断该位,是否已经同步了,如果没有则等待同步;
  • 4CNF):配置标位,在软件修改RTC_CNT/RTC_ALR/RTC_PRL的值的时候,必须先软件置位该位,以允许进入配置模式;
  • 5RTOFF):RTC操作位,该位由硬件操作,软件只读。通过该位可以判断上次对RTC寄存器的操作是否完成,如果没有,我们必须等待上一次操作结束才能开始下一次,也就是判断RTOFF位是否置位。

3个位总结如下:

(1) 修改RTC_CRH/RTC_CRL寄存器,必须先判断RSF位,确定已经同步;

(2) 修改RTC_CNT/RTC_ALR/RTC_PRL的时候,必须先配置CNF位进入配置模式,修改完之后,设置CNF位为0退出配置模式。

(3) 同时在对RTC相关寄存器写操作之前,必须先判断RTOFF位,确定上次对RTC寄存器的操作是已经完成。

2.2 RTC预分频装载寄存器

预分频装载寄存器用来保存RTC预分频器的周期计数值。在修改这个寄存器的时候要先进入配置模式,即设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式。

我们使用外部32.768kHz的晶振作为RTC时钟的输入频率,那么就要设置这两个寄存器的值为327677FFF)以得到1s的计数频率。

2.2.1 RTC_PRLH
2.2.2 RTC_PRLL

2.3 RTC预分频余数寄存器

预分频余数寄存器用于获取比秒钟更准确的时钟。该寄存器的值是自减的,用于保存还需要多少时钟周期获取的一个秒信号。在一次秒钟更新后,由硬件重新加载,这两个寄存器和RTC_PRL的各位是一样的。

TR_CLK的每个周期里,RTC预分频器中计数器的值都会被重新设置为RTC_PRL寄存器的值。用户可通过读取RTC_DIV寄存器,以获得预分频计数器的当前值,而不停止分频计数器的工作,从而获得精确的时间测量。

此寄存器是只读寄存器,其值在RTC_PRLRTC_CNT寄存器中的值发生改变后,由硬件重新装载。

2.3.1 RTC_DIVH
2.3.2 RTC_DIVL

2.4 RTC计数器寄存器

存放计数器内的计数值,也就是用来记录时钟时间。

该寄存器由216位的寄存器组成RTC_CNTHRTC_CNTL,总共32位,当进行读操作时,直接返回计数器内的计数值(系统时间)。

在修改这个寄存器的时候要先进入配置模式,即设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式。

2.4.1 RTC_CNTH
2.4.2 RTC_CNTL

2.5 RTC闹钟寄存器

当可编程计数器RTC_CNT的值与RTC_ALR中的32位值相等时,即触发一个闹钟事件,并且产生RTC闹钟中断。

在修改这个寄存器的时候要先进入配置模式,即设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式。

2.5.1 RTC_ALRH
2.5.2 RTC_ALRL

2.6 BKP备份寄存器

备份寄存器是4216位的寄存器。可用来存储84个字节数据。

它们处在备份区域,当VDD电源切断,仍然由VBAT维持供电。

当系统在待机模式下被唤醒,或者系统复位或者电源复位,它们也不会复位。执行以下操作将使能对后备寄存器和RTC访问:

  • 设置寄存器RCC_APB1ENRPWRENBKPEN位,使能电源和后备时钟;
  • 设置寄存器PWR_CRDBP位,使能对RTC和后备寄存器的访问;
2.6.1 备份数据寄存器(BKP_DRx

一般用BKP来存储RTC的校验值或者记录一些重要的数据;

2.6.2 备份域控制寄存器 (RCC_BDCR)

备份域控制寄存器中(RCC_BDCR)的LSEONLSEBYPRTCSELRTCEN位处于备份域。

因此,这些位在复位后处于写保护状态,只有在电源控制寄存器(PWR_CR)中的DBP位置1后才能对这些位进行改动。

三、RTC源码

3.1 RTC初始化步骤

RTC配置流程如下:

(1) 时钟使能以及取消写保护;

  • 使能电源时钟和备份区域时钟:通过配置RCC_APB1ENR的位28和位27

    • 28PWREN):电源接口时钟使能;

    • 27BKPEN):备份接口时钟使能;

  • 取消备份区写保护:通过配置PWR_CRDBP位(位8)为1来使能对后备寄存器和RTC的访问;

(2) RTC时钟配置 (复位,取消复位,时钟源选择,使能)->该模块是在备份区域;

  • 备份区域软复位,复位结束;

    • 通过配置RCC_BDCR寄存器位161备份区域软复位;
    • 通过配置RCC_BDCR寄存器位160备份区域软复位结束;
  • 开启LSE

    • 通过配置RCC_BDCR寄存器位0使能外部低速振荡器;

    • 通过读取RCC_BDCR寄存器位1等待外部低速振荡器就绪;

  • 选择RTC时钟,并使能:通过配置RCC_BDCR的位[9:8]和位15

    • 位[9:8]:RTC是时钟源选择,配置为01选择LSE作为RTC时钟;

    • 15RTC时钟使能;

(3) 等待上一次RTC写操作完成:判断上一次RTC操作是否完成,通过等待RTC_CRL5RTOFF=1)实现;

亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。

日期姓名金额
2023-09-06*源19
2023-09-11*朝科88
2023-09-21*号5
2023-09-16*真60
2023-10-26*通9.9
2023-11-04*慎0.66
2023-11-24*恩0.01
2023-12-30I*B1
2024-01-28*兴20
2024-02-01QYing20
2024-02-11*督6
2024-02-18一*x1
2024-02-20c*l18.88
2024-01-01*I5
2024-04-08*程150
2024-04-18*超20
2024-04-26.*V30
2024-05-08D*W5
2024-05-29*辉20
2024-05-30*雄10
2024-06-08*:10
2024-06-23小狮子666
2024-06-28*s6.66
2024-06-29*炼1
2024-06-30*!1
2024-07-08*方20
2024-07-18A*16.66
2024-07-31*北12
2024-08-13*基1
2024-08-23n*s2
2024-09-02*源50
2024-09-04*J2
2024-09-06*强8.8
2024-09-09*波1
2024-09-10*口1
2024-09-10*波1
2024-09-12*波10
2024-09-18*明1.68
2024-09-26B*h10
2024-09-3010
2024-10-02M*i1
2024-10-14*朋10
2024-10-22*海10
2024-10-23*南10
2024-10-26*节6.66
2024-10-27*o5
2024-10-28W*F6.66
2024-10-29R*n6.66
2024-11-02*球6
2024-11-021*鑫6.66
2024-11-25*沙5
2024-11-29C*n2.88
posted @   大奥特曼打小怪兽  阅读(267)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
如果有任何技术小问题,欢迎大家交流沟通,共同进步

公告 & 打赏

>>

欢迎打赏支持我 ^_^

最新公告

程序项目代做,有需求私信(小程序、网站、爬虫、电路板设计、驱动、应用程序开发、毕设疑难问题处理等)。

了解更多

点击右上角即可分享
微信分享提示