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 特性
  • 可编程的预分频系数:分频系数高为\(2^{20}\)

  • 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寄存器中设置了相应的允许位,则在每个实时时钟(RTC)TR_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时钟

### STM32F103 RTC配置方法 #### 使用STM32CubeMX初始化RTC模块 为了简化开发过程并减少错误的发生概率,在开始编写具体代码之前推荐先利用STM32CubeMX工具完成硬件资源配置工作。对于RTC功能而言,主要涉及以下几个方面的设定: - **使能LSE晶振**:外部低速晶体用于给RTC供电及时基信号源。 - **选择RTC时钟源**:通常会选择LSE作为RTC的时钟输入。 - **开启RTC外设**:激活RTC外设以便后续操作。 上述设置可以通过图形界面直观地完成,并生成相应的初始化函数供用户调用[^1]。 #### 编写C语言程序实现基本功能 下面给出一段简单的示例代码来展示如何启动RTC以及处理秒级中断事件: ```c #include "stm32f1xx_hal.h" // 声明全局变量用于计数 volatile uint32_t secondCounter = 0; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_RTC_Init(void); int main(void){ HAL_Init(); SystemClock_Config(); /* 初始化GPIO */ MX_GPIO_Init(); /* 初始化RTC */ MX_RTC_Init(); while (1){ // 主循环体可以放置其他任务逻辑 } } /* 中断服务例程定义 */ void EXTI0_IRQHandler(void){ if(__HAL_RTC_SECF flag & RTC_FLAG_SECIE)){ __HAL_RTC_CLEAR_IT(&hrtc, RTC_FLAG_SEC); // 更新全局计数值 secondCounter++; // 可在此处添加更多业务逻辑 // 清除标志位防止重复触发 __HAL_RTC_CLEAR_FLAG(&hrtc, RTC_FLAG_SEC); } /* Clear the EXTI line pending bit */ HAL_NVIC_ClearPendingIRQ(EXTI0_IRQn); } ``` 需要注意的是这段代码仅展示了框架结构,实际应用中还需要根据需求补充具体的细节部分,比如对外部设备的操作或是数据存储等功能。 另外,如果希望进一步降低功耗,则可以在进入停止模式前关闭不必要的电源域;当定时器溢出产生中断后唤醒MCU继续执行剩余的任务流程[^2]。 最后提醒一点,由于预分频系数的选择会影响到最终输出频率精度,因此建议按照官方文档中的指导原则合理选取参数值以满足特定应用场景的要求[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值