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的晶振,精度不高,所以只能做着玩一下了。。。


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
江科大STM32笔记中提到了RTC(实时时钟)的相关内容。RTC是一个独立的定时器,可以提供时钟日历的功能,并且可以通过修改计数器的值重新设置系统的当前时间和日期。在STM32CubeMX中可以进行RTC的配置。 另外,EXTI是外部中断线,它可以监测指定GPIO口的电平信号变化,并且当GPIO口产生电平变化时,EXTI会向NVIC(中断向量控制器)发出中断申请。经过NVIC的裁决后,CPU可以执行对应的中断程序。EXTI和NVIC的时钟在STM32中是默认打开的,因为NVIC是内核的外设,不需要手动开启时钟,而RCC(时钟控制寄存器)负责管理内核外的外设。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STM32CubeMX RTC配置STM32 RTC时钟掉电日期不更新](https://download.csdn.net/download/qq_22560021/85415300)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [STM32学习笔记(基于B站江科大标准库教程)](https://blog.csdn.net/weixin_62127790/article/details/128665970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值