STM32F103 RTC实时时钟
STM32F103C8T6最小系统开发板使用HAL固件库实现RTC实时时钟
本文将介绍如何使用STM32F103C8T6最小系统开发板,通过HAL固件库实现RTC(实时时钟)功能。我们将详细描述硬件设计、RTC原理、软件设计以及具体操作步骤和示例代码。
1.硬件设计
STM32F103C8T6最小系统开发板集成了RTC功能,可以通过配置外部晶振(LSE)或内部低速振荡器(LSI)来提供时钟源。在硬件设计上,确保:
- 电源连接:为RTC模块提供稳定的电源。STM32F103C8T6的RTC模块依赖于VBAT引脚连接的备用电池(如CR2032纽扣电池),确保即使主电源断开,RTC仍能保持计时。
- 外部晶振连接:如果需要高精度时钟源,可以选择外接32.768kHz的晶振连接到LSE(Low-Speed External)引脚。
- 时钟源选择:STM32支持选择LSE(外部低速晶振)、LSI(内部低速振荡器)作为RTC时钟源。
RTC实时时钟原理
RTC模块在STM32F103C8T6中用于提供持续的时间计数功能,通常用于保持日期和时间。它能够使用外部晶振或内部振荡器来获取低频时钟信号。
STM32的RTC模块包括以下几个重要功能:
- 计时器功能:以秒为单位持续计时,提供当前时间(秒、分钟、小时、日期等)。
- 闹钟功能:RTC可以配置为定时触发闹钟中断。
- 备用电池:使用备用电池(如CR2032)保持RTC计时,确保电源关闭时,RTC能够继续运行。
2.软件设计
在软件层面,我们通过配置STM32F103C8T6的RTC模块,选择合适的时钟源并设置计时功能。使用HAL固件库时,可以通过HAL_RTC_Init()来初始化RTC模块,通过HAL_RTC_SetTime()和HAL_RTC_SetDate()来设置时间和日期。
1. 配置时钟源
STM32F103C8T6支持LSE和LSI作为RTC时钟源。此处我们以LSE为例,配置外部32.768kHz晶振作为RTC的时钟源。
#include "stm32f1xx_hal.h"
// 配置LSE作为RTC时钟源
void RTC_Clock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = {0};
// 配置LSE为RTC时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
// 配置RTC时钟源
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
RCC_PeriphCLKInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
}
2. 初始化RTC模块
配置RTC模块的时区、时间格式以及日期。
void RTC_Init(void) {
RTC_HandleTypeDef hrtc;
// RTC配置
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制
hrtc.Init.AsynchPrediv = 127; // 异步预分频
hrtc.Init.SynchPrediv = 255; // 同步预分频
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; // 不输出时钟
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
HAL_RTC_Init(&hrtc);
}
3. 设置时间和日期
可以通过HAL_RTC_SetTime()和HAL_RTC_SetDate()函数设置当前时间和日期。
void Set_RTC_Time(void) {
RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
// 设置时间
sTime.Hours = 12;
sTime.Minutes = 30;
sTime.Seconds = 0;
sTime.TimeFormat = RTC_HOURFORMAT12_PM;
HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 设置日期
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_MARCH;
sDate.Date = 15;
sDate.Year = 23;
HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}
4. 获取当前时间和日期
可以通过HAL_RTC_GetTime()和HAL_RTC_GetDate()来获取当前时间和日期。
void Get_RTC_Time(void) {
RTC_HandleTypeDef hrtc;
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
// 获取时间
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
// 获取日期
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
// 显示时间和日期(具体显示方式可根据外设调整)
printf("Time: %02d:%02d:%02d\n", sTime.Hours, sTime.Minutes, sTime.Seconds);
printf("Date: %02d-%02d-%02d\n", sDate.Date, sDate.Month, sDate.Year);
}
5. 闹钟功能
可以配置RTC模块的闹钟功能,当时间达到预定值时触发中断。
void RTC_Alarm_Init(void) {
RTC_HandleTypeDef hrtc;
RTC_AlarmTypeDef sAlarm;
// 配置闹钟时间
sAlarm.AlarmTime.Hours = 12;
sAlarm.AlarmTime.Minutes = 30;
sAlarm.AlarmTime.Seconds = 0;
sAlarm.Alarm = RTC_ALARM_A;
HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);
}
6. 编译并下载程序

- 连接 STLink-V2 到开发板。
- 使用 STM32CubeIDE 或 Keil 进行编译。
- 通过 STLink-V2 烧录程序。
7.小结
通过使用STM32F103C8T6的RTC模块,我们能够轻松实现实时时钟功能。STM32的RTC支持多种时钟源、时间设置和闹钟中断功能,适用于需要精确时间跟踪的应用。本文通过详细的操作步骤和代码示例,帮助大家理解如何在STM32F103C8T6上实现RTC功能。

浙公网安备 33010602011771号