STM32F10x_RTC秒中断
Ⅰ、概述
RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。
该文主要讲述关于RTC的秒中断功能,这个功能类似SysTick系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。
本文章提供的实例工程,其实验效果是:
主函数间隔0.5秒LED变化一次;
秒中断一次打印数据"RTC Sec...";
也就是LED变化一次,串口打印一次数据"RTC Sec..."
扩展部分的功能RTC计数:可以实现RTC闹钟,本文将提供实例工程源代码供大家下载学习。
关于本文的更多详情请往下看。
Ⅱ、实例工程下载
笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。
笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。
提供下载的软件工程是STM32F103ZE的,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。
STM32F10x_RTC闹钟实例源代码工程:
https://yunpan.cn/cBbpu3gIGK38a 访问密码 05da
STM32F10x_RTC秒中断实例源代码工程:
https://yunpan.cn/cBbpPnhYbXR9x 访问密码 561f
STM32F1资料:
https://yunpan.cn/crBUdUGdYKam2 访问密码 ca90
Ⅲ、原理描述
以笔者个人学习经历来说,想要掌握其真正原理,最好还是查看参考手册(现在有很多都翻译为中文了),里面模块的框图,从框图中大概就可以看到该模块有些什么功能及其工作的原理。
RTC框图:
从上面系统框图来分析“RTC秒中断”的原理:
1、RTC时钟源,总共有三类:
RCC_RTCCLKSource_LSE
RCC_RTCCLKSource_LSI
RCC_RTCCLKSource_HSE_Div128
本文实例代码是:RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);
使用“RCC_RTCCLKSource_HSE_Div128”作为时钟源(高速时钟源),也就是外部高速时钟的128分频,也就是每秒8M/128(62500)个脉冲;
当然,我们也可以选择另外两个时钟源,也就是使用低速时钟源,一般应用在RTC闹钟可RTC日历等都使用低速时钟源。
2、RTC分频:
本文实例代码是:RTC_SetPrescaler(62500);
这个值是和上面对应的,因为我们这里是实现真正的1秒钟中断一次。
3、RTC中断:
RTC中断有三种:
RTC_IT_SEC秒中断
RTC_IT_ALR闹钟中断
RTC_IT_OW(计数)溢出中断
本文实例是:RTC_ITConfig(RTC_IT_SEC, ENABLE);
使能RTC_IT_SEC秒中断。
再次强调:
这里的“秒中断”是概念上的秒中断,它的中断间隔时间是根据你选择的时钟源和分频值决定的,并非真正的1秒钟中断一次。
我们可以试着将源代码中的分频值该62500的一半31250,可以看得出来,秒中断的间隔时间为0.5秒(请自行修改实验测试)。
Ⅳ、源代码分析
笔者以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_HSE_Div128);
在原理描述中说了,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(62500);
我们是为了得到真正的1秒钟中断一次,所以这里的值是62500 = 8M/128,这样才能刚好1秒中断一次。
3. NVIC配置
该函数位于bsp.c文件下面;
我们要中断,就需要配置NVIC(中断控制器),为其分配优先级。
很多人觉得自己的配置没问题,但程序就是不进入中断,原因可能就在这里。因此,NVIC这里也是容易忽略的地方。
4. RTC中断
该函数位于stm32f10x_it.c文件下面;
这里需要注意,RTC有三类中断,但入口都是这个函数,因此,需要在函数体里面分辨是哪一个中断进入了该函数。
注意1点:
清除中断标志位:RTC_ClearITPendingBit(RTC_IT_SEC);
有的中断标志位清除方法可能有几种方法,比如USART接收中断,只要读取接收值就可以清除(请看USART1_IRQHandler函数)
可能有人觉得自己的程序老是字在中断函数里面,原因可能就在于没有清除中断标志位。
Ⅴ、说明
这篇文章是结合前几篇文章来讲述的,可以在微信“历史消息”中查看。
关于笔者提供的软件工程实例,可关注微信,在会话框回复“关于工程”,有关于工程结构描述、型号修改等讲述。
以上总结仅供参考,若有不对之处,敬请谅解。
Ⅵ、最后
更多精彩文章我讲第一时间在微信公众号里面分享。
本着免费分享的原则,方便大家手机学习知识,定期在微信平台分享技术知识。如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,将有更多精彩内容等着你。
STM32F10x_RTC秒中断的更多相关文章
- 使用STM32CubeMX生成RTC工程[秒中断]
现在我们在之前的工程(http://www.cnblogs.com/libra13179/p/7170791.html)中修改 /** ******************************** ...
- STM32F10x_RTC日历
Ⅰ.概述 接着上一篇文章来讲述关于RTC的计数功能,我们以实例RTC日历(读写年.月.日.星期.时.分.秒)来讲述该章节. STM32F1系列芯片的RTC功能和其他系列(F0.F2.F4等)相比来说, ...
- mini2440裸机试炼之—RTC闹钟中断,节拍中断
版权声明:博客地址:http://blog.csdn.net/muyang_ren.源代码能够在我的github上找看看 https://blog.csdn.net/muyang_ren/articl ...
- 性能分析_linux服务器CPU_中断
中断 1. 指标范围 1.1 Interrupt rate 应该与cpu利用率结合分析,如果cpu利用率在合理范围内,大量的中断也是可以接受的.一个巨大的中断值,同时伴随着缓慢的系统性能表现,指示 ...
- 79.ZYNQ内部私有定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedbo ...
- Zynq-7000 FreeRTOS(二)中断:Timer中断
总结Zynq-7000 这款器件中的Timer定时器中断,为FreeRTOS中断做准备.在 ZYNQ 的纯 PS 里实现私有定时器中断. 每隔一秒中断一次, 在中断函数里计数加 1, 通过串口打印输出 ...
- STM32的RTC中断标志只能手动清除
背景: 最近在做一个stm32的项目,其中用到RTC的实时时钟功能.时钟源采用外部32.768K晶振,时钟预分频设置为32767,目的是为了产生1秒的中断,然后在中断处理函数中更新实时年月日时分秒. ...
- S02_CH08_ ZYNQ 定时器中断实验
S02_CH08_ ZYNQ 定时器中断实验 上一章实现了PS接受来自PL的中断,本章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 8.1中断原 ...
- 第十四章 ZYNQ TIMER定时器中断
上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每隔一秒中断一次,在中断函数里计数加1,通过串口打印输出. 本文所使用的开发板是Miz702 PC 开发环 ...
随机推荐
- scrapy-splash抓取动态数据例子八
一.介绍 本例子用scrapy-splash抓取界面网站给定关键字抓取咨询信息. 给定关键字:个性化:融合:电视 抓取信息内如下: 1.资讯标题 2.资讯链接 3.资讯时间 4.资讯来源 二.网站信息 ...
- C#高级编程八十二天----用户自己定义异常类
用户自己定义异常类 前面已经说了不少关于异常的问题了,如今来给大家说一下自己定义异常时咋个回事以及咋样. 为啥会出现自己定义异常类呢? 用用脚趾头想想也明确,是为了定义咱们自己的异常,自己定义异常 ...
- 报错:maven:java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets
运行报错: maven:java.lang.NoClassDefFoundError: org/apache/commons/io/Charsets 找不到Charsets这个类 上网查了以后,是因为 ...
- Razor语法(一)
语法名称 Razor 语法 Web Forms 等效语法 代码块 @{ int x = 123; string y ="because."; } <% int x = ...
- 如何在asp.net mvc框架及django框架下面避免CSRF
CSRF 跨站伪造请求 不知CSRF为何物的,可以问下G哥. 在Asp.net MVC平台下,提供了Html.AntiForgeryToken() 方法,我们只需把其放在form的标签内,在浏览器端就 ...
- (转)Scala中协变(+)、逆变(-)、上界(<:)、下界(>:)简单介绍
看源码的时候看到: trait ExtensionId[T <: Extension] { 没见过这个符号啊<: Scala上界(<:)和下界(>:) 1) U >: T ...
- java 过滤器补充
多个Filter按照在配置文件中配置的filter顺序执行. 在web.xml文件中配置该Filter,使用init-param元素为该Filter配置参数,init-param可接受如下两个子元素: ...
- vs2017 自定义生成规则 错误 MSB3721 命令 ”已退出,返回代码为 1。
错误 MSB3721 命令 ”已退出,返回代码为 1. 解决办法:去掉yasm复选框,改为masm vs2017 自定义生成规则-编译汇编代码 VC++调用yasm编译汇编代码有三种方法:Custom ...
- TestNG 四 测试方法之工厂
工厂允许你动态的创建测试.例如,假设你需要创建一个测试方法,并用它来多次访问一个web页面,而且每次都带有不同的参数: public class TestWebServer { @Test(param ...
- Discuz常见小问题2-如何清空,删除,清除全部DIY的数据
如果所有diy都不想要了,手动清空_common_block._common_diy_data与_common_template_block表,然后删除\data\diy\下的所有子文件夹,保证你以前 ...