Ⅰ、概述

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

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

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

本文章提供的实例工程,其实验效果是:

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

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

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

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

Ⅱ、实例工程下载

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

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

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

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

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

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

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

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日 18:00:00(假如为当前值)。 如果有电池,则会按照这个时间一直持续下去,系统掉电之后也不会影响时钟的计数。

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”时钟,其他地方不该可以吗?

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

Ⅵ、说明

这篇文章是结合前几篇文章来讲述的,可以在微信“历史消息”中查看。

关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅶ、最后

更多精彩文章我讲第一时间在微信公众号里面分享,该文有什么疑问可留言。

本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。

 

STM32F10x_RTC日历的更多相关文章

  1. STM32F10x_RTC秒中断

    Ⅰ.概述 RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的. 该文主要讲述关于RTC的秒中断功能,这个 ...

  2. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  3. 开源一款简单清爽的日历组件,JavaScript版的

    源码会在最后给出地址,需要的朋友自己去下载.最近项目需要做一个日程安排的功能,就是点击日历的某一天弹出一个录入页面,填完信息后保存当天的日程安排.有日程的日期会有不同的标记(比如加一个背景色啥的).网 ...

  4. FullCalendar日历插件说明文档

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  5. 被逼着写的jquery工作日管理日历插件

    因为工作原因,在我刚进入新公司之后,立马要求让我做一个jquery的插件demo.我的天,我面试的可是.net工程师啊.虽然以前接触过js,jquery,但也只是接触过一丢丢啊,没办法,只好硬着头皮上 ...

  6. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  7. [JS,Canvas]日历时钟

    [JS,Canvas]日历时钟 Html: <!doctype html> <html> <head> <meta charset="UTF-8&q ...

  8. 用NSCalendar和UICollectionView自定义日历,并实现签到显示

    前一段时间因为工作需要实现了一个可以签到的日历,来记录一下实现的思路 效果如图:   这里的基本需求是: 1,显示用户某个月的签到情况,已经签到的日子打个圈,没有签到且在某个时间范围内的可以签到,其他 ...

  9. java日历显示年份、月份

    import java.util.Scanner;class CalendarMain{     //主函数入口    public static void main(String[] args)   ...

随机推荐

  1. Linux 设备驱动--- 并发 与 竞态 --- atomic_t --- atomic_dec_and_test --- 原子操作

    并发: 多个执行单元同时被执行. 竞态: 并发的执行单元对资源 ( 硬件资源和软件上的全局变量等 ) 的访问导致的竞争状态. 并发的处理: 处理并发的常用技术是加锁或者互斥,即保证在任何时间只有一个执 ...

  2. http://blog.sina.com.cn/s/blog_546abd9f0101c6au.html

    http://blog.sina.com.cn/s/blog_546abd9f0101c6au.html

  3. TCP的状态(SYN,FIN等)

    TCP的标志位有SYN,FIN,RST,ACK,PSH,URG SYN:建立连接. FIN:关闭连接. RST:连接重置. ACK:响应. PSH:有数据传输. URG:urgent紧急. ACK可以 ...

  4. 新闻焦点切换flash应用

    pixviewer.zip <!-- pixviewer.swf使用--> <script language="javascript" type="te ...

  5. IP地址冲突排查

    普通ARP请求报文(查找别人的IP地址,比如:我需要10.1.1.2的MAC地址,10.1.1.2是别人的IP)广播发送出去,广播域内所有主机都接收到,计算机系统判断ARP请求报文中的目的IP地址字段 ...

  6. JMS与Spring之二(用message listener container异步收发消息)

    转自:http://blog.csdn.net/moonsheep_liu/article/details/6684948

  7. SQL Server 2008 R2 清空数据库中ldf日志文件

    /************************************************************ * Sql Server 2008 R2 清空数据库中ldf日志文件 * 将 ...

  8. Git学习笔记二--工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 简单理解: 我们使用mkdir Git在d盘下创建的文件夹,就是工作区,我们编辑readme.txt文件就是在工作区下完成的: gi ...

  9. Bitmap和Drawable的互相转换

    刚好之前的项目实用到.怕遗忘了.就先记录下来.然后会用到的时候直接来这copy使用就好了. 1.Bitmap ---->Drawable: public static Drawable bitm ...

  10. Ubuntu 下apache2 增加新的module

    http://andrew913.iteye.com/blog/398648 首先来介绍下apache的一个工具apxs.apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译 ...