stm32f103zet6_RTC_1_介绍

2024-05-08 19:04
文章标签 介绍 rtc stm32f103zet6

本文主要是介绍stm32f103zet6_RTC_1_介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RTC简介

实时时钟是一个独立的定时器

RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。

修改计数器的值可以重新设置系统当前的时间和日期。

RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒 后,RTC的设置和时间维持不变。

系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操 作。执行以下操作将使能对后备寄存器和RTC的访问:

        ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟

        ● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。

主要特性

● 可编程的预分频系数:分频系数最高为220。

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

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

● 可以选择以下三种RTC的时钟源:

        ─ HSE时钟除以128;高速外部时钟 (HSE)这是以外部晶振作为时钟源,晶振频率可以在4MHz到16MHz之间选择,通常采用8MHz的晶振。

        ─ LSE振荡器时钟;(低速外部时钟 (LSE)以外部晶振作为时钟源,主要提供给实时时钟模块,通常采用32.768KHz的晶振)

        ─ LSI振荡器时钟;低速内部时钟 (LSI)由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。

● 2个独立的复位类型: ─ APB1接口由系统复位;

        ─ RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。

● 3个专门的可屏蔽中断:

        ─ 闹钟中断,用来产生一个软件可编程的闹钟中断。

        ─ 秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。

         ─ 溢出中断,指示内部可编程计数器溢出并回转为0的状态。

结构图

简化的RTC框图

选择外部低数时钟

低速外部时钟 (LSE)

外接时钟频率为32.768  原因为2的15次方为它  将它分频15次为1秒

复位

  1. 系统复位://设置寄存器复位

    • 当STM32微控制器执行硬复位或软复位时,RTC模块也会被复位。
    • 系统复位可以由外部复位引脚、电源管理模块或软件命令触发。
    • 系统复位后,RTC会重置到其默认状态,例如日历寄存器会被重置到1970年1月1日。
  2. 看门狗复位

    • 如果配置了窗口看门狗(WWDG)或独立看门狗(IWDG),当这些看门狗计数器达到预设的值时,也会触发RTC复位。
    • 这些复位通常用于检测软件运行失控或系统故障。
  3. 掉电复位://外接电源电池断电

    • 当电源电压低于RTC模块的复位阈值时,RTC模块可能会自动复位。
    • 掉电复位通常用于防止在电源电压不足时,RTC模块的寄存器值被破坏。

 RTC的寄存器

  1. RTC_CRH(控制寄存器高)

    • 用于配置RTC的预分频器、闹钟中断、秒中断和唤醒功能的使能。
  2. RTC_CRL(控制寄存器低)

    • 用于控制RTC的启动和停止,以及读取RTC的状态。
  3. RTC_PRLH(预分频器加载寄存器高)和 RTC_PRLL(预分频器加载寄存器低)

    • 用于配置RTC的预分频器,以确定RTC时钟的频率。
  4. RTC_CNTLH(计数器寄存器高)和 RTC_CNTL(计数器寄存器低)

    • 用于存储RTC的秒计数器值。
  5. RTC_ALRH(闹钟寄存器高)和 RTC_ALRL(闹钟寄存器低)

    • 用于配置RTC的闹钟时间。
  6. RTC_DIVH(分频器寄存器高)和 RTC_DIVL(分频器寄存器低)

    • 用于配置RTC的时钟分频器。
  7. RTC_CR(日历寄存器)

    • 用于存储当前的日期和星期信息。
  8. RTC_TI(时间寄存器)

    • 用于存储当前的时间信息,包括小时、分钟和秒。
  9. RTC_BKPxR(后备寄存器)

    • 用于存储后备电池供电的RTC时钟信息。
  10. RTC_ISR(中断和状态寄存器)

    • 用于读取RTC的中断标志和状态。
  11. RTC_ICR(中断清除寄存器)

    • 用于清除RTC的中断标志。
  12. RTC_PRER(预分频器寄存器)

    • 用于配置RTC的预分频器。
  13. RTC_CNTH(计数器寄存器高)和 RTC_CNTL(计数器寄存器低)

    • 用于存储RTC的秒计数器值。
  14. RTC_ALRH(闹钟寄存器高)和 RTC_ALRL(闹钟寄存器低)

    • 用于配置RTC的闹钟时间。

 步骤

在STM32上设置RTC、读取RTC数据和写入RTC数据的基本步骤:

1.配置RTC时钟源

  • 选择时钟源:通常选择低速外部时钟(LSE)作为RTC的时钟源,因为它是一个稳定的32.768kHz时钟。
  • 使能时钟:通过编程RTC和后备域(RTC和后备寄存器时钟使能)相关的RCC(Reset and Clock Control)寄存器来使能RTC时钟。

2. 配置RTC

  • 配置RTC初始化结构体:使用RTC_InitTypeDef结构体来配置RTC的参数,如小时格式(12小时制或24小时制)、日期格式等。
  • 初始化RTC:调用HAL_RTC_Init()函数,将配置好的参数写入RTC相关的寄存器。

3. 设置时间

  • 配置时间结构体:使用RTC_TimeTypeDefRTC_DateTypeDef结构体来设置时间和日期。
  • 设置时间:调用HAL_RTC_SetTime()HAL_RTC_SetDate()函数来设置RTC的时间。

4. 读取时间

  • 读取时间:调用HAL_RTC_GetTime()HAL_RTC_GetDate()函数来从RTC模块读取当前的时间和日期。

5. 写入数据

  • 写入后备寄存器:STM32的RTC模块通常附带后备寄存器,可以在微控制器断电后保留数据。可以使用HAL_RTCEx_BKUPWrite()函数来写入数据到后备寄存器。

6. 读取数据

  • 读取后备寄存器:使用HAL_RTCEx_BKUPRead()函数来从后备寄存器读取数据。

注意

当关闭RTC(实时时钟)模块时,日历功能通常不会更新。RTC模块需要保持运行,才能持续跟踪和更新时间。如果RTC被关闭,它将停止计时,因此日历信息也不会更新。

在某些情况下,即使RTC模块被软件“关闭”(即,不再通过软件更新或读取时间),只要RTC的电源(例如后备电池或超级电容)仍然连接,RTC硬件本身可能仍然在运行。这取决于具体的微控制器和其RTC模块的设计。但是,如果软件不再与RTC交互,那么即使RTC硬件在运行,系统也不会知道当前的时间或日期。

如果你想要在关闭RTC模块后保留日历信息,你需要在关闭之前将当前的时间信息存储到非易失性存储器中(如后备存储器或Flash),然后在重新启动或打开RTC时从这些存储器中恢复时间信息。这样,即使RTC在一段时间内没有运行,系统也可以恢复到最后存储的时间点,并继续从那里更新日历信息。

 

这篇关于stm32f103zet6_RTC_1_介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971174

相关文章

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2

四种Flutter子页面向父组件传递数据的方法介绍

《四种Flutter子页面向父组件传递数据的方法介绍》在Flutter中,如果父组件需要调用子组件的方法,可以通过常用的四种方式实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录方法 1:使用 GlobalKey 和 State 调用子组件方法方法 2:通过回调函数(Callb

Python进阶之Excel基本操作介绍

《Python进阶之Excel基本操作介绍》在现实中,很多工作都需要与数据打交道,Excel作为常用的数据处理工具,一直备受人们的青睐,本文主要为大家介绍了一些Python中Excel的基本操作,希望... 目录概述写入使用 xlwt使用 XlsxWriter读取修改概述在现实中,很多工作都需要与数据打交

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Python实现NLP的完整流程介绍

《Python实现NLP的完整流程介绍》这篇文章主要为大家详细介绍了Python实现NLP的完整流程,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 编程安装和导入必要的库2. 文本数据准备3. 文本预处理3.1 小写化3.2 分词(Tokenizatio