注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Leo

笑:胸怀,傲:实力,才能笑傲江湖。

 
 
 

日志

 
 

STM32 RTC设置  

2011-10-06 19:13:39|  分类: 大学留笔 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

RTC配置:

1.打开电源管理和备份寄存器时钟。这个在RCC配置中打开。

 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

2.使能RTC和备份寄存器的访问(复位默认关闭)。

 PWR_BackupAccessCmd(ENABLE);

3.检查电池是否断电过(是否RTC初始化过),通过的话直接跳到第4步。

 if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)

{

  A.  BKP_DeInit();//BKP寄存器全部设为缺省值

  B.  RCC_LSEConfig(RCC_LSE_ON);  //RCC打开了LSE时钟
  C.  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);//等待LSE就绪,如果谐振不对,就会死在这里.

  D.  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//RTC使用时钟源LSE
  E.  RCC_RTCCLKCmd(ENABLE);//RTC的时钟开启

  F.  RTC_WaitForSynchro();//RTC等待同步

  G.  RTC_WaitForLastTask();//等待就绪

  H.  RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断

  I.  RTC_SetPrescaler(32767);//RTC预分频,32768HZ

  J.  RTC_WaitForLastTask();

  K.  BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);//往备份域寄存器中写一个特殊的字符

  L.  SetDateTime((TagDateTime *)&DefaultSystime);  //设置一个初始时间

     PWR_BackupAccessCmd(DISABLE);//禁止RTC后备寄存器的写 ??? 

  M.  RCC_ClearFlag();  //清除RCC重启标志

}

else

{

4.RTC_WaitForSynchro();//RTC等待同步

5.AdjustRtcTime();//配置系统时间,主要是考虑到断电重启如何恢复系统时间

6.RTC_ITConfig(RTC_IT_SEC, ENABLE); // 使能RTC秒中断

7.RTC_WaitForLastTask();

PWR_BackupAccessCmd(DISABLE);//禁止RTC后备寄存器的写 ??? 

8.RCC_ClearFlag();  //清除RCC重启标志

}

 

对了前提还必须对RTC中断进行配置:

 
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
 

注意:
1. 上电后要检查备份电池有没有断过电。如何检查? 恩,RTC的示例代码中已经明示:
   往备份域寄存器中写一个特殊的字符(0xA5A5),备份域寄存器是和RTC一起在断电下能保存数据的。
   上电后检查下这个特殊字符是否还存在,如果存在,ok,RTC的数据应该也没丢,不需要重新配置它
   如果那个特殊字符丢了,那RTC的定时器数据一定也丢了,那我们要重新来配置RTC了
   这个过程包括时钟使能、RTC时钟源切换、设置分频系数等等,这个可以参考FWLib\example\RTC\Calendar的代码
   在我的这个实例里,检查备份域掉电在Init.c的RTC_Conig()中,函数内若检测到BKP掉电,则会调用RTC_Configuration()

2. 因为RTC的一些设置是保存在后备域中的,so,操作RTC的设置寄存器前,要打开后备域模块中的写保护功能。
3. RTC设定值写入前后都要检查命令有没有完成,调用RTC_WaitForLastTask();

  评论这张
 
阅读(2829)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017