一、RTC_Init()

1.1 RTC_HandleTypeDef

  • Instance:指向 RTC 外设寄存器基地址
  • Init:包含初始化 RTC 所需的参数
  • Lock:用于锁定和解锁 RTC 外设
  • State:定义 RTC 的状态

1.2 RTC_InitTypeDef

  • HourFormat:设置 RTC 的小时制格式

RTC_HOURFORMAT_24:使用 24 小时制

RTC_HOURFORMAT_12:使用 12 小时制

  • AsynchPrediv:设置 RTC 外设的异步预分频器

通常设置为 127

  • SynchPrediv:RTC 的同步预分频器

通常设置为 255

  • OutPut:选择将哪个信号输出到 RTC 输出引脚

RTC_OUTPUT_DISABLE:禁用 RTC 输出

RTC_OUTPUT_ALARMA:闹钟 A 输出

RTC_OUTPUT_ALARMB:闹钟 B 输出

RTC_OUTPUT_WAKEUP:唤醒信号输出

  • OutPutPolarity:配置输出信号的极性

RTC_OUTPUT_POLARITY_HIGH:输出高电平

RTC_OUTPUT_POLARITY_LOW:输出低电平

  • OutPutType:配置 RTC 输出引脚的类型

RTC_OUTPUT_TYPE_OPENDRAIN:开漏模式

RTC_OUTPUT_TYPE_PUSHPULL:推挽模式

1.3 HAL_RTC_Init()

HAL_RTC_Init(RTC_HandleTypeDef *hrtc)

调用函数初始化1.1 1.2的配置

1.4 RTC事件设置

1.4.1 RTC_TimeTypeDef

  • Hours:小时

0 到 23 1 到 12

  • Minutes:分钟

0 到 59

  • Seconds:秒钟

0 到 59

  • TimeFormat:指示时间是 12 小时制还是 24 小时制

RTC_HOURFORMAT_12:12 小时制

RTC_HOURFORMAT_24:24 小时制

  • SubSeconds:表示秒钟的更高精度

  • SecondFraction:表示时间的分数部分

  • DayLightSaving:指示是否启用了夏令时

RTC_DAYLIGHTSAVING_SUB1H:夏令时减去 1 小时

RTC_DAYLIGHTSAVING_ADD1H:夏令时加上 1 小时

RTC_DAYLIGHTSAVING_NONE:不使用夏令时

  • StoreOperation:是否在某些操作中存储 RTC 时间

RTC_STOREOPERATION_RESET:重置 RTC 存储操作

RTC_STOREOPERATION_SET:设置 RTC 存储操作

1.4.2 HAL_RTC_SetTime()设置时间

HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)

  • hrtc:指向 RTC_HandleTypeDef 结构体的指针

  • sTime:1.4.1配置的结构体

  • Format:RTC 日期和时间格式

RTC_FORMAT_BIN :二进制格式
RTC_FORMAT_BCD:BCD 格式

1.4.3 RTC_DateTypeDef

  • WeekDay:当前日期是星期几
  • Month:当前日期的月份
  • Date:当前月份中的日期
  • Year:当前年份(2023年为23)

1.4.4 HAL_RTC_SetDate()设置日期

HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)

  • hrtc:指向 RTC_HandleTypeDef 结构体的指针

  • sTime:1.4.3配置的结构体

  • Format:RTC 日期和时间格式

RTC_FORMAT_BIN : 二进制格式
RTC_FORMAT_BCD:BCD 格式

1.5 设置闹钟

1.5.1 RTC_AlarmTypeDef

  • AlarmTime:指定 RTC 闹钟的时间部分
  • AlarmMask:设置 RTC 闹钟触发时应忽略哪些时间部分

RTC_ALARMMASK_NONE:不忽略任何字段

RTC_ALARMMASK_DATEWEEKDAY:忽略日期和星期字段

RTC_ALARMMASK_HOURS:忽略小时字段

RTC_ALARMMASK_MINUTES:忽略分钟字段

RTC_ALARMMASK_SECONDS:忽略秒字段

RTC_ALARMMASK_ALL:忽略所有字段

  • AlarmSubSecondMask:设置 RTC 闹钟触发时应忽略的子秒部分
  • AlarmDateWeekDaySel:选择闹钟基于日期还是星期几触发

RTC_ALARMDATEWEEKDAYSEL_DATE:选择日期触发闹钟

RTC_ALARMDATEWEEKDAYSEL_WEEKDAY:选择星期几触发闹钟

  • AlarmDateWeekDay
    • 如果选择了日期触发,则此字段指定具体的日期(1 到 31)
    • 如果选择了星期触发,则此字段指定星期几(如 RTC_WEEKDAY_MONDAY 表示星期一)
  • Alarm:指定闹钟的类型或其他相关配置

RTC_ALARM_A:闹钟A

RTC_ALARM_B:闹钟B

1.5.2 RTC_TimeTypeDef

同1.2配置

1.6 HAL_RTC_SetAlarm_IT()

HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)

设定1.5.2的配置

  • hrtc:指向 RTC_HandleTypeDef 结构体的指针

  • sAlarm:指向RTC_AlarmTypeDef 结构体的指针

  • Format:指时间格式

调用此函数初始化1.5中的配置

1.7 唤醒定时器

HAL_RTCEx_SetWakeUpTimer_IT(RTC_HandleTypeDef *hrtc, uint32_t WakeUpCounter, uint32_t WakeUpClock)

  • hrtc:指向 RTC 句柄的指针
  • WakeUpCounter:设置唤醒定时器的计数器值
  • WakeUpClock:唤醒定时器的时钟源

RTC_WAKEUPCLOCK_RTCCLK_DIV16:分频为 16

RTC_WAKEUPCLOCK_RTCCLK_DIV8:分频为 8

RTC_WAKEUPCLOCK_RTCCLK_DIV4:分频为 4

RTC_WAKEUPCLOCK_RTCCLK_DIV2:分频为 2

RTC_WAKEUPCLOCK_CK_SPRE_16BITS: 16 位的分频时钟作为唤醒时钟源

RTC_WAKEUPCLOCK_CK_SPRE_17BITS:选择 17 位的分频时钟作为唤醒时钟源

二、唤醒中断

2.1 RTC_WKUP_IRQHandler()

1
2
3
4
void RTC_WKUP_IRQHandler(void)
{
HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
}

2.2 回调函数

1
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)

三、闹钟时间中断

3.1 RTC_Alarm_IRQHandler()

1
2
3
4
void RTC_Alarm_IRQHandler(void)
{
HAL_RTC_AlarmIRQHandler(&hrtc);
}

3.2 闹钟回调函数

1
2
3
4
5
6
7
8
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
//闹钟A
}
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
{
//闹钟B
}
1
2
3
4
5
6
7
8
//    RTC_TimeTypeDef nowTime;
// RTC_DateTypeDef nowData;

if(HAL_RTC_GetTime(hrtc,&nowTime,RTC_FORMAT_BCD) == HAL_OK)
{
HAL_RTC_GetDate(hrtc,&nowData,RTC_FORMAT_BCD);
printf("IT:日期 %d/%d/%d 时间:%d:%d:%d\r\n",nowData.Year+2000,nowData.Month,nowData.Date,nowTime.Hours,nowTime.Minutes,nowTime.Seconds);
}