STM3f10x的RTC时能涉及到的寄存器有RCC,BKP和RTC这三个大类寄存器;其中RCC主要控制了实时时钟和备份区的电源使能和时钟使能;RTC模块和时钟配置系统的寄存器是在后备区域的(即BKP),通过BKP后备区域来存储RTC配置的数据可以让在系统复位或待机模式下唤醒后RTC里面配置的数据维持不变;为此备份区还得涉及一个寄存器PWR,电源管理寄存器,备份区的写保护位在PWR->CR的第八位。
由于整个RTC都是位于后备区,而且RTC的APB1总线和内核的APB1总线是独立的,所以在系统复位和唤醒时,RTC和BKP的那些时钟不用从新配置;他们只受Backup domain software reset这个位和系统完全掉电的影响。所以呢;RTC只要有备用电池,它可以完全独立工作。
图一
图二
大家要清楚f10x系列的RTC算不上一个真正意义上的RTC,它只是一个计数器,精度上难免差强人意,所以设计要注意是否满足计时要求。
如果是要实现实时时间以上所有的寄存器都要有相应设置,如果只用秒中断,那么只需要设置RCC和RTC的寄存器就可以了。
以下以实现实时时钟为例讲解初始化过程。
- 检测后备区是否已有有效标记
BKP->DR1 != 0x5050;//(DR1 TO DR42)
BKP_ReadBackupRegister(BKP_DR1) != 0x5050;
- 开启电源管理和备份区时钟
(RCC->APB1ENR |=1<<28;//POWER);
(RCC->APB1ENR |=1<<27;//BACKUP);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
- 取消备份去写保护
(PWR->CR |=1<<8;//WP);
RCC->BDCR |=1<<16;
RCC->BDCR &=~(1<<16);
RCC->BDCR |=1<<0;
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
- 选择32k为RTC时钟并使能RTC
-
-
- 库函数
-
-
- 等待RTC操作和同步完成
-
-
- 库函数
-
-
- 使能秒中断
-
-
- 库函数
RTC_ITConfig(RTC_IT_SEC, ENABLE);
//set time---
BKP_WriteBackupRegister(BKP_DR1, 0X5050);
- 如果时钟已被设置过(RTC没有断电)
- 等待同步
- 开中断
- 等待操作完成
- 库函数
-
RTC_ITConfig(RTC_IT_SEC, ENABLE);
最后配置RTC中断优先级。