STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳

目录

1、准备材料

2、实验目标

3、实验流程

3.0、前提知识

3.1、CubeMX相关配置

3.1.1、时钟树配置

3.1.2、外设参数配置

3.1.3、外设中断配置

3.2、生成代码

3.2.1、外设初始化调用流程

3.2.2、外设中断调用流程

3.2.3、添加其他必要代码

4、常用函数

5、烧录验证

5.1、具体步骤

5.2、实验现象

6、奇怪的现象

参考资料


1、准备材料

开发板(正点原子stm32f407探索者开发板V2.4)

STM32CubeMX软件(Version 6.10.0)

野火DAP仿真器

keil µVision5 IDE(MDK-Arm)

CH340G Windows系统驱动程序(CH341SER.EXE)

XCOM V2.6串口助手

杜邦线一根

2、实验目标

使用STM32CubeMX软件配置STM32F407开发板RTC实现入侵检测和时间戳功能,具体为周期唤醒回调中使用串口输出当前RTC时间,按键WK_UP存储当前RTC时间到备份寄存器,按键KEY_2从备份寄存器中读取上次存储的时间,按键KEY_1负责产生入侵事件

3、实验流程

3.0、前提知识

STM32F407的RTC上有两个入侵检测模块,但是笔者使用的LQFP144封装的STM32F407ZGT6只有一个入侵检测模块,只有一个入侵检测模块的STM32F407单片机是利用RTC_AF1(PC13)引脚来进行触发的,和按键外部中断类似,如果设置入侵检测触发为低电平触发,那么当PC13为低电平时就会进入Tampere1事件回调函数,当发生入侵事件时,RTC的20个备份寄存器中的值会全部丢失

由于开发板上PC13引脚并没有按键控制,不方便实现其电平的翻转变化操作,因此本实验需要一根杜邦线,将按键KEY_1所使用的PE3引脚与PC13引脚短接,相当于使用按键KEY_1来间接控制PC13的电平变化,如下图所示,当按键KEY_1松开时,此时PE3/PC13状态应该由外部上/下拉决定,而当按键KEY_1按下时,PE3/PC13的状态应该为低电平,通过设置PC13外部上拉,就可以实现KEY_1按键松开时为高电平,按下为低电平

3.1、CubeMX相关配置

请阅读“STM32CubeMX STM32F4 HAL库 实时时钟RTC - 周期唤醒、闹钟A/B事件和备份寄存器”实验3.1.1小节配置RCC和SYS

3.1.1、时钟树配置

系统时钟树配置与上一实验一致,均设置为STM32F407总线能达到的最高时钟频率,配置LSE,RTC时钟频率为32.768kHz,具体如下图所示

3.1.2、外设参数配置

本实验需要需要初始化USART1作为输出信息渠道,具体配置步骤请阅读“STM32CubeMX教程9 USART/UART 异步通信”

单击Pinout & Configuration页面左边Timers/RTC,并在页面中间激活日历,周期唤醒WakeUp采用内部模式,勾选入侵检测1将其输入复用到引脚RTC_AF1(PC13),则此后PC13引脚便作为入侵检测引脚,具体配置如下图所示

与上一小节实验类似,需要配置RTC通用参数、日历日期时间、周期唤醒参数和入侵检测参数

①滤波设置中,如果不滤波则入侵检测的触发方式只能选择边沿触发,而如果选择滤波,则触发方式只能选择电平触发,这里由于使用的机械按键存在抖动,因此对输入滤波

②入侵引脚是否上拉设置中,如上述3.0小节所述,我们需要PE3/PC13外部上拉才能实现目标,因此此处选择上拉

③保存了入侵时间戳就可以在Tampere1事件回调函数中使用HAL_RTCEx_GetTimeStamp获取入侵时间戳

④入侵检测触发方式设置中,由于按键按下为低电平,因此这里选择低电平

3.1.3、外设中断配置

在Pinout & Configuration页面左边System Core/NVIC中勾选入侵检测及周期唤醒中断,然后选择合适的中断优先级即可

3.2、生成代码

请阅读“STM32CubeMX STM32F4 HAL库 工程建立”实验3.4.3小节配置Project Manager

单击页面右上角GENERATE CODE生成工程

3.2.1、外设初始化调用流程

与上一小节RTC初始化函数MX_RTC_Init对比,可以发现本小节的初始化函数中减少了闹钟A/B的初始化,但是新增加了入侵检测的初始化,如下图所示,也即我们在CubeMX中设置的参数,类似的中断相关的初始化设置仍然在HAL_RTC_MspInit函数中

3.2.2、外设中断调用流程

在CubeMX中勾选RTC入侵检测启动中断后,在stm32f4xx_it.c中均会生成对应的中断服务函数TAMP_STAMP_IRQHandler()

在该TAMP_STAMP_IRQHandler()中断服务函数中调用了HAL库HAL_RTCEx_TamperTimeStampIRQHandler()函数统一处理时间戳/入侵事件

最终根据发生的事件来源调用了时间戳事件回调函数HAL_RTCEx_TimeStampEventCallback()、入侵检测1事件回调函数HAL_RTCEx_Tamper1EventCallback()和入侵检测2事件HAL_RTCEx_Tamper2EventCallback()

具体流程如下图所示

3.2.3、添加其他必要代码

由于无入侵检测2,笔者这里只实现了入侵检测1事件回调函数HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc),将其实现在了rtc.c中,另外周期唤醒回调函数内容与上一小结内容一致,这里不再赘述,入侵检测1事件回调函数具体代码如下图所示

源代码如下

/*Tampere1事件回调函数*/
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)
{RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;if(HAL_RTCEx_GetTimeStamp(hrtc, &sTime, &sDate, RTC_FORMAT_BIN) == HAL_OK){char str[24];sprintf(str,"TimeStamp = %2d:%2d:%2d\r\n",sTime.Hours,sTime.Minutes,sTime.Seconds);printf("Tampere1 Event Happend, %s", str);}HAL_GPIO_TogglePin(GREEN_LED_GPIO_Port,GREEN_LED_Pin);
}

经过了上述的过程之后目前还缺少两个操作,利用按键WK_UP存储当前RTC时间到备份寄存器,按键KEY_2从备份寄存器中读取上次存储的时间,其代码实现在了主函数主循环中,简单采用轮询的方式处理按键,如下图所示

源代码如下

/*按下WK_UP按键将当前时间存储到备份寄存器*/
if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET)
{HAL_Delay(50);if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET){RTC_TimeTypeDef sTime;RTC_DateTypeDef sDate;if(HAL_RTC_GetTime(&hrtc, &sTime,  RTC_FORMAT_BIN) == HAL_OK){HAL_RTC_GetDate(&hrtc, &sDate,  RTC_FORMAT_BIN);HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR2, sTime.Hours);HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR3, sTime.Minutes);HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR4, sTime.Seconds);char timeStr[30];sprintf(timeStr,"%2d:%2d:%2d",sTime.Hours,sTime.Minutes,sTime.Seconds);printf("Store %s to the backup register\r\n", timeStr);while(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin));}}
}/*按下KEY2按键将存储到备份寄存器的时间利用串口输出*/
if(HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin) == GPIO_PIN_RESET)
{HAL_Delay(50);if(HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin) == GPIO_PIN_RESET){uint32_t  sHour,sMinute,sSecond;sHour = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);	//HoursMinute = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);	//MinutesSecond = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);	//Secondchar timeStr[30];sprintf(timeStr,"%u:%u:%u",sHour,sMinute,sSecond);printf("Read out %s from the backup register\r\n", timeStr);while(!HAL_GPIO_ReadPin(KEY_2_GPIO_Port,KEY_2_Pin));}
}

4、常用函数

/*时间戳回调函数*/
void HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc)/*Tampere1事件回调函数*/
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)/*Tampere2事件回调函数*/
void HAL_RTCEx_Tamper2EventCallback(RTC_HandleTypeDef *hrtc)/*获取RTC时间戳*/
HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTimeStamp, RTC_DateTypeDef *sTimeStampDate, uint32_t Format)

5、烧录验证

5.1、具体步骤

“RTC Mode and Configuration中启用内部模式的WakeUp周期唤醒 -> 勾选入侵检测Tamper1 Routed to AF1 -> 配置合适的日历通用参数、日历日期时间、周期唤醒参数和入侵检测参数 -> NVIC中勾选RTC周期唤醒中断及RTC入侵检测中断,并选择合适的中断优先级 -> 在生成的工程代码中重新实现周期唤醒回调函数、Tampere1事件回调函数HAL_RTCEx_Tamper1EventCallback -> 添加必要的代码逻辑(具体看上述3.2)”

5.2、实验现象

烧录程序,利用杜邦线短接PE3和PC13,当开发板上电后,会在周期唤醒回调函数中不断地输出当前RTC的时间,另外开发板上的红色LED灯也会不断地闪烁,当按下开发板上的WK_UP按键之后会将当前RTC日历的时间存储到备份寄存器RTC_BKP_DR2~4中,按下开发板上的KEY_2按键可以从备份寄存器中将上次存储的时间读出来

然后当按下按键KEY_1的时候,会发生入侵事件,此时入侵被检测到,会触发Tampere1事件回调函数通过串口输出入侵事件的信息,并且如果再去通过KEY_2按键读取备份寄存器中存储的时间会发现由于入侵的发生,备份寄存器中的值已经被清空

上述整个流程串口输出信息如下图所示

6、奇怪的现象

有时候会出现写备份寄存器写不进去的情况,如果你也遇到了,可以尝试将开发板完全断电(电源线、USB串口和调试器接口),然后重新上电复位再向备份寄存器中写入试试

参考资料

STM32Cube高效开发教程(基础篇)

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

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

相关文章

探索 CodeWave低代码技术的魅力与应用

目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…

新能源汽车冷却系统的水道管口类型有哪些?格雷希尔针对这些管口密封的快速接头有哪些?

对于新能源汽车,不仅电池,还有电机、电控、充电单元部件,都需要处于适宜的工作温度,才能维持整车的正常运行。而这些部件在运行过程中会产生大量的热量,如果不及时散热会对汽车的性能、寿命产生影响,甚至可…

Scrapy爬虫中合理使用time.sleep和Request

概述 在Scrapy爬虫中,我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间,而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响,以及在异步情况下可能…

TTS | NaturalSpeech语音合成论文详解及项目实现【正在更新中】

----------------------------------🔊 语音合成 相关系列直达 🔊 ------------------------------------- ✨NaturalSpeech:正在更新中~ ✨NaturalSpeech2:TTS | NaturalSpeech2语音合成论文详解及项目实现 本文主要是 讲解了Nat…

基于孔雀优化算法的航线规划

MATLAB2020a下正常运行 上传明细-CSDN创作中心

Excel中部分sheet页隐藏并设置访问密码

1、新建sheet1 2、新建sheet2 3、隐藏sheet2 4、保护工作簿、输密码 5、密码二次确认 6、隐藏的sheet2已经查看不了 7、想要查看时,按图示输入原密码即可 8、查看sheet2内容

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

🍎个人博客:个人主页 🏆个人专栏: 软件工程 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 Scrum(敏捷开发框架之一) 详细介绍和解释: 优缺点: 优点: 缺点&…

【MySQL】数据库之高级SQL查询语句补充

目录 一、补充正则表达式的查询regexp 二、补充case的用法 三、补充空值和null值的区别 一、补充正则表达式的查询regexp 要知道 在MySQL中使用正则表达式,一定要在前面加上regexp 正则表达式 ^ 匹配文本的开始字符 ‘^bd’ 匹配以 bd 开头的字符串 …

开关电源输入输出电压测试方法:如何用开关电源智能测试系统测试输入输出电压?

一、用万用表测量输入输出电压 1. 连接万用表到电路中 2. 将万用表调到直流电压挡,连接红表笔到开关电源正极,连接黑表笔到开关电源负极。 3. 打开电源,读取万用表显示的电压值。 二、用示波器测量输入输出电压 1. 连接示波器到电路中 2. 将示…

网络安全—PKI公钥基础设施

文章目录 前提知识散列函数非对称加密数字签名 PKI受信任的人RA注册CA颁发IKE数字签名认证(交换证书)密钥管理 前提知识 散列函数 散列也可以叫哈希函数,MD5、SHA-1、SHA-2、、(不管叫啥,都记得是同一个东西就行&…

图神经网络——图学习

图学习 0. 前言1. 图2. 图学习3. 图神经网络小结 0. 前言 近年来,从社交网络到分子生物学等各个领域,数据的图表示越来越普遍。图神经网络 (Graph Neural Network, GNN) 是专为处理图结构数据而设计的,要充分挖掘图表示的潜力,深…

log4cplus visual c++ 编译及调试小记

简介 最近在调试一款SATA加密设备,发现设备有时加密出来的数据,再解密时与明文对不上,怀疑是通信问题。因此,急需要在测试工具中加入通信日志。由于对第三方日志库都不熟悉,所以随便选了个log4cplus软件集成到现有工具…

Easy Rules规则引擎实战

文章目录 简介pom 规则抽象规则Rule基础规则BasicRule事实类Facts:map条件接口动作接口 四种规则定义方式注解方式RuleBuilder 链式Mvel和Spel表达式Yml配置 常用规则类DefaultRuleSpELRule(Spring的表达式注入) 组合规则UnitRuleGroup 规则引…

009、引用

1. 引用与借用 下面的示例重新定义了一个新的 calculate_length 函数。与之前不同的是,新的函数签名使用了 String 的引用作为参数而没有直接转移值的所有权: fn main() { let s1 String::from("hello"); let len calculate_length(&s1…

Java学习,一文掌握Java之SpringBoot框架学习文集(1)

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

我有实体店,为什么要做小程序

做小程序对于实体店来说有以下几个好处: 拓展线上渠道:随着移动互联网的普及,越来越多的消费者习惯在手机上进行购物和搜索相关信息。通过做小程序,你可以将线下实体店与线上渠道相结合,提供在线购买、预约、查询等功能…

Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…

pycharm中Pyside2/QtDesigner安装和配置

目录 1、安装pyqt5 2、安装pyqt5-tools 3、在pycharm中配置Qt Designer PyQt5/QtDesigner安装和配置 1、安装pyqt5 pip install pyqt5 安装了 pyqt5 之后,在 python 安装目录下面的 Scripts 文件夹中,有一个 pyuic5.exe 文件,这个可执行文…

大数据概念:数据网格和DataOps

数据网格(Data Mesh) 一种新型的数据架构模式,旨在解决传统数据架构中存在的一些问题,例如数据孤岛、数据冗余、数据安全等。数据网格将数据作为一种服务,通过在分布式环境中提供数据服务,实现数据的共享和…

c++ 静态联编+动态联编 (多态)

静态多态 动态多态 1)静态多态和动态多态的区别就是函数地址是早绑定(静态联编)还是晚绑定(动态联编)。 如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(编译时多态),就是说地址是早绑定…