STM32--RTC实时时钟(详解)

本文介绍了STM32中的RTC模块,包括其作为计时和日期记录设备的特性、时钟源选择、BKP及TAMPER的作用、基本结构和功能如计数器、闹钟、中断系统等。重点阐述了如何配置和操作RTC以实现精确的时间处理和应用开发。
摘要由CSDN通过智能技术生成

前言:

一、RTC简介

STM32的RTC指的是实时时钟(Real-Time Clock),它是一种用于计时和日期记录的硬件模块。在STM32微控制器中,RTC模块是由一个32位的计数器和一组用于保存日期和时间的寄存器组成的。

RTC模块具有很高的精度和稳定性,并且能够在微控制器断电时继续运行,从而保持准确的时间和日期信息。它通常用于需要精确定时和实时数据记录的应用场景,例如时钟、日历、定时器、闹钟、数据采集等。

STM32的RTC模块提供了一系列的功能,包括时钟频率配置、时间和日期的设置与读取、闹钟的设置与触发、定时器功能、中断控制等。通过配置和使用RTC模块,开发者可以实现各种与时间相关的功能和应用。

二、RTC特点

三、RTC时钟

RTC的时钟来源主要有三路,但一般选择中间的那一路。因为它有备用电池供电,可以实现主电源掉电仍然走时;而且32.768kHz正好是2的15次方,经过一个15位的分频器的自然溢出(15位计数器记到最大值32768后自然溢出),就能很方便得到1Hz的频率。

四、BKP简介

BKP本质上是RAM存储器,掉电丢失;

TAMPER:在引脚产生上升沿或者下降沿的时候产生侵入事件;

五、BKP基本结构

小容量和中容量只有DR1~DR10;大容量和互联型有DR1~DR42;

六、RTC框图

RTC_PRL:计数目标(写入n,就是n+1分频);

RTC_DIV:自减计数器,每来一个输入时钟,DIV的值自减一次,减到0后再来一个时钟,从PRL获取到重装值继续自减;

RTC_CNT:Unix时间戳的秒计数器;

RTC_ALR:闹钟寄存器, 当CNT=ALR时会产生RTC_Alarm闹钟信号,就能进入右边的中断系统;同时也可以让STM32退出待机模式;

中断:RTC_Second,秒中断:开启后每秒进一次RTC中断;RTC_Overflow,溢出中断:CNT溢出;RTC_Alarm,闹钟中断:CNT=ALR时会触发中断,同时也可以让STM32退出待机模式;

七、RTC基本结构

八、RTC操作注意事项

  • 15
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32F4xx的RTC实时时钟代码,包括初始化和设置时间的函数: ```c #include "stm32f4xx.h" void RTC_Init(void) { /* 使能PWR和BKP的时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); /* 解锁BKP区域 */ PWR_BackupAccessCmd(ENABLE); /* 复位BKP区域 */ BKP_DeInit(); /* 使能LSE时钟 */ RCC_LSEConfig(RCC_LSE_ON); while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* 选择LSE作为RTC时钟源 */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* 使能RTC时钟 */ RCC_RTCCLKCmd(ENABLE); /* 等待RTC同步 */ RTC_WaitForSynchro(); /* 设置RTC预分频器 */ RTC_SetPrescaler(32767); /* 等待RTC同步 */ RTC_WaitForSynchro(); } void RTC_SetTime(uint8_t hour, uint8_t minute, uint8_t second) { RTC_TimeTypeDef RTC_TimeStructure; /* 等待RTC同步 */ RTC_WaitForSynchro(); /* 设置RTC时间 */ RTC_TimeStructure.RTC_Hours = hour; RTC_TimeStructure.RTC_Minutes = minute; RTC_TimeStructure.RTC_Seconds = second; RTC_TimeStructure.RTC_H12 = RTC_H12_AM; RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure); /* 等待RTC同步 */ RTC_WaitForSynchro(); } ``` 在主函数中,可以先调用RTC初始化函数,然后再调用RTC设置时间函数,例如: ```c int main(void) { /* 初始化RTC */ RTC_Init(); /* 设置RTC时间为12:34:56 */ RTC_SetTime(12, 34, 56); while (1) { } } ``` 需要注意的是,RTC模块需要连接外部低速晶振(LSE),并且需要在STM32的RCC寄存器中设置LSE作为RTC时钟源。同时,还需要在PWR寄存器中解锁BKP区域,才能够使用RTC模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值