OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6386|回复: 11

RTC实时时钟

[复制链接]

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
发表于 2013-1-26 16:07:53 | 显示全部楼层 |阅读模式

u8 RTC_Init(void)
{
 //检查是不是第一次配置时钟
 u8 temp=0;
 if(BKP->DR1!=0X5050)//第一次配置
 { 
    RCC->APB1ENR|=1<<28;     //使能电源时钟    
  RCC->APB1ENR|=1<<27;     //使能备份时钟    
  WR->CR|=1<<8;           //取消备份区写保护
  RCC->BDCR|=1<<16;        //备份区域软复位   
  RCC->BDCR&=~(1<<16);     //备份区域软复位结束    
     RCC->BDCR|=1<<0;         //开启外部低速振荡器
     while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪 
  {
   temp++;
   delay_ms(10);
  };
  if(temp>=250)return 1;//初始化时钟失败,晶振有问题    

  RCC->BDCR|=1<<8; //LSI作为RTC时钟     
  RCC->BDCR|=1<<15;//RTC时钟使能  
    while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 
     RTC->CRH|=0X01;      //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 
  RTC->CRL|=1<<4;              //允许配置   
  RTC->RLH=0X0000;
  RTC->RLL=32767;             //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767          
  Auto_Time_Set();
  //RTC_Set(2012,12,26,9,40,35);  //设置时间  
  RTC->CRL&=~(1<<4);           //配置更新
  while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成             
  BKP->DR1=0X5050;
  //BKP_Write(1,0X5050);;//在寄存器1标记已经开启了
  //printf("FIRST TIME\n");
 }else//系统继续计时
 {
     while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步 
     RTC->CRH|=0X01;      //允许秒中断
     while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
  //printf("OK\n");
 }           
 MY_NVIC_Init(0,0,RTC_IRQChannel,2);//RTC,G2,P2,S2.优先级最低    
 RTC_Get();//更新时间
 return 0; //ok
}
我想知道什么时候要执行while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成,什么时候不需要执行呢?

天道酬勤
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2012-10-11
在线时间
6 小时
发表于 2013-1-26 20:09:50 | 显示全部楼层
为什么不执行,你可以查一下是否满足执行的条件
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-26 23:29:59 | 显示全部楼层
在<stm32参考手册>,rtc部分的介绍,其实都已经提到了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
 楼主| 发表于 2013-2-1 10:20:10 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
手册里面介绍是说要等到上一次RTC寄存器操作有没有完成,那按照这个意思的话他是不是应该每对RTC寄存器进行写操作一次就要判断一下寄存器操作有没有完成呢???
天道酬勤
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-1 10:33:28 | 显示全部楼层
回复【4楼】xly0907:
---------------------------------
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
 楼主| 发表于 2013-2-1 17:48:21 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
那要这样的话  
那RTC->CRL|=1<<4;              //允许配置    
  RTC->RLH=0X0000;
   RTC->RLL=32767;             //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767     
这个后面也应该是要加上while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成         的啊    为什么这里又不要呢???
天道酬勤
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-2-2 11:22:53 | 显示全部楼层
不好意思,4楼我的回答是不对的.
不是所有的RTC寄存器操作,都需要等待完成,以上的等待都是在操作RTC_CRL的时候,才出现的动作.
在16.4.2接的表格后面,有提到:RTC的功能由这个控制寄存器控制。当前一个写操作还未完成时(RTOFF=0时,详见16.3.4节),不能写RTC_CR寄存器。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

39

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
金钱
417
注册时间
2012-12-23
在线时间
19 小时
 楼主| 发表于 2013-2-4 12:22:04 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
哦,我明白了。。。非常感谢原子哥
天道酬勤
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
发表于 2013-11-15 21:54:17 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5052) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{  
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问 
BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值 
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)
return 1;//初始化时钟失败,晶振有问题     
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟  
~~~~~~~RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成(寄存器同步标志位RSF)
~~~~~~~RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成(RTC操作关闭RTOFF)
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2013,11,4,10,49,55);  //设置时间   
BKP_WriteBackupRegister(BKP_DR1, 0X5052); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{

RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}           
RTC_Get();//更新时间
RCC_ClearFlag(); //清除RCC的复位标志位
return 0; //ok
}

原子哥,对于这个等待上一次操作完成还是有点搞不懂啊!手册上说对RTC的寄存器(RTC_CR,RTC_PRL,RTC_CNT,RTC_ALR)进行写操作时要等待上一次操作的完成(RTC_WaitForLastTask()),这点可以理解,但是对上面用波浪线标记出来的两行代码的区别不是很明白啊?什么时候需要加RTC_WaitForSynchro()呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-16 12:15:19 | 显示全部楼层
回复【9楼】黑小子mxx:
---------------------------------
看参考手册吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

16

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2013-11-13
在线时间
0 小时
发表于 2013-11-16 19:15:04 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
原子哥,我又仔细看了一下手册,我得到这样的结果:
1、在对RTC_CR寄存器进行操作之前必须等待寄存器同步:RTC_WaitForSynchro();
2、在对RTC_CR,RTC_PRL,RTC_CNT,RTC_ALR进行操作之前必须等待上一次操作完成:RTC_WaitForLastTask();
3、也就是说在对RTC_CR操作之前既要等待同步,又要等待上一次操作完成

不知道我理解的对不对,还望原子哥指点!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-16 21:04:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-9 07:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表