OpenEdv-开源电子网

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

RTC中LSE开启失败问题

[复制链接]

12

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-6-28
在线时间
4 小时
发表于 2015-8-16 17:28:41 | 显示全部楼层 |阅读模式
5金钱


这个retry 初始值 是127 ,每 10ms 增加1, 怎么会有 == 0 的情况呢? 这条语句怎么检测 LSE开启失败的? 分析不通求助。

最佳答案

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

用我们的代码吧: [mw_shl_code=c,true] u8 RTC_Init(void) { //检查是不是第一次配置时钟 u8 temp=0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { BKP_DeInit(); //复 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-8-16 17:28:42 | 显示全部楼层
用我们的代码吧:
[mw_shl_code=c,true] u8 RTC_Init(void) { //检查是不是第一次配置时钟 u8 temp=0; RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟 PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问 if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎 { 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,1,14,17,42,55); //设置时间 RTC_ExitConfigMode(); //退出配置模式 BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据 } else//系统继续计时 { RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成 RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断 RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成 } RTC_NVIC_Config();//RCT中断分组设置 RTC_Get();//更新时间 return 0; //ok } [/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-8-16 17:28:42 | 显示全部楼层
库函数有点bug,应该是retry--才对。
[mw_shl_code=c,true]//RTC初始化 //返回值:0,初始化成功; // 1,LSE开启失败; // 2,进入初始化模式失败; u8 RTC_Init(void) { u16 retry=0X1FFF; RCC->APB1ENR|=1<<28; //使能电源接口时钟 PWR->CR|=1<<8; //后备区域访问使能(RTC+SRAM) if(RTC_Read_BKR(0)!=0X5050) //是否第一次配置? { RCC->BDCR|=1<<0; //LSE 开启 while(retry&&((RCC->BDCR&0X02)==0))//等待LSE准备好 { retry--; delay_ms(5); } if(retry==0)return 1; //LSE 开启失败. RCC->BDCR|=1<<8; //选择LSE,作为RTC的时钟 RCC->BDCR|=1<<15; //使能RTC时钟 //关闭RTC寄存器写保护 RTC->WPR=0xCA; RTC->WPR=0x53; if(RTC_Init_Mode())return 2;//进入RTC初始化模式 RTC->RER=0XFF; //RTC同步分频系数(0~7FFF),必须先设置同步分频,再设置异步分频,Frtc=Fclks/((Sprec+1)*(Asprec+1)) RTC->RER|=0X7F<<16; //RTC异步分频系数(1~0X7F) RTC->CR&=~(1<<6); //RTC设置为,24小时格式 RTC->ISR&=~(1<<7); //退出RTC初始化模式 RTC->WPR=0xFF; //使能RTC寄存器写保护 RTC_Set_Time(23,59,56,0); //设置时间 RTC_Set_Date(14,5,5,1); //设置日期 //RTC_Set_AlarmA(7,0,0,10); //设置闹钟时间 RTC_Write_BKR(0,0X5050); //标记已经初始化过了 } //RTC_Set_WakeUp(4,0); //配置WAKE UP中断,1秒钟中断一次 return 0; }[/mw_shl_code]

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

303

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2269
金钱
2269
注册时间
2015-2-3
在线时间
560 小时
发表于 2015-8-16 17:52:48 | 显示全部楼层
retry==0  说明  没有进入那个while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET)  循环  换而言之  就是LSE开启不了  那就是说明LSE开启失败了啊
STM32/LPC1788/51
回复

使用道具 举报

12

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-6-28
在线时间
4 小时
 楼主| 发表于 2015-8-16 20:56:59 | 显示全部楼层
回复【2楼】北极圈的黄昏:
---------------------------------
可申请变量的时候 就赋值 0x1fff 了呀,  怎么会是 0  呢? 难道代码错了?
回复

使用道具 举报

12

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
94
金钱
94
注册时间
2015-6-28
在线时间
4 小时
 楼主| 发表于 2015-8-17 00:07:38 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,那个就是你们的代码啊,o(╯□╰)o , 探索者开发板自带代码。《精通STM32F4(库函数版)》 233页 代码。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-10-3
在线时间
2 小时
发表于 2015-11-9 22:23:36 | 显示全部楼层
找了半天没找到为什么会retry++,原来是bug多谢原子哥。
回复

使用道具 举报

1

主题

20

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2015-10-16
在线时间
65 小时
发表于 2016-2-18 16:45:02 | 显示全部楼层
我说怎么源代码不对
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-7-15
在线时间
2 小时
发表于 2016-2-19 21:37:18 | 显示全部楼层
while((RCC->BDCR&0X02)==0)//等待LSE准备好
        {
            retry--;
            delay_ms(5);
            if(retry==0)return 1;       //LSE 开启失败.
        }
这样貌似更简单吧!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 03:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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