RTC实时时钟的初始化语句

2019-07-20 16:48发布

u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
 
if (BKP_ReadBackupRegister(BKP_DR1) != 0x4040)
//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化时钟失败,晶振有问题    
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟  
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步  
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2015,8,15,20,52,55);  //设置时间
RTC_ExitConfigMode(); //退出配置模式  
BKP_WriteBackupRegister(BKP_DR1, 0X4040); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{

RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config();//RCT中断分组设置         
RTC_Get();//更新时间
return 0; //ok

}



疑问一:RTC_SetPrescaler(32767); //设置RTC预分频的值
                     这个32767是通过那个公式来的?别说是定时器那个? 原子哥在视频里说1兆代表1秒 ?咋来的?

疑问二: RTC_WaitForLastTask();等待最近一次对 RTC 寄存器的写操作完成 RTC_WaitForSynchro();等待最近一次对 RTC 寄存器的写操作完成 这两个函数在固件库使用手册中功能描述是一致的呀//???怎么解释
  还有为啥要用这俩函数?
疑问三;为啥要在else下面也要设置RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成   这个函数?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-07-20 22:33
1,因为外部LSE是32.768Khz,这里设置的分频系数,32767,得到32768的分频,从而产生1秒计数时钟
2,3,看《STM32参考手册》
八度空间
2楼-- · 2019-07-21 00:22
 精彩回答 2  元偷偷看……
追破风的小石头
3楼-- · 2019-07-21 02:42
请问原子哥,我用的是8M的外部晶振,为什么初始化晶振时钟不通过呢?

一周热门 更多>