细说STM32F407单片机RTC入侵检测和时间戳的原理及使用方法

目录

一、入侵检测的功能

二、示例功能

三、项目设置

1、晶振、DEBUG、CodeGenerator、USART6、KEYLED

2、RTC

(1)设置RTC的模式。

(2)General、Time、Date\Wake Up分组

(3)Tamper分组

1)Filter,滤波

2)Sampling Frequency,输入引脚RTC_AF1的采样频率

3)Precharge Duration,预充电时间

4)Tamper Pull Up,是否对输入引脚使用内部上拉

5)Time Stamp On Tamper Detection,是否保存时间戳

6)Tamper 1 Trigger,有效触发事件类型

3、NVIC

4、GPIO

四、软件设计

1、keyled.c、keyled.h

2、main.h

3、main.c

五、运行调试


        本文将通过示例介绍 STM32单片机RTC时钟单元的的入侵检测和时间戳的原理及使用方法。本文将继续使用旺宝红龙开发板STM32F407ZGT6 KIT V1.0。本实例将引用本文作者写的其他文章作为参考文献。

        参考文章1:细说STM32F407单片机RTC的基本原理及闹钟和周期唤醒功能的使用方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/145575366

        参考文章2:细说STM32F407单片机RTC的备份寄存器原理及使用方法-CSDN博客  https://wenchm.blog.csdn.net/article/details/145593205

一、入侵检测的功能

        入侵检测和时间戳的HAL驱动程序头文件是stm32f4xx_hal_rtc_ex.h。RTC上有两个入侵检测模块,用Tamper1和Tamper2表示。当发生入侵事件时,如果开启了时间戳功能,就会记录时间戳数据,所以入侵检测通常是和时间戳一起使用的

        常用的入侵检测和时间戳HAL函数如下表所示,其他函数见文件stm32f4xx_hal_rtc_ex.h中的定义。入侵检测和时间戳共用一个中断号,3个中断事件对应表中的3个回调函数

函数名

功能

__HAL_RTC_TAMPER1_DISABLE()

禁用Tamper1

__HAL_RTC_TAMPER1_ENABLE()

启用Tamper1

__HAL_RTC_TAMPER2_DISABLE()

禁用Tamper2

__HAL_RTC_TAMPER2_ENABLE()

启用Tamper2

__HAL_RTC_TIMESTAMP_DISABLE()

禁用时间戳外设

__HAL_RTC_TIMESTAMP_ENABLE()

启用时间戳外设

__HAL_RTC_TIMESTAMP_DISABLE_IT()

禁止时间戳事件产生硬件中断,时间戳中断事件类型是RTC_IT_TS

__HAL_RTC_TIMESTAMP_ENABLE_IT()

允许时间戳事件产生硬件中断,时间戳中断事件类型是RTC_IT_TS

HAL_RTCEx_GetTimeStamp()

读取时间戳的数据

HAL_RTCEx_Tamper1EventCallback()

Tamper1的中断事件回调函数

HAL_RTCEx_Tamper2EventCallback()

Tamper2的中断事件回调函数

HAL_RTCEx_TimeStampEventCallback()

时间戳中断事件回调函数

        发生入侵事件时,RTC的20个备份寄存器的内容会被清零,时间戳寄存器保存发生入侵事件时的时间。用函数HAL_RTCEx_GetTimeStamp()可以读取出保存的时间戳数据,其函数原型如下:

HAL_StatusTypeDef HAL_RTCEx_GetTimeStamp(RTC_HandleTypeDef *hrtc,RTC_TimeTypeDef*TimeStamp,RTC_DateTypeDef *sTimeStampDate,uint32_t Format);

        其中,参数sTimeStamp返回时间数据的指针,sTimeStampDate返回日期数据的指针,Format省定二进制或BCD码格式。

二、示例功能

        将复用引脚RTC_AF1(即引脚PC13)作为Tamper1输入引脚,在输入引脚发生边沿事件(无滤波时是边沿事件)或所需电平(有输入滤波时是电平检测)时,触发入侵事件中断,并自动将RTC的20个备份寄存器复位,自动记录入侵事件发生时刻的时间戳数据。

        使用开发板上的按键制造入侵事件,用杜邦线连接引PC13和PF6。PC13是RTC的复用引脚RTC_AF1,PF6是KeyRight按键接入MCU的引脚。设置PC13内部上拉,KeyRight按下后是低电平,入侵检测设置为低电平有效,那么按建KeyRight按下后就会产生入侵事件。在实际调试中,要注意按建抖动的影响。

        本文示例用于测试入侵检测功能。

  • 采用1s周期的唤醒中断,在唤醒中断里读取RTC时间后显示。
  • 可将RTC当前时间保存到备份寄存器。
  • 可以读取备份寄存器中保存的时间数据并显示。
  • 按下KeyRight键时产生入侵事件,看备份寄存器内容是否被复位。
  • 菜单设计:
//菜单设计
[S2]KeyUp   = Save time to BKUP       //LED2 ON.
[S3]KeyDown = Read BKUP registers     //LED3 ON.
[S5]KeyRight= Trigger tamper event    //LED1 Flashing.

三、项目设置

1、晶振、DEBUG、CodeGenerator、USART6、KEYLED

        与参考文章2相同。

2、RTC

(1)设置RTC的模式。

        禁用闹钟A和闹钟B,启用Tamper1,并且使用复用引脚RTC_AF1作为入侵事件输入引脚。启用周期唤醒功能,设置为Internal WakeUp。

(2)General、Time、Date\Wake Up分组

        参数设置和参考项目2的示例相同。

(3)Tamper分组

1)Filter,滤波

        当选择为Disable时,禁用滤波。禁用滤波时,下面的Tamper 1 Trigger参数只能是边沿触发。使用滤波时,Tamper 1 Trigger只能是电平触发。

        如果使用滤波,可选项为Tamper activated after 2 consecutive samples、Tamper activated after 4 consecutive samples和Tamper activated after 8 consecutive samples,即经过2、4或8个连续采样都是所设置的触发电平时,才确认产生入侵事件。带滤波的方式适用于按键抖动时的检测,相当于有一定的消抖作用。

2)Sampling Frequency,输入引脚RTC_AF1的采样频率

        采样频率设置为RCCCLK的分频,分频系数为32768~256,且只能是2N。例如,当RCCCLK是32.768kHz时,分频系数设置为512,则采样频率为64Hz。又将滤波参数设置为连续4个采样信号有效,则需要电平持续时间为4/64s,即62.5ms。这个时间差不多是按键按下或释放时的抖动阶段时间,所以有一定的消除按键抖动影响的作用。

3)Precharge Duration,预充电时间

        可选择为1、2、4或8个RTCCLK周期,这是每次采样之前激活上拉的持续时间。

4)Tamper Pull Up,是否对输入引脚使用内部上拉

        可选Enable或Disable。因为按键输入是低有效,所以需要设置为上拉。

5)Time Stamp On Tamper Detection,是否保存时间戳

        设置在发生入侵事件时是否保存时间戳数据,这里设置为保存,即Time Stamp on Tamper Detection event saved。

6)Tamper 1 Trigger,有效触发事件类型

        当Filter参数设置为Disable时,有效事件为边沿触发,可选项为Rising Edge(上跳沿)和Falling Edge(下跳沿)。当Filter参数设置为Enable时,使用滤波,有效事件为电平触发,可选项为Low Level(低电平)和High Level(高电平)。本示例使用了滤波,且按键按下时输入是低电平,所以选择Low Level。

3、NVIC

        启用RTC入侵检测和时间戳中断,启用RTC周期唤醒中断。在NVIC组件中将这两个中断的抢占优先级都设置为1。将这两个中断的抢占优先级设置为相同的,是为了避免它们之间发生抢占,导致串口显示出现混乱。 

4、GPIO

        本示例要用到3个按键,将与KeyRight连接的GPIO引脚PF6复位成原始状态,其他按键和LED的GPIO设置与参考文章2相同。

四、软件设计

1、keyled.c、keyled.h

         与参考文章2相同。

2、main.h

/* USER CODE BEGIN Private defines */
void RTC_SaveToBKUP();
void RTC_ReadBKUP();
/* USER CODE END Private defines */

3、main.c

/* USER CODE BEGIN Includes */
#include "keyled.h"
#include <stdio.h>
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
uint8_t RTC_isReading=0;
/* USER CODE END PV */
 /* USER CODE BEGIN 2 */__HAL_RTC_WAKEUPTIMER_DISABLE(&hrtc);	//禁止RTC周期唤醒printf("Demo11_3_RTC_Tamper:RTC tamper and timestamp.\r\n");printf("Please connect PF6 and PC13 by line.\r\n");printf("KeyRight simulate tamper event.\r\n\r\n");/* USER CODE END 2 */
 /* Infinite loop *//* USER CODE BEGIN WHILE *///菜单设计printf("[S2]KeyUp   = Save time to BKUP,LED2 ON.\r\n");printf("[S3]KeyDown = Read BKUP registers,LED3 ON.\r\n");printf("[S5]KeyRight= Trigger tamper event,LED1 Flashing.\r\n\r\n");__HAL_RTC_WAKEUPTIMER_ENABLE(&hrtc);	//启用RTC周期唤醒while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */KEYS curKey=ScanPressedKey(KEY_WAIT_ALWAYS);switch(curKey){case KEY_UP:    //[S2]KeyUp   = Save time to BKUPRTC_SaveToBKUP();break;case KEY_DOWN:  //[S3]KeyDown = Read BKUP registersRTC_ReadBKUP();break;default:break;}HAL_Delay(300);	//消除按键后抖动的影响}/* USER CODE END 3 */

        在main()函数里,执行MX_RTC_Init()后立刻执行__HAL_RTC_WAKEUPTIMER_DISABLE(&hrtc)禁止了RTC周期唤醒功能,在进入while循环之前,重新开启了RTC周期唤醒功能。

        while循环里检测按键并执行响应代码。只有KeyUp键和KeyDown键是执行菜单选项,KeyRight用于产生RTC入侵事件。KeyUp键按下时,调用函数RTC_SaveToBKUP(),用于将RTC当前时间写入备份寄存器;KeyDown键按下时,调用函数RTC_ReadBKUP(),用于读取备份寄存器中的数据并在串口助手上显示。这两个按键的功能是测试入侵事件发生后备份寄存器的内容是否被复位。

/* USER CODE BEGIN 4 */
//周期唤醒中断回调函数
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{LED1_Toggle();RTC_isReading=1;if (HAL_RTC_GetTime(hrtc,&sTime,RTC_FORMAT_BIN) == HAL_OK){//调用HAL_RTC_GetTime()之后必须调用HAL_RTC_GetDate()以解锁数据,才能连续更新日期和时间HAL_RTC_GetDate(hrtc,&sDate,RTC_FORMAT_BIN);RTC_isReading=0;//显示时间hh:mm:sschar str[40];sprintf(str,"RTC WakeUp Time = %2d:%2d:%2d",sTime.Hours,sTime.Minutes,sTime.Seconds);printf(" %s\r\n",str);}
}/* 入侵和时间戳事件回调函数 */
void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc)
{printf("Tamper1 is triggered and all BKUP-Regs are cleared.\r\n");RTC_TimeTypeDef time;RTC_DateTypeDef date;if (HAL_RTCEx_GetTimeStamp(hrtc,&time,&date,RTC_FORMAT_BIN) == HAL_OK){//显示时间hh:mm:sschar str[40];sprintf(str,"RTC Tamper1 Time = %2d:%2d:%2d",sTime.Hours,sTime.Minutes,sTime.Seconds);printf(" %s\r\n",str);}
}/* 保存RTC时间到备份寄存器 */
void RTC_SaveToBKUP()
{LED2_ON();while(RTC_isReading)HAL_Delay(1);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);	//转换为字符串,自动添加"\0"printf("Time %s is saved in BKUP.\r\n",timeStr);HAL_Delay(5000);LED2_OFF();
}void RTC_ReadBKUP()
{LED3_ON();uint32_t regValue;char regStr[40];regValue=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);	//Hoursprintf(regStr,"Saved time(Hour) ,BKP_DR2= %lu",regValue);printf(" %s\r\n",regStr);regValue=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);	//Minutesprintf(regStr,"Saved time(Min) , BKP_DR3= %lu",regValue);printf(" %s\r\n",regStr);regValue=HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);	//Secondsprintf(regStr,"Saved time(Sec) , BKP_DR4= %lu",regValue);printf(" %s\r\n",regStr);HAL_Delay(5000);LED3_OFF();
}//串口打印
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart6,(uint8_t*)&ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */

        Tamper1事件中断回调函数的主要功能就是调用函数HAL_RTCEx_GetTimeStamp()读取时间戳数据,然后在串口助手上显示这个时间。程序运行时,按下KeyRight键就会触发入侵事件,并在串口助手上显示相应的的信息。 

五、运行调试

        首次下载或S6键复位后,在串口助手上显示功能菜单。

        正常情况下不按任何键,连续显示中断唤醒RTC时间,1秒1次。当按下S5键,切换显示入侵RTC时间。 然后恢复显示中断唤醒RTC时间。LED1闪烁。

        按S2键,存储当前RTC时间到备份寄存器,LED2亮;按S3键,读取备份寄存器RTC时间,LED3亮。

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

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

相关文章

Python elasticsearch客户端连接常见问题整理

python 访问 elasticsearch 在python语言中&#xff0c;我们一般使用 pip install elasticsearch 软件包&#xff0c;来访问es服务器。 正确用法 本地安装elasticsearch时&#xff0c;应指定与服务端相同的大版本号&#xff1a; pip install elasticsearch7.17.0然后就可以…

讯方·智汇云校华为授权培训机构的介绍

官方授权 华为授权培训服务伙伴&#xff08;Huawei Authorized Learning Partner&#xff0c;简称HALP&#xff09;是获得华为授权&#xff0c;面向公众&#xff08;主要为华为企业业务的伙伴/客户&#xff09;提供与华为产品和技术相关的培训服务&#xff0c;培养华为产业链所…

python的类装饰器

装饰器不仅可以用于函数&#xff0c;还能作用于类。将装饰器应用于类时&#xff0c;其核心原理与作用于函数类似&#xff0c;都是通过接收一个类作为输入&#xff0c;然后返回一个新的类或者修改后的原类&#xff0c;以此来为类添加额外的功能 简单的类装饰器 def add_method…

MySQL数据库的设计原则

前言 首先&#xff0c;数据库设计原则通常包括范式化、性能优化、安全性等方面。但具体到MySQL&#xff0c;可能还有一些特定的最佳实践。例如&#xff0c;存储引擎的选择&#xff08;InnoDB vs MyISAM&#xff09;、索引的使用、事务处理等。 1.范式化的内容。   第一范式是…

【R语言】方差分析

方差分析的基本前提假设与t检验的前提假设类似&#xff0c;包括正态分布假设、观察独立性假设和方差齐性假设。 一、基本术语 在R语言以及更广泛的统计学领域中&#xff0c;方差分析&#xff08;ANOVA&#xff0c;即Analysis of Variance&#xff09;是一种用于比较两个或更多…

权限五张表

重点&#xff1a;权限五张表的设计 核心概念&#xff1a; 在权限管理系统中&#xff0c;经典的设计通常涉及五张表&#xff0c;分别是用户表、角色表、权限表、用户角色表和角色权限表。这五张表的设计可以有效地管理用户的权限&#xff0c;确保系统的安全性和灵活性。 用户&…

高效高并发调度架构

以下是从架构层面为你提供的适合多核CPU、多GPU环境下API客户端、服务端高级调度&#xff0c;以实现高效并发大规模与用户交互的技术栈&#xff1a; 通信协议 gRPC&#xff1a;基于HTTP/2协议&#xff0c;具有高性能、低延迟的特点&#xff0c;支持二进制序列化&#xff08;通…

服务器A到服务器B免密登录

#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…

Deepseek R1模型本地化部署+API接口调用详细教程:释放AI生产力

文章目录 前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装ollama2部署DeepSeek R1模型删除已存在模型&#xff0c;以7b模型为例 三、DeepSeek API接口调用Cline配置 前言 随着最近人工智能 DeepSeek 的爆火&#xff0c;越来越多的技术大佬们开始关注如…

对openharmony HDF驱动框架的C/S设计模式和单例类的说明

在分析openharmony的HDF驱动框架时我们会发现用了很多面向对象的思想&#xff0c;例如类继承、接口、单例类等&#xff0c;本来应该是好事情&#xff0c;**但使用时对象之间的关系交错复杂&#xff0c;不太符合linux内核分层分模块的思路&#xff0c;导致整体理解起来比较困难&…

如何从0开始将vscode源码编译、运行、打包桌面APP

** 网上关于此的内容很少&#xff0c;今天第二次的完整运行了&#xff0c;按照下文的顺序走不会出什么问题。最重要的就是环境的安装&#xff0c;否则极其容易报错&#xff0c;请参考我的依赖版本以及文末附上的vscode官方指南 ** 第一步&#xff1a;克隆 VSCode 源码 首先…

【踩坑】⭐️MyBatis的Mapper接口中不建议使用重载方法

目录 &#x1f378;前言 &#x1f37b;一、背景 &#x1f379;二、问题处理 &#x1f49e;️三、处理方法 &#x1f378;前言 小伙伴们大家好&#xff0c;很久没有水..不是&#xff0c;写文章了&#xff0c;都收到系统的消息了&#xff1b;我算下时间&#xff0c;上周是单休…

harmonyOS的文件的增、删、读、写相关操作(fs/content)

注意: 操作harmonyOS的文件只能对app沙箱内的文件进行操作 牵扯到两个支持点: fs和content这两个API; 具体的操作方法看下图: 创建文件 //js 引入 import fs from "ohos.files.fs" import featureAbility from "ohos.ability.featureAbility"; // 上下…

GC 基础入门

什么是GC&#xff08;Garbage Collection&#xff09;&#xff1f; 内存管理方式通常分为两种&#xff1a; 手动内存管理&#xff08;Manual Memory Management&#xff09;自动内存管理&#xff08;Garbage Collection, GC&#xff09; 手动内存管理 手动内存管理是指开发…

简要分析LeetCode树经典题目(Java)

目录 开场白 实战环节 准备工作 遍历问题 LeetCode144. 二叉树的前序遍历 方法一 方法二 LeetCode94. 二叉树的中序遍历 LeetCode145. 二叉树的后序遍历 方法一 方法二 LeetCode102. 二叉树的层序遍历 LeetCode103. 二叉树的锯齿形层序遍历 LeetCode107. 二叉树的…

深度剖析 NVIDIA Isaac Sim:重塑机器人开发的创新引擎

一、引言 在上一篇文章探索探索 NVIDIA Isaac Sim&#xff1a;解锁机器人开发的无限可能中&#xff0c;我们初步领略了 NVIDIA Isaac Sim 平台为机器人开发带来的无限潜力。随着平台的不断更新迭代&#xff0c;又有许多令人惊喜的新特性和优化&#xff0c;让我们继续深入体验这…

Leetcode 712. Minimum ASCII Delete Sum for Two Strings

Problem Given two strings s1 and s2, return the lowest ASCII sum of deleted characters to make two strings equal. Algorithm Dynamic Programming (DP): similar as Longest Common Subsequence (LCS). If s1[i] ! s2[j]: F ( i , j ) min ⁡ ( F ( i − 1 , j ) …

【Python 学习 / 4】基本数据结构之 字符串 与 集合

文章目录 1. 字符串概念1.1 字符串的创建1.2 字符串的访问和操作1.2.1 下标访问1.2.2 切片操作1.2.3 字符串的拼接和重复1.2.4 字符串的长度 1.3 字符串的方法1.4 字符串的查找和替换1.5 字符串格式化1.5.1 使用 % 运算符1.5.2 使用 str.format()1.5.3 使用 f-string&#xff0…

Spring Boot (maven)分页3.0版本 通用版

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

OpenAI 放王炸,将发布整合多项技术的 GPT-5,并免费无限使用,该模型有哪些技术亮点

对于 ChatGPT 的免费用户&#xff0c;将可以无限制地访问 GPT-5&#xff0c;但仅限于标准的智能级别。该级别会设定滥用限制&#xff0c;以防止不当使用(意思就是你得付费嘛)。 OpenAI CEO Sam Altman 今天在 X 上透露了 GPT-4.5 和 GPT-5 的最新发展计划。 OpenAI 将发布代…