当前位置: 代码迷 >> 单片机 >> stm32 RTC有关问题
  详细解决方案

stm32 RTC有关问题

热度:96   发布时间:2016-04-28 16:01:54.0
stm32 RTC问题
void RTC_Config(void)
{
  //我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
  //第一次上电或后备电源掉电后,该寄存器数据丢失,
  //表明RTC数据丢失,需要重新配置
  if (BKP_ReadBackupRegister(BKP_DR1) != 0x0505)
  {
  //重新配置RTC
  RTC_Configuration();
   
  RTC_Set(2011,2,30,13,41,25);
  // Time_Set(23,59,59);
   
  //配置完成后,向后备寄存器中写特殊字符0xA5A5
  BKP_WriteBackupRegister(BKP_DR1, 0x0505);
  }
  else
  {
  //若后备寄存器没有掉电,则无需重新配置RTC
  //这里我们可以利用RCC_GetFlagStatus()函数查看本次复位类型
  if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
  {
  //这是上电复位
  }
  else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
  {
  //这是外部RST管脚复位
  }
  //清除RCC中复位标志
  RCC_ClearFlag();

  //虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
  //但是每次上电后,还是要使能RTCCLK???????
  RCC_RTCCLKCmd(ENABLE);

  //等待RTC时钟与APB1时钟同步
  RTC_WaitForSynchro();

  //使能秒中断
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
  //等待操作完成
  RTC_WaitForLastTask();
  }
   
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

#ifdef RTCClockOutput_Enable

  /* Disable the Tamper Pin */
  BKP_TamperPinCmd(DISABLE); 

  /* Enable RTC Clock Output on Tamper Pin */
  BKP_RTCOutputConfig(BKP_RTCOutputSource_CalibClock);
#endif
  
}


这是我从网上下载的代码,功能也实现了,但是还是有一个疑惑,我感觉在上电复位以后对rtc配置一次就够了,然后设置时间,在RTC_Set(2011,2,30,13,41,25);函数以后,我感觉就都不需要了。不知道这样理解对不对?

------解决方案--------------------
探讨
void RTC_Config(void)
{
//我们在BKP的后备寄存器1中,存了一个特殊字符0xA5A5
//第一次上电或后备电源掉电后,该寄存器数据丢失,
//表明RTC数据丢失,需要重新配置
if (BKP_ReadBackupRegister(BKP_DR1) != 0x0505)
{
//重新配置RTC
……

------解决方案--------------------
这是我从网上下载的代码,功能也实现了,但是还是有一个疑惑,我感觉在上电复位以后对rtc配置一次就够了,然后设置时间,在RTC_Set(2011,2,30,13,41,25);函数以后,我感觉就都不需要了。不知道这样理解对不对?

要看有没有完全掉电。。。

掉电后,数据会丢

如果确定不掉,理论上,那当然是设置一次就可以了

:)