在STM32单片机里,实时时钟(Real-time clock: RTC)是一个独立的计时器。RTC提供一组连续运行的计数器,可以与合适的软件一起使用,以提供时钟日历功能。可以写入计数器值以设置系统的当前时间/日期。
1、时钟源配置
// 使能电源时钟和备份域访问
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
// 选择时钟源(LSE/LSI)
RCC_OscInitTypeDef RCC_OscInit = {0};
RCC_OscInit.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInit.LSEState = RCC_LSE_ON;
HAL_RCC_OscConfig(&RCC_OscInit);
// 配置RTC时钟
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
2、RTC初始化
// 使能RTC时钟
__HAL_RCC_RTC_ENABLE();
// 初始化结构体配置
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制
hrtc.Init.AsynchPrediv = 127; // 异步预分频(LSE 32.768kHz时)
hrtc.Init.SynchPrediv = 255; // 同步预分频
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 输出关闭
HAL_RTC_Init(&hrtc);
3、时间日期设置
// 设置时间
sTime.Hours = 12;
sTime.Minutes = 30;
sTime.Seconds = 0;
sTime.SubSeconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT12_AM;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 设置日期
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_JANUARY;
sDate.Date = 1;
sDate.Year = 23; // 2023年
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
4、闹钟配置(可选)
// 使能RTC全局中断
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
// 中断服务函数
void RTC_Alarm_IRQHandler(void)
{
HAL_RTC_AlarmIRQHandler(&hrtc);
// 用户处理代码
}
5、中断配置
// 使能RTC全局中断
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
// 中断服务函数
void RTC_Alarm_IRQHandler(void)
{
HAL_RTC_AlarmIRQHandler(&hrtc);
// 用户处理代码
}
6、关键参数说明
①预分频计算
检查晶振负载电容(通常6pF)
确保LSE使能配置正确
使用示波器测量PC14/PC15引脚
②备份域注意事项
检查预分频配置是否正确
确认后备电池(VBAT)供电正常
检查RTC寄存器写保护状态
③低功耗模式
// 进入Stop模式时保持RTC运行
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
本文凡亿教育原创文章,转载请注明来源!