配置RTC寄存器:
1.查询RTOFF位,知道RTOFF的值为1.
2.置CNF值为1,进入配置模式。
3.对一个或者多个RTC寄存器进行写操作。
4.清除CNF标志位,退出配置模式。
5.查询RTOFF,直到RTOFF位变1,已确认写操作已经完成。
仅当CNF标志位被清除时,写操作才能进行,这个操作至少需要3个RTCCLK周期。
RTC相关库函数
RTC时钟源和时钟操作函数:
void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
RTC配置函数(预分频,计数值):
void RTC_SetPrescaler(uint32_t PrescalerValue);//预分频配置:PRLH/PRLL
void RTC_SetCounter(uint32_t CounterValue);//设置计数器值:CNTH/CNTL
void RTC_SetAlarm(uint32_t AlarmValue);//闹钟设置:ALRH/ALRL
RTC中断设置函数:
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//CRH
RTC配置函数:
void RTC_EnterConfigMode(void);//允许RTC配置 :CRL位 CNF
void RTC_ExitConfigMode(void);//退出配置模式:CRL位 CNF
RTC同步函数:
void RTC_WaitForLastTask(void);//等待上次操作完成:CRL位RTOFF
void RTC_WaitForSynchro(void);//等待时钟同步:CRL位RSF
相关状态位获取清除函数:
FlagStatus RTC_GetFlagStatus(uint16_t RTC_FLAG);
void RTC_ClearFlag(uint16_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint16_t RTC_IT);
void RTC_ClearITPendingBit(uint16_t RTC_IT);
其他相关函数(BKP等)
PWR_BackupAccessCmd();//BKP后备区域访问使能
RCC_APB1PeriphClockCmd();//使能PWR和BKP时钟
RCC_LSEConfig();//开启LSE,RTC选择LSE作为时钟源
PWR_BackupAccessCmd();//BKP后备区域访问使能
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);//读BKP寄存器
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);//写BKP
配置RTC步骤
①使能PWR和BKP时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
1
② 使能后备寄存器访问:
PWR_BackupAccessCmd(ENABLE); //使能 RTC 和后备寄存器访问
1
③复位备份区域,开启外部低速振荡器。
BKP_DeInit();//复位备份区域
1
④ 配置RTC时钟源,使能RTC时钟:
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择 LSE 作为 RTC 时钟(RCC_RTCCLKSource_LSI 和 RCC_RTCCLKSource_HSE_Div128)
RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
1
2
⑤ 设置RTC预分频系数:RTC_SetPrescaler();
RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
⑥ 设置时间:
RTC_SetCounter();
RTC_EnterConfigMode();/// 允许配置
void RTC_SetCounter(uint32_t CounterValue);
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
⑦开启相关中断(可选):
void RTC_ITConfig(uint16_t RTC_IT, FunctionalState NewState);//RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能 RTC 秒中断
⑧编写中断服务函数:
RTC_IRQHandler();
⑨部分操作要等待写操作完成和同步。
RTC_WaitForLastTask();//等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步
具体的代码,库函数写的太多了,我会用CubeMx配置下,用HAL库写一个例程,几十行就可以解决RTC
全部0条评论
快来发表一下你的评论吧 !