RTC
2025/9/8大约 4 分钟
RTC(real time clock)
| 分类 | 详情 |
|---|---|
| 基本概念 | 实时时钟(RTC)是一个独立的定时器,可为系统提供计时、日历功能,即使主电源关闭,在备用电源支持下仍能持续工作,确保计时的连续性。 |
| 主要功能 | 1. 计时功能:精准提供秒、分、时、日、月、年等时间信息,常用于记录事件发生时间、设定定时任务等场景。 2. 闹钟功能:可设置一个或多个闹钟时间,当RTC计时与设定闹钟时间匹配时,触发中断通知系统执行特定操作,如定时唤醒系统、定时采集数据等。 3. 周期性唤醒功能:按设定的时间间隔周期性触发中断,将系统从低功耗模式唤醒,执行特定任务后再返回低功耗模式,用于节能场景。 |
| 时钟源选择 | 1. 内部低速时钟(LSI):无需外部硬件支持,成本低,但精度较差,频率约为32kHz,适用于对时钟精度要求不高的场景。 2. 外部低速晶体(LSE):精度较高,频率通常为32.768kHz,能提供更稳定的计时,但需要外接晶体振荡器,成本相对较高,适用于对时钟精度要求较高的应用。 |
| Cube MX配置要点 | 1. 使能RTC功能:在“Pinout & Configuration”选项卡中,将对应的引脚设置为“RTC”功能;或在“Configuration”选项卡中,找到“RTC”并点击使能。 2. 配置时钟源:在“RTC Configuration”中,选择“Clock Source”为所需的时钟源(LSI或LSE),若选LSE,还可设置“LSE Drive Capability”等参数。 3. 配置日历时间:在“Date and Time”区域设置初始日期和时间。 4. 配置中断:在“NVIC Settings”中使能“RTC Alarm_IRQn”等相关中断,并设置中断优先级。 |
| 后备区域相关 | 1. 存储特性:包含42个16位的BKP寄存器,在主电源VDD掉电且有后备电源供电时,可保存用户程序的数据,系统复位或电源复位时数据不丢失;RTC模块中的计数器、分频器等相关寄存器的数据也保存在此区域,保证RTC在系统复位、掉电等情况下,其设置和时间数据能维持不变。 2. 功能特性:无论器件处于运行、低功耗还是复位状态,只要后备区域供电正常,RTC便能持续工作;系统复位后默认禁止访问后备寄存器和RTC,防止对后备区域的意外写操作,确保数据的安全性和完整性。 |
| TAMPER1相关 | 1. 功能含义:TAMPER1引脚用于检测是否有外部对后备区域的非法侵入或干扰,当TAMPER1引脚上的信号发生特定变化时,会产生一个侵入检测事件。 2. 应用场景:用于保护后备区域的数据安全,防止非法访问或篡改后备寄存器中的数据。当检测到侵入事件时,系统可以采取相应的措施,如清除所有数据备份寄存器内容、触发中断通知软件进行处理等。 3. 配置要点:在Cube MX中配置时,需要根据具体需求设置TAMPER1引脚的相关参数,如TPAL位、使能或禁止TAMPER1功能等,还需注意TAMPER1引脚的外部连接。 |

异步预分频器处理高频输入时钟,快速降低频率,减少后续同步分频器的负担。
同步预分频器进一步精确调整频率,确保最终输出1Hz的时钟信号,用于RTC的计时。
HSE (High-Speed External)
LSI (Low-Speed Internal)
LSE (Low-Speed External)
RTC中断唤醒
中断回调
/* USER CODE BEGIN 1 */
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
SystemClock_Config(); // STOP模式唤醒后默认时钟主频为内部8M时钟,所以要先初始化时钟配置
// 亮蓝灯
HAL_GPIO_WritePin(GPIOB, LED_B_Pin, GPIO_PIN_RESET);
printf("3s时间到,唤醒!\r\n");
}
/* USER CODE END 1 */while循环中调用,RTC配置
void RTC_AlarmStart(void)
{
//RTC_AlarmTypeDef sAlarm = {0};
RTC_TimeTypeDef tim = {0};
// 获取当前时间
HAL_RTC_GetTime(&hrtc, &tim, RTC_FORMAT_BIN);
sAlarm.AlarmTime.Hours = tim.Hours;
sAlarm.AlarmTime.Minutes = tim.Minutes;
sAlarm.AlarmTime.Seconds = tim.Seconds + 3; /* 设置下次闹钟提醒时间是当前时间的3s之后 */
sAlarm.Alarm = RTC_ALARM_A;
// 启动闹钟中断事件
//HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
//不要这个也行
}
