OpenEdv-开源电子网

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

采用内部晶振作为实时时钟配置 报错

[复制链接]

24

主题

89

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2012-8-29
在线时间
3 小时
发表于 2012-12-14 13:02:34 | 显示全部楼层 |阅读模式
想省一个外部低速晶振,因此修改了原子的实时时钟配置函数:


//实时时钟配置
//初始化RTC时钟,同时检测时钟是否工作正常
//BKP->DR1用于保存是否第一次配置的设置
//返回0:正常
//其他:错误代码

u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;

if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
// 测试:无论如何都进入配置:
// if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050 ||BKP_ReadBackupRegister(BKP_DR1) == 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
    PUT("\r\n\r\n Start Config RTC... \r\n");
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
PWR_BackupAccessCmd(ENABLE);    //使能后备寄存器访问 
BKP_DeInit(); //复位备份区域 

// RCC_LSEConfig(RCC_LSE_ON); //配置外部低速晶振:设置外部低速晶振(LSE),使用外设低速晶振
RCC_LSICmd(ENABLE);    // 配置内部低速晶振:使能内部低速晶振

// while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待外部低速晶振就绪
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //检查指定的RCC标志位设置与否,等待内部低速晶振就绪
{
temp++;
//delay_ms(10);  // 该函数只能用于外部低速晶振
delay_GSM(10000); // 延时函数
}
if(temp>=250)
{
PUT("\r\n\r\n Config RTC Failed... \r\n");
return 1; //初始化时钟失败,晶振有问题
}

// 配置RTC时钟:
// RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK), 选择LSE作为RTC时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //   选择LSI作为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(2009,12,2,10,0,55);   //设置时间
RTC_ExitConfigMode(); //退出配置模式  
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
PUT("\r\n\r\n Finish Config RTC... \r\n");
}
else //系统继续计时
{
PUT("\r\n\r\n Already Config RTC... \r\n");

RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}

RTC_NVIC_Config(); //RCT中断分组设置         
RTC_Get(); //更新时间
PUT("\r\n\r\n Config RTC Success... \r\n");
return 0; //ok

}





故障现象:

首次能配置成功,
第2次运行时,卡在RTC_WaitForSynchro()函数:

在 void RTC_WaitForSynchro(void)的while 里不出来了。
  while ((RTC->CRL & RTC_FLAG_RSF) == (uint16_t)RESET)
  {
  }



请教大师们:哪里配置错了? 谢谢!




我白天是个程序员,晚上就是个有抱负的演员。住在天朝的魔都,有条同名的狗......
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-10-21 03:10:40 | 显示全部楼层
回复 支持 反对

使用道具 举报

11

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2013-11-9
在线时间
145 小时
发表于 2014-5-8 15:26:37 | 显示全部楼层
我现在也碰到了你同样的问题  你现在处理好了吗?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-7 22:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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