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

这篇具有很好参考价值的文章主要介绍了STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、准备材料

2、实验目标

3、实验流程

3.0、前提知识

3.1、CubeMX相关配置

3.1.0、工程基本配置

3.1.1、时钟树配置

3.1.2、外设参数配置

3.1.3、外设中断配置

3.2、生成代码

3.2.0、配置Project Manager页面

3.2.1、外设初始化调用流程

3.2.2、外设中断调用流程

3.2.3、添加其他必要代码

4、常用函数

5、烧录验证

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按键松开时为高电平,按下为低电平

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.1、CubeMX相关配置

3.1.0、工程基本配置

打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,具体如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

详细工程建立内容读者可以阅读“STM32CubeMX教程1 工程建立”

3.1.1、时钟树配置

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

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.1.2、外设参数配置

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

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

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

对于参数配置,RTC通用参数、日历时间、日历日期和周期唤醒参数均上一实验类似,这里不再过多解释,下面主要介绍下入侵检测的相关参数

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

 Tamper Pull Up (入侵引脚是否上拉):如上述3.0小节所述,我们需要PE3/PC13外部上拉才能实现目标,因此此处选择上拉

 Time Stamp On Tamper Detection (入侵检测时间戳):保存了入侵时间戳就可以在Tampere1事件回调函数中使用HAL_RTCEx_GetTimeStamp获取入侵时间戳,反之则无法获取

 Tamper 1 Trigger (入侵检测触发方式):由于按键按下为低电平,因此这里选择低电平

其他两个 Sampling Frequency  Precharge Duration 两个参数按照下图设置即可,下图所示为具体参数配置

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.1.3、外设中断配置

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

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.2、生成代码

3.2.0、配置Project Manager页面

单击进入Project Manager页面,在左边Project分栏中修改工程名称、工程目录和工具链,然后在Code Generator中勾选“Gnerate peripheral initialization as a pair of 'c/h' files per peripheral”,最后单击页面右上角GENERATE CODE生成工程,具体如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

详细Project Manager配置内容读者可以阅读“STM32CubeMX教程1 工程建立”实验3.4.3小节

3.2.1、外设初始化调用流程

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

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.2.2、外设中断调用流程

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

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

最终根据发生的事件来源调用了以下几个函数

  1. 时间戳事件回调函数 HAL_RTCEx_TimeStampEventCallback()
  2. 入侵检测1事件回调函数 HAL_RTCEx_Tamper1EventCallback()
  3. 入侵检测2事件回调函数 HAL_RTCEx_Tamper2EventCallback()

具体流程如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

3.2.3、添加其他必要代码

由于无入侵检测2,故只实现了入侵检测1事件回调函数HAL_RTCEx_Tamper1EventCallback(),将其实现在了rtc.c中

另外周期唤醒回调函数内容与上一小结内容一致,这里不再赘述,入侵检测1事件回调函数具体代码如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

源代码如下

/*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从备份寄存器中读取上次存储的时间,其代码实现在了主函数主循环中,简单采用轮询的方式处理按键,如下图所示

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

源代码如下

/*按下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);	//Hour
        sMinute = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);	//Minute
        sSecond = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);	//Second
        char 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、烧录验证

烧录程序,利用杜邦线短接PE3和PC13,当开发板上电后,会在周期唤醒回调函数中不断地输出当前RTC的时间,另外开发板上的红色LED灯也会不断地闪烁

当按下开发板上的WK_UP按键之后会将当前RTC日历的时间存储到备份寄存器RTC_BKP_DR2~4中,按下开发板上的KEY_2按键可以从备份寄存器中将上次存储的时间读出来

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

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

printf要加&吗,STM32CubeMX+STM32F4系列教程,单片机,嵌入式硬件,stm32

6、奇怪的现象

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

参考资料

STM32Cube高效开发教程(基础篇)文章来源地址https://www.toymoban.com/news/detail-772341.html

到了这里,关于STM32CubeMX教程11 RTC 实时时钟 - 入侵检测和时间戳的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32--RTC实时时钟

    Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 。 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量。 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。 GMT : GMT(Greenwich Mean Time), 格林威治平时(也称格林

    2024年02月10日
    浏览(48)
  • STM32——RTC实时时钟

    Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 底层使用秒计数器可以节省硬件设计电路,

    2024年01月23日
    浏览(40)
  • STM32-RTC实时时钟详解

    RTC的本质很简单,就是一个时钟经过精确分频最后得到的一个1Hz的时钟,也可以说是计数器,其他大部分功能都是基于这个计数器设计的数字逻辑。 本文讲的RTC是基于STM32F030来讲的,相比与F1系列的RTC来说,M0的将很多原本需要软件实现的功能硬件化了,使用起来更加便利。

    2024年02月04日
    浏览(44)
  • STM32-实时时钟RTC-2

                                     

    2024年01月20日
    浏览(45)
  • 【STM32学习】实时时钟 —— RTC

    STM32RTC实时时钟实验讲解,从入门到放弃 【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下 关于STM32使用RTC唤醒停止模式的设置 RTC(Real Time Clock):实时时钟,是指可以像时钟一样输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。总之,RTC只是个能靠电

    2024年02月01日
    浏览(46)
  • STM32基础10--实时时钟(RTC)

     目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量  重写周期唤醒回调函数 重写闹钟中断函数         在做51单片机项目时,如果需

    2023年04月11日
    浏览(37)
  • STM32学习笔记(十二)丨RTC实时时钟

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断   

    2024年02月16日
    浏览(47)
  • STM32中的RTC实时时钟和配套闹钟设置

    主要初始化函数,以及设置闹钟函数,闹钟中断函数 RTC.c RTC.h main.c

    2024年04月23日
    浏览(43)
  • stm32-OLED屏+RTC实现简易实时时钟(上篇)

    oled屏选择ssd1306,使用RTC实现简易实时时钟 1、MCU接口选择 SSD1306单片机接口由8个数据引脚和5个控制引脚组成。通过BS[2:0]引脚上的硬件选择可以设置不同的MCU模式    通过控制BS[2:0]引脚可以设置MCU与OLED屏的通信方式。因为我使用的是正点原子的开发板,所以我用了适配的接

    2024年01月17日
    浏览(46)
  • stm32-OLED屏+RTC实现简易实时时钟(下篇)

    一、RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒 后,R

    2024年01月18日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包