首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

stm32 rtc(转)

stm32 rtc(转)

1:32768HZ晶体,选一般6pF--12.5pF的都可以(本身品质有问题例外),并非传说中的猛兽
2(重要):在STM32的VBAT脚与GND必须接至少一个陶瓷电容(100nF X7R介质材料)退藕,线要短/粗
3:32768HZ晶体的负载电容焊盘与晶体焊盘之间线要短/粗,实际安装的电容须为NPO介质材料
4:STM32 RTC起振到稳定需要时间(1--3秒,和温度有关)建议写代码先开启STM32 RTC,然后去初始化其他外设,最后来判断RTC状态 分2个函数 代码如下:
================================================================================================================================
u8 Cheak_RTC_MY(void)
{
   if(BKP_ReadBackupRegister(BKP_DR1)!=0xA5A5)
    {
              // u32 delay;
          //启用PWR和BKP的时钟(from APB1)
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
        //后备域解锁
        PWR_BackupAccessCmd(ENABLE);
        //备份寄存器模块复位
        BKP_DeInit();
        //外部32.768K
        RCC_LSEConfig(RCC_LSE_ON);
        
        return 1;
    }
   else
   {
                  //清除RCC中复位标志
        RCC_ClearFlag();
        
        //虽然RTC模块不需要重新配置,且掉电后依靠后备电池依然运行
        RCC_RTCCLKCmd(ENABLE);
        //等待RTC时钟与APB1时钟同步
        RTC_WaitForSynchro();
        
        //使能秒中断
        RTC_ITConfig(RTC_IT_SEC,ENABLE);
        //等待操作完成
        RTC_WaitForLastTask();
        
        RCC_ClearFlag();
   
    /* Enable PWR and BKP clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
   
    /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);
        
        return 0;  //RTC OK
     
   }
}

void Setup_RTC(void)
{      
        struct tm time_now;
       //等待稳定
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
        //RTC时钟源配置成LSE(外部32.768K)
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
        //RTC开启
        RCC_RTCCLKCmd(ENABLE);
        //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
        RTC_WaitForSynchro();
        //读写寄存器前,要确定上一个操作已经结束
        RTC_WaitForLastTask();
        //设置RTC分频器,使RTC时钟为1Hz
        //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
        RTC_SetPrescaler(32767);

        //等待寄存器写入完成
        RTC_WaitForLastTask();
        //使能秒中断
        RTC_ITConfig(RTC_IT_SEC, ENABLE);   
        //等待写入完成
        RTC_WaitForLastTask();
        
        
        time_now.tm_year = 2010;
        time_now.tm_mon = 6;
        time_now.tm_mday = 30;
        time_now.tm_hour = 12;
        time_now.tm_min = 00;
        time_now.tm_sec = 00;
        time_now.tm_isdst=0;//刚加的
        Time_SetCalendarTime(time_now);
        BKP_WriteBackupRegister(BKP_DR1,0xA5A5);//配置完成后,向后备寄存器中写特殊字符0xA5A5
        
        RCC_ClearFlag();
   
        // Enable PWR and BKP clocks
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);
   
        // Allow access to BKP Domain
        PWR_BackupAccessCmd(ENABLE);
}
//-------------------------------------------------------------------------------

u8 RTC_FG=0;

  /* Initialize the Demo */
  System_Init();
  RTC_FG=Cheak_RTC_MY();
  LCD_Init();
  //GPIOB->BSRR =GPIO_Pin_11;
  Key_GPIO_Init();
  
  
  LCD_write_english_string(5,66,"guanfu_wang@126.com",0X001F,0X0000);
// LCD_write_english_string(5,66+16,"RTC Init......",0Xf800,0X0000);
  if( RTC_FG==1)
  {
    Setup_RTC();
    LCD_write_english_string(5,66+16,"RTC Init....OK",0Xf800,0X0000);
  }
  else
  {
     LCD_write_english_string(5,66+16,"RTC ........OK",0Xf800,0X0000);
  }

ST官方授权代理,专营STM8/32
QQ 940436962
http://y-ec.taobao.com/
http://y-ec.taobao.com/
返回列表