当前位置: 首页 > news >正文

基于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定时器相似,不过多了很多东西。要对比学习。

相关文章:

基于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的功能有…...

Virtual安装centos后,xshell连接centos

1. 网络使用Host-Only模式动态分配IP,点确定后,centos 上运行 system restart network ,使用ifconfig查看新的ip,XShell可以直接连上centos, 但是由于使用的是Host-Only模式,centos不能访问网络&#xff0c…...

Taro.navigateTo 使用URL传参数和目标页面参数获取

文章目录 1. Taro.navigateTo 简介2. 通过 URL 传递参数3. 目标页面参数获取4. 拓展与分析4.1 拓展4.2 URL参数的类型4.3 页面间通信 5. 总结 🎉欢迎来到Java学习路线专栏~Taro.navigateTo 使用URL传参数和目标页面参数获取 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x…...

Unity Meta Quest 一体机开发(七):配置玩家 Hand Grab 功能

文章目录 📕教程说明📕玩家物体配置 Hand Grab Interactor⭐添加 Hand Grab Interactor 物体⭐激活 Hand Grab Visual 和 Hand Grab Glow⭐更新 Best Hover Interactor Group 📕配置可抓取物体(无抓取手势)⭐刚体和碰撞…...

我又开始贩卖焦虑了,机器视觉兄弟们,打工这生意盘不活了?让人逃离北上广深,是毒鸡汤吗?

我想大多数人和我想的一样,不要质疑自己的出身,也不必用一生去改变出身而获得融入感,思想富足这是我们留给自己一生最珍贵的礼物。也许一线城市容不下肉身,二三线城市容不下灵魂。那我回到生我养我的十八线小县城,这不…...

hyperledger fabric2.4测试网络添加组织数量

!!!修改内容比较繁琐,预期未来提供模板修改 修改初始配置文件,初始添加3个组织 organizations文件夹 /cryptogen文件夹下创建文件crypto-config-org3.yaml,内容如下: PeerOrgs:# ---------------------------------------------------------------------------# Org3# ----…...

分库分表

分库,分表,分库分表 “只分库“,“只分表“,“既分库又分表" 何时分库 在面对高并发的情况下,数据库连接成为性能瓶颈。当数据QPS过高导致数据库连接数不足时,考虑分库。在读多写少的场景下&#x…...

uniapp自定义组件

在UniApp中,你可以使用自定义组件来拓展应用程序的功能和界面。自定义组件是由多个Vue组件构成的,可以在应用程序中重复使用。 要创建一个自定义组件,你需要在UniApp项目中的components目录下创建一个新的文件夹,并在该文件夹中创…...

linux gdb调试

安装gdb yum install gdb -y 查看dump文件所在路径: 可通过 cat /proc/sys/kernel/core_pattern命令获取dump目录路径 gdb调试: 可执行文件为 xxx(例如:main),结合其运行时产生的dump文件进行调试 命令&a…...

java17 linux 环境配置

linux版本 :centos 8 1.能联网的情况下: wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 2.mkdir /usr/local/java tar zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/java 3./etc/profile增加: export JAVA_HOME/usr/local/java/jdk-17.…...

Flutter最新稳定版3.16 新特性介绍

Flutter 3.16 默认采用 Material 3 主题,Android 平台预览 Impeller,DevTools 扩展等等 欢迎回到每季度一次的 Flutter 稳定版本发布,这次是 Flutter 3.16。这个版本将 Material 3 设为新的默认主题,为 Android 带来 Impeller 预览…...

nodejs+vue慢性胃炎健康管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于慢性胃炎健康管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了慢性胃炎健康管理系统, 系统首页、个…...

【C++】传递‘类非静态成员函数’用作回调函数

在C语言中,传递函数指针是非常常见的操作。 在C语言中,使用C语言一致的方法传递全局函数指针,或者传递静态函数指针也很常见。 不过如果遇到想传递非静态成员函数时,可以参考以下示例代码。 #ifndef _WORKER_HPP_ #define _WOR…...

vscode 创建 运行c++ 项目

1 扩展 install c 2.1安装 mingw g 下载 MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net win32下载地址 Download x86_64-8.1.0-release-win32-seh-rt_v6-rev0.7z (MinGW-w64 - for 32 and 64 bit Windows) 2.2 把 文件夹 bin 路径 添加到环境…...

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …...

大数据HCIE成神之路之数学(3)——概率论

概率论 1.1 概率论内容介绍1.1.1 概率论介绍1.1.2 实验介绍 1.2 概率论内容实现1.2.1 均值实现1.2.2 方差实现1.2.3 标准差实现1.2.4 协方差实现1.2.5 相关系数1.2.6 二项分布实现1.2.7 泊松分布实现1.2.8 正态分布1.2.9 指数分布1.2.10 中心极限定理的验证 1.1 概率论内容介绍…...

【论文解读】FFHQ-UV:用于3D面部重建的归一化面部UV纹理数据集

【论文解读】FFHQ-UV 论文地址:https://arxiv.org/pdf/2211.13874.pdf 0. 摘要 我们提出了一个大规模的面部UV纹理数据集,其中包含超过50,000张高质量的纹理UV贴图,这些贴图具有均匀的照明、中性的表情和清洁的面部区域,这些都是…...

simple foc 移植odriver foc的 anti-cogging(抗齿槽算法)

文章目录 ESP32 simple foc 移植odriver anti-cogging.1.硬件,在淘宝买的。esp32 simple foc(最新). 下电阻三采样。2. 效果,见视频https://www.bilibili.com/video/BV1xg4y1X7Yr/?vd_source4fd70d693021f289fb2d339c6c0407193.代码添加(生成…...

基于深度学习的恶意软件检测

恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...

环境配置|GitHub——解决Github无法显示图片以及README无法显示图片

一、问题背景 最近在整理之前写过的实验、项目,打算把这些东西写成blog,并把工程文件整理上传到Github上。但在上传README文件的时候,发现github无法显示README中的图片,如下图所示: 在README中该图片路径为&#xff1…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...