学习STM32的RTC实时时钟

STM32的RTC(实时时钟)模块是用于提供精确实时时钟和日历功能的外设。它可以用于保存时间戳、定时器、计时器、警报等应用场景。本文将详细介绍如何学习和使用STM32的RTC模块,并编写代码案例进行实践。

  1. 硬件准备 在开始学习STM32的RTC模块之前,您需要准备一块支持RTC功能的STM32开发板。常见的系列包括STM32F0、STM32F1、STM32F3、STM32F4等。此外,还需要一块能够连接到开发板上的外部时钟晶振,用于提供RTC的时钟源。

  2. RTC模块的配置 首先,我们需要在STM32的CubeMX软件中进行RTC模块的配置。打开该软件后,选择适用于您的开发板的芯片型号。在“Pinout & Configuration”选项卡中,选择“RTC”按钮以启用RTC外设。然后,选择合适的时钟源和频率,并配置相应的引脚和功能(例如备份电源和复位控制)。完成配置后,点击“Generate Code”按钮生成相应的代码框架。

  3. 初始化RTC模块 打开生成的代码框架后,我们需要进行RTC模块的初始化。找到名为“rtc.c”的文件,并在其中找到“MX_RTC_Init()”函数。在函数中,我们可以看到RTC模块的一些基本配置参数,如下所示:

void MX_RTC_Init(void)
{
  /* USER CODE BEGIN RTC_Init 0 */

  /* USER CODE END RTC_Init 0 */

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

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */
  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }
  sTime.Hours = 0x0;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  sDate.WeekDay = RTC_WEEKDAY_MONDAY;
  sDate.Month = RTC_MONTH_JANUARY;
  sDate.Date = 0x1;
  sDate.Year = 0x0;

  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN RTC_Init 2 */

  /* USER CODE END RTC_Init 2 */
}

在这段代码中,我们可以看到一些重要的配置参数,如“HourFormat”(小时制)、“AsynchPrediv”(异步分频系数)和“SynchPrediv”(同步分频系数)。根据需求,您可以根据实际应用场景进行相应的配置。

  1. 设置当前时间 在RTC模块初始化之后,我们可以设置当前时间。找到名为“main.c”的文件,并在其中找到“MX_RTC_Init()”函数之后的代码段。您可以使用以下代码设置当前时间:
/* USER CODE BEGIN 2 */
RTC_TimeTypeDef sTime = {0};
sTime.Hours = 12;
sTime.Minutes = 0;
sTime.Seconds = 0;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE END 2 */

在上述代码中,我们将当前时间设置为12:00:00。您可以根据需要修改参数。

  1. 读取当前时间 为了读取当前设置的时间,您可以使用以下代码:
/* USER CODE BEGIN 3 */
RTC_TimeTypeDef sTime = {0};
if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
  Error_Handler();
}
printf("Current time: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
/* USER CODE END 3 */

在上述代码中,我们使用“HAL_RTC_GetTime()”函数从RTC模块中读取当前时间,并使用printf()函数打印出来。您可以根据需要选择适当的输出方式。

  1. 设置和读取日期 除了时间,RTC模块还可以用于设置和读取日期。以下代码将演示如何设置和读取当前日期:

设置日期:

/* USER CODE BEGIN 4 */
RTC_DateTypeDef sDate = {0};
sDate.WeekDay = RTC_WEEKDAY_TUESDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 0;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE END 4 */

读取日期:

/* USER CODE BEGIN 5 */
RTC_DateTypeDef sDate = {0};
if (HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
  Error_Handler();
}
printf("Current date: %02d-%02d-%02d\n", sDate.Month, sDate.Date, sDate.Year);
/* USER CODE END 5 */

在上述代码中,我们设置了日期为2020年1月1日(星期二),并读取了这个日期并将其打印出来。

  1. RTC中断和闹钟功能 RTC模块还具有中断和闹钟功能。通过启用RTC中断,您可以在特定事件发生时触发中断,如秒中断、小时中断、日期中断等。以下代码将演示如何通过启用秒中断来触发中断:
/* USER CODE BEGIN 6 */
__HAL_RTC_ENABLE_IT(&hrtc, RTC_IT_SEC);
HAL_RTCEx_SetSecond_IT(&hrtc);
/* USER CODE END 6 */

通过闹钟功能,您可以在特定时间点上触发闹钟中断。以下代码将演示如何设置一个每天的特定时间点触发的闹钟:

/* USER CODE BEGIN 7 */
RTC_AlarmTypeDef sAlarm = {0};
sAlarm.AlarmTime.Hours = 8;
sAlarm.AlarmTime.Minutes = 0;
sAlarm.AlarmTime.Seconds = 0;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 1;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
{
  Error_Handler();
}
/* USER CODE END 7 */

在上述代码中,我们设置了闹钟在每天的8:00:00触发,并启用了闹钟中断。

以上是对STM32的RTC实时时钟进行学习和使用的基本步骤。通过以上代码案例的介绍,您应该能够掌握如何配置RTC模块、设置当前时间和日期、读取当前时间和日期,以及如何使用RTC中断和闹钟功能。希望这些内容能够帮助您更好地理解和应用STM32的RTC模块。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CrMylive.

穷呀,求求补助

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

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

打赏作者

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

抵扣说明:

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

余额充值