一、背景说明


        让人从一个较低的基础开始制作一个智能手环项目,功能的话,先做一个时间显示( RTC系统时间、蓝牙控制设置闹钟、wifi获取网络时间),然后做温湿度的简单显示、以及心率血氧、计步的检测,这些我以多章节,一步一步的写出来。

        不过,还是主要讲模块和项目的内容,原理性的知识不会过多的讲。

二、 RTC模块的介绍

        实时时钟 (RTC)是一个独立的 BCD 定时器计数器。RTC 提供一个日历时钟、两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志(等同于外设定时器的时间更新中断),RTC 还包含用于管理低功耗模式的自动唤醒单元。

        两个 32 位寄存器包含二进制码十进制数格式(BCD)的秒、分钟、小时(12或 24 小时制)、星期几、日期、月份和年份。此还可提供二进制格式的亚秒值。

        系统可以自动将月份的天数补偿为28、29(闰年)、30和31 天。并且还可以进行夏令时补偿。
        其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、小时、星期几和日期。
        此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。
上电复位后,所有 RTG 寄存器都会受到保护,以防止可能的非正常写访问。无论器件状态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,RTC 便不会停止工作。

三、RTC模块的初始化使用

        .c

//1、RTC配置初始化
void RTC_ConfigInit(void)
{
    /* 0、外设信息配置结构体 */
	RTC_InitTypeDef  RTC_InitStructure;		//RTC基础配置

	/* 1、使能电源管理时钟 */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
		
	/* 2、允许使用RTC时钟 */
	PWR_BackupAccessCmd(ENABLE);

	/* 3、重置RTC域(注意:重置后,需重新开启RTC时钟) */
	//RCC_BackupResetCmd(ENABLE);
	//RCC_BackupResetCmd(DISABLE);
	
	/* 4、使能RTC时钟 */
	RCC_RTCCLKCmd(ENABLE);
	

#if SELECT_RTC_CLK //(为真选择LSE时钟,为假选择LSI时钟)
	
	/* 5、使能外部低速时钟振荡器 */
	RCC_LSEConfig(RCC_LSE_ON);

	/* 6、等到外部低速时钟振荡器准备好 */ 	
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

	/* 6、选择RTC时钟源 */
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	

	/* 7、等待直到RTC时间和日期寄存器(RTC_TR和RTC_DR)完成与RTCAPB时钟同步 */
	RTC_WaitForSynchro();
	
	/* 8、配置RTC数据寄存器和RTC预分频器 */
	/* 公式:ck_spre(1Hz) = RTCCLK(LSE) /(AsynchPrediv + 1)*(SynchPrediv + 1)*/
	RTC_InitStructure.RTC_AsynchPrediv = 0x7F;					//异步分频系数(127+1)
	RTC_InitStructure.RTC_SynchPrediv  = 0xFF;					//同步分频系数(255+1)
	RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;		//24小时格式
	RTC_Init(&RTC_InitStructure);								//将配置的外设信息,写入到相对应的寄存器中
	
#else
	/* 4、使能内部低速时钟振荡器 */
	RCC_LSICmd(ENABLE);

	/* 5、等到内部低速时钟振荡器准备好 */ 	
	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);

	/* 6、选择RTC时钟源 */
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

	/* 7、等待直到RTC时间和日期寄存器(RTC_TR和RTC_DR)完成与RTCAPB时钟同步 */
	RTC_WaitForSynchro();
	
	/* 8、配置RTC数据寄存器和RTC预分频器 */
	/* 公式:ck_spre(1Hz) = RTCCLK(LSI) /(AsynchPrediv + 1)*(SynchPrediv + 1)*/
	RTC_InitStructure.RTC_AsynchPrediv = 0x7F;					//异步分频系数(127+1)
	RTC_InitStructure.RTC_SynchPrediv  = 0xF9;					//同步分频系数(249+1)
	RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;		//24小时格式
	RTC_Init(&RTC_InitStructure);								//将配置的外设信息,写入到相对应的寄存器中
	
#endif

}



//2、设置RTC的日期和时间
void RTC_SetDateTime(uint8_t Year, uint8_t Month, uint8_t Date, uint8_t Hours, uint8_t Minutes, uint8_t Seconds)
{
	/* 0、外设信息配置结构体 */
	RTC_DateTypeDef  RTC_DateStruct;					//RTC日期配置
	RTC_TimeTypeDef  RTC_TimeStruct;					//RTC时间配置
	
	/* 1、设置日期(年月日、星期) */
	RTC_DateStruct.RTC_Year		=	Year;				//年份(0-99)
	RTC_DateStruct.RTC_Month	=	Month;				//月份
	RTC_DateStruct.RTC_Date		=	Date;				//日期(1-31)
	RTC_DateStruct.RTC_WeekDay	=	RTC_Weekday_Tuesday;	//星期
	RTC_SetDate(RTC_Format_BIN, &RTC_DateStruct);		//将配置的外设信息,写入到相对应的寄存器中
	
	/* 2、设置时间(时分秒) */
	RTC_TimeStruct.RTC_Hours    =  Hours;				//小时(24小时制:0-23,12小时制:0-11) 				
	RTC_TimeStruct.RTC_Minutes  =  Minutes;				//分钟(0-59) 
	RTC_TimeStruct.RTC_Seconds  =  Seconds;  			//秒数(0-59) 
	//RTC_TimeStruct.RTC_H12    =  RTC_H12_PM;
	RTC_SetTime(RTC_Format_BIN, &RTC_TimeStruct);		//将配置的外设信息,写入到相对应的寄存器中

}

.h

/**
  ******************************************************************************
  * @file    rtc.h
  * @author  SLDY.熊猫
  * @version V0.0.1
  * @date    2025.11.04
  * @brief   
  ******************************************************************************
  * @attention
  *
  * 	本文档可以随便复制粘贴使用
  *		
  * 	CSON:			  https://blog.csdn.net/cc_nyz?type=blog 
  * 	gitee:  			https://gitee.com/sldyxm/my-warehouse-ku.git
  *		有疑问或建议   SLAYXM@163.com
  *
  ******************************************************************************
  */


#ifndef  __RTC_H 		//定义防止递归包含
#define __RTC_H



/* 1.其他头文件---------------------------------------------------------------------------------------------------------------*/
#include "stm32f4xx.h"
#include "my_config.h"
#include "my_reg.h"

#define SELECT_RTC_CLK 1
/* 宏定义(函数,变量,常量) ----------------------------------------------------------------------------------*/


/* 3.自定义数据类型(结构体,联合体,枚举) --------------------------------------------------------*/

/* 4.	全局变量声明 -------------------------------------------------------------------------------------------------------*/

/* 5.	函数声明 --------------------------------------------------------------------------------------------------------------*/

/* 6.	静态函数,函数定义 -------------------------------------------------------------------------------------------*/
extern void RTC_ConfigInit(void);																							// 1、RTC配置初始化
extern void RTC_SetDateTime(uint8_t Year, uint8_t Month, uint8_t Date, uint8_t Hours, uint8_t Minutes, uint8_t Seconds);	// 2、设置RTC的日期和时间


#endif /* __RTC_H */


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐