打印

觉得受益,转来与大家共享:stm32 rtc问题

[复制链接]
2043|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jxmzzr|  楼主 | 2012-10-2 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);
  }
沙发
拿起书本| | 2012-10-3 18:43 | 只看该作者
很好的经验分享,有收获,感谢分享

使用特权

评论回复
板凳
it_yrj| | 2013-3-14 21:43 | 只看该作者
多谢分享

使用特权

评论回复
地板
启晨| | 2013-3-15 14:55 | 只看该作者
如何通过按键来调节时间。。。谢谢

使用特权

评论回复
5
yuchl| | 2013-6-4 09:10 | 只看该作者
不错!

使用特权

评论回复
6
xiaoye1113| | 2013-9-22 09:33 | 只看该作者

使用特权

评论回复
7
hugo0chen| | 2014-2-19 08:57 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

460

主题

2188

帖子

12

粉丝