基于STM32CubeMX和keil采用RTC时钟周期唤醒和闹钟实现LED与BEEP周期开关

文章目录

  • 前言
  • 1. RTC概念
    • 1.1 RTC的时钟信号源
    • 1.2 预分频器
    • 1.3 实时时钟与日历数据
    • 1.4 周期性自动唤醒
    • 1.5 可编程闹钟
  • 2. RTC相关中断
  • 3. STM32CubeMX配置
    • 3.1 时钟配置
    • 3.2 引脚配置
    • 3.3 RTC配置
      • 3.3.1 模式选择
      • 3.3.2 RTC基本参数配置
      • 3.3 中断配置
  • 4. 代码编写
  • 总结

前言

RTC的功能有很多,这里主要介绍RTC的周期唤醒和闹钟功能。
本篇博客先阐述RTC的概念以及周期唤醒和闹钟的原理,并对STM32CubeMX的配置参数进行阐述,最后结合LED与BEEP进行效果演示。

最终效果:
每分钟的第5秒翻转LED0状态.
每分钟的第30秒翻转BEEP的状态。
每秒翻转LED1状态。


1. RTC概念

RTC(Real-Time Clock),实时时钟。它是由时钟信号驱动的日历时钟,提供日期和时间数据。在STM32F407ZET6里面,有一个RTC,由普中的开发板后面的电源VBAT供电,这个的好处在于它可以提供不间断的日期时间数据。不像我们写程序配置的时间,一般我们关闭了开发板的电源就丢失了。这个RTC其实在我使用中觉得最有用的大概就是使用ssh连接linux系统的时候,往里面传文件,可以看到文件的修改日期。如果没有这个RTC,传输进嵌入式系统的文件的修改日期大概率就是系统最初始的时间,比如1970-1-1。
RTC有两个可编程的闹钟,库函数中就是AlarmA和AlarmB。可以设定任意组合和重复性闹钟:有一个周期唤醒单元,可以作为一个普通定时器使用;还具有时间戳和入侵检测功能。这篇博客就写的是前半部分,后面会再写一篇后续的功能。

1.1 RTC的时钟信号源

我们RTC的时钟是哪里来的?打开看STM32CubeMX看一下时钟配置就知道了
在这里插入图片描述

通过上图可以看到RTC的时钟来源有三个:
LSI:MCU内部的32kHz时钟信号。
LSE:MCU外接的32.768kHz时钟信号。
HSE_RTC:MCU外接的高速晶振HSE经过2到31分频后的时钟信号。
在实际的时钟源选择上,我们一般选择LSE。因为外接的32.768kHz的时钟,经过多次二分频后就可以得到精确的1Hz的时钟信号,转成时间就是1s一个周期。

STM32CubeMx只给出RTC的时钟来源,RTC的具体框图如下。
在这里插入图片描述


1.2 预分频器

要想实现输出不同频率的时钟,就取决于预分频器的系数。对于给定的初始RTC时钟源信号,只有经过预分频器的分频,才可以在指定引脚输出我们想要的频率的时钟。

在上图中,以32.768kHz的LSE时钟源为例,RTC的时钟源经过精密校准后,通过异步分频器128分频,得到ck_apre为256Hz。256Hz的时钟信号经过同步分频256分频,得到1Hz的ck_spre信号。

ck_apre和ck_spre经过一个选择器后,可以选择其中一个时钟信号作为RTC_CALIB时钟信号,这个时钟信号经过输出控制选择,可以输出到复用引脚RTC_AF1,也就是可以向外部提供一个256Hz(异步分频)或1Hz(异步+同步分频)的时钟信号。


1.3 实时时钟与日历数据

上图RTC的总框图中有两个暗部的影子寄存器
RTC_SSR:亚秒计数器
RTC_TR:时间计数器
RTC_DR:日期计数器

系统每隔两个RTCCLK周期就讲当前的日历值复制到影子寄存器中。当程序读取日期时间数据时,读取的是影子寄存器的内容,而不会影响日历计数器的工作。
本质上我认为影子寄存器就是用来做一个数据备份,主要备份的就是亚秒,时间,日期。


1.4 周期性自动唤醒

我在写定时器TIM的相关博客的时候写到过一个自动重装载值。比如我将该值设定为10,那么计数器到10就触发一次事件,同时计数器从0开始计数。这个周期自动唤醒的功能也类似。

RTC内有一个16位自动重载递减计数器,可以产生周期性的唤醒中断,16位寄存器RTC_WURT存储用于设置定时周期的自动重载值。周期唤醒定时器的输入时钟有两个来源:

1.同步预分频器输出的clk_spre时钟信号,通常是1Hz
2.RTCCLK经过2、4、8、16分频后的时钟信号(结合一下RTC的原理框图)

一般可以在周期性唤醒中断里读取RTC当前时间。例如,设置周期唤醒时钟源为1Hz的ck_spre信号,并且每秒中断一次。唤醒中断产生时间信号WUTF,这个信号可以配置到复用引脚RTC_AF1。


1.5 可编程闹钟

在STM32F407ZET6中有两个可编程闹钟,闹钟A,闹钟B。
闹钟的时间和重复方式可以自定义,后面STM32CubeMX配置的时候阐述。闹钟触发的时候闹钟A,B分别产生事件信号ALRAF和ALRBF。这两个信号和周期唤醒事件WUTF一起经过一个选择器,可以选择一个信号作为输出信号RTC_ALARM,再通过输出控制可以输出到复用引脚RTC_AF1。
在这里插入图片描述


2. RTC相关中断

我这里只介绍用到的时钟周期唤醒以及闹钟对应的中断名称和ISR。

中断号中断名称说明ISR
3RTC_WKUP连接到EXTI 22线的RTC唤醒中断RTC_WKUP_IRQHandler()
41RTC_Alarm连接到EXTI 17线的RTC闹钟(A和B)中断RTC_Alarm_IRQHandler()

两个中断可以触发的中断事件以及对应的回调函数如下表。

中断名称中断事件源中断事件类型输出或输引脚回调函数
RTC_Alarm闹钟ARTC_IT_ALRARTC_AF1HAL_RTC_AlarmAEventCallback()
RTC_Alarm闹钟BRTC_IT_ALRBRTC_AF1HAL_RTCEx_AlarmBEventCallback()
RTC_WKUP周期唤醒RTC_IT_WUTRTC_AF1HAL_RTCEx_WakeUpTimerEventCallback()

对于STM32F407ZET6,复用引脚RTC_AF1是引脚PC13,RTC_AF2是引脚PI8。但是只有178个引脚的MCU才有PI8,所以普中这款STM32F407开发板上面是没有RTC_AF2只有RTC_AF1。

写到这里,其实我们大概已经知道怎么做了。对于最终效果:
每分钟的第5秒翻转LED状态.
每分钟的第30秒翻转BEEP的状态。
每秒翻转LED1状态。
我们只需要在调用中断函数的时候翻转一下电平就可以了。
现在的问题是什么时候调用中断,怎么判定设置闹钟以及周期唤醒。

下面我们用STM32CubeMX来详细阐述一下。


3. STM32CubeMX配置

3.1 时钟配置

刚才讲到RTC的1Hz的分频,最好选择的是时钟源是外部的低速晶振。
在这里插入图片描述
在这里插入图片描述

3.2 引脚配置

LED和蜂鸣器配置
在这里插入图片描述

在这里插入图片描述

RTC时钟输出引脚
在这里插入图片描述

在这里插入图片描述

3.3 RTC配置

这里我们不涉及到时间戳等RTC其他功能,只考虑我们用到的周期唤醒和闹钟。

3.3.1 模式选择

在这里插入图片描述

对于Timers模块,我们需要启用时钟源以及日历。

AlarmA和AlarmB都有三个选项。
在这里插入图片描述

Disable:禁用
Internal Alarm:内部闹钟功能
Routed to AF1:闹钟事件信号输出到复用引脚RTC_AF1。

WakeUp也有三个选项。
在这里插入图片描述

Disable:禁用
Internal WakeUp:内部唤醒功能
Routed to AF1:闹钟事件信号输出到复用引脚RTC_AF1。

这里注意,Routed to AF1这个选项,有且只能有一个支持配置。也就是说AlarmA ,AalarmB,WakeUp三种唤醒方式只能支持一种配置到AF1。一旦AF1被占用了,那么其他的唤醒方式不能配置输出到AF1。


3.3.2 RTC基本参数配置

在这里插入图片描述

General
Hour Format: 小时格式,可选12h制或者24小时制。
Asynchronous Predivider value:异步分频器值。设置值为0~127,对应分频系数1-128。当RTCCLK为32.768kHz时,128分频后就是256Hz。
Synchronous Predivider value:同步预分频器。设置值为0~32767,对应分频系数为1-32768。256Hz分频后就是1Hz。
Output Polarity:输出极性。闹钟A,B以及周期唤醒中断事件信号有效时的输出极性,可设置为高电平或低电平。
Output Polarity:输出类型。复用引脚RTC_AF1的输出类型,可选开漏输出或者推挽输出。

Calendar Time
Data Format:数据格式。可选择二进制格式或者BCD格式。
Hours:初始化时间数据的时。
Minutes:初始化时间数据的分。
Seconds:初始化时间数据的秒。
Day Light Saving: value of hour adjustment:夏令时设置。这里设置为不使用夏令时。啥叫夏令时?
Store Operation:存储操作。表示是否已经对夏令时设置做修改。设置为Reset表示未修改夏令时。Set则表示已修改。

Calendar Date
这个分组主要设置的是初始化的日期。
Week Day:周几
Month:几月
Date:几日
Year:几年


唤醒方式设置。
在这里插入图片描述

因为AlarmB和AlarmA的设置是一样的,我这里方便截图,就直接用AlarmB做解释了。

AlarmA/B
Hours:时 0-23
Minutes:分 0-59
Seconds:秒 0-59
Sub Seconds:亚秒 0-59
Alarm Mask Date Week day:屏蔽日期。设置为Enable表示屏蔽,即闹钟与日期无关。反之有关
Alarm Mask Hours:屏蔽小时。Enable表示闹钟与小时数据无,反之有关。
Alarm Mask Minutes:屏蔽分钟。Enable表示闹钟与分钟数据无,反之有关。
Alarm Mask Seconds:屏蔽秒。Enable表示闹钟与秒数据无,反之有关。
Alarm Sub Second Mask:屏蔽亚秒。Enable表示闹钟与亚秒数据无,反之有关。
Alarm Date Week Day Sel:日期形式。有Date和Weekday两种选项。选项Date表示用1-31表示日期。选择后者则表示用Monday到Sunday表示星期几
Alarm Date:日期。1-31或Monday-Sunday。

这里屏蔽日期什么含义,具体来说就是,我正常设置一个闹钟是哪一天哪一时哪一分哪一秒,如果屏蔽了日期,那也就是说我每天的固定时分秒都会响闹钟。屏蔽日期与小时,则说明,每小时的第几分钟第几秒都会响闹钟。以此类推。

Wake UP
Wake Up Clock:周期唤醒的时钟源。
Wake Up Counter:唤醒计数器的重载值。设定范围为0-65535。这个就是计数器到达设定值就触发中断,接着重新计数。如果这个值设置为0,则每个时钟周期中断一次。这里WakeUpClock设置为1Hz,WakeUpCounter设置为0,则表示每秒触发一次中断。

这里WakeUpClock的值是通过分频来获得的。
在这里插入图片描述

3.3 中断配置

这里中断这样设置,表明周期唤醒的优先级高于闹钟的中断。
这里主

在这里插入图片描述


4. 代码编写

实现我们想要的电平翻转其实就只需要对3个回调函数做一下处理就行。
每次来一个中断就翻转一下电平

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
}
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin);
}	
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
}

总结

这里WakeUp的输出到RTF_AF1的电平是高电平,可以用示波器抓一下看看。我这通过杜邦线引出来看LED,只能看到微弱的闪烁。
这篇博客主要是RTC的一些基本概念以及简单运用,和TIM定时器相似,不过多了很多东西。要对比学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/194266.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真心建议看看这个盈亏平衡点计算方法及要点解析!

说实话,进行产品动态盈亏平衡计算是非常考验人的,因为不是人人都具备评估不同产品组合的盈利能力和掌握风险的方法。 当然最简单的方式就是套用诸如单产品动态盈亏平衡表之类的现成模板进行测算,可以实现以下三点基本需求: 弹性输…

【预处理详解】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏函数的对比 7. #和## 7.1 #运算符 7.2 ## 运算符 8. 命名约定 …

22. 深度学习 - 自动求导

Hi,你好。我是茶桁。 咱们接着上节课内容继续讲,我们上节课已经了解了拓朴排序的原理,并且简单的模拟实现了。我们这节课就来开始将其中的内容变成具体的计算过程。 linear, sigmoid和loss这三个函数的值具体该如何计算呢? 我们…

『亚马逊云科技产品测评』活动征文|借助AWS EC2搭建服务器群组运维系统Zabbix+spug

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 本文基于以下软硬件工具: aws ec2 frp-0.52.3 zabbix 6…

复旦EMBA美东国际课程走进哈佛、耶鲁、麻省理工、哥大等顶尖名校

2023夏末秋初,复旦大学EMBA“问道东西”国际课程重新起航,同学们来到美国东海岸,走进顶级名校,开启学习与交流。    同学感悟      此次美东国际课程,整个设计非常合理。哈佛大学,麻省理工以及哥伦…

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有: 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…

Prometheus+Grafana监控

Prometheus是一种开源监控系统,可用于收集指标和统计数据,并提供强大的查询语言,以便分析和可视化这些数据。它被广泛用于云原生和容器化环境中,可以嵌入到Kubernetes集群中,并与其他Kubernetes工具进行集成。 Grafan…

优卡特脸爱云一脸通智慧管理平台权限绕过漏洞复现(CVE-2023-6099)

0x01 产品简介 脸爱云一脸通智慧管理平台是一套功能强大,运行稳定,操作简单方便,用户界面美观,轻松统计数据的一脸通系统。无需安装,只需在后台配置即可在浏览器登录。 功能包括:系统管理中心、人员信息管理…

单片机课程设计——基于C51电子密码锁(源代码)

本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。我们这里实现的是硬件仿真,关于软件仿真可以参考其他人的文章。 单片机课程设计--基于C51电子密码锁 效果展示 我们先来看效果展示,公主王子请看视频: 课…

jbase打印完善

上一篇实现了粗略的打印元素绘制协议,并且写了打印示例和导出示例,趁着空隙时间完善一下打印。 首先元素构造函数默认初始化每个字段值 package LIS.Core.Dto;/*** 打印约定元素*/ public class PrintElement {/*** 元素类型*/public String PrintType…

凸包的学习之路

5.算法策略5:Graham Scan Algorithm 算法思路: 给定二维点集,求其凸包 1)presorting: (1)先找到 ltl点 ,也就是y值最小的点,若是存在y值相等的点,再取x值…

WSA子系统(一)

WSA子系统安装教程 Windows Subsystem for Android (WSA) 是微软推出的一项功能,它允许用户在 Windows 11 上运行 Android 应用程序。通过在 Windows 11 上引入 WSA,用户可以在其 PC 上轻松运行 Android 应用程序,从而扩展了用户的应用程序选…