6.2.8 RTC 时钟
通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL[1:0]位,RTCCLK时钟源可以由
HSE/128、LSE或LSI时钟提供。除非备份域复位,此选择不能被改变。
LSE时钟在备份域里,但HSE和LSI时钟不是。因此:
● 如果LSE被选为RTC时钟:
─ 只要V BAT 维持供电,尽管V DD 供电被切断,RTC仍继续工作。
● 如果LSI被选为自动唤醒单元(AWU)时钟:
─ 如果V DD 供电被切断, AWU状态不能被保证。有关LSI校准,详见6.2.559/754节LSI时钟。
● 如果HSE时钟128分频后作为RTC时钟:
─ 如果V DD 供电被切断或内部电压调压器被关闭(1.8V域的供电被切断),则RTC状态不确定。
─ 必须设置电源控制寄存器(见4.4.1节)的DPB位(取消后备区域的写保护)为’1’。
16 实时时钟 实时时钟(RTC)
小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
中容量产品是指闪存存储器容量在64K至128K字节之间的STM32F101xx、STM32F102xx和STM32F103xx微控制器。
大容量产品是指闪存存储器容量在256K至512K字节之间的STM32F101xx和STM32F103xx微控制器。
互联型产品是指STM32F105xx和STM32F107xx微控制器。
除非特别说明,本章描述的模块适用于整个STM32F10xxx微控制器系列。
16.1 RTC 简介
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。
系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
16.2 主要特性 主要特性
● 可编程的预分频系数:分频系数最高为2 20 。
● 32位的可编程计数器,可用于较长时间段的测量。
● 2个分离的时钟:用于APB1接口的PCLK1和RTC时钟(RTC时钟的频率必须小于PCLK1时钟频率的四分之一以上)。
● 可以选择以下三种RTC的时钟源:
─ HSE时钟除以128;
─ LSE振荡器时钟;
─ LSI振荡器时钟(详见6.2.8308/754节RTC时钟)。
● 2个独立的复位类型:
─ APB1接口由系统复位;
─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。
● 3个专门的可屏蔽中断:
─ 闹钟中断,用来产生一个软件可编程的闹钟中断。
─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。
─ 溢出中断,指示内部可编程计数器溢出并回转为0的状态。
16.3 功能描述 功能描述
16.3.1 概述
RTC由两个主要部分组成(参见下图)。第一部分(APB1接口)用来和APB1总线相连。此单元还包含一组16位寄存器,可通过APB1总线对其进行读写操作(参见16.4节)。APB1接口由APB1总线时钟驱动,用来与APB1总线接口。
另一部分(RTC核心)由一组可编程计数器组成,分成两个主要模块。第一个模块是RTC的预分频模块,它可编程产生最长为1秒的RTC时间基准TR_CLK。RTC的预分频模块包含了一个20位的可编程分频器(RTC预分频器)。如果在RTC_CR寄存器中设置了相应的允许位,则在每个实时时钟(RTC) STM32F10xxx参考手册
TR_CLK周期中RTC产生一个中断(秒中断)。第二个模块是一个32位的可编程计数器,可被初始化为当前的系统时间。系统时间按TR_CLK周期累加并与存储在RTC_ALR寄存器中的可编程时间相比较,如果RTC_CR控制寄存器中设置了相应允许位,比较匹配时将产生一个闹钟中断。
图154 简化的RTC框图
16.3.2 复位过程
除了RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器外,所有的系统寄存器都由系统复位或电源复位进行异步复位。
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器仅能通过备份域复位信号复位,详见第6.1.3节
16.3.3 读RTC 寄存器
RTC核完全独立于RTC APB1接口。
软件通过APB1接口访问RTC的预分频值 、 计数器值和闹钟值。但是,相关的可读寄存器只在与RTC APB1时钟进行重新同步的RTC时钟的上升沿被更新。RTC标志也是如此的。
这意味着,如果APB1接口曾经被关闭,而读操作又是在刚刚重新开启APB1之后,则在第一次的内部寄存器更新之前,从APB1上读出的RTC寄存器数值可能被破坏了(通常读到0)。下述几种情况下能够发生这种情形:
● 发生系统复位或电源复位
● 系统刚从待机模式唤醒(参见第4.3309/754节:低功耗模式)。
4.3 ● 系统刚从停机模式唤醒(参见第 节:低功耗模式)。
所有以上情况中,APB1接口被禁止时(复位、无时钟或断电)RTC核仍保持运行状态。
因此,若在读取RTC寄存器时,RTC的APB1接口曾经处于禁止状态,则软件首先必须等待
RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置’1’。
注: RTC 的 APB1 接口不受 WFI 和 WFE 等低功耗模式的影响。
16.3.4 配置RTC 寄存器
必须设置RTC_CRL寄存器中的CNF位,使RTC进入配置模式后,才能写入RTC_PRL、RTC_CNT、RTC_ALR寄存器。
另外,对RTC任何寄存器的写操作,都必须在前一次写操作结束后进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。
配置过程: 配置过程:
1. 查询RTOFF位,直到RTOFF的值变为’1’
2. 置CNF值为1,进入配置模式
3. 对一个或多个RTC寄存器进行写操作
4. 清除CNF标志位,退出配置模式
5. 查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。
仅当CNF标志位被清除时,写操作才能进行,这个过程至少需要3个RTCCLK周期。
16.3.5 RTC 标志的设置在每一个RTC核心的时钟周期中,更改RTC计数器之前设置RTC秒标志(SECF)。
在计数器到达0x0000之前的最后一个RTC时钟周期中,设置RTC溢出标志(OWF)。
在计数器的值到达闹钟寄存器的值加1(RTC_ALR+1)之前的RTC时钟周期中,设置RTC_Alarm和RTC闹钟标志(ALRF)。对RTC闹钟的写操作必须使用下述过程之一与RTC秒标志同步:
● 使用RTC闹钟中断,并在中断处理程序中修改RTC闹钟和/或RTC计数器。
● 等待RTC控制寄存器中的SECF位被设置,再更改RTC闹钟和/或RTC计数器。
上一篇:stm32 rtc 误差实验
下一篇:stm32 RTC_WaitForSynchro()死循环
推荐阅读最新更新时间:2024-03-16 16:24
- 热门资源推荐
- 热门放大器推荐
设计资源 培训 开发板 精华推荐
- 2021 Digi‑Key KOL 视频系列:新型智能曝光算法在人脸识别中的应用
- 任选下载有礼|《新概念模拟电路》全五册合集/《ADI 参考电路合集》
- 免费送:英国Aim TTi 最新数字信号发生器和热销电流探头【社区重磅福利】
- Microchip有奖直播:VectorBlox™ SDK 报名中
- 预报名有奖直播:煮酒数创客,看如何让好创意发生!
- 【EEWORLD带你DIY】数字示波器V1.0进展贴
- DIY 个浪漫光影棒,报名请跟帖!
- e络盟大讲堂—告别冗长的手动测试
- 感谢有你,愿一路同行!——eeworld感恩节送书活动
- 免费体验业界最快编译速度&最好性能 Quartus II v15.0网页版下载有礼!