STM32RTC秒中断--基于HAL库(一文看懂如何配置并使用)


前言

相关说明:

开发板:CT117E-M4(STM32G431RB 蓝桥杯嵌入式比赛板)
开发环境: CubeMX+Keil5


CubeMX配置:

一、CubeMX配置(RTC相关)

1.使能RTC:

三个步骤(对应图中2、3、4):
a.使能RTC时钟源
b.使能日历(使能日历才能用闹钟)。
c.使能闹钟

在这里插入图片描述

2.进制配置:

有两个选项,Hourformat24对应24进制,Hourformat12对应12进制。
在这里插入图片描述

3.初始时间配置:

DataFormat选项分别为BIN(时间为10进制)BCD(时间为16进制)
Hours为初始时间的小时
Minutes为初始时间的分钟
Seconds为初始时间的秒数
在这里插入图片描述
时间进制不同体现在代码里面的区别如下,选择了16进制后续也可以使用10进制数来配置时间或闹钟,因为配置时可以重新选择时间进制
在这里插入图片描述在这里插入图片描述

4.日期配置:

配置秒中断可以不用关心日期的配置,初始值即可。
在这里插入图片描述

5.闹钟配置:

分为两步:
1.初始时直接将闹钟时间配置为初始时间(23:55:55)的下一秒(23:55:56)。
2.使能闹钟触发忽略日期忽略小时忽略分钟,但不忽略秒。这样每次中断发生只是根据秒数决定。在这里插入图片描述

二、代码

三个函数
1.GET_Time()
2.SET_Alarm()
3.HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)

1.获取时间

获取时间时需注意,只调用HAL_RTC_GetTime()的话会出现闹钟不会继续走的问题(希望懂的大佬可以解释下原理,十分感激),因此需要在调用HAL_RTC_GetTime()后再调用HAL_RTC_GetDate(),即使用不到它。

RTC_TimeTypeDef Now_Time;//定义时间结构体
RTC_DateTypeDef Now_Date;//定义日期结构体

void GET_Time()//获取当前时间
{
	HAL_RTC_GetTime(&hrtc,&Now_Time,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&Now_Date,RTC_FORMAT_BIN);
}

2.设置闹钟

首先将生成代码里面的闹钟结构体定义copy一下,定义为全局变量,再将生成的那句删除(用MX重新配置其他东西的时候,注意再次删除生成的代码!!!),定义为全局变量目的是用到上面配置好的闹钟(忽略日期,忽略小时……)。
在这里插入图片描述
然后在函数里面,将当前时间的秒数+1后的值赋值给闹钟结构体的秒数!(函数中的第一行代码);然后判断是否为60,为60则重新赋值0!;然后调用函数HAL_RTC_SetAlarm_IT()重新配置闹钟即可!

void SET_Alarm()
{
	sAlarm.AlarmTime.Seconds = Now_Time.Seconds+1;
	if(sAlarm.AlarmTime.Seconds==60)sAlarm.AlarmTime.Seconds=0;
    HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}

3.闹钟中断函数

在到达原先配置好的中断时间后(23:55:56),会进入闹钟中断函数,在中断函数里做两件事:
1.获取当前时间GET_Time()。
2.设置下一秒钟的中断SET_Alarm()。
这样每次发生中断时都将重新配置闹钟,并在下一秒时再次发生中断,如此反复,即可达到秒中断的效果,再根据自己的需求在中断函数中添加代码(LCD更新时间,串口打印时间)。

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	GET_Time();
	printf("%02d:%02d:%02d\n",Now_Time.Hours,Now_Time.Minutes,Now_Time.Seconds);//这句代码只是测试
	SET_Alarm();
}

拓展(蓝桥杯第九届省赛真题):
根据EEPROM中存储的时间来配置闹钟分为三步
1.读取在EEPROM中存储的时间,保存在时间结构体中
2.调用Set_Time函数设置当前时间
3.配置下一秒的闹钟

三、实验结果

在这里插入图片描述


总结

以上就是全部内容,如有错误请批评指正。

  • 22
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
配置STM32H7的RTC有两种方法,一种是使用HAL库,另一种是直接使用寄存器编程。在这里,我将介绍如何使用HAL库配置RTC。 1. 首先,在CubeMX中启用RTC并生成代码。 2. 在main.c文件中,找到以下函数: ```c void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) ``` 在这个函数中,你需要初始化RTC时钟,启用RTC和备份域访问。在这里,我们使用LSE作为RTC时钟源。示例代码如下: ```c void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /*##-1- Enables the PWR Clock and Enables access to the backup domain ###################################*/ /* To change the source clock of the RTC feature (LSE, LSI), You have to: - Enable the power clock using __HAL_RCC_PWR_CLK_ENABLE() - Enable write access using HAL_PWR_EnableBkUpAccess() function before to configure the RTC clock source (to be done once after reset). - Reset the Back up Domain using __HAL_RCC_BACKUPRESET_FORCE() and __HAL_RCC_BACKUPRESET_RELEASE(). - Configure the needed RTC clock source */ __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); /*##-2- Configue LSE as RTC clock soucre ###################################*/ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /*##-3- Configure the RTC clock source ###################################*/ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /*##-4- Enable RTC peripheral Clocks #######################################*/ /* Enable RTC Clock */ __HAL_RCC_RTC_ENABLE(); /*##-5- Configure the NVIC for RTC TimeStamp ########################################*/ HAL_NVIC_SetPriority(TAMP_STAMP_IRQn, 0x0F, 0); HAL_NVIC_EnableIRQ(TAMP_STAMP_IRQn); } ``` 3. 在RTC初始化之前,你需要配置RTC的时钟和日期。这可以通过以下代码实现: ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* Configure the RTC time */ sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /* Configure the RTC date */ sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 0; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } ``` 4. 最后,你需要启用RTC中断。这可以通过以下代码实现: ```c /* Enable the RTC global Interrupt */ HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0); HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); ``` 5. 现在你已经完成了RTC配置。你可以使用HAL库函数来读取和写入当前时间和日期,例如: ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); /* Display time Format : hh:mm:ss */ printf("Time: %02d:%02d:%02d\r\n", sTime.Hours, sTime.Minutes, sTime.Seconds); /* Display date Format : dd-mm-yy */ printf("Date: %02d-%02d-%02d\r\n", sDate.Date, sDate.Month, 2000 + sDate.Year); ``` 希望这可以帮助你配置STM32H7的RTC

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AゞOctopus๊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值