STM32如何计算RTC时钟异步预分频和同步预分频

实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器,提供具有可编程闹钟中断功能的日历时钟/日历,可用于管理所有低功耗模式的自动唤醒单元。在配置RTC时钟时预分频器是关键指标,通过配置预分频器可以自定义计数周期。

以STM32L0系列MCU为例,介绍RTC时钟的异步预分频和同步预分频配置方法。

RTC 时钟源 (RTCCLK) 通过时钟控制器从 LSE 时钟、LSI 振荡器时钟以及 HSE 时钟三者中选择。预分频器分为 2 个可编程的预分频器:通过 RTC_PRER 寄存器的 PREDIV_A 位配置的 7 位异步预分频器(范围0~2^7),通过 RTC_PRER 寄存器的 PREDIV_S 位配置的 15 位同步预分频器(范围0~2^15)。如下图所示:

在参考文档中给出了(f ck_apre)异步预分频和(f ck_spre)同步预分频的计算公式,(f ck_apre)异步预分频主要是亚秒级计数,(f ck_spre)同步预分频是普通得日历计数(秒级别),在计算两个预分频器时,推荐将异步预分频器(PREDIV_A)配置为较高的值,以最大程度降低功耗。如下所示:

若想实现普通计数功能,例如使用频率为 32.768 kHz 的 LSE 获得频率为 1 Hz 的内部时钟 (ck_spre),为了最大程度降低功耗,PREDIV_A=127,则(f ck_spre)同步预分频=32768Hz/(PREDIV_S+1)x(127+1),1Hz=32768Hz/(PREDIV_S+1)x(127+1),

计算得,PREDIV_S=255。

当然用户计算完成后就可以在STM32CubeMX中配置,自动生成配置好的RTC代码。

<think>好的,我现在需要回答用户关于STM32F103 RTC时钟选择的问题。首先,我得回顾一下STM32F103的RTC模块相关知识,确保自己理解正确。RTC(实时时钟)在STM32中用于提供时间日期信息,即使在主电源关闭时也能通过备用电池保持运行。时钟源的选择对RTC的准确性低功耗特性至关重要。 首先,用户可能想知道有哪些可用的时钟源,以及它们的特点。我记得STM32F103的RTC可以使用三种时钟源:LSE(低速外部晶振)、LSI(低速内部RC振荡器)HSE(高速外部晶振)分频后的信号。需要详细说明每个时钟源的优缺点。 接下来,用户可能关心如何选择这些时钟源,以及具体的配置步骤。我需要解释如何通过RCC(复位时钟控制)模块进行配置,特别是RCC_BDCR寄存器的设置。同时,可能需要提到备份域(Backup Domain)的相关操作,比如需要先使能PWRBKP时钟,然后取消备份域的写保护。 另外,时钟源的切换校准也是需要注意的地方。例如,当从LSE切换到LSI时,可能需要重新初始化RTC配置。同时,不同时钟源的精度问题,LSE通常更准确,适合需要高精度的应用,而LSI成本低但精度较差。 还要考虑低功耗模式下的时钟选择,比如在Stop或Standby模式下,RTC时钟源是否仍然可用。这可能涉及到RTC的中断唤醒功能,用户可能想知道如何配置这些功能以实现低功耗运行。 此外,常见问题解答可能会有帮助,比如时钟源启动失败如何处理,如何检测时钟源是否有效,以及不同时钟源下如何计算RTC预分频值以保证正确的时钟频率。 最后,需要确保回答结构清晰,分点列出,使用用户容易理解的语言,避免过于技术化的术语,同时保持专业性准确性。检查是否有遗漏的重要信息,比如寄存器名称、配置步骤中的关键函数调用,或者参考文档的位置(如ST的参考手册)。 总结一下,回答的结构应该是先介绍RTC的基本概念,然后详细说明每个时钟源的特点,接着是配置步骤,注意事项,常见问题,最后可能的应用场景建议。需要确保符合用户给出的格式要求,使用中文,数学公式正确应用,行内公式用$...$,独立公式用$$...$$。</think>以下是关于STM32F103 RTC时钟选择的详细介绍,按逻辑分步说明: --- ### **一、RTC时钟源概述** STM32F103的RTC(实时时钟)需要外部或内部时钟源驱动,支持以下三种时钟源: 1. **LSE(低速外部晶振)** - 典型频率:32.768 kHz - 优点:精度高(配合晶振可达到±5ppm),低功耗 - 缺点:需外接晶振负载电容 - 适用场景:需要高精度计时(如日历功能) 2. **LSI(低速内部RC振荡器)** - 频率:约40 kHz(实际范围30~60 kHz) - 优点:无需外部元件,成本低 - 缺点:精度差(±5%),温漂大 - 适用场景:低精度需求或资源受限场景 3. **HSE分频(高速外部晶振分频)** - 将HSE(通常8 MHz)通过128分频得到62.5 kHz - 优点:时钟稳定(若HSE稳定) - 缺点:功耗较高,需外接高速晶振 - 适用场景:HSE已启用且需共享时钟源时 --- ### **二、时钟配置步骤** #### 1. **硬件准备** - 若使用LSE:焊接32.768 kHz晶振及匹配电容(通常6~22 pF)。 - 若使用LSI或HSE:无需额外硬件。 #### 2. **软件配置流程** ```c // 示例代码(以LSE为例) RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); // 使能备份域访问 RCC_LSEConfig(RCC_LSE_ON); // 启动LSE while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET); // 等待LSE就绪 RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); // 选择LSE为RTC时钟源 RCC_RTCCLKCmd(ENABLE); // 使能RTC时钟 RTC_WaitForSynchro(); // 等待RTC寄存器同步 RTC_WaitForLastTask(); // 等待操作完成 ``` #### 3. **关键寄存器** - **RCC_BDCR**:控制备份域时钟(Bit 8-9 `RTCSEL[1:0]`选择时钟源): - `00`:无时钟 - `01`:LSE - `10`:LSI - `11`:HSE分频 --- ### **三、注意事项** 1. **备份域保护** - 修改RTC配置前需取消备份域写保护: ```c PWR_BackupAccessCmd(ENABLE); BKP_TamperPinCmd(DISABLE); // 关闭侵入检测(若未使用) ``` - 修改后重新使能保护。 2. **时钟切换限制** - RTC时钟源只能在复位后首次初始化时修改,运行时不可切换。 3. **预分频配置** - RTC时钟分频至1 Hz驱动计数器: $$ \text{异步预分频} \times \text{同步预分频} = \text{时钟频率} $$ 例如,LSE为32.768 kHz时: ```c RTC_SetPrescaler(32768 - 1); // 直接分频至1 Hz ``` --- ### **四、常见问题** #### 1. **LSE启动失败** - 检查硬件连接,确认晶振电容匹配。 - 增加启动超时检测,若超时切换至LSI备用。 #### 2. **RTC走时不准** - LSI需软件校准(通过调整预分频值)。 - 使用LSI时避免温度剧烈变化。 #### 3. **低功耗模式** - 在Stop/Standby模式下,RTC可由LSI或LSE维持运行,需配置唤醒中断: ```c RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能秒中断 NVIC_EnableIRQ(RTC_IRQn); ``` --- ### **五、总结** - **高精度需求**:优先选择LSE,需硬件支持。 - **低成本方案**:使用LSI,但需容忍误差。 - **共享HSE场景**:选择HSE分频,适合已使用HSE的系统。 建议参考《STM32F10x参考手册》第7章“备份寄存器(BKP)实时时钟RTC)”。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不脱发的程序猿

亲,赏包辣条吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值