2023版 STM32实战9 RTC实时时钟/闹钟

RTC简介

实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。

注意事项

-1- 要手动配置中断寄存器
2023版 STM32实战9 RTC实时时钟/闹钟_第1张图片
-2- 需要等待写操作完成

-3- 时钟闹钟中段在同一个中断函数中

配置时钟

调用函数RTC_SetCounter();

函数里面的参数可通过计算获得如下图
2023版 STM32实战9 RTC实时时钟/闹钟_第2张图片

配置闹钟

调用函数RTC_SetAlarm();

函数里面的参数和时钟相同

代码编写 (F1可直接拷贝使用)

#include "stm32f10x.h"
#include "usart.h"

uint32_t TimeDisplay;

u32  Set_RTCTIME(u8 Hour,u8 Minute,u8 Sec);
void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* Configure one bit for preemption priority */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	
	/* Enable the RTC Interrupt */
	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	RTC->CRH |= 0x02;
}




 void RTC_Configuration(void)
 {
	//使能电源和后备接口时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	//使能后备寄存器和RTC的访问 
	PWR_BackupAccessCmd(ENABLE);
	BKP_DeInit();
	RCC_LSEConfig(RCC_LSE_ON);
	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	RCC_RTCCLKCmd(ENABLE);
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();
	RTC_ITConfig(RTC_IT_SEC, ENABLE);
	RTC_WaitForLastTask();
	RTC_SetPrescaler(32767);
	RTC_WaitForLastTask();
 }

 
 void Time_Adjust(void)
 {
	RTC_WaitForLastTask();
	RTC_SetCounter(Set_RTCTIME(16,24,50));
	RTC_WaitForLastTask();
	RTC_SetAlarm(Set_RTCTIME(16,24,53));
	RTC_WaitForLastTask();
 }

 int main(void)
 {	
	int a;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_Configuration();
	uart_init(115200);
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
	{
		printf("\r\n\n RTC not yet configured....");
		RTC_Configuration();
		printf("\r\n RTC configured....");
		Time_Adjust();
		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
	}
		RCC_ClearFlag();
	 
	 while(1)
	 {
		if( TimeDisplay==1 )
		{
			TimeDisplay=0;
			a=RTC_GetCounter();
			printf("%d\n", a / 3600);
			printf("%d\n",(a % 3600) / 60);
			printf("%d\n",(a % 3600) % 60);
		}
	 
	 }
	 
	 
	 
	 
 }
 
 
void RTC_IRQHandler(void)
{
	if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
	{
		/* Clear the RTC Second interrupt */
		RTC_ClearITPendingBit(RTC_IT_SEC);
		TimeDisplay = 1;
		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();
		
	}
		if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
	{
		/* Clear the RTC Second interrupt */
		RTC_ClearITPendingBit(RTC_IT_ALR);
		RTC_WaitForLastTask();
		printf("发生了闹钟的中断\r\n");
	}

}


u32  Set_RTCTIME(u8 Hour,u8 Minute,u8 Sec)
{
	
	return((Hour*3600 + Minute*60 + Sec));

}
 
 
 

工程获取

三连加关注后点击头像获取

你可能感兴趣的:(STM32软硬件实战,stm32,单片机,实时音视频)