引言
STM32RTC(实时时钟)模块是STM32微控制器系列中的一种内置功能,它允许设备在没有外部时钟源的情况下保持时间。STM32RTC可以用于记录事件、定时任务以及作为系统时钟的备份。本文将详细介绍如何配置和使用STM32RTC模块,包括初始化、设置时间、读取时间和中断处理等步骤。
准备工作
在开始之前,确保你已经具备了以下条件:
- 一块STM32微控制器开发板(如STM32F103系列)。
- 一个集成开发环境(IDE),如STM32CubeIDE或Keil uVision。
- 一个合适的时钟源,如晶振或外部时钟。
初始化STM32RTC
初始化STM32RTC包括以下几个步骤:
以下是一个示例代码,展示了如何初始化STM32RTC:
#include "stm32f1xx_hal.h"
void SystemClock_Config(void);
void RTC_Init(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
RTC_Init();
while (1)
{
// 主循环代码
}
}
void SystemClock_Config(void)
{
// 系统时钟配置代码
}
void RTC_Init(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RTC_TimeTypeDef RTC_TimeStructure = {0};
RTC_DateTypeDef RTC_DateStructure = {0};
// 启用PWR和RCC时钟
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_RCC_RTC_CLK_ENABLE();
// 配置时钟源
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
// 错误处理
}
// 配置系统时钟
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
// 错误处理
}
// 配置RTC校准
RTC_TimeTypeDef RTC_TimeStructure;
RTC_DateTypeDef RTC_DateStructure;
RTC_InitTypeDef RTC_InitTypeDef;
RTC_InitTypeDef.RTC_HourFormat = RTC_HOURFORMAT_24;
RTC_InitTypeDef.RTC_AsynchPrediv = RTC_ASYNCHPREDIV_DIV1;
RTC_InitTypeDef.RTC_SynchPrediv = RTC_SYNCHPREDIV_DIV1;
RTC_InitTypeDef.RTC_OutPut = RTC_OUTPUTSOURCE_NONE;
RTC_InitTypeDef.RTC_Prescaler = RTC_PRESCALER_DIV1;
RTC_InitTypeDef.RTC_24HFormat = RTC_24HFORMAT_24H;
if (HAL_RTC_Init(&RTC_InitTypeDef) != HAL_OK)
{
// 错误处理
}
// 设置当前时间
RTC_TimeStructure.RTC_Hours = 12;
RTC_TimeStructure.RTC_Minutes = 0;
RTC_TimeStructure.RTC_Seconds = 0;
RTC_DateStructure.RTC_Year = 2023;
RTC_DateStructure.RTC_Month = RTC_MONTH_JANUARY;
RTC_DateStructure.RTC_Date = 1;
RTC_DateStructure.RTC_WeekDay = RTC_WEEKDAY_MONDAY;
if (HAL_RTC_SetTime(&hrtc, &RTC_TimeStructure, RTC_FORMAT_BCD) != HAL_OK
转载请注明来自马鞍山同杰良,本文标题:《stm32rtc实时时钟步骤, 》
百度分享代码,如果开启HTTPS请参考李洋个人博客