STM32F103 RTC实时时钟

STM32F103C8T6最小系统开发板使用HAL固件库实现RTC实时时钟

本文将介绍如何使用STM32F103C8T6最小系统开发板,通过HAL固件库实现RTC(实时时钟)功能。我们将详细描述硬件设计、RTC原理、软件设计以及具体操作步骤和示例代码。

1.硬件设计

STM32F103C8T6最小系统开发板集成了RTC功能,可以通过配置外部晶振(LSE)或内部低速振荡器(LSI)来提供时钟源。在硬件设计上,确保:

  1. 电源连接:为RTC模块提供稳定的电源。STM32F103C8T6的RTC模块依赖于VBAT引脚连接的备用电池(如CR2032纽扣电池),确保即使主电源断开,RTC仍能保持计时。
  2. 外部晶振连接:如果需要高精度时钟源,可以选择外接32.768kHz的晶振连接到LSE(Low-Speed External)引脚。
  3. 时钟源选择:STM32支持选择LSE(外部低速晶振)、LSI(内部低速振荡器)作为RTC时钟源。

RTC实时时钟原理

RTC模块在STM32F103C8T6中用于提供持续的时间计数功能,通常用于保持日期和时间。它能够使用外部晶振或内部振荡器来获取低频时钟信号。

STM32的RTC模块包括以下几个重要功能:

  1. 计时器功能:以秒为单位持续计时,提供当前时间(秒、分钟、小时、日期等)。
  2. 闹钟功能:RTC可以配置为定时触发闹钟中断。
  3. 备用电池:使用备用电池(如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

  1. 连接 STLink-V2 到开发板。
  2. 使用 STM32CubeIDE 或 Keil 进行编译。
  3. 通过 STLink-V2 烧录程序。

7.小结

通过使用STM32F103C8T6的RTC模块,我们能够轻松实现实时时钟功能。STM32的RTC支持多种时钟源、时间设置和闹钟中断功能,适用于需要精确时间跟踪的应用。本文通过详细的操作步骤和代码示例,帮助大家理解如何在STM32F103C8T6上实现RTC功能。

posted @ 2025-02-07 16:36  jeikerxiao  阅读(1428)  评论(0)    收藏  举报