0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32的实时时钟RTC编程详解

jf_78858299 来源:雨飞工作室 作者:雨飞工作室 2023-05-26 14:32 次阅读

STM32里,一个CPU已经足够,不需要像DS1302这样的实时时钟芯片。实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。

  1. STM32的RTC模块

RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。

1.1 RTC的组成

RTC由两个部分组成:APB1接口部分以及RTC核心部分。 STM32所有的外设默认时钟无效,使用某个外设时,再开启时钟,用这样的方式来降低功耗。 这里的RTC,APB1 接口由APB1总线时钟来驱动。为了突出时钟吧?不过据说APB1接口部分还包括一组16 位寄存器。

RTC核心部分又分为预分频模块和一个32位的可编程计数器。前者可使每个TR_CLK 周期中RTC产生一个秒中断,后者可被初始化为当前系统时间。此后系统时间会按照TR_CLK周期进行累加,实现时钟功能。

1.2 对RTC的操作

我们对RTC的访问,是通过APB1接口来进行的。注意,APB1刚被开启的时候(比如刚上电,或刚复位后),从APB1上读出来的RTC寄存器的第一个值有可能是被破坏了的(通常读到0)。这个不幸,STM32是如何预防的呢?我们在程序中,会先等待RTC_CRL寄存器中的RSF位(寄存器同步标志)被硬件置1,然后才开始读操作,这时候读出来的值就是OK的。

那么对RTC寄存器的写操作会不会有类似的情况呢?对于写操作,我们只要注意, 每一次写操作,必须确保在前一次写操作完成后进行。 这个“确保”,是通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中。只有当RTOFF状态位是1,才可以写RTC寄存器。

  1. RTC的编程

RTC的例程,主要是设置RTC时钟,使得其在超级终端上显示出当前的时钟。这个时钟的显示是“不停地走”。而且掉电后,重新上电,时钟仍然在走,仍然显示当前的时间。当然,如果感兴趣,您可以让它在LCD上显示—— 那就是一个名副其实的电子钟了。

编程的时候,首先要注意备份寄存器BKP_DR1,它做了一件关键的事情:判断RTC是否已经被设置过。 因为RTC跟其他计时器不同,它是使用纽扣电池单独供电工作,所以它不会每次上电或者复位都被重置。判断RTC是否已经被设置过,可以决定当前是否需要去设置RTC。如果刚安装电池,第一次上电,自然需要去设置。否则的话,我们只要让它显示当前时钟即可。

当第一次使用RTC的时候(第一次配置),需要做的工作总结下:

1、打开电源管理和备份寄存器时钟。注意,一定要打开备份寄存器的时钟。

我们正是通过在备份寄存器写固定的数据来判断芯片是否第一次使用RTC,从而在系统运行RTC 时提示配置时钟的。

2、使能RTC 和备份寄存器的访问(复位默认是关闭的,以防止可能存在的意外的写操作)。

3、选择外部低速晶体为RTC时钟,并使能时钟。笔者当初调试RTC 的时候,犯了一个低级错误:由于没有定义如下:

#define RTCClockSource_LSE

导致程序一直停留在这里:

/* Wait till LSE is ready */while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}

希望大家能避免这个错误。

4、使能秒中断,程序里在秒中断里置位标志位来通知主程序显示时间数据,同时在32 位计数器到23:59:59时清零;

5 、设置RTC 预分频器值产生1秒信号计算公式fTR_CLK = fRTCCLK/(PRL+1),我们设置32767来产生秒信号。

我们再次强调:所有在对RTC寄存器操作之前都要判断读写操作是否完成,即内部是否有读写操作。

下面来看代码:

/* System Clocks Configuration */RCC_Configuration();
/* NVIC configuration */NVIC_Configuration();
/* Configure the GPIOs */GPIO_Configuration();
/* Configure the USART1 */USART_Configuration();

注意时钟,为避免遗漏,笔者将其代码放在第一位:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_PWR,ENABLE);

接着我们读取备份寄存器BKP_DR1 中的值来判断是否是第一次上电,如果不是则直接显示时钟,否则进行时间设置。当BKP_DR1的值不为0xAAAA,说明是第一次上电,此时需要对RTC进行初始化。注意初始化的实现函数RTC_Configuration();,为什么那么写,请参考我们之前给出的“第一次使用RTC的配置工作总结”,然后进行时钟设置。

注意,因为我们需要进行写操作,所以根据固件库手册,要先调用RTC_WaitForLastTask(),等待标志位RTOFF被设置,保证在前一次写操作结束后才能进行。调用RTC_SetCounter(Time_Regulate());,将计数值写入RTC计数器。

由于后面要通过BKP_WriteBackupRegister()函数对BKP_DR1写操作,因此之前还需要进行一次RTC_WaitForLastTask(),这样,对时间的设置就完成了。

剩下的代码,比较简单,主要是注意如下:

RTCCount = RTC_GetCounter(); //获得计数值并计算当前时钟
/* Compute hours */THH = RTCCount/3600;
/* Compute minutes */TMM = (RTCCount % 3600)/60;
/* Compute seconds */TSS = (RTCCount % 3600)% 60;

这是通过RTC_GetCounter();函数获取计数值,然后把这个计数值分别用小时、分钟、秒来表示的过程。最后还需要调用printf 函数把它显示出来。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10850

    浏览量

    211514
  • STM32
    +关注

    关注

    2270

    文章

    10890

    浏览量

    355630
  • 时钟芯片
    +关注

    关注

    2

    文章

    249

    浏览量

    39876
  • 纽扣电池
    +关注

    关注

    2

    文章

    112

    浏览量

    7605
收藏 人收藏

    评论

    相关推荐

    基于STM32CubeMX的实时时钟(RTC)配置

    实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。
    发表于 03-21 09:36 3899次阅读

    STM32 RTC实时时钟(一)

    STM32处理器内部集成了实时时钟控制器(RTC),因此在实现实时时钟功能时,无须外扩时钟芯片即可构建
    的头像 发表于 07-22 15:41 4668次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>RTC</b><b class='flag-5'>实时时钟</b>(一)

    RTC实时时钟简介

    RTC实时时钟1. RTC实时时钟简介2. 硬件设计3. 软件设计3.1 STM32CubeMX设置3.2 MDK-ARM
    发表于 08-18 06:55

    如何去使用STM32实时时钟RTC

    实时时钟RTC是什么?如何去使用STM32实时时钟RTC呢?有哪些注意事项?
    发表于 11-22 08:05

    RTC是什么?RTC实时时钟实验

    是什么?STM32F4 的实时时钟RTC)相对于 STM32F1 来说,改进了不少,带了日历功能了,STM32F4 的
    发表于 01-13 07:19

    STM32F0xx_ RTC实时时钟配置详细过程

    STM32F0xx_RTC实时时钟配置详细过程
    的头像 发表于 04-07 11:50 8298次阅读
    <b class='flag-5'>STM32</b>F0xx_ <b class='flag-5'>RTC</b><b class='flag-5'>实时时钟</b>配置详细过程

    浅谈RTC实时时钟特征与原理

    一、RTC实时时钟特征与原理 查看STM32中文手册 16 实时时钟RTC)(308页) RTC
    的头像 发表于 06-30 15:54 1.1w次阅读

    STM32CubeMX | 40 - 实时时钟RTC的使用(日历和闹钟)

    STM32CubeMX | 40 - 实时时钟RTC的使用(日历和闹钟)
    发表于 11-23 18:06 19次下载
    <b class='flag-5'>STM32</b>CubeMX | 40 - <b class='flag-5'>实时时钟</b><b class='flag-5'>RTC</b>的使用(日历和闹钟)

    STM32开发 -- RTC详解

    RTC实时时钟部分,之前也是有讲到过的。Hi3516A开发–RTC电路接下来看一下STM32RTC该怎么配置一、
    发表于 11-30 13:06 27次下载
    <b class='flag-5'>STM32</b>开发 -- <b class='flag-5'>RTC</b><b class='flag-5'>详解</b>

    stm32f4 RTC实时时钟解析

    应用最为广泛的消费类电子产品之一。它为人们提供精确的实时时间,或者为电子系统提供精确的时间基准,目前实时时钟芯片大多采用精度较高的晶体振荡器作为时钟源。对于STM32F的
    发表于 12-04 18:06 19次下载
    <b class='flag-5'>stm32</b>f4 <b class='flag-5'>RTC</b><b class='flag-5'>实时时钟</b>解析

    STM32CubeMX系列|RTC实时时钟

    RTC实时时钟1. RTC实时时钟简介2. 硬件设计3. 软件设计3.1 STM32CubeMX设置3.2 MDK-ARM
    发表于 12-24 19:15 16次下载
    <b class='flag-5'>STM32</b>CubeMX系列|<b class='flag-5'>RTC</b><b class='flag-5'>实时时钟</b>

    STM32CubeMX-实时时钟(RTC)

    实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。
    的头像 发表于 01-14 17:24 2505次阅读

    基于STM32单片机RTC实时时钟使用库文件设计

    基于STM32单片机RTC实时时钟使用库文件设计源代码
    发表于 04-26 14:28 5次下载

    STM32 RTC实时时钟(二)

    上次实验完成了对实时时钟的基本功能——计时的实验,这次在计时的基础上对RTC的可编程闹钟的功能进行测试。
    的头像 发表于 07-22 15:43 1972次阅读
    <b class='flag-5'>STM32</b> <b class='flag-5'>RTC</b><b class='flag-5'>实时时钟</b>(二)

    CW32实时时钟RTC)介绍

    CW32实时时钟RTC)介绍
    的头像 发表于 10-24 15:36 1129次阅读
    CW32<b class='flag-5'>实时时钟</b>(<b class='flag-5'>RTC</b>)介绍