STM32F10x_RTC日历

发布者:GoldenSunrise最新更新时间:2021-01-12 来源: 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日历

上一篇:stm32 fsmc 功能讲解
下一篇:STM32_TIM输出PWM波形

推荐阅读最新更新时间:2024-11-18 11:27

一种新型的时钟日历芯片DS12C887
摘要: 简要介绍了美国DALLAS公司的新型时钟日历芯片DS12C887的功能特性和内部控制寄存器参数,给出了DS12C887与8031单片机的电路连接图,同时给出了用C51编写的初始化程序和获取内部时间的程序。 关键词: 时钟 单片机 DS12C887 1 器件特性 DS12C887实时时钟芯片功能丰富,可以用来直接代替IBM PC上的时钟日历芯片DS12887,同时,它的管脚也和MC146818B、DS12887相兼容。 由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题; DS12C887中自带有锂电池,外部掉电时,其内
[单片机]
一种新型的时钟<font color='red'>日历</font>芯片DS12C887
RTC时钟与触摸功能详解(下)
58.5 电阻式触摸控制器——XPT2046 为了方便测量触摸屏的坐标,芯片厂商设计了专门的触摸屏控制芯片,实现触摸点电压测量与转换功能。本文采用的XPT2046是一款4导线制触摸屏控制器,内含12位分辨率 125KHz 转换速率逐次逼近型A/D转换器。XPT2046通过执行两次A/D转换便可以计算出触摸点位置,该芯片兼容 ADS7843 触摸芯片,其电路原理图和引脚图如图8-6和表8-1、表8-2所示。 XPT2046的 电源 VCC的范围为2.7V~5.5V。A/D转换所需的参考电压可以选择通过 VR EF输入,范围是1V~VCC;也可以采用内部内部 2.5V参考电压,采用内部参考电压时VREF引脚应悬空。XPT2
[单片机]
<font color='red'>RTC</font>时钟与触摸功能详解(下)
STM32 基础系列教程 20 - RTC
前言 学习stm32 RTC(实时时钟)的使用,学会用RTC实现钟表功能。 示例详解 基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。 本示例所用的最小系统板原理图: 从本节开始,关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置: 系统时钟树 RTC定时器配置 引脚配置(保持默认即可) 中断配置(保持默认即可) 工程代码 在main.c 中加入如下图所示代码: 将程序编译,仿真调试,可以看
[单片机]
STM32 基础系列教程 20 - <font color='red'>RTC</font>
pcf8563外部RTC驱动程序基于STM32F10x
#ifndef uchar #define uchar unsigned char #endif #define SEC 0x02 //秒寄存器 #define MIN 0x03 //分寄存器 #define HOUR 0x04 //时寄存器 #define DAY 0x05 //日寄存器 #define WEEK 0x06 //周寄存器 #define MONTH 0x07 //月寄存器 #define YEAR 0x08 //年寄存器 #define read_ADD 0xA3 //写器件地址 #define write_ADD 0xA2 //读器件地址 tm timer_8563; /
[单片机]
STM32万年历时钟调试经验(时间精度问题,断电RTC不持续运行)
最初调试STM32的万年历,使用的是内部的 LSI晶振作为RTC晶振来源,发现有两个问题: 第一:由于LSI晶振频率大约在40KHZ附近,实际上会在30~60KHZ之间波动,导致计时不准,基本上一个小时会有1分钟左右的偏差。 第二: 由于LSI内部晶振,在断电的时候,并不在后备供电区域范围内,而外接的3.3V电池连接到VBAT上,只给后备供电区域供电,导致系统断电后,电池只能维持后备RTC的计数,并没有给LSI晶振供电(见下图所示:),导致RTC总是保持在断电之前的时间。虽然重新上电后又可以继续运行。但是需要重新校准了 。 最后使用了外界的32.768KHZ的外部LSE晶振作为RTC晶振来源,调试过程中发现,反复修改,问题
[单片机]
STM32万年历时钟调试经验(时间精度问题,断电<font color='red'>RTC</font>不持续运行)
STM32F10x 学习笔记3(CRC计算单元)
STM32F 系列的单片机内部带了CRC32 计算单元。这个内置CRC模块的方法使用非常简单。其操作如下图所示。 图 1 CRC计算单元框图 归纳起来有如下几步操作: 1. 开启CRC单元的时钟。RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE) 2. 复位CRC模块(设置CRC_CR=0x01),这个操作把CRC余数初始化为0xFFFFFFFF 3. 把要计算的数据按逐个地写入CRC_DR寄存器 4. 写完所有的数据字后,从CRC_DR寄存器读出计算的结果 STM32F10x StdPeriph Driver 中提供了几个函数。 CRC_ResetDR(void)
[单片机]
<font color='red'>STM32F10x</font> 学习笔记3(CRC计算单元)
基于stm32f103zet6的RTC学习
RTC配置 一、秒中断的配置,RTC就是一个定时器而已,没什么大不了的! 1、NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_PriorityGroup,: specifies the priority grouping bits length. This parameter can be one of the following values: NVIC_PriorityGroup_0: 0 bits for pre-emption priority 4 bits for subpriority NVIC_PriorityGroup_1: 1 bits for pre-e
[单片机]
STM32开发笔记76: 初始化RTC后死机的原因
项目开发中只要初始化RTC,则系统死机。其初始化步骤可参考日志:STM32开发笔记44:RTC驱动程序的移植。按照日志STM32开发笔记75: 使用STM32CubeMX点亮一个LED使用STM32CubeMX直接生成程序则运行正常。 分析原因在于,少移植了2个函数:HAL_RTC_MspInit和HAL_RTC_MspDeInit。这两个函数的实现非常简单,可以靠STM32CubeMX直接生成。 void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc) { __HAL_RCC_RTC_ENABLE(); HAL_NVIC_SetPriority(RTC_IRQn, 0x0, 0)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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