Ⅰ、概述
接着上一篇文章来讲述关于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计数”的原理:
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”时钟,其他地方不该可以吗?【在下面解答】
本文实例代码是:RTC_SetPrescaler(32768-1);
外部低速时钟频率为32.768K,我们要达到1秒计数(RTC_CNT)一次,则需要分频32768.
3.RTC中断:
RTC中断有三种:
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秒中断”重要的、容易弄错的几点:
该函数位于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”时钟,其他地方不该可以吗?
这个地方和第一个问题有关联,修改后的工程程序会死在等待时钟同步的地方。
Ⅵ、说明
这篇文章是结合前几篇文章来讲述的,可以在微信“历史消息”中查看。
关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。
以上总结仅供参考,若有不对之处,敬请谅解。
上一篇:stm32定时器时钟源时钟选择,重点是外部时钟源1模式的理解
下一篇:不建议用STM32F1的RTC实现日历功能
推荐阅读最新更新时间:2024-11-12 12:40
设计资源 培训 开发板 精华推荐
- LTC1646 紧凑型 PCI 双路热插拔控制器的典型应用电路
- 具有双输入的 LTC3126MPFE 3.3V、750kHz 降压转换器的典型应用电路
- AM30EW-2412SZ 12V单路输出DC/DC转换器的典型应用
- AKD4616-A,AK4616 24 位音频编解码器评估板
- DC9007A,基于 LTP5903 的 SmartMesh WirelessHART 入门套件
- 单片机+电机驱动集成
- 王字流水灯
- ADR444A 4.096 Vout 超低噪声、LDO XFET 电压基准的典型应用,具有电流吸收器和电流源
- SL2.1A 拓展坞 !!
- 用于仪表的 8/10/12/14 位、1 通道 DAC
- TI机器人系统学习套件,低成本开启你的电子工程课程实战之旅
- 了解TE CONNECTIVITY室外照明连接解决方案精彩专题,参与有好礼!
- 直播已结束【基于迈来芯第二代位置传感器优化设计的新一代产品】
- 跟着电源达人一起动手做“高效率双向DC-DC变换器”
- TI E2E中文社区年终回馈,15 块 CC3200-LAUNCHXL 开发板免费申请中……测评赢好礼喽!
- TI教室全新导航让查看更简单!填问卷送好礼啦!
- 【下单全额返现,300元封顶,不限产品】MPS商城钜惠体验季!
- 造个车,一起驶向诗和远方!学习 TI 汽车参考设计,参加技能小测试赢好礼!
- Microchip ShieldsUP!安全解决方案系列在线研讨会
- 已结束 |TI 新一代 MSP430™ 产品在低成本超声波水表中的方案介绍及快速应用指南