STM32RTC时钟HAL库
时间: 2025-03-26 20:34:03 浏览: 34
### STM32 RTC时钟 HAL库 示例代码
对于STM32系列微控制器而言,利用HAL库操作RTC(实时时钟)模块能够简化开发流程。下面展示一段基于HAL库的示例代码用于初始化RTC以及设置备份寄存器的操作。
#### 初始化RTC并配置时间日期
```c
// 定义全局变量存储当前时间和日期
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};
/* 配置系统时钟 */
void SystemClock_Config(void);
int main(void)
{
/* 重定位更新向量表位置 */
HAL_Init();
/* 设置系统时钟频率 */
SystemClock_Config();
__HAL_RCC_PWR_CLK_ENABLE(); // 开启PWR时钟
/*** 初始化RTC ***/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 采用24小时制
hrtc.Init.AsynchPrediv = 127; // 异步预分频系数 (APRE),假设LSE=32.768kHz,则此处应设为32768-1
hrtc.Init.SynchPrediv = 255; // 同步预分频系数 (SPRE), 这里同样取决于所使用的晶振频率
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 关闭RTC输出功能
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if(HAL_RTC_Init(&hrtc) != HAL_OK){
Error_Handler(__FILE__, __LINE__); // 错误处理函数定义
}
/** 设定初始时间为午夜零点整 **/
sTime.Hours = 0x00U;
sTime.Minutes = 0x00U;
sTime.Seconds = 0x00U;
if(HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN)!= HAL_OK){
Error_Handler(__FILE__,__LINE__);
}
}
```
这段程序展示了如何通过调用`HAL_RTC_Init()`来启动RTC硬件资源,并设定其工作参数;接着使用`HAL_RTC_SetTime()`方法指定具体的时刻作为起始值[^1]。
#### 备份数据区读写操作
当涉及到非易失性的用户自定义信息保存时,可以通过访问RTC的备份寄存器实现:
```c
#define BACKUP_REGISTER_INDEX 0 // 可选范围通常是从0到19不等
uint32_t writeValue = 240630UL;
uint32_t readValue;
readValue = HAL_RTCEx_BKUPRead(&hrtc, BACKUP_REGISTER_INDEX);
printf("Backup Register %d Value Before Write:%lu\r\n",BACKUP_REGISTER_INDEX ,readValue );
if(HAL_RTCEx_BKUPWrite(&hrtc,BACKUP_REGISTER_INDEX,writeValue )!= HAL_OK ){
Error_Handler(__FILE__,__LINE__);
}
readValue = HAL_RTCEx_BKUPRead(&hrtc, BACKUP_REGISTER_INDEX );
printf("Backup Register %d Value After Write :%lu\r\n",BACKUP_REGISTER_INDEX ,readValue );
```
上述片段说明了怎样借助于`HAL_RTCEx_BKUPRead()/HAL_RTCEx_BKUPWrite()`接口对特定编号下的备用区域执行读取与记录动作。
#### 设置闹钟中断
为了创建一个定时提醒机制,在这里介绍一种简单的方法——即调整闹钟触发的时间戳从而改变等待周期长度:
```c
RTC_AlarmTypeDef sAlarm = {0};
/** 更新闹钟A配置**/
sAlarm.AlarmTime.Hours = 0x00U;
sAlarm.AlarmTime.Minutes = 0x0AU; // 即将在十分钟之后响起警报声
sAlarm.AlarmTime.Seconds = 0x00U;
sAlarm.AlarmMask = RTC_ALARMMASK_NONE;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 0x01U;
sAlarm.Alarm = RTC_ALARM_A;
if(HAL_RTC_SetAlarm_IT(&hrtc,&sAlarm,RTC_FORMAT_BIN)!= HAL_OK )
{
Error_Handler(__FILE__,__LINE__);
}
```
此部分实现了将来的某个确切瞬间激活报警信号的功能,其中的关键在于精确指派`sAlarm.AlarmTime.*`成员属性以匹配预期的发生条件[^3]。
阅读全文
相关推荐


















