必要知识:
1、Unix时间戳
2、time.h
localtime():将秒寄存器的值转化为当地时间
mktime():将指向的结构体转化为自1970年1月1日的秒数
注:在STM32中两函数换算出的时间均是0时区伦敦时间
一、BKP(Backup Registers)备份寄存器
BKP基本结构:
二、RTC实时时钟
除了
RTC_PRL、RTC_ALR、RTC_CNT和RTC_DIV
寄存器外,所有的系统寄存器都由系统复
位或电源复位进行异步复位
PRL重装寄存器就相当于定时器中的ARR,实际数值为PRL+1;DIV余数寄存器相当于定时器中的CNT(自减),当减到0时,PRL的值重装到DIV里,并产生一个脉冲
RTC操作注意事项:
在操作中,之所以等待是因为,总线的时钟频率与RTC的时钟频率不相同,RTC中的寄存器全部由RTC时钟驱动读写,所以在写的过程中,可能会出现不同步的现象,只有同步之后,才可以进行读写
三、RTC配置
(1)开启BKP和RTC的时钟,并使能对BKP和RTC的访问
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP,ENABLE); //开启BKP(备份寄存器)时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //开启PWR(电源控制)时钟
PWR_BackupAccessCmd(ENABLE); //使能对BKP和RTC的访问
(2)开始LSE时钟,并等待LSE时钟启动完成
RCC_LSEConfig(RCC_LSE_ON); //开启LSE时钟
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY != SET)); //等待LSE时钟启动完成
(3)选择RTC时钟源,并使能RTC时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择RTC时钟源
RCC_RTCCLKCmd(ENABLE);
(4)调用:等待同步、等待上一次写入操作完成
RTC_WaitForSynchro(); //等待同步
RTC_WaitForLastTask(); //等待前一次写操作结束
(5)配置预分频器(重装寄存器PRL)
RTC_SetPrescaler(32768-1);
RTC_WaitForLastTask();
(6)设置时间,即设置CNT计数器