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的方式是不一样的,有使用时间戳的、也有自定义时间的。这个根据我们的需求来定。程序编写的过程中,一定要明白寄存器、程序代码的意思,才能更好的使用。 |