接着我们读取备份寄存器BKP_DR1 中的值来判断是否是第一次上电,如果不是则直接显示时钟,否则进行时间设置。当BKP_DR1的值不为0xAAAA,说明是第一次上电,此时需要对RTC进行初始化。注意初始化的实现函数RTC_Configuration();,为什么那么写,请参考我们之前给出的“第一次使用RTC的配置工作总结”,然后进行时钟设置。
(BKP_ReadBackupRegister(BKP_DR1)!= 0xABCD) 注意:BKP的寄存器有纽扣电池的时候,即使没有外部电源,也不会进行复位。 void RTC_Init(void) { // 1. 启用 PWR 和 BKP 外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); // 启用 PWR 外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ...
若断电则进行初始化,相当于用BKP做了一个标志位if(BKP_ReadBackupRegister(BKP_DR1)!
BKP在本例程中的作用就是用于检测RTC是否被配置,通过向BKP_DR1寄存器写入一个任意的值,来判断RTC是否被配置。整体流程图如下: NO YES 配置NVIC 上电检测BKP寄存器 BKP寄存器是否为0x1234? 配置RTC并向BKP寄存器写入0x1234 通过串口助手设置RTC的时间 清除复位标志位 等待RTC的寄存器同步 使能RTC秒中断 向串口显示...
接着我们读取备份寄存器BKP_DR1中的值来判断是否是第一次上电,如果不是则直接显示时钟,否则进行时间设置。当BKP_DR1的值不为0xAAAA,说明是第一次上电,此时需要对RTC进行初始化。注意初始化的实现函数RTC_Configuration();,为什么那么写,请参考我们之前给出的“第一次使用RTC的配置工作总结”,然后进行时钟设置。
比如我们可以在RTC初始化之后,对BKP_DR1寄存器写入一个值,比如0x5050,然后在 RTC_Init(void)函数开始处,先读取并判断BKP_DR1寄存器的值是否为0x5050,进而可以知道系统的RTC是否有VBAT外部电源维持供电。 STM32时钟系统 参考《STM32中文参考手册》中对STM32的时钟系统的详细说明。
1. 在退出配置模式更新配置之后我们在备份区域 BKP_DR1 中写入 0X5050 代表我们已经初始化过时钟了,下次开机(或复位)的时候,先读取 BKP_DR1 的值,然后判断是否是0X5050 来决定是不是要配置。接着我们配置 RTC 的秒钟中断,并进行分组。 往备份区域写用户数据的函数是: ...
这两个宏的值中,BKP_DR1是备份域的其中一个寄存器,而0xA5A5则是随意选择的数字,只要写入和检测一致即可。 TIME_ZOOM:这个宏用于设置时区的秒数偏移,例如北京时间为(GMT+8)时区,即相对于格林威治时间(GMT)早8个小时,此处使用的宏值即为8个小时的秒数(8*60*60),若使用其它时区,修改该宏即可。
OLED_ShowHexNum(1, 1, BKP_ReadBackupRegister(BKP_DR1), 4); } } RTC简介 RTC(Real Time Clock)实时时钟,是一个独立的定时器,可为系统提供时钟和日历的功能 RTC和时钟配置系统(RCC_BDCR寄存器)处于后备区域,系统复位或从待机模式唤醒时,数据不清零,RTC的设置和时间维持不变VDD(2.0~3.6V)断电后可借助VBAT...
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource); 时钟输出功能的配置,可以选择在RTC引脚上输出时钟信号,输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲 void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue); 设置RTC校准值,写入RTC校准寄存器 void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Da...