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

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

3天内不再提示

STM32F10x_ RTC日历

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-25 11:39 次阅读

Ⅰ、概述

接着上一篇文章来讲述关于RTC的计数功能,我们以实例RTC日历(读写年、月、日、星期、时、分、秒)来讲述该章节。

STM32F1系列芯片的RTC功能和其他系列(F0、F2、F4等)相比来说,功能要弱一点,原因在于F1系列的RTC日历功能需要我们通过软件进行处理(换算RTC计数值)才能真正实现RTC日历的功能,而其他系列芯片不用这么麻烦,可直接读取日历值。

该文和上一篇文章的区别:1、RTC时钟源选择LSE(外部低速时钟); 2、分频值是32768; 3、读写了RTC_CNT(计数值),用于RTC日历。

本文章提供的实例工程“STM32F10x_RTC日历(LSE)”,其实验效果是:

主函数间隔0.5秒LED变化一次;

间隔1秒中断:读取日历并打印出来

电脑串口调试助手接收到数据:年月日星期时分秒

关于本文的更多详情请往下看。

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是基于Keil(MDK-ARM) v5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号:关注微信,回复“修改型号”)。

STM32F10x_RTC日历(LSE)实例源代码工程:

https://yunpan.cn/cBDwPJcChZRFE 访问密码 f7c0

STM32F10x_RTC日历(LSI)实例源代码工程:

https://yunpan.cn/cBDwSikRhZ2Nk 访问密码 d65d

STM32F1资料

https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90

Ⅲ、原理描述

以笔者个人学习经历来说,想要掌握其真正原理,最好还是查看参考手册(现在有很多都翻译为中文了),里面模块的框图,从框图中大概就可以看到该模块有些什么功能及其工作的原理。

RTC框图:


从上面系统框图来分析“RTC秒中断”和“RTC_CNT计数”的原理:

1.RTC时钟源,总共有三类:

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

本文实例代码是:RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

重点:

细心的朋友可能会发现:笔者还提供了一个实例“STM32F10x_RTC日历(LSI)”。对,这个实例是以LSI内部低速时钟作为RTC时钟源。

先问两个问题:1、为什么不建议使用LSI作为时钟源来设计日历? 2、两个实例工程之间的差别? 将实例中使用“LSE”时钟改为“LSI”时钟,其他地方不该可以吗?【在下面解答】

2.RTC分频:

本文实例代码是:RTC_SetPrescaler(32768-1);

外部低速时钟频率为32.768K,我们要达到1秒计数(RTC_CNT)一次,则需要分频32768.

3.RTC中断:

RTC中断有三种:

RTC_IT_SEC秒中断

RTC_IT_ALR闹钟中断

RTC_IT_OW(计数)溢出中断

本文实例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);

使能RTC_IT_SEC秒中断,间隔1秒中断一次,打印日历。

再次强调:

这里的“秒中断”是概念上的秒中断,它的中断间隔时间是根据你选择的时钟源和分频值决定的,并非真正的1秒钟中断一次。本文提供的实例是1秒钟中断一次。

4.RTC日历的来由:

在文章开头已经说了,F1系列中RTC只要RTC_CNT寄存器,不像F0、F4等有现成的日历(年月日时分秒)寄存器,因此,我们是通过软件换算而得来的日历。

Ⅳ、源代码分析

笔者以F1标准外设库(同时也建议初学者使用官方的标准外设库)为基础建立的工程,主要以库的方式来讲述(若您的F1芯片与提供工程不一样,可微信回复“修改型号”)。

下面将讲述关于“RTC秒中断”重要的、容易弄错的几点:

1.RCC时钟源


该函数位于bsp.c文件下面;

RCC是很多初学者,甚至已经工作的朋友容易遗漏的地方,有很多朋友觉得它使用的外设不正常,很大部分是没有配置RCC导致的。

重点注意:

A.外设RCC时钟的配置要在其外设初始化的前面;

B.匹配对应时钟。

比如:RCC_APB2外设不要配置在RCC_APB1时钟里面

【如:RCC_APB1PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);这样能编译通过,但这是错误的代码】

2. RTC配置


该函数位于rtc.c文件下面;

该函数请结合参考手册(框图和寄存器)理解。

注意4点:

A.使能后备区域:PWR_BackupAccessCmd(ENABLE);

从系统框图可以看见RTC有阴影部分,其实这部分就是后备区域。因此,需要使能,这也是为什么上面需要配置RCC时钟的原因。

B.选择RTC时钟源:RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

在原理描述中说了,RTC时钟源有三种:

RCC_RTCCLKSource_LSE

RCC_RTCCLKSource_LSI

RCC_RTCCLKSource_HSE_Div128

可以在源代码中查看其参数,也是有3中可以选择。

C.使能RTC闹钟中断:RTC_ITConfig(RTC_IT_SEC,ENABLE);

RTC有三类中断:

RTC_IT_SEC秒中断

RTC_IT_ALR闹钟中断

RTC_IT_OW(计数)溢出中断

上一篇文章提供的拓展功能“RTC闹钟”就是使用闹钟中断,可以下载实例工程查看源代码。

D.RTC分频:RTC_SetPrescaler(32767);

我们是为了得到真正的1秒钟中断一次。

3. RTC初始化


该函数位于rtc.c文件下面;

A.我们使用BKP保存“标志位”数据(第一次才初始化,后面就不用初始化了)。我们初始化时间为:2016年7月18日 1800(假如为当前值)。 如果有电池,则会按照这个时间一直持续下去,系统掉电之后也不会影响时钟的计数。

B.第二次及以后上电需要等待RTC与RTC_APB时钟同步。

C.使能RTC秒中断,我们用于测试并打印RTC日历数据。如果你的应用是直接读取RTC日历,不是想我们实例那样中断打印数据,则可以不开启该中断。

4. RTC读写描述


该结构体位于rtc.h文件下面;

这要就是用于读写用(这样直接传递一个参数就行了,不用传递“一串”整形变量)


该函数位于rtc.c文件下面;

RTC日历写(设置)函数,这个函数是笔者整理并经过项目验证的,可直接调用。

注意:

参数不能越界(超出范围),超出范围会返回错误。


该函数位于rtc.c文件下面;

RTC日历读(获取)函数,这个函数是笔者整理并经过项目验证的,可直接调用。

注意:

需要配置RTC并初始化RTC值才会读出正确的日历值。

Ⅴ、解答问题


上面笔者留下的问题或许对于初学者不是很关心,但对于在工作中,需要实际项目的开发的人应该比较有帮助。

1、为什么不建议使用LSI作为时钟源来设计日历?

原因在于LSI不是属于后备区域,而RTC日历部分是属于后备局域(见上图),也就是说系统一旦掉电,RTC时钟就不能工作了。

2、两个实例工程之间的差别? 将实例中使用“LSE”时钟改为“LSI”时钟,其他地方不该可以吗?

这个地方和第一个问题有关联,修改后的工程程序会死在等待时钟同步的地方。

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

    关注

    0

    文章

    274

    浏览量

    27726
  • STM32F10x
    +关注

    关注

    1

    文章

    81

    浏览量

    20576
  • RTC
    RTC
    +关注

    关注

    2

    文章

    482

    浏览量

    65429
收藏 人收藏

    评论

    相关推荐

    STM32F103正点RTC RTC_Alarm_Set不能作用是为什么?

    STM32F103正点RTC RTC_Alarm_Set根本不能作用
    发表于 04-08 07:28

    STM32F1的LL库,RTC怎么不能设置日期?

    STM32F1的LL库,RTC 怎么不能设置日期,只能设置时间。
    发表于 03-29 07:02

    AT32F403/F403A/F407/F413 RTC日历的使用

    AT32F403/F403A/F407/F413 RTC 日历的使用演示AT32
    发表于 10-26 07:32

    AT32F415 AT32F421 ERTC日历的使用

    AT32F415 AT32F421 ERTC 日历的使用演示AT32F415以及AT32F421 ERTC
    发表于 10-19 06:27

    STM32F2实时时钟RTC

    RTC系统框图和组件 时钟源和分频器 硬件日历和警报 自动唤醒定时器 特色功能 数字粗略校准 参考时钟 外部引脚上的导出和导入功能 输出:警报、定时信号、校准时钟 输入:入侵检测 低功耗特性 STM32F2
    发表于 09-13 07:07

    STM32L15x实时时钟RTC介绍

    超低功耗运行时耗电 < 1uA 带有年份月份日期星期小时分钟秒的日历 2个具有中断功能的可编程报警可由任意的日历字段组合触发 1个16位自动装载的可编程定时器能定期触发自动唤醒中断 可
    发表于 09-12 06:35

    什么是RTCRTC的基础知识

    RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤
    的头像 发表于 08-28 10:20 2.1w次阅读
    什么是<b class='flag-5'>RTC</b>?<b class='flag-5'>RTC</b>的基础知识

    STM32RTC晶振不起振的可能原因?

    大家好,我是EE小ai。看到一篇10年前的关于STM32晶振的文章,与大家共享。 STM32RTC晶振经常出现不起振的问题,这已经是“业界共识”了。。。很多人在各种电子论坛上求助类似
    的头像 发表于 08-23 16:47 1850次阅读

    STM32系列里RTC的亚秒特性及功能(上)

    绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。本文中的有关截图若无特别说明均来自STM32L4系列参考手册。
    的头像 发表于 06-21 15:53 1680次阅读
    <b class='flag-5'>STM32</b>系列里<b class='flag-5'>RTC</b>的亚秒特性及功能(上)

    一文看懂RTC实时时钟

    RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器,在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤
    的头像 发表于 06-16 12:24 2762次阅读
    一文看懂<b class='flag-5'>RTC</b>实时时钟

    STM32RTC简介及使用方式

    STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 此外RTC
    的头像 发表于 05-26 16:43 1997次阅读
    <b class='flag-5'>STM32</b>中<b class='flag-5'>RTC</b>简介及使用方式

    STM32学习笔记之RTC实时时钟2

    STM32 的实时时钟(RTC)是一个独立的定时器。 STM32RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历
    的头像 发表于 05-26 14:26 829次阅读
    <b class='flag-5'>STM32</b>学习笔记之<b class='flag-5'>RTC</b>实时时钟2

    STM32学习笔记之RTC实时时钟1

    STM32 的实时时钟(RTC)是一个独立的定时器。 STM32RTC 模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历
    的头像 发表于 05-26 14:26 1280次阅读
    <b class='flag-5'>STM32</b>学习笔记之<b class='flag-5'>RTC</b>实时时钟1

    STM32片内RTC亚秒特性的应用示例(下)

    不过,今天主要想聊聊如何通过RTC来实现该需求。了解STM32RTC的人可能知道,RTC模块往往还自带一个专门的16位向下计数的唤醒定时器,即下面
    的头像 发表于 04-30 16:32 1113次阅读
    <b class='flag-5'>STM32</b>片内<b class='flag-5'>RTC</b>亚秒特性的应用示例(下)

    STM32片内RTC亚秒特性的应用示例(上)

    绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。本文中的有关截图若无特别说明均来自STM32L4系列参考手册。
    的头像 发表于 04-30 16:28 661次阅读
    <b class='flag-5'>STM32</b>片内<b class='flag-5'>RTC</b>亚秒特性的应用示例(上)