hal库rtc时钟教程
时间: 2025-03-26 18:21:32 浏览: 48
### STM32 HAL 库中 RTC 时钟使用教程
#### 初始化 RTC 实例
为了初始化 RTC 模块,需创建 `RTC_HandleTypeDef` 类型的句柄并配置其参数。通常,在项目启动阶段完成此操作。
```c
RTC_HandleTypeDef hrtc;
void MX_RTC_Init(void)
{
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
}
```
#### 设置当前时间和日期
通过调用 `HAL_RTC_SetTime()` 和 `HAL_RTC_SetDate()` 函数可以设置 RTC 的初始时间与日期[^1]。
```c
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};
sTime.Hours = 18;
sTime.Minutes = 30;
sTime.Seconds = 0;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
DateToUpdate.Month = RTC_MONTH_JANUARY;
DateToUpdate.Date = 1;
DateToUpdate.Year = 21;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
```
#### 获取当前的时间和日期
利用 `HAL_RTC_GetTime()` 及 `HAL_RTC_GetDate()` 方法来获取当前存储于 RTC 中的时间和日期数据。
```c
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
if (HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
if (HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
printf("Current Time: %02d:%02d:%02d\r\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
printf("Current Date: %02d/%02d/20%02d\r\n", sDate.Date, sDate.Month, sDate.Year);
```
#### 时间戳功能实现
当特定事件发生时(例如按键按下),可通过中断服务程序捕获该时刻的时间戳,并将其保存下来以便后续处理[^2]。
```c
void HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *_hrtc)
{
if (_hrtc == &hrtc)
{
RTC_TimeTypeDef stampTime;
RTC_DateTypeDef stampDate;
HAL_RTCEx_GetTimeStamp(&_hrtc, &stampTime, &stampDate, RTC_FORMAT_BIN);
printf("Timestamp captured at:\n");
printf("Date: %02d-%02d-20%02d\n", stampDate.Date, stampDate.Month, stampDate.Year);
printf("Time: %02d:%02d:%02d\n", stampTime.Hours, stampTime.Minutes, stampTime.Seconds);
}
}
```
阅读全文
相关推荐

















