0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F10x _RTC秒中断

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 2020-03-25 11:39 次阅读

Ⅰ、概述

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函数)

可能有人觉得自己的程序老是字在中断函数里面,原因可能就在于没有清除中断标志位。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32F10x
    +关注

    关注

    1

    文章

    81

    浏览量

    20571
  • RTC
    RTC
    +关注

    关注

    2

    文章

    478

    浏览量

    65393
  • 时钟源
    +关注

    关注

    0

    文章

    84

    浏览量

    15757
收藏 人收藏

    评论

    相关推荐

    RT-thread源码移植到STM32F10xSTM32F4xx

    RT-thread源码移植到STM32F10xSTM32F4xx: 一、源码下载 点击入门->下载   在历史版本里边随便选取一个   会进入百度云盘的下载地址,里边有全部版本的源码。这里下载
    的头像 发表于 11-15 09:38 847次阅读
    RT-thread源码移植到<b class='flag-5'>STM32F10x</b>和<b class='flag-5'>STM32</b>F4xx

    STM32F10x中一些专业术语解释

    STM32F10x中一些专业术语解释
    的头像 发表于 11-01 16:59 233次阅读

    STM32F10X定时器PWM输入模式测量频率、占空比精度问题如何处理?

    今天使用了STM32F10X定时器PWM输入模式,用来测量输入方波信号的频率和占空比,发现精度不高,设置定时器的时钟频率为36MHz,预分频为35,计数频率为1MHz,即精度为1us,当输入信号
    发表于 10-28 07:14

    STM32L4如何操作能最快速让RTC的闹钟输出(Alarm A 11次)重置?

    使用高精度晶振作为RTC时钟源,想让闹钟1输出与GPS的1PPS同步,现在是用EXTI的上升沿触发中断检测1次GPS的1PPS脉冲,在中断
    发表于 10-21 12:19

    STM32F10x其余模块介绍

    1MHz转换速率、12位转换结果STM32F103系列:在56MHz时转换时间为:1µs在72MHz时转换时间为:1.17µsSTM32F101系列:在28MHz时的转换时间:1µs在36MHz
    发表于 09-13 07:40

    STM32L15x概述

    系统架构 STM32L15x 外设 外设的基本功能和特色 STM32L15x 的最小系统 STM32L15xSTM32F10x 对比
    发表于 09-12 06:21

    STM32RTC晶振不起振的可能原因?

    大家好,我是EE小ai。看到一篇10年前的关于STM32晶振的文章,与大家共享。 STM32RTC晶振经常出现不起振的问题,这已经是“业界共识”了。。。很多人在各种电子论坛上求助类似
    的头像 发表于 08-23 16:47 1686次阅读

    RTC的alarm中断事件能否唤醒standby或者shutdown模式?

    274页中有描述: 文档中是可以用RTC中断事件来唤醒的。但是我在工程中配置好的PWR、RTC,却唤醒不了。只能在stop模式下唤醒。 查阅了RM0490《STM32C0x1 ad
    发表于 08-08 07:22

    新手,求一份stm32f10x标准外设库文件压缩包

    因为我个人注册不了,已经注册好几次了,均为通过,想请问各位大佬帮帮忙,求一份stm32f10x标准外设库文件文件压缩包,谢谢
    发表于 08-07 15:01

    TinyScreen+ RTC外部中断和休眠模式

    电子发烧友网站提供《TinyScreen+ RTC外部中断和休眠模式.zip》资料免费下载
    发表于 06-29 10:00 0次下载
    TinyScreen+ <b class='flag-5'>RTC</b>外部<b class='flag-5'>中断</b>和休眠模式

    STM32RTC简介及使用方式

    STM32H750 的实时时钟是一个独立的 BCD 定时器/计数器,且带了日历功能,它提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。 此外RTC
    的头像 发表于 05-26 16:43 1910次阅读
    <b class='flag-5'>STM32</b>中<b class='flag-5'>RTC</b>简介及使用方式

    RTC alarm组件不进入回调函数的原因是什么?

    芯片类型stm32F407ZGT6,用rt threadstudio进行调试,rtthread 版本用的是4.0.3,studio中seting 设置开启rtc驱动组件和alarm驱动组件
    发表于 05-17 14:14

    如何移植RT-thread官方的系统源码到STM32F10x特定的MCU平台中?

    如何移植RT-thread官方的系统源码到STM32F10x特定的MCU平台中?
    发表于 05-16 10:31

    STM32片内RTC亚秒特性的应用示例(下)

    不过,今天主要想聊聊如何通过RTC来实现该需求。了解STM32RTC的人可能知道,RTC模块往往还自带一个专门的16位向下计数的唤醒定时器,即下面
    的头像 发表于 04-30 16:32 1071次阅读
    <b class='flag-5'>STM32</b>片内<b class='flag-5'>RTC</b>亚秒特性的应用示例(下)

    STM32片内RTC亚秒特性以及应用演示的分享

    绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。
    的头像 发表于 04-15 11:27 1605次阅读
    <b class='flag-5'>STM32</b>片内<b class='flag-5'>RTC</b>亚秒特性以及应用演示的分享