STM32使用HAL库配置RTC时钟

STM32使用HAL库配置RTC时钟

RTC时钟介绍

  • RTC是个独立的定时器

RTC模块拥有一个连续计数的计数器。在相应的软件配置下,可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期 RTC还包含用于管理低功耗模式的自动唤醒单元。

在断电情况下 RTC仍可以独立运行 只要芯片的备用电源一直供电,RTC上的时间会一直走。RTC实质是一个掉电后还继续运行的定时器,从定时器的角度来看,相对于通用定时器TIM外设,它的功能十分简单,只有计时功能(也可以触发中断)。但其高级指出也就在于掉电之后还可以正常运行。

Cubemx中的RTC时钟树

CubemxRTC时钟配置

本文不包括rtc中断(rtc闹钟的配置)
不包括rtc中断(rtc闹钟的配置)

以下框内为主要调节的参数,包括时间的格式与第一次上电时的初始值

初始化的参数

代码

读取函数
在进行读取RTC前,我们需要定义两个特定的结构体

RTC_TimeTypeDef GetTime;
RTC_DateTypeDef GetDate;

我们获取的RTC时间将会保存到这两个RTC的结构体中,接下来是获取时间和日期的函数。

 HAL_RTC_GetTime(&hrtc,&GetTime,RTC_FORMAT_BIN);
 HAL_RTC_GetDate(&hrtc,&GetDate,RTC_FORMAT_BIN);

> 注意:这两行代码必须一起使用,我们获取完时间后必须再获取一次日期,(无论你是否需要RTC日期)。如果你没有获取RTC的日期,那么你可能只能调用一次RTC时间。

sprintf(text,"%d:%d:%d\n",GetTime.Hours,GetTime.Minutes,GetTime.Seconds);
### STM32 HAL RTC 实时时钟 示例代码及教程 #### 初始化RTC模块 为了初始化STM32RTC模块,首先需要配置时钟源并开启RTC外设。通常情况下,LSE(低速外部晶振)作为RTC的工作时钟源。 ```c RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; // 配置 LSE 为 RTC时钟源 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { // Initialization Error } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { // Configuration Error } ``` 接着初始化RTC结构体变量`RTC_HandleTypeDef hrtc`以及调用`HAL_RTC_Init()`函数完成RTC初始化[^1]。 #### 设置时间和日期 通过定义两个结构体`RTC_TimeTypeDef sTime` 和 `RTC_DateTypeDef sDate` 来存储时间与日期信息,并利用`HAL_RTC_SetTime()`和`HAL_RTC_SetDate()`来设定初始的时间和日期值。 ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; sTime.Hours = 0x14; /* HH */ sTime.Minutes = 0x57; /* MM */ sTime.Seconds = 0x00; /* SS */ sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 0x01; sDate.Year = 0x23; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) { // Setting Time error } if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) { // Setting Date error } ``` #### 获取当前时间和日期 当需要读取当前的时间或日期时,同样使用上述提到的数据结构并通过相应的API获取最新的数据: ```c RTC_TimeTypeDef currentTime; RTC_DateTypeDef currentDate; HAL_RTC_GetTime(&hrtc, &currentTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &currentDate, RTC_FORMAT_BIN); printf("Current time is %02d:%02d:%02d\r\n", \ currentTime.Hours, currentTime.Minutes, currentTime.Seconds); printf("Today's date is %02d/%02d/20%02d\r\n", \ currentDate.Date, currentDate.Month, currentDate.Year); ``` #### 时间戳中断处理程序 对于特定事件的发生记录精确时刻的需求,可以通过使能相应类型的中断服务例程(ISR),如下所示实现了按键触发生成时间戳的功能: ```c void HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc) { if (__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSOF)) { __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSOF); RTC_TimeTypeDef stampTime; RTC_DateTypeDef stampDate; HAL_RTCEx_GetTimeStamp(hr tc, &stampTime, &stampDate, RTC_FORMAT_BIN); printf("Timestamp occurred at %02d-%02d-%02d %02d:%02d:%02d \r\n", stampDate.Year, stampDate.Month, stampDate.Date, stampTime.Hours, stampTime.Minutes, stampTime.Seconds); } } ``` 以上就是基于STM32 HAL 实现RTC实时时钟的基本操作流程介绍[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值