基于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.mzph.cn/news/154053.shtml

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

相关文章

Spring Boot中使用AOP统一处理Web请求日志

AOP AOP,也就是 Aspect-oriented Programming,译为面向切面编程,是计算机科学中的一个设计思想,旨在通过切面技术为业务主体增加额外的通知(Advice),从而对声明为“切点”(Pointcut…

1.0 Zookeeper 教程

分类 Zookeeper 教程 ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。 ZooKeeper 的架构通过冗余服务实现高可用性。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&…

最长公共子串 动态规划

#include<iostream> #include<string.h> #include<stdio.h> #include<math.h> using namespace std; int main(){ string s1,s2; cin>>s1>>s2; if(s1.size() > s2.size()) //以短的作为s1 swap(s1,s2); int le…

详细讲解什么是观察者模式

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;当主题对象状态发生变化时&#xff0c;所有依赖于它的观察者都会得到通知并自动更新。 该模…

Git 服务器搭建

目录 1、安装Git 2、创建证书登录 3、初始化Git仓库 4、克隆仓库 上一章节中我们远程仓库使用了 Github&#xff0c;Github 公开的项目是免费的&#xff0c;2019 年开始 Github 私有存储库也可以无限制使用。 当然我们也可以自己搭建一台 Git 服务器作为私有仓库使用。 接…

COCO格式转化为YOLOv8格式

COCO格式转化为YOLOv8格式 目录格式代码 目录格式 yolov8仅支持YOLO格式的标签&#xff0c;COCO的默认标签为JSON格式&#xff0c;所以需要将COCO格式转换为YOLO格式。 如果训练COCO数据集的话一定要按照这个格式&#xff0c;摆放目录images&#xff0c;labels这两个目录名不…

学习c#的第二十三天

目录 C# 委托&#xff08;Delegate&#xff09; 委托概述 使用委托 带有命名方法的委托与匿名方法 示例 如何合并委托&#xff08;多播委托&#xff09; 示例 如何声明、实例化和使用委托 示例 C# 委托&#xff08;Delegate&#xff09; 委托是一种引用类型&#xff…

公网环境固定域名异地远程访问内网BUG管理系统

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

浅谈 JVM GC 收集器--系列(一)

又到一年大促时刻&#xff0c;今天我们一起探讨下JVM垃圾回收的问题&#xff0c;写代码的时候想一想如何减少FullGC问题的出现&#xff0c;因为一旦出现频繁FullGC&#xff0c;短时间内没有太好的解决办法&#xff0c;很有可能重启后服务接着FullGC&#xff0c;导致服务可用率降…

【探索嵌入式虚拟化技术与应用】— 虚拟化技术深入浅出自学系列

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:【探索嵌入式虚拟化技术与应用】&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 一、虚拟技术的发展历史 1.1传统技术的局限性&#xff1a; ​编辑 1.2云计算和万物互联技术的发展机遇&#x…

万宾科技智能井盖传感器,预防城市道路安全

随着城市交通的不断发展和城市化进程的加速推进&#xff0c;城市道路安全问题日益凸显。市政井盖作为城市道路的一部分&#xff0c;承担着重要的交通安全保障职责。然而传统的市政井盖管理方式存在许多不足。针对这些问题政府需要采取适当的措施&#xff0c;补足传统管理方式的…

react原理及合成事件原理

文章目录 react的理解react创建组件的三种写法react的工作原理初始化的渲染流程。页面更新的流程。diffing 算法计算更新视图diff策略 react合成事件原理一、React合成事件的概念二、React合成事件的原理三、React合成事件的优势四、React合成事件的使用方法五、总结 react的理…

小型机加工工厂MES系统选型指南

随着制造业的不断发展&#xff0c;越来越多的企业开始关注生产过程的管理和优化。对于小型机加工工厂来说&#xff0c;选择一款合适的MES系统&#xff08;制造执行系统&#xff09;能够显著提高生产效率、降低成本、优化资源利用&#xff0c;从而在激烈的市场竞争中脱颖而出。 …

HTTP之常见问答

1&#xff1a;HTTP/1.1 如何优化&#xff1f; &#xff1a;尽量避免发送 HTTP 请求&#xff1b;通过缓存技术&#xff0c;使用请求的 Etag 参数来处理判断缓存过期等问题&#xff0c;类似304状态码就是告诉客户端&#xff0c;缓存有效还能继续使用 &#xff1a;在需要发送 HTTP…

创建域名邮箱邮件地址的方法与步骤

如何创建域名邮箱邮件地址?使用Zoho Mail创建域名邮箱邮件地址的步骤简单易懂&#xff0c;操作便捷。从其他邮箱迁移到Zoho Mail的过程也相当顺畅&#xff0c;您可以轻松为所有员工创建具有企业邮箱域名的电子邮件地址。 步骤1&#xff1a;添加并验证您的域名 首先&#xff0c…

rook-ceph部署

rook是云原生存储编排器&#xff0c;本身不提供存储。 下载 git clone --single-branch --branch v1.11.4 https://github.com/rook/rook.git cd rook/deploy/examples 修改镜像地址images.txt operator方式部署rook kubectl apply -f crds.yaml -f common.yaml -f operator…

动态顺序表

目录 一、动态顺序表结构定义 二、动态顺序表初始化 三、动态顺序表打印 四、动态顺序表尾插 五、封装扩容函数 六、动态顺序表头插 七、动态顺序表的尾删 八、动态顺序表的头删 九、动态顺序表任意位置插入 十、动态顺序表任意位置删除 十一、动态顺序表销毁 十二、…

【计算机网络学习之路】网络基础1

文章目录 前言一. 计算机网络发展局域网和广域网 二. 网络协议三. OSI七层模型四. TCP/IP四层&#xff08;五层&#xff09;模型五. 计算机体系结构与网络协议栈六. 协议形式及局域网通信数据包封装与分用 七. 跨网络通信八. MAC地址与网络通信的理解结束语 前言 本系列文章是…

人工智能带来的各方面影响

近年来&#xff0c;人工智能&#xff08;AI&#xff09;技术在各个领域中的应用越来越广泛&#xff0c;已经开始对我们的生活方式、社会和经济结构产生深远的影响。 1.人工智能家庭化。人工智能技术使我们的生活变得更加便利和智能化。在家庭日常中&#xff0c;智能家居、智能…

什么是深度学习

一、深度学习的发展历程 1.1 Turing Testing (图灵测试) 图灵测试是人工智能是否真正能够成功的一个标准&#xff0c;“计算机科学之父”、“人工智能之父”英国数学家图灵在1950年的论文《机器会思考吗》中提出了图灵测试的概念。即把一个人和一台计算机分别放在两个隔离的房…