超简单 STM32 RTC闹钟 时钟配置

该博客围绕STM32 RTC展开,介绍了其时钟闹钟设置。先展示效果,可在LCD屏幕显示时间,设置时间后到点蜂鸣器启动。配置方法是采用原子RTC章节源码,替换RTC.C源文件。还分享了设置闹钟值的函数,最后告知项目获取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述▬▬▬▬▬▶玩转STM32RTC◀▬▬▬▬▬


⚔️先看效果

LCD屏幕显示 年月日时分秒 设置任意时间 到时间蜂鸣器启动


基于Stm32RTC时钟闹钟设置

⚔️配置方法

代码模板采用的是原子的RTC那一章节的源码

替换RTC.C源文件即可实现时钟闹钟的配置


⚔️RTC.C源码分享

设置闹钟值的函数(RTC_Alarm_Set(2021,1,13,16,39,59);)



#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "rtc.h" 	
#include "led.h"
#include "beep.h" 

	   
_calendar_obj calendar;
 
static void RTC_NVIC_Config(void)
{	
  NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;	
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		
	NVIC_Init(&NVIC_InitStructure);		
}


u8 RTC_Init(void)
{

    u8 temp=0;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	
	PWR_BackupAccessCmd(ENABLE);	
	if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051)		
		{	 			 
		BKP_DeInit();
		RCC_LSEConfig(RCC_LSE_ON);	
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250)	
			{
			temp++;
			delay_ms(10);
			}
		if(temp>=250)return 1;	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		  
		RCC_RTCCLKCmd(ENABLE);	
		RTC_WaitForLastTask();	
		RTC_WaitForSynchro();		 
		RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);	
		RTC_WaitForLastTask();	
		RTC_EnterConfigMode();
		RTC_SetPrescaler(32767); 
		RTC_WaitForLastTask();	
		RTC_Set(2021,1,13,16,38,59);  
        RTC_Alarm_Set(2021,1,13,16,39,59);			
		RTC_ExitConfigMode(); 
		BKP_WriteBackupRegister(BKP_DR1, 0X5051);	
		}
	else//ϵͳ¼ÌÐø¼ÆÊ±
		{

		RTC_WaitForSynchro();	
		RTC_ITConfig(RTC_IT_SEC, ENABLE);	
		RTC_WaitForLastTask();	
		}
	RTC_NVIC_Config();	    				     
	RTC_Get();	
	return 0; 

}		 				    
 
void RTC_IRQHandler(void)
{		 
	if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
	{							
		RTC_Get();   
 	}
	if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)
	{
		RTC_ClearITPendingBit(RTC_IT_ALR);		  	
	  RTC_Get();				
  	printf("Alarm Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
		BEEP=1;
  	} 				  								 
	RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);		
	RTC_WaitForLastTask();	  	    						 	   	 
}

u8 Is_Leap_Year(u16 year)
{			  
	if(year%4==0) //
	{ 
		if(year%100==0) 
		{ 
			if(year%400==0)return 1;  
			else return 0;   
		}else return 1;   
	}else return 0;	
}	 			   
										 
u8 const table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; 
const u8 mon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31};
u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	
	{
		if(Is_Leap_Year(t))seccount+=31622400;
		else seccount+=31536000;			  
	}
	smon-=1;
	for(t=0;t<smon;t++)	   
	{
		seccount+=(u32)mon_table[t]*86400;
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;	   
	}
	seccount+=(u32)(sday-1)*86400;
	seccount+=(u32)hour*3600;
    seccount+=(u32)min*60;	
	seccount+=sec;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	
	PWR_BackupAccessCmd(ENABLE);	// 
	RTC_SetCounter(seccount);	//
	RTC_WaitForLastTask();	//	
	return 0;	    
}


u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)
{
	u16 t;
	u32 seccount=0;
	if(syear<1970||syear>2099)return 1;	   
	for(t=1970;t<syear;t++)	
	{
		if(Is_Leap_Year(t))seccount+=31622400;
		else seccount+=31536000;			 
	}
	smon-=1;
	for(t=0;t<smon;t++)	   
	{
		seccount+=(u32)mon_table[t]*86400;
		if(Is_Leap_Year(syear)&&t==1)seccount+=86400;	   
	}
	seccount+=(u32)(sday-1)*86400;
	seccount+=(u32)hour*3600;
    seccount+=(u32)min*60;	 
	seccount+=sec;			    
	//ÉèÖÃʱÖÓ
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	
	PWR_BackupAccessCmd(ENABLE);	 
	RTC_SetAlarm(seccount);
	RTC_WaitForLastTask();	
	
	return 0;	    
}
u8 RTC_Get(void)
{
	static u16 daycnt=0;
	u32 timecount=0; 
	u32 temp=0;
	u16 temp1=0;	  
    timecount=RTC_GetCounter();	 
 	temp=timecount/86400; 
	if(daycnt!=temp)
	{	  
		daycnt=temp;
		temp1=1970;	
		while(temp>=365)
		{				 
			if(Is_Leap_Year(temp1))
			{
				if(temp>=366)temp-=366;
				else {temp1++;break;}  
			}
			else temp-=365;	  //ƽÄê 
			temp1++;  
		}   
		calendar.w_year=temp1;
		temp1=0;
		while(temp>=28)
		{
			if(Is_Leap_Year(calendar.w_year)&&temp1==1)
			{
				if(temp>=29)temp-=29;
				else break; 
			}
			else 
			{
				if(temp>=mon_table[temp1])temp-=mon_table[temp1];
				else break;
			}
			temp1++;  
		}
		calendar.w_month=temp1+1;	
		calendar.w_date=temp+1;  	
	}
	temp=timecount%86400;     			   
	calendar.hour=temp/3600;     	
	calendar.min=(temp%3600)/60; 	
	calendar.sec=(temp%3600)%60; 	
	calendar.week=RTC_Get_Week(calendar.w_year,calendar.w_month,calendar.w_date);  
	return 0;
}	 
																						 
u8 RTC_Get_Week(u16 year,u8 month,u8 day)
{	
	u16 temp2;
	u8 yearH,yearL;
	
	yearH=year/100;	yearL=year%100;  
	if (yearH>19)yearL+=100;
	temp2=yearL+yearL/4;
	temp2=temp2%7; 
	temp2=temp2+day+table_week[month-1];
	if (yearL%4==0&&month<3)temp2--;
	return(temp2%7);
}			  



⚔️项目获取

在这里插入图片描述▬▬▬▬▬▶点击获取源代码◀▬▬▬▬▬


评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日落悬崖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值