BKP简介
本节使用的STM32F103C8T6是中容量单片机,所以只能存储20字节的数据,共有10个DR数据寄存器,每个寄存器能存储两个字节的数据。
配置BKP基本结构 
初始化配置模板
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE);
//使能对BKP和RTC的访问
PWR_BackupAccessCmd(ENABLE);//备份访问控制使能函数
上面的代码对应下面注意事项
要访问BKP,得先使能PWR和BKP的时钟,两者都是挂载在APB1上的设备
PWR_BackupAccessCmd(ENABLE);函数能使能对BKP和RTC的访问
接着使用BKP_WriteBackupRegister和BKP_ReadBackupRegister就能对BKP进行读写操作。
RTC简介
我们一般选择LSE作为RTC的时钟源,再经过分频器输出1Hz的信号给RTC的秒计数器
配置RTC的基本结构
我们先使能LSE外部低速时钟,然后选择LSE作为RTC的时钟源,再配置RTC各个参数就可以了,本节不使用闹钟和中断的功能。(RTC的配置不像之前一样用结构体来配置,只需要选择外部时钟源,设置分频器的值就好了)
初始化配置模板
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
//开启LSE时钟,并等待LSE时钟启动完成
RCC_LSEConfig(RCC_LSE_ON);//32.768KHz
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)!=SET);//等待标志位为1
//选择RTC_CLK时钟源
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
RCC_RTCCLKCmd(ENABLE);//使能
//等待时钟同步
RTC_WaitForSynchro();
//等待上一次操作完成
RTC_WaitForLastTask();
//配置预分频器
RTC_SetPrescaler(32768-1);//输出1Hz的时钟源给秒计数器
RTC_WaitForLastTask();//在每次写入操作之后调用一次
RTC_SetCounter(x);
RTC_WaitForLastTask();
具体注意事项见下图
代码前三步和BKP初始化一样,使能对RTC的访问。
这里开启LSE时钟不像之前一样使用 RCC_APB1PeriphClockCmd 函数,而是RCC_LSEConfig(RCC_LSE_ON);接着还要判断LSE是否准备完成,用判断标志位的函数。
接着使用RCC_RTCCLKConfig选择RTC的时钟源,别忘了使能RTC。
注意事项里的第二点和第四点,用两个无参的函数就能完成。分别是RTC_WaitForSynchro();和
RTC_WaitForLastTask();注意在每次写操作后都要调用第二个函数。
接着设置分频器的值,我们选择LSE作为时钟源,频率为32.768KHz,所以分频值选择32768。
秒计数器的值涉及到时间戳的知识点。
使用RTC_SetCounter和RTC_GetCounter可以对秒计数器进行读写操作,想要将秒计数器里的值转换成想要的年月日时分秒,需要用到<time.h>库里的函数。