OpenEdv-开源电子网

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

进入待机模式后 按下复位键后 卡在 RTC_WaitForSynchro();

[复制链接]

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-6-7
在线时间
21 小时
发表于 2016-6-21 18:32:45 | 显示全部楼层 |阅读模式
40金钱
本帖最后由 whyil 于 2016-6-21 21:31 编辑

[mw_shl_code=c,true]//RTC初始化
void rtc_init(void)
{
        //默认时间 2016.6.20 12:13:30        
        //这个时间是不是需要根据当前的gps时间或gprs时间设置 是在运行时修改还是在初始化时修改?
        //这里暂时使用固定时间        
        rtc_time time = {
                12,13,30,
                2016,6,20
        };
        
        myprintf("rtc init start\r\n");
        
        /* Enable PWR and BKP clocks */        //这个寄存器不在备份域
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

        /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);        //使能对后备寄存器和RTC的访问               
        
        //从指定备份域寄存器读取参数 不等代表第一次初始化rtc 相等已经初始化过rtc 跳过初始化过程
        if(BKP_ReadBackupRegister(BKP_DR1) != 0x5050)
        {                        
                /* Reset Backup Domain */
                BKP_DeInit();

                /* Enable the LSI OSC */
                RCC_LSICmd(ENABLE);
                /* Wait till LSI is ready */
                while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
                {}
                /* Select the RTC Clock Source */
                RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

                /* Enable RTC Clock */
                RCC_RTCCLKCmd(ENABLE);

                /* Wait for RTC registers synchronization */
                RTC_WaitForSynchro();

//                /* Wait until last write operation on RTC registers has finished */
//                RTC_WaitForLastTask();

//        //    /* Enable the RTC Second */
//        //    RTC_ITConfig(RTC_IT_SEC, ENABLE);

                /* Wait until last write operation on RTC registers has finished */
                RTC_WaitForLastTask();      //查询RTOFF位,直到RTOFF的值变为’1

                /* Set RTC prescaler: set RTC period to 1sec */
                RTC_SetPrescaler(40000);      //包含了进入和退出RTC设置模式 设置预分频 内部LSI约为40Khz

                /* Wait until last write operation on RTC registers has finished */
                RTC_WaitForLastTask();  //查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成
               
                //设置系统当前时间
                rtc_set_time(time);        
               
                BKP_WriteBackupRegister(BKP_DR1, 0X5050);        //向指定的后备寄存器中写入用户程序数据
        }
        else{
                /* Wait for RTC registers synchronization */
                RTC_WaitForSynchro();                           //按下复位后卡在了这里
        }
        
    NVIC_Configuration();    //设置中断优先级        
        
        myprintf("rtc init end\r\n");        
}[/mw_shl_code]

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

使用道具 举报

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-6-7
在线时间
21 小时
 楼主| 发表于 2016-6-21 18:35:45 | 显示全部楼层
但是通过闹钟事件唤醒并不会卡在RTC_WaitForSynchro(); 里可以唤醒
回复

使用道具 举报

14

主题

34

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2015-6-7
在线时间
21 小时
 楼主| 发表于 2016-6-21 21:30:14 | 显示全部楼层
当我没有设置 wakeUp的外部中断时 rtc闹钟事件和wakeup脚的上升沿(不是中断)都可以唤醒stm32,但是我把wakeup脚改成外部中断后,我的外部中断脚为上拉输入,进入待机模式后会有个下降沿,我的wakeup中断是上升沿和下降沿都触发导致我的芯片不能被rtc的闹钟唤醒 wakeup脚的上升沿也不能唤醒。
捕获1.PNG
捕获2.PNG
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-22 20:51:48 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 14:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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