
1、RTC简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。 系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问: ●设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时钟 ●设置寄存器PWR_CR的DBP位使能对后备寄存器和RTC的访问。 2、主要特性 ●可编程的预分频系数:分频系数最高为220。 ●32位的可编程计数器,可用于较长时间段的测量。 ●2个单独的时钟:用于APB1接口的PCLK1和RTC时钟(此时的RTC时钟必须小于PCLK1时钟的四分之一以上) ●可以选择以下三种RTC的时钟源: ─HSE时钟除以128 ─LSE振荡器时钟 ─LSI振荡器时钟(详见6.2.8节RTC时钟) ●2种独立的复位类型: ─APB1接口由系统复位 ─RTC核心(预分频器、闹钟、计数器和分频器)只能由后备域复位(详见6.1.3节)。 ●3个专门的可屏蔽中断: ─闹钟中断,用来产生一个软件可编程的闹钟中断。 ─秒中断,用来产生一个可编程的周期性中断信号(最长可达1秒)。 ●溢出中断,检测内部可编程计数器溢出并回转为0的状态。 3、RTC初始化配置 /******************************************************************************* * Function Name : RTC_Configuration * Description : RTC配置 * Input : * Output : * Return : None *******************************************************************************/ void RTC_Configuration(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE); BKP_DeInit(); RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);//时钟配置,选择分频方式 RCC_RTCCLKCmd(ENABLE); RTC_WaitForSynchro(); RTC_WaitForLastTask(); RTC_ITConfig(RTC_IT_SEC, ENABLE); RTC_WaitForLastTask(); RTC_SetPrescaler(93750); /* RTC period = RTCCLK/RTC_PR = (93.750 KHz)/(RTC+1) */ RTC_WaitForLastTask(); } 4、RTC时钟配置 /******************************************************************************* * Function Name : RTC_TimeSet * Description : RTC时间设置 * Input : HH:输入小时,MM:输入分钟,SS:输入秒 * Output : * Return : None *******************************************************************************/ void RTC_TimeSet(u8 HH,u8 MM,u8 SS) { u32 TimeCount; TimeCount=HH*3600+MM*60+SS; RTC_WaitForLastTask(); //等待上一次的RTC操作完成 RTC_SetCounter(TimeCount); //时间的存储方式是以秒的方式来存储的 RTC_WaitForLastTask(); } 5、RTC中断的开启 /******************************************************************************* * Function Name : RTC_It * Description : * Input : * Output : * Return : None *******************************************************************************/ void RTC_It(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;//选择中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =6;//中断优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;开启中断 NVIC_Init(&NVIC_InitStructure); } 我们在日常使用RTC的时候需要用到很多的寄存器,这里就不一一说明了。大家可以参考手册来使用寄存器。因为ST提供了成熟的库文件,我们只需要明白每个库里面程序的意思就可以了。这样省去了我们开发底层驱动的时间,如果大家认为不太好用,也可以自己编写程序,这样就需要明白寄存器的内容了。 很多方案使用RTC的方式是不一样的,有使用时间戳的、也有自定义时间的。这个根据我们的需求来定。程序编写的过程中,一定要明白寄存器、程序代码的意思,才能更好的使用。 |
学习了 |