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