打印
[STM32L1]

STM32L15X StopMode下WakeUp唤醒问题探讨

[复制链接]
5316|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keno52|  楼主 | 2013-11-7 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32L15X搭建了系统,系统初始化配置了RTC和IWDG,初始化完成后进入StopMode,喂狗在RTC的WakeUp中完成。

现遇到如下现象:
1、系统上电,待WakeUp时间到,能正常唤醒进行喂狗;
2、因为是低功耗设计,所以在喂狗完成后,重新进入StopMode,问题出来了,WakeUp的中断无法再进入,系统产生复位;
3、验证性尝试:在WakeUp的中断中重新调用RTC配置,重新进入StopMode后依然无法进入WakeUp中断;
4、验证性尝试:在喂狗完成后,不再重新进入StopMode,WakeUp中断不会失效,能正常进入中断喂狗,系统不复位。

各位看官有无遇到类似问题?如有该如何解决?
欢迎大家探讨。本人会在一楼贴上测试代码。
沙发
keno52|  楼主 | 2013-11-7 11:37 | 只看该作者
/***********************************************************
Function name        : RTC_Config
Function type        : void
Description        : RTCÅäÖÃ
Parameter        : None
Return                : None
***********************************************************/
void RTC_Config(void)
{
        //ʹÄÜPWRʱÖÓ
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);       

        PWR_RTCAccessCmd(ENABLE);        //ÔÊÐí·ÃÎÊRTC

        RCC_RTCResetCmd(ENABLE);        //¸´Î»RTCÓò
        RCC_RTCResetCmd(DISABLE);        //

        RCC_LSEConfig(RCC_LSE_ON);        //¿ªÆôLSE

        //µÈ´ýLSEÆðÕñ²¢Îȶ¨
        while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)       
        {
        }

        //Ñ¡ÔñLSEΪRTCʱÖÓÔ´
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);               

        RCC_RTCCLKCmd(ENABLE);                //ʹÄÜRTCʱÖÓ

        RTC_WaitForSynchro();                //µÈ´ýRTC¼Ä´æÆ÷ÓëAPBʱÖÓͬ²½
}

/***********************************************************
Function name        : RTC_InitConfig
Function type        : void
Description        : RTC³õʼ»¯ÅäÖÃ
Parameter        : None
Return                : None
***********************************************************/
void RTC_InitConfig(void)
{
        RTC_InitTypeDef RTC_InitStructure;
       
        if (RTC_ReadBackupRegister(RTC_BKP_DR0) != 0x32F2)
        {  
                RTC_Config();                //RTCÅäÖÃ

                //ÅäÖÃRTCÊý¾Ý¼Ä´æÆ÷ºÍÔ¤·ÖƵÆ÷
                RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
                RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
                RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
               
                if (RTC_Init(&RTC_InitStructure) == ERROR)
                {
                        //printf("\n\r RTC Prescaler Config failed \n\r");
                }
                RTC_SetInitTimeDate();        //ÉèÖóõʼʱ¼ä       
        }
        else
        {
                if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)                //¼ì²éÊÇ·ñµçÔ´¸´Î»
                {
                        //printf("\r\n Power On Reset occurred....\n\r");
                }
                else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)        //¼ì²éÊÇ·ñ¹Ü½Å¸´Î»               
                {
                        //printf("\r\n External Reset occurred....\n\r");
                }
                //printf("\n\r No need to configure RTC....\n\r");

                RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                //ʹÄÜPWRʱÖÓ

                PWR_RTCAccessCmd(ENABLE);                                                                //ÔÊÐí·ÃÎÊRTC

                //RCC_RTCCLKCmd(ENABLE);                                                                //ʹÄÜRTCʱÖÓ
               
                RTC_WaitForSynchro();                                                                        //µÈ´ýRTC¼Ä´æÆ÷ÓëAPBʱÖÓͬ²½
               
                //RTC_ClearFlag(RTC_IT_WUT);                                                        //Çå³ýRTC±¨¾¯±êÖ¾
        }
        RTC_SetWakeUpTime();        //ÉèÖû½ÐÑÖжÏʱ¼ä
}

/***********************************************************
Function name        : RTC_SetWakeUpTime
Function type        : void
Description        : RTCÉèÖóõʼ»¯Ê±¼ä
Parameter        : None
Return                : None
***********************************************************/
void RTC_SetWakeUpTime(void)
{
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        //RTC WakeUpÖжÏÅäÖÃ
        EXTI_ClearITPendingBit(EXTI_Line20);
        EXTI_InitStructure.EXTI_Line         = EXTI_Line20;
        EXTI_InitStructure.EXTI_Mode         = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        //ʹÄÜRTC WakeUpÖжÏ
        NVIC_InitStructure.NVIC_IRQChannel                                         = RTC_WKUP_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority                  = 0x0F;
        NVIC_InitStructure.NVIC_IRQChannelCmd                                  = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

        //ʹÄÜRTC WakeUpÖжÏ
        RTC_ITConfig(RTC_IT_WUT, ENABLE);
       
        //ʹÄÜRTC WakeUp¹¦ÄÜ
        RTC_WakeUpCmd(ENABLE);
       
        RTC_WakeUpCmd(DISABLE);
        RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);        //WakeUpʱÖÓµÈÓÚ1HzÄÚ²¿Ê±ÖÓ
        RTC_SetWakeUpCounter((WAKEUPTIME - 1));
        RTC_WakeUpCmd(ENABLE);
}

/***********************************************************
Function name        : SetInitTimeDate
Function type        : void
Description        : RTCÉèÖóõʼ»¯Ê±¼ä
Parameter        : None
Return                : None
***********************************************************/
void RTC_SetInitTimeDate(void)
{
        RTC_TimeTypeDef RTC_TimeStructure1;
        RTC_DateTypeDef RTC_DateStructure1;
       
        //ʱ¼ä
        RTC_TimeStructure1.RTC_Hours         = 1;
        RTC_TimeStructure1.RTC_Minutes         = 30;
        RTC_TimeStructure1.RTC_Seconds         = 0;

        //ÈÕÆÚ
        RTC_DateStructure1.RTC_Year         = 13;
        RTC_DateStructure1.RTC_Month         = 1;
        RTC_DateStructure1.RTC_Date         = 1;
        RTC_DateStructure1.RTC_WeekDay        = 2;
       
        if(RTC_SetDate(RTC_Format_BIN, &RTC_DateStructure1)== ERROR)
        {
                //printf("\n\r>> !! RTC Set Data failed. !! <<\n\r");
        }
        else
        {
                if(RTC_SetTime(RTC_Format_BIN, &RTC_TimeStructure1) == ERROR)
                {
                        //printf("\n\r>> !! RTC Set Time failed. !! <<\n\r");
                }
                else
                {
                        RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructure1);
                        RTC_GetDate(RTC_Format_BIN, &RTC_DateStructure1);
                        RTC_WriteBackupRegister(RTC_BKP_DR0, 0x32F2);
                }
        }
}


void IWDG_InitConfig(void)
{
        IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);        //ʹÄܼĴæÆ÷¶Áд

        IWDG_SetPrescaler(IWDG_Prescaler_256);                //LSIʱÖÓ256·ÖƵ
       
        IWDG_SetReload(1445);                //ÉèÖüÆÊýÆ÷ÊýÖµ£¬10sÒç³ö¸´Î»

        IWDG_ReloadCounter();                //ÖØÆô¼ÆÊýÆ÷

        IWDG_Enable();                        //ʹÄÜIWDG¿´ÃŹ·
}

使用特权

评论回复
板凳
keno52|  楼主 | 2013-11-7 11:40 | 只看该作者
根据现象3,应该是RTC配置的问题,希望高手帮忙解决!

使用特权

评论回复
地板
keno52|  楼主 | 2013-11-7 14:26 | 只看该作者
郁闷的类,WakeUp不是会自动重装载吗,怎么就会遇到这个问题呢

使用特权

评论回复
5
liaoyijiaren| | 2014-8-6 17:21 | 只看该作者
你好,请问你的问题有没有解决?

使用特权

评论回复
6
B_boyxiaoxin| | 2017-3-30 20:12 | 只看该作者
你好 你这个问题解决了吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

28

帖子

2

粉丝