RTC正常工作的一般配置步骤
1. 使能电源时钟和备份区域时钟
要访问 RTC 和备份区域就必须先使能电源时钟和备份区域时钟 ,通过 RCC_APB1ENR 寄存器来设置
RCC->APB1ENR |= 1<<28; //使能电源接口时钟
RCC->APB1ENR |= 1<<27; //使能备份区域时钟
2. 取消备份区写保护
要向备份区域写入数据,就要通过PWR_CR寄存器取消备份区域写保护(写保护在每次硬复位之后被使能),通过向备份区写一个字节,标记时钟已经被配置完成。
PWR->CR |= 1<<8; //取消备份区写保护
3.复位备份区域,开启外部低速振荡器
取消备份区写保护后,对这个区域复位。当然这个操作不要每次都执行,因为备份区域的复位将导致之前存在的数据丢失,所以要不要复位,要
通过BKP_DR1检测是否是第一次配置。然后我们使能外部低速振荡器,注意这里一般要先判断 RCC_BDCR 的 LSERDY位来确定低速振荡器已经就绪了才开始下面的操作。
if(BKP->DR1 != 0X5050) //是否是第一次配置
RCC->BDCR |= 1<<16; //备份区域软复位
RCC->BDCR &= ~(1<<16); //备份区域软复位结束
RCC->BDCR |= 1<<0; //开启外部低速振荡器
while((!(RCC->BDCR&0X02)) && temp<250){
//等待外部时钟就绪
temp++;
delay_ms(10);
};
if(temp>=250)
return 1; //初始化时钟失败,晶振有问题
4.选择 RTC 时钟,并使能
通过 RCC_BDCR 的 RTCSEL 来选择选择外部 LSE作为 RTC 的时钟。然后通过RTCEN 位使能 RTC 时钟。
RCC->BDCR|=1<<8; //LSE作为RTC时钟
RCC->BDCR |= 1<<15;//RTC时钟使能
while(!(RTC-&