RTC时钟简介:
实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可 提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。
RTC模块和时钟配置系统
(RCC_BDCR
寄存器
)
处于后备区域,即在系统复位或从待机模式唤醒后,RTC
的设置和时间维持不变。
系统复位后,对后备寄存器和RTC
的访问被禁止,这是为了防止对后备区域
(BKP)
的意外写操
作。执行以下操作将使能对后备寄存器和
RTC
的访问:
● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟
● 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。
![](https://i-blog.csdnimg.cn/blog_migrate/ad1f5cc1891f91048d832637c584520c.png)
RTC时钟的主要特性:
● 可编程的预分频系数:分频系数最高为
2
20
。
●
32
位的可编程计数器,可用于较长时间段的测量。
●
2
个分离的时钟:用于
APB1
接口的
PCLK1
和
RTC
时钟
(RTC
时钟的频率必须小于
PCLK1
时钟
频率的四分之一以上
)
。
●
可以选择以下三种RTC的时钟源:
─ HSE时钟除以128;(HSE时钟为8MHZ)----除与128为62.5KHZ
─ LSE振荡器时钟;(LSE时钟为32.768KHZ)
─ LSI振荡器时钟(波动太大,有选择的情况下基本不会选)
●
2
个独立的复位类型:
─
APB1
接口由系统复位;
─
RTC
核心
(
预分频器、闹钟、计数器和分频器
)
只能由后备域复位
。
●
3
个专门的可屏蔽中断:
─
闹钟中断,用来产生一个软件可编程的闹钟中断。
─
秒中断,用来产生一个可编程的周期性中断信号
(
最长可达
1
秒
)
。
─
溢出中断,指示内部可编程计数器溢出并回转为
0
的状态。
(因为内部计数器太大,需要好久才能产生溢出信号,所以很少用到溢出中断)
RTC配置过程:
1、配置思路:
(1)获得后备寄存器和RTC的写入权限;
(2)复位整个备份域
(3)选择时钟源(HSE,LSE),若选择LSE时钟则要先使能LSE时钟。保险起见,若选择了LSE而LSE损坏,RTC时钟将无用,所以我们要先判断外部低俗时钟LSE是否就绪,且设定一段时间,若超时也选择HSE。
(4)使能RTC时钟
(5)RTC的具体配置核心寄存器(计数器,分频器,设置中断等),具体步骤:
1. 查询RTOFF
位,直到
RTOFF
的值变为
’1’
2. 置CNF
值为
1
,进入配置模式
3. 对一个或多个RTC
寄存器进行写操作
4. 清除CNF
标志位,退出配置模式
5. 查询RTOFF
,直至
RTOFF
位变为
’1’
以确认写操作已经完成。
2、配置代码:
/******************************************************
函数功能:RTC时钟初始化
形参含义:无
返回值:无
*******************************************************/
void RTC_Init(void)
{
u16 BeyondTime = 0;//超时时间
//开启写入后备域的权限
RCC->APB1ENR |= 1<<27;
RCC->APB1ENR |= 1<<28;
PWR->CR |= 1<<8;
//复位整个后备域
RCC->BDCR |= 1<<16;
RCC->BDCR &= ~(1<<16);
//选择时钟
RCC->BDCR |= 1<<0;//外部低速时钟使能(LSE)
do
{
SysTick_Delay_ms(1);
BeyondTime++;
}while(!(RCC->BDCR & 1<<1) && BeyondTime != 0xfe);
if(BeyondTime != 0xfe) RCC->BDCR |= 1<<8;
else RCC->BDCR |= 3<<8;
//使能时钟
RCC->BDCR |= 1<<15;
//RTC基础配置
while(!(RTC->CRL & 1<<5)){}
RTC->CRL |= 1<<4;//进入配置模式
RTC->CNTH = 0;
RTC->CNTL = 0;//计数器清零
RTC->ALRH = 0;
RTC->ALRL = 15;//闹钟设为15秒进一次
RTC->PRLH = 0;
if(BeyondTime != 0xfe) RTC->PRLL = 0x7fff; //外部低速时钟---产生一秒需要的分频
else RTC->PRLL = 0xF423; //外部高速时钟---产生一秒需要的分频
//设置中断
RTC->CRH |= 1<<0;//开启秒中断
RTC->CRH |= 1<<1;//开启闹钟中断
SET_NVIC_SetPriority(RTC_IRQn,1,1); //设置中断优先级
RTC->CRL |= ~(1<<4);//退出配置模式
while(!(RTC->CRL & 1<<5)){}//完成这个步骤才能把这些配置写入RTC的寄存器中
}