STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例

news2024/11/17 12:58:58

STM32F103VET6基于STM32CubeMX RTC时钟报警中断使用示例


  • 📺STM32CubeMX配置RTC时钟报警中断演示过程:

在这里插入图片描述

  • 📌相关篇《STM32F103VET6基于STM32CubeMX RTC时钟秒更新中断使用示例》
  • 📌《STM32F103VET6基于STM32CubeMX RTC时钟使用示例》
  • 📍相关参考文章《STM32CubeMX | 基于STM32使用HAL库驱动RTC时钟及闹钟功能》

🔰利用报警(闹铃)中断,来设定一个间隔段循环促发事件的功能。也就是相当于一个定时器来使用。

  • 🌼RTC报警中断流程
    在这里插入图片描述

业务代码完善

  1. 🌿需要使用串口打印时间,在usart.c文件中,配置串口printf重映射,并在魔术棒设置选项中,勾选Use Micro LIB,记得在main.c中要包含stdio.h头文件。
  2. 设置报警时间。

此内容为必须项,具体的报警时间可以根据个人需求设置。可以放置在设置RTC初始化函数MX_RTC_Init()中,因为设置时间的时候,同时将报警时间也一同设置进去。

/* USER CODE BEGIN 0 */
extern RTC_AlarmTypeDef alarm;
/* USER CODE END 0 */

RTC_HandleTypeDef hrtc;

/* RTC init function */
void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */
//__HAL_RCC_PWR_CLK_ENABLE();//使能电源时钟 PWR
//HAL_PWR_EnableBkUpAccess();//取消备份区域写保护
  /* USER CODE END RTC_Init 0 */

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef DateToUpdate = {0};

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */

  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
		
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */

  /* USER CODE END Check_RTC_BKUP */

  /** Initialize RTC and set the Time and Date
  */
  sTime.Hours = 0x10;
  sTime.Minutes = 0x20;
  sTime.Seconds = 0x35;

  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  DateToUpdate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  DateToUpdate.Month = RTC_MONTH_DECEMBER;
  DateToUpdate.Date = 0x22;
  DateToUpdate.Year = 0x22;

  if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */
	alarm.Alarm 	= RTC_ALARM_A;   //配置闹钟的时间
	alarm.AlarmTime.Hours = 0x10;
	alarm.AlarmTime.Minutes = 0x20;
	alarm.AlarmTime.Seconds = 0x40;
	HAL_RTC_SetAlarm_IT(&hrtc,&alarm,RTC_FORMAT_BCD);
  /* USER CODE END RTC_Init 2 */

}

间隔5秒钟触发一次报警中断。

  1. 重写报警中断回调函数。

main.c文件中,重写报警回调函数。

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
    rtc_time_t tim = {0};
	// 获取当前时间
    RTC_GetTime(&tim);

    alarm.AlarmTime.Hours = tim.Hours;
    alarm.AlarmTime.Minutes =tim.Minutes;
    alarm.AlarmTime.Seconds = tim.Seconds + 5;  /* 设置下次闹钟提醒时间是当前时间的5s之后 */
    alarm.Alarm = RTC_ALARM_A;
	
	// 再次启动闹钟中断事件
    if (HAL_RTC_SetAlarm_IT(hrtc, &alarm, RTC_FORMAT_BIN) != HAL_OK)
    {
        Error_Handler();
    }
printf("%02d/%02d/%02d %02d:%02d:%02d %d\r\n", tim.Year, tim.Month, tim.Day, tim.Hours, tim.Minutes, tim.Seconds, tim.WeekDay);
	
		HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
    printf("HAL_RTC_AlarmAEventCallback\r\n");
//		printf("%02d:%02d:%02d \r\n",alarm.AlarmTime.Hours,alarm.AlarmTime.Minutes,alarm.AlarmTime.Seconds + 5);
}

  • main主函数代码
#include "stdio.h"
#pragma pack(1)
typedef struct
{
    uint8_t Hours;
    uint8_t Minutes;
    uint8_t Seconds;
    uint8_t WeekDay;
    uint8_t Month;
    uint8_t Day;
    uint8_t Year;
} rtc_time_t;
#pragma pack()

RTC_AlarmTypeDef alarm;


void RTC_GetTime(rtc_time_t* time)
{
    HAL_RTC_GetTime(&hrtc, (RTC_TimeTypeDef *)&time->Hours,   RTC_FORMAT_BIN);
    HAL_RTC_GetDate(&hrtc, (RTC_DateTypeDef *)&time->WeekDay, RTC_FORMAT_BIN);
}
int main(void)
{
  /* USER CODE BEGIN 1 */
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();

  MX_USART1_UART_Init();
	printf("HAL_RTC_Alarm  TEST\r\n");
	  MX_RTC_Init();

  /* USER CODE BEGIN 2 */
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */
}
  • 📜串口打印信息
    在这里插入图片描述

📚程序源码

链接:https://pan.baidu.com/s/1C9V-sV9x9B51Quhsz8dLnw 
提取码:oirm

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

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

相关文章

VUE-router

七.Vue-router 1、什么是vue-router vue-router是vue.js官方路由管理器。vue的单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。 传统页面切换是用超链接a标签进行切换。但vue里是用路由,因为我们用Vue做的都是…

K8s 前世今生与架构组件简析

k8s 前世 k8s 的前世是google 内部的Borg 系统,是一个作业调度平台,调度的对象是一个个进程。 Borg 本身也利用了容器化技术比如 Cgroups, Namespace 实现应用的隔离。 运行在线上的业务主要分为在线业务(prod)和离线业务(non-…

Netty实战与源码剖析(二)——Netty线程模型

1 线程模型基本介绍 不同的线程模式,对于程序的性能有很大的影响,Netty为何具有如此高的性能,很大程度上是得益于Netty采用的线程模型。 目前主流存在的线程模型有两种: 传统阻塞IO模型Reactor模型 然而根据Reactor的数量和处理…

零基础转行程序员,有哪些经验可以借鉴?

随着互联网行业的迅速发展,市场对于程序员的需求增大,越来越多的人开始转行到IT领域,程序员也不再基于计算机科学或软件工程等个别专业的毕业生,其他非计算机相关专业的,像学物理、数学、自动化,甚至英语、…

云原生丨DataX在数据迁移中的应用与实践

文章目录一、前言二、准备工作三、安装工具与数据迁移Demo安装工具与数据迁移三、使用Datax抽取移动云上的gauss数据库四、Datax工具逻辑说明整体框架核心模板介绍流程调度数据库类型插件读、写说明五、Datax工具参数说明SettingReader& writerjdbcUrlusernamepasswordtabl…

数据人PK也无人,为什么业务部门的数据需求都是急活?

**导读:**你是不是经常听到数据开发吐槽业务部门:我可以理解业务部门数据需求多,但为什么经常要得这么急呢? 作为一个数据开发者,可以回想一下,当初是怎么进入数据行业的。 是不是也是听一些大V忽悠&…

Java Swing JSlider:滑块组件

在前面的章节中,我们介绍了 Swing 设计简单界面所需的窗口、布局组件以及如何响应事件。Swing 还提供了很多高级组件,如菜单栏、工具栏、文件选择器、表格以及树等。使用这些高级组件可以实现更为复杂的布局,也可以使程序界面更加人性化&…

颜色分析.

介绍 宽光谱光源对许多光学系统都很重要,应用范围包括白光照明、分光计等。Fred中的颜色图像分析,是通过计算每个像素的色度坐标并在表面上显示生成的RGB值来生成颜色分布。此外,FRED还可以显示彩色色度图,并在用户移动光标时指…

CSS -- CSS选择器精讲(基础选择器,符合选择器,属性选择器,结构伪类选择器,伪选择器)

文章目录1 CSS基础选择器1.1 选择器的分类1.2 标签选择器1.3 类选择器1.4 id选择器1.5 通配符选择器1.6 基础选择器总结2 CSS的复合选择器2.1 什么是复合选择器2.2 后代选择器2.3 子选择器2.4 并集选择器2.5 伪类选择器2.6 链接伪类选择器2.7 :focus 伪类选择器2.8 复合选择器总…

正点原子-Linux嵌入式开发学习-第二期04

第十一讲:BSP工程管理 BSP管理其实就是以前学stm32一样的单独为led写.h和.c,并且文件夹有很多种 使用ubuntu的vscode创建bsp文件 第一步:新建bsp文件夹,在bsp文件夹新建各个外设或者功能的文件夹(一定是在相应的文件夹…

nodejs+vue+elementui鲜花销售商城管理系统410

前台: (1) 用户注册:用户名,密码,确认密码,邮箱,手机号,真实姓名,收货地址 (2) 用户登录:用户名,密码,验证码 登录后在主页显示欢迎信息&am…

2022年保险行业和产品研究报告

第一章 行业概况 保险业是经营风险的特殊行业。保险是以契约形式确立双方经济关系,以缴纳保险费建立起来的保险基金,对保险合同规定范围内的灾害事故所造成的损失,进行经济补偿或给付的一种经济形式。 保险是专门以风险为经营对象、为人们提…

RK3568开发环境搭建

前面我给大家展示了RK3568的开发板,但是并没有对RK3568的芯片资源进行描述,这里简单给大家看下该芯片的资源,具体的请看瑞芯微官网https://www.rock-chips.com/ 对芯片有了写了解之后,下面就开始搭建开发环境,让我们早…

Databend 开源周报 #72

Databend 是一款强大的云数仓。专为弹性和高效设计,自由且开源。 即刻体验云服务:https://app.databend.com。 What’s New 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Features & Improvements Multiple Catalogs …

操作系统:虚拟存储器 练习题(带有答案和解析)

文章目录1.虚拟存储器概述1.1.常规存储管理方式的特征和局部性原理1.2.虚拟存储器的定义和特征1.3.虚拟存储器的实现方法2.请求分页存储管理方式2.1.请求分页中的硬件支持2.2.请求分页中的内存分配3.页面置换算法3.1.最佳置换算法和先进先出置换算法3.2.最近最久未使用和最少使…

Spring事件处理

在实际业务开发中,有时候复杂性的业务之间需要解耦,常用的方法:同步、异步、MQ。但 MQ 重啊,非必要不提升架构复杂度。 针对同步和异步使用方式:1.定时器 2.Spring Event. Spring Event: 观察者…

网站反爬指南:政府网站篇

目录 前言 黑灰产为何盯上政务网站? 如何反爬? 前言 网络爬虫正在成为政务网站们最大的威胁之一。 随着网络安全被提升到国家层面,网站安全管理和防护日趋重要,政务网站既要确保网站信息的及时和准确,又要能应对网络…

15. Spring事务管理

1. Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或**业务层**保障一系列的数据库操作同成功同失败 2. 案例 2.1 需求和分析 需求:实现任意两个账户间转账操作需求微缩:A账户减…

如何使用 SAP OData 服务向 ABAP 服务器上传文件试读版

本教程到目前为止开发的 OData 图书管理服务,可以在 ABAP 系统里对图书数据进行增删改查。 本步骤我们继续介绍如何通过 SAP OData 服务,实现向 ABAP 系统上传文件的需求。我们采取 Postman 进行文件上传。 先看一下通过本文介绍的步骤,实现…

word基础功能应用:带圈字符如此妙法,好玩有趣

很多人把Word当成码字的记事本,其实它的逆天操作,远比你想象得还要强大。比如,Word中的“带圈字符”功能。 01、基本用法 Word中,点击【开始】-【带圈字符】按钮,即可启用“带圈字符”功能。 比如,我们可…