OpenEdv-开源电子网

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

RTC实时时钟的初始化语句

[复制链接]

22

主题

109

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
367
金钱
367
注册时间
2015-5-28
在线时间
0 小时
发表于 2015-8-15 22:07:23 | 显示全部楼层 |阅读模式
5金钱

u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
 
if (BKP_ReadBackupRegister(BKP_DR1) != 0x4040)
//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 
BKP_DeInit(); //复位备份区域
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET&&temp<250) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化时钟失败,晶振有问题    
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟  
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForSynchro(); //等待RTC寄存器同步  
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
// RTC_EnterConfigMode();/// 允许配置
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2015,8,15,20,52,55);  //设置时间
RTC_ExitConfigMode(); //退出配置模式  
BKP_WriteBackupRegister(BKP_DR1, 0X4040); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{

RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_NVIC_Config();//RCT中断分组设置         
RTC_Get();//更新时间
return 0; //ok

}



疑问一:RTC_SetPrescaler(32767); //设置RTC预分频的值
                     这个32767是通过那个公式来的?别说是定时器那个? 原子哥在视频里说1兆代表1秒 ?咋来的?

疑问二:

RTC_WaitForLastTask();等待最近一次对 RTC 寄存器的写操作完成

RTC_WaitForSynchro();等待最近一次对 RTC 寄存器的写操作完成

这两个函数在固件库使用手册中功能描述是一致的呀//???怎么解释
  还有为啥要用这俩函数?

疑问三;为啥要在else下面也要设置RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成   这个函数?

最佳答案

查看完整内容[请看2#楼]

1,因为外部LSE是32.768Khz,这里设置的分频系数,32767,得到32768的分频,从而产生1秒计数时钟 2,3,看《STM32参考手册》
再不玩命努力,你就老了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-15 22:07:24 | 显示全部楼层
1,因为外部LSE是32.768Khz,这里设置的分频系数,32767,得到32768的分频,从而产生1秒计数时钟
2,3,看《STM32参考手册》
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-8-16 13:31:03 | 显示全部楼层
建议楼主结合STM32开发手册来看
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-14
在线时间
30 小时
发表于 2017-2-20 17:28:17 | 显示全部楼层
请问原子哥,我用的是8M的外部晶振,为什么初始化晶振时钟不通过呢?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 14:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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