STM32F10x_RTC日历

发布者:ShimmeringStar最新更新时间:2017-02-05 来源: eefocus关键字:STM32F10x  RTC日历 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ、概述

接着上一篇文章来讲述关于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”时钟,其他地方不该可以吗?

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

 

Ⅵ、说明

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

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

 

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


关键字:STM32F10x  RTC日历 引用地址:STM32F10x_RTC日历

上一篇:STM32F10x_ADC三通道DMA连续转换(3通道、软件单次触发)
下一篇:STM32F10x_RTC秒中断

推荐阅读最新更新时间:2024-03-16 15:32

STM32F10x低功耗之待机模式详解
1.待机模式介绍 STM32F10x待机模式可实现系统的最低功耗。该模式是在Cortex-M3深睡眠模式时关闭电压调节器。整个1.8V供电区域被断电。 PLL、HSI和HSE振荡器也被断电。 SRAM和寄存器内容丢失。只有备份的寄存器和待机电路维持供电。 在待机模式下,下列功能需要单独设置: 1.独立看门狗(IWDG):独立看门狗一旦启动,除了系统复位,它不能再被停止。可通过看门狗的键寄存器或硬件选择来启动IWDG。 2.实时时钟(RTC):可通过区域控制寄存器(RCC_BDCR)中的RTCEN位来设置。 3.内部RC振荡器(LSI RC):通过控制/状态寄存器(RCC_CSR)的LSION位来设置。 4.外部低速时钟LSE(
[单片机]
<font color='red'>STM32F10x</font>低功耗之待机模式详解
STM32头文件STM32F10x.h和STM32F10x_lib.h区别
#include stm32f10x_lib.h 是ST公司V2.0的库函数使用的头文件,用MDK3.80A打开。但是,如果你用MDK4.7/MDK5打开,就没法找到了,这也就是为什么,我们老版本的例程,存在高版本的MDK编译的时候,报找不到stm32f10x_lib.h的错误的原因了。而stm32f10x_lib.h里面,经过分析,实际可以用:stm32f10x_map.h和stm32f10x_nvic.h来替代。 #include stm32f10x.h 是ST公司V3.5及以后版本统一使用的库函数头文件了,说白了就是把原来的stm32f10x_lib.h,换成了#include stm32f10x.h ,规范了代码,不需
[单片机]
STM32f10x系列工程建立演示
温馨提示:图看不清可以放大 ctrl + 鼠标滑轮 步骤如下: 1、在一个文件夹里放入Libraries库,新建output文件夹作为工程的输出文件,新建一个App文件夹用于放外设文件,新建user文件夹用于放主函数和中断函数,新建的startup文件夹可以放驱动文件,也可不放,因为Libraies有该文件夹,在工程里可以添加到 2、在keil新建一个工程,以下是动态 3、在工程中添加目录,然后在目录中添加文件,一下是动态图 忘了,在CMSIS添加system_stm32f10x.c 4、添加头文件,如果不添加,无法编译,预编译指令是: USE_STDPERIPH_DRIVER,STM32F10X_HD 过程如下:
[单片机]
<font color='red'>STM32f10x</font>系列工程建立演示
stm32驱动实例 STM32F10x_StdPeriph_Examples
1.下载 http://download.csdn.net/detail/miseli/9787037 或者 http://pan.baidu.com/s/1miRyneK 2.
[单片机]
stm32驱动实例 STM32F10x_StdPeriph_Examples
STM32F10x系列的MCU配置PB3和PB4为普通IO口
对于初学习者来说为什么用到PB3和PB4时无法控制输出呢? 下面就这一问题进行分析讲解。 首先,STM32F10x系列的MCU复位后,PA13/14/15 & PB3/4默认配置为JTAG功能。有时我们为了充分利用MCU I/O口的资源,会把这些 端口设置为普通I/O口。具体方法如下: 在GPIO_Configuration(); // 配置使用的 GPIO 口: 注意:不要忘记在RCC_Configuration()中开启AFIO时钟, //AFIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SW
[单片机]
STM32F10x 启动代码分析
;******************** (C) COPYRIGHT 2010 STMicroelectronics ******************** ;* File Name : startup_stm32f10x_hd_vl.s ;* Author : MCD Application Team ;* Version : V3.4.0 ;* Date : 10/15/2010 ;* Description : STM32F10x High Density Value Line Devices vector table ;* for MDK-ARM t
[单片机]
STM32F10x 学习笔记6(USART实现串口通讯 2)
这次讲讲利用串口收发中断来进行串口通讯。STM32 上为每个串口分配了一个中断。也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断。程序需在中断处理函数中读取状态寄存器(USART_SR)来判断当前的是什么中断。下面的中断映像图给出了这些中断源是如何汇合成最终的中断信号的。图中也给出了如何控制每一个单独的中断源是否起作用。 另外,Cortex-M3 内核中还有个NVIC,可以控制这里的中断信号是否触发中断处理函数的执行,还有这些外部中断的级别。关于NVIC 可以参考《ARM CortexM3 权威指南》,里面讲解的非常详细。 简单的说,为了开启中断,我们需要如下的代码: NVIC_InitType
[单片机]
<font color='red'>STM32F10x</font> 学习笔记6(USART实现串口通讯 2)
STM32F10x _RTC秒中断
Ⅰ、概述 RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。 该文主要讲述关于RTC的秒中断功能,这个功能类似SysTick系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 秒中断一次打印数据 RTC Sec... ; 也就是LED变化一次,串口打印一次数据 RTC Sec... 扩展部分的功能RTC计数:可以实现RTC
[单片机]
<font color='red'>STM32F10x</font> _<font color='red'>RTC</font>秒中断
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved