
[STM32 ] RTC 实时时钟的系统时间维护 STM32内部带有RTC时钟,可以使用内部LSI和外部晶振LSE提供时钟源。 LSI:单片机内部的晶振,受外部环境影响比较大,比如温度等因素;大概40Khz左右; LSE:外接32.768KHz的晶振,比较稳定; 软件可配置选择时钟源,可判断识别是否起振。 驱动: 1、首先要启动对应的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); 2、使能RTC功能 PWR_BackupAccessCmd(ENABLE); 3、配置时钟 RCC_LSICmd(ENABLE); //内部晶振 RCC_LSECmd(ENABLE); //外部晶振 读取LSE状态 RCC_GetFlagStatus(RCC_FLAG_LSERDY) 读取LSI状态 RCC_GetFlagStatus(RCC_FLAG_LSIRDY) 4、操作RTC所有寄存器之前需要先确定总线为空闲才能操作成功; RTC_WaitForSynchro();//等待上一个指令执行完成; 5、初始化配置属性 //软件对时钟进行校准,HSE 按照32.768KHZ接入,公式如下: uwAsynchPrediv = 0xFF uwSynchPrediv = 0x7F ck_spre(1Hz)=RTCCLK(LSE)/(uwAsynchPrediv + 1)*(uwSynchPrediv+1) RTC_InitStructure.RTC_AsynchPrediv=uwAsynchPrediv; RTC_InitStructure.RTC_SynchPrediv=uwSynchPrediv; //24/12小时制 RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24; RTC_Init(&RTC_InitStructure); 6、时钟在不掉电的情况下只需要初始化一次即可,程序复位防止多次初始化,在BAK区域写初始化标志,可解决; RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2); 初始化前,读取RTC_BKP_DR0,查看是否为0x32F2,如果是,表示已经初始化成功。 if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2) 7、读取日期时间 RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure); 8、写入日期时间 RTC_SetTime(RTC_Format_BCD, &RTC_TimeStructure); 下面为此篇文章的重点 系统里面保存事件或者打印信息,都带有时标,不可能每次都去操作MCU的总线去读取RTC寄存器获取;或者是外部RTC芯片8025,IIC接口; 直接操作硬件缺点如下: 1、直接从硬件中获取事件,精度很难取到ms级别,芯片最小刻度为秒; 2、操作总线占用系统资源,降低MCU性能; 为解决这个事情,需要系统中有个维护软时钟功能,接替RTC的走时; 具体做法为: 1、开启定时器,具体根据需求定义周期,可开启一个1ms定时器; 2、软时钟1ms累加计数,1S=1000ms;累加到1000,秒数加1; 3、防止走时误差大,一小时建议同步一次时钟,从硬件RTC中,把时间读取一次到软时钟同步; |