历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2021年01月12日 | STM32F10x_RTC日历

2021-01-12 来源:eefocus

Ⅰ、概述

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

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


推荐阅读

史海拾趣

Glorious Sources Co Ltd公司的发展小趣事
对于视力受损的人群,可听式光探测器电路可以作为一种辅助工具,帮助他们感知环境中的光线变化。
DMC Tools公司的发展小趣事

随着全球对环保问题的日益关注,DMC Tools公司也积极响应号召,致力于绿色生产。公司引进了先进的环保设备和技术,对生产过程中的废弃物进行无害化处理。同时,公司还积极推广绿色产品,帮助客户实现绿色生产。这种对环保的关注和投入不仅彰显了公司的社会责任感,也为公司赢得了良好的社会声誉。

Bay Linear Inc公司的发展小趣事

在电子行业的早期,Bay Linear Inc公司以其精湛的技术和前瞻性的视野,成功研发出了一款高效能、低能耗的线性电源管理芯片。这款产品凭借出色的性能,迅速获得了市场的认可,为公司在行业内赢得了良好的声誉。随着技术的不断进步,公司又陆续推出了多款创新产品,不断巩固和扩大市场份额。

CINTERION公司的发展小趣事

近年来,CINTERION与泰雷兹达成战略合作,共同推出了创新型物联网无线通信模组Cinterion MV32。这款模组结合了泰雷兹在连接管理方面的灵活性和CINTERION在无线通信模组技术上的优势,为制造商提供了快速构建和维护高性能5G设备的解决方案。这一合作不仅加强了CINTERION在物联网领域的市场地位,也为其在未来的发展中注入了新的活力。

以上五个故事均基于CINTERION在电子行业中的发展历程和成就进行描述,旨在客观呈现其在不同领域的发展轨迹和技术实力。

台湾奇力(Chip)公司的发展小趣事

奇力公司的成功离不开与奇美集团的紧密合作。奇美集团是台湾知名的面板生产厂家,拥有强大的技术实力和市场份额。奇力公司作为奇美集团的子公司,得到了奇美集团在技术、资金和市场等方面的全力支持。通过与奇美集团的紧密合作,奇力公司得以快速发展,并在LED芯片市场上取得了显著的成绩。

CIRCUITCO公司的发展小趣事

CIRCUITCO公司自创立之初,就致力于电子电路技术的研发。在某一时期,公司投入大量资源研发新型高性能电路板。经过数年的努力,团队终于成功开发出一款具有更高集成度、更低能耗的电路板。这一突破不仅提升了公司的技术实力,也使其在市场上获得了显著的竞争优势。随着这款新产品的推出,CIRCUITCO公司的业绩迅速攀升,成为行业内的佼佼者。

问答坊 | AI 解惑

奉上 胡树豪老先生的《实用射频技术》

第1章 传输线的基本知识 (1) 1.1 传输线基本公式 (1) 1.2 史密斯圆图 (5) 1.3 l /4线的应用 (8) 1.4 杂项 (11) 第2章 同轴线实用知识 (15) 2.1 同轴线缆 (15) 2.2 同轴器件 (17) 2.3 同轴线内导体的金属支撑――直流接地 ...…

查看全部问答>

有没有谁见过这些触发器。知道它们特性方程吗?

[img=http://hi.eeworld.net/attachment/200911/22/5108_1258896379hB6h.jpg][/img][img=http://hi.eeworld.net/attachment/200911/22/5108_1258896378SHxq.jpg[/img]…

查看全部问答>

bootloader 从sd卡引导wince的问题

为了方便更新wince系统,想做sd上引导wince,bootloader 还是在nandflash上。网上下了bootloader源码,,sd卡初始化成功了,fat初始化也成功,能够读出sd的容量,但是查找boot.txt文件失败,无法加载。我跟踪发现在读sd卡0扇区时,读出了的Mbr就不 ...…

查看全部问答>

飞龙教程------51单片机=====按键(独立按键/矩阵键盘)

飞龙教程------51单片机=====按键(独立按键/矩阵键盘) 电子工程师之家 单片机学习网   http://www.eehome.cn/ 新势力电子单片机              http://www.xinshili.net/ BY: 飞龙& ...…

查看全部问答>

gooogleman请进。NAND启动代码问题。

NAND启动代码 ldr r0, =BWSCON ldr r0, [r0] ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot bne copy_proc_beg ;don\'t read nand flash\' adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot cmp r0, #0 ;if use Multi-ice, 如果使 ...…

查看全部问答>

如何搭建vs2005下ce5.0模拟器开发环境

在vs下安装了STANDARD_SDK.msi,但编译能通过,运行出现“部署错误”对话框,然后错误信息: 1>------ 已启动部署: 项目: EvalCE, 配置: Debug STANDARDSDK_500 (ARMV4I) ------ 1>设备未准备好。如果目标是 ActiveSync 设备,请验证 ActiveSync ...…

查看全部问答>

EM310模块发送数据无应答,求解

在给的开发流程中是这样: AT%IPOPEN=\"TCP\",\"61.144.177.202\",3000 CONNECT AT%IPSEND=\"683100310068c90896060000027400000100e416\" %IPSEND:15 OK %IPDATA:20\"683100310068C90896060000027400000100E416\" ------------------------ ...…

查看全部问答>

基于事件驱动的嵌入式系统设计,有谁了解的请进!广发言路!呵呵

各位前辈,有谁知道这个题目的该怎么做,“基于事件驱动的嵌入式系统设计”,我想了很长时间了,关于什么是事件驱动机制我是清楚了,就是现在不知道从何入手? 请大家发表一下看法。呵呵,谢谢…

查看全部问答>

急!!!关于WINDOWS CE下调用DirectShow开发多媒体的问题!!!

我在WINDOWS CE平台上调用DirectShow开发多媒体,当初始化COM以后,调用CoCreateInstance方法,老是出错,返回一个很小的负数,不知道是什么原因,请高手指教,下面是其中一段代码。IID和CLSID都没错。     HRESULT hr = CoInitializeEx ...…

查看全部问答>

【视频分享】电源设计小贴士37:折中选择输入电容纹波电流的线压范围

简介:您在为一个低功耗、离线电源选择输入滤波电容时,会出现一种有趣的权衡过程。您要折中地选取电容的纹波电流额定值,以适合电源工作所需的电压范围。通过增加输入电容,您可以获得更多纹波电流的同时还可以通过降低输入电容的压降来缩小电源的 ...…

查看全部问答>