一 RTC 的三个专门的可屏蔽中断 :
1报警中断:软件可编程的报警中断 (相当于一个RTC的比较中断,详细:第三部分注释1)
2秒中断:可编程的周期性中断
3溢出中断:检测内部编程计数器溢出的中断信号。
二 两个独立的复位
1 APB1接口由系统复位
2 RTC 核复位 由备份域复位
三 RTC的重要组成部分
1 APB1系统时钟
2 RTC核 部分分为两个模块: 第一个模块RTC预分频包含了一个20位的可编程预分频器,可
编程产生最长为1S的RTC基准TR_CLK。( RTC_DIV和RTC_PRL 寄存器)
3 第二个模块是可编程计数器,可被初始化当前系统时钟(RTC_CNT)。
( 注1:系统时间一基准TR_CLK计数,若RTC_CR寄存器设置相应允许位,RTC_ALR设置可编
程时间比较值,则在RTC_CNT与RTC_ALR相等的情况下产生报警中断,溢出中断和秒中
断设置使能位就行了,很好理解的。)
四 两个单独的时钟:
1 APB1接口的PCLK时钟。
2 RTC基准时钟(RTC时钟必须小于1/4PLCK1)
五 操作RTC寄存器
1 RTC寄存器的复位:PRL ALR CNT DIV 仅通过备份域复位,此外的由时钟和电源复位
2 读RTC寄存器: 由于相关的寄存器只有在RTC时钟的上升沿才有效更新,这意味着APB1接口
开启后通过APB1读取的值因RTC寄存器还未及时更新而出现错误,
有以下几种情况特别注意:
1发生了系统复位和电源复位
2系统从待机模式下唤醒
3 系统从停机模式下被唤醒
这几种情况下APB接口是被禁止的,RTC核仍在运行的状态,那么在这些情况下我们要先
等到RSF位复位被置1。
3 RTC寄存器配置: 1 查询,仅当RTOFF位,被置1才可以向RTC寄存器写入新值。
2 置CNF为1 ,进入配置模式。才能写RTC—PRL RTC—ALRRTC—CNT RTC—DIV
3 清除CNF,退出配置模式;
4 查询RTOFF位是否为1,以确认最后的写结束了。
4 相关标志位的写操作:RTC标志位会在情况满足的情况下会自动置位,对于报警和秒中断的标志位可通过如下写操作
1 使用RTC报警中断,在RTC中断处理程序中对RTC报警/RTC_CNT修改.
2等待RTC控制寄存器中的SECF被设置了,RTC报警/RTC_CNT修改
实例配置
/*******************************************************************************
* Function Name : RTC_Configuration
* Description : PTC_clclk
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void RTC_Configuration (void)
{
/*配置RTC时钟源*/
/* 允许访问BKP*/
PWR_BackupAccessCmd(ENABLE);
/*复位备份域*/
BKP_DeInit();
/*允许LSE*/
RCC_LSEConfig(RCC_LSE_ON);
/*等待LSE有效*/
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET) ;
/*选择LSE做为RTC时钟 */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/*允许RTC时钟*/
RCC_RTCCLKCmd(ENABLE);
/*配置RTC*/
/*等待RTC APB同步*/
RTC_WaitForSynchro();
/*预分频值为1s*/
RTC_SetPrescaler(32767);
/*等待最后一条写指令完成*/
RTC_WaitForLastTask();
/*允许RTC报警中断*/
RTC_ITConfig(RTC_IT_ALR, ENABLE);
/*等待最后一条写指令完成*/
RTC_WaitForLastTask();
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』