STM32笔记--RTC

今天再一次学习了RTC,只能说自己曾经看的有点走马观花,今天重新学习到了很多,同时自己也心血来潮用几个小时制作了一个STM32+OLED的电子时钟,电子时钟的制作和讲解将写在下个博客里,希望大家多来看和评论。

附上博客链接:点击打开链接

下面我们来看看RTC的定义:RTC 提供了一系列连续工作的计数器,配合适当的软件,具有提供时钟-日历的功能。写入计数器的值可以设置整个系统的时间/日期。

以下为RTC的相关函数和函数描述

函数名                             描述
RTC_ITConfig  使能或者失能指定的 RTC 中断
RTC_EnterConfigMode  进入 RTC 配置模式
RTC_ExitConfigMode  退出 RTC 配置模式
RTC_GetCounter  获取 RTC 计数器的值
RTC_SetCounter  设置 RTC 计数器的值
RTC_SetPrescaler  设置 RTC 预分频的值
RTC_SetAlarm  设置 RTC 闹钟的值
RTC_GetDivider  获取 RTC 预分频分频因子的值
RTC_WaitForLastTask  等待最近一次对 RTC 寄存器的写操作完成
RTC_WaitForSynchro  等待 RTC 寄存器(RTC_CNT, RTC_ALR and RTC_PRL)与
RTC 的 APB 时钟同步
RTC_GetFlagStatus  检查指定的 RTC 标志位设置与否
RTC_ClearFlag  清除 RTC 的待处理标志位
RTC_GetITStatus  检查指定的 RTC 中断发生与否
RTC_ClearITPendingBit  清除 RTC 的中断待处理位

下面我们通过详细代码来记录

void RTC_NVIC_Config(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的中断开启我们不再赘述,前面已经说过了。

 
 
void RTC_CheckAndConfig(struct rtc_time *tm)
{
   	  /*在启动时检查备份寄存器BKP_DR1,如果内容不是0xA5A5,
	  则需重新配置时间并询问用户调整时间*/
	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
	{
		printf("\r\n\r\n RTC not yet configured....");

		/* RTC Configuration */
		RTC_Configuration();
		
		printf("\r\n\r\n RTC configured....");

		/* Adjust time by users typed on the hyperterminal */
		Time_Adjust(tm);

		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
	}
	else
	{
	  /*启动无需设置新时钟*/
		/*检查是否掉电重启*/
		if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
		{
		    printf("\r\n\r\n Power On Reset occurred....");
		}
		/*检查是否Reset复位*/
		else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
		{
			printf("\r\n\r\n External Reset occurred....");
		}
	
		printf("\r\n No need to configure RTC....");
		
		/*等待寄存器同步*/
		RTC_WaitForSynchro();
		
		/*允许RTC秒中断*/
		RTC_ITConfig(RTC_IT_SEC, ENABLE);
		
		/*等待上次RTC寄存器写操作完成*/
		RTC_WaitForLastTask();
	}
	   /*定义了时钟输出宏,则配置校正时钟输出到PC13*/
	#ifdef RTCClockOutput_Enable
	  /* Enable PWR and BKP clocks */
	  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	
	  /* Allow access to BKP Domain */
	  PWR_BackupAccessCmd(ENABLE);
	
	  /* Disable the Tamper Pin */
	  BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper
	                                 functionality must be disabled */
	
	  /* Enable RTC Clock Output on Tamper Pin */
	  BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
	#endif
	
	  /* Clear reset flags */
	  RCC_ClearFlag();

}
以上就是比较简单的一个代码解析,确实没什么可说的,但是注意一点, STM32自带的RTC精度是真的差,大概20分钟会误差40S左右,晶振使用的37k的晶振,精度不高,所以只能做着玩一下了。。。


猜你喜欢

转载自blog.csdn.net/vca821/article/details/80710631