OpenEdv-开源电子网

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

求教:使用RTC实时时钟总在非第一次配置卡住,见代码!

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2016-1-26
在线时间
12 小时
发表于 2016-11-16 10:29:36 | 显示全部楼层 |阅读模式
   这是初始化RTC的程序,就是用的原子大哥的,第一次上电可以,但是之后我只要下载,程序就会卡在代码中标红的地方RTC_WaitForSynchro(),请问大家这是什么情况。是因为我没装电池吗,但是没装电池的话,我之后怎么能走到else呢?


//检查是不是第一次配置时钟
    NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd (RCC_APB1Periph_PWR | RCC_APB1Periph_BKP,ENABLE );// 通过设置寄存器RCC_APB1ENR的PWREN 和BKPEN位来打开电源和后备接口的时钟
        PWR_BackupAccessCmd(ENABLE);     //电源控制寄存器(PWR_CR) 的DBP位来使能对后备寄存器和RTC的访问        
        
        if(BKP_ReadBackupRegister(BKP_DR1) != 0x1111)//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相符
        {
                printf("first time..\r\n");
                BKP_DeInit();                                     //初始化复位BKP寄存器
        #if OSE_ENA==1  //使用外部晶振        
                RCC_LSEConfig(RCC_LSE_ON);       //选择外部低速晶振
                while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);//设置后需要等待启动
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);////选择LSE为RTC设备 的 时钟,LSE为32.767KHZ
        #else           //使用内部晶振
                RCC_LSEConfig(RCC_LSE_OFF);//关闭LSE
                RCC_LSICmd(ENABLE);//使能LSI为40khz        
                while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);//设置后需要等待启动
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);////选择LSI为RTC设备 的 时钟,LSI为40khz        
        #endif
        
                RCC_RTCCLKCmd(ENABLE);; //使能RTC
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成               
                RTC_WaitForSynchro();        //等待同步
                RTC_ITConfig(RTC_IT_SEC, ENABLE);                //使能RTC秒中断
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成
                RTC_EnterConfigMode();/// 允许配置               
                RTC_WaitForLastTask();
                #if OSE_ENA==1        
                        RTC_SetPrescaler(32767);  //设置预分频值RTC period = RTCCLK/RTC_PR = (32.767KHZ)/(32767+1) 约等于1s
                #else
                        RTC_SetPrescaler(39999);  //设置预分频值RTC period = RTCCLK/RTC_PR = (40khz)/(39999+1) 约等于1s               
                #endif        
                RTC_WaitForLastTask();    /*查询RTOFF位,直到RTOFF的值变为1 */
                RTC_Set(2016,11,15,13,56,10);  //设置时间        
                RTC_ExitConfigMode(); //退出配置模式  
                BKP_WriteBackupRegister(BKP_DR1, 0x1111);        //向指定的后备寄存器中写入用户程序数据
        }
        else //系统继续计时
        {
                printf("not first time..\r\n");
                RTC_WaitForSynchro();        //等待最近一次对RTC寄存器的写操作完成
                RTC_ITConfig(RTC_IT_SEC, ENABLE);        //使能RTC秒中断
                RTC_WaitForLastTask();        //等待最近一次对RTC寄存器的写操作完成               
        }
                                
        //配置NVIC
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;   
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   
    NVIC_Init(&NVIC_InitStructure);               
        RTC_Get();//更新时间        
}

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

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2016-11-16 11:20:46 | 显示全部楼层
1、如果确认板子的RTC可以使用电源线供电,那可以不用纽扣电池。
2、如果在开始加一个配置时间和日期set_time,setdate这俩函数,试试可以执行过去吗?
自在随心
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2016-1-26
在线时间
12 小时
 楼主| 发表于 2016-11-17 09:21:32 | 显示全部楼层
yuzeyuan1 发表于 2016-11-16 11:20
1、如果确认板子的RTC可以使用电源线供电,那可以不用纽扣电池。
2、如果在开始加一个配置时间和日期set_t ...

兄弟,谢谢。你说的我都尝试过得,现在好了。感觉是keil编译器的原理,重启了电脑就好了,还是谢谢你的指导。
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2016-1-26
在线时间
12 小时
 楼主| 发表于 2016-11-17 09:22:48 | 显示全部楼层
已解决
回复 支持 反对

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2016-11-17 09:52:43 | 显示全部楼层
103会出现偶尔卡死在RTC初始化上,我现在设计不是在上电初始化上,这样即使RTC初始化失败也不影响其他的运用。
让我们的思维驾驭在电的速度之上!
回复 支持 反对

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2016-1-26
在线时间
12 小时
 楼主| 发表于 2016-11-28 13:44:20 | 显示全部楼层
DongInker 发表于 2016-11-17 09:52
103会出现偶尔卡死在RTC初始化上,我现在设计不是在上电初始化上,这样即使RTC初始化失败也不影响其他的运 ...

谢谢兄弟你的指导,我搞好了,一模一样的代码,重启下电脑编译下进去就醒了。。。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 15:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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