OpenEdv-开源电子网

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

STM32F429关于RTC闹钟中断唤醒待机模式问题

[复制链接]

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2016-5-19
在线时间
26 小时
发表于 2019-9-25 21:41:22 | 显示全部楼层 |阅读模式
20金钱
各位大佬门们好,小弟遇到了非常难的问题,希望各位大佬帮忙解决。
我使用的是  STM32F429  如果不进入待机模式的话,RTC闹钟能够 通过设定的时间闹钟,现在问题是,进入待机模式后  不能够闹钟唤醒,附上代码。。。。

NVIC_InitTypeDef   NVIC_InitStructure;

//设置时间
ErrorStatus RTC_Set_Time(u8 hour,u8 min,u8 sec,u8 ampm)
{
    RTC_TimeTypeDef RTC_TimeTypeInitStructure;

    RTC_TimeTypeInitStructure.RTC_Hours=hour;
    RTC_TimeTypeInitStructure.RTC_Minutes=min;
    RTC_TimeTypeInitStructure.RTC_Seconds=sec;
    RTC_TimeTypeInitStructure.RTC_H12=ampm;

    return RTC_SetTime(RTC_Format_BIN,&RTC_TimeTypeInitStructure);

}

//设置日期
ErrorStatus RTC_Set_Date(u8 year,u8 month,u8 date,u8 week)
{

    RTC_DateTypeDef RTC_DateTypeInitStructure;
    RTC_DateTypeInitStructure.RTC_Date=date;
    RTC_DateTypeInitStructure.RTC_Month=month;
    RTC_DateTypeInitStructure.RTC_WeekDay=week;
    RTC_DateTypeInitStructure.RTC_Year=year;
    return RTC_SetDate(RTC_Format_BIN,&RTC_DateTypeInitStructure);
}

//初始化
void My_RTC_Init(void)
{
    RTC_InitTypeDef RTC_InitStructure;
    u16 retry=0X1FFF;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
    PWR_BackupAccessCmd(ENABLE);  

    if(RTC_ReadBackupRegister(RTC_BKP_DR0)!=0x5050)  
   {
        RCC_LSEConfig(RCC_LSE_ON);//LSE   
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)  
            {
            retry++;
            Delay_ms(10);
            }

        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);        //
        RCC_RTCCLKCmd(ENABLE);    //

        RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
        RTC_InitStructure.RTC_SynchPrediv  = 0xFF;
        RTC_InitStructure.RTC_HourFormat   = RTC_HourFormat_24;
        RTC_Init(&RTC_InitStructure);

        RTC_Set_Time(23,58,10,RTC_H12_AM);  
        RTC_Set_Date(14,5,5,1);  

       RTC_WriteBackupRegister(RTC_BKP_DR0,0x5050);
    }

}

//闹钟设置
void RTC_Set_AlarmA(u8 hour,u8 min,u8 sec)
{
    EXTI_InitTypeDef   EXTI_InitStructure;
    RTC_AlarmTypeDef RTC_AlarmTypeInitStructure;
    RTC_TimeTypeDef RTC_TimeTypeInitStructure;

    RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//

    RTC_TimeTypeInitStructure.RTC_Hours=hour;//
    RTC_TimeTypeInitStructure.RTC_Minutes=min;//
    RTC_TimeTypeInitStructure.RTC_Seconds=sec;//
    RTC_TimeTypeInitStructure.RTC_H12=RTC_H12_AM;

    RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDay=1;//
    RTC_AlarmTypeInitStructure.RTC_AlarmDateWeekDaySel=RTC_AlarmDateWeekDaySel_WeekDay;//
    RTC_AlarmTypeInitStructure.RTC_AlarmMask=RTC_AlarmMask_DateWeekDay;//
    RTC_AlarmTypeInitStructure.RTC_AlarmTime=RTC_TimeTypeInitStructure;
    RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A,&RTC_AlarmTypeInitStructure);


    RTC_ClearITPendingBit(RTC_IT_ALRA);//
    EXTI_ClearITPendingBit(EXTI_Line17);//

    RTC_ITConfig(RTC_IT_ALRA,ENABLE);//
    RTC_AlarmCmd(RTC_Alarm_A,ENABLE);//

  EXTI_InitStructure.EXTI_Line = EXTI_Line17;//LINE17
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;//
  EXTI_Init(&EXTI_InitStructure);//

  NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//
  NVIC_Init(&NVIC_InitStructure);//
}


//进入待机模式
void My_Sys_Enter_Standby(void)
{
           RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWR时钟
          RCC_BackupResetCmd(ENABLE);//使能备份区域
         PWR_BackupAccessCmd(ENABLE);  //后备区域访问使能
       
       
          PWR_ClearFlag(PWR_FLAG_SB);//清楚待机模式标志
          RTC_WriteProtectionCmd(DISABLE);//关闭RTC写保护
       
       
          RTC->TR &= 0xffffcfff; //关闭闹钟AB中断
        //  RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,DISABLE);//
       
          RTC_ClearFlag(RTC_FLAG_ALRAF|RTC_FLAG_ALRBF|RTC_FLAG_WUTF|RTC_FLAG_TSF|RTC_FLAG_TAMP1F);//清楚相关标志位
       
          PWR_ClearFlag(PWR_FLAG_WU);//清除唤醒标志
       
          RTC_WriteProtectionCmd(ENABLE);//使能RTC写保护
       
          RTC->TR |=0x00003000;//开启闹钟AB中断
       
         // RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,ENABLE);//
          PWR_EnterSTANDBYMode();//进入待机模式
       

}



//闹钟中断函数
void RTC_Alarm_IRQHandler(void)
{   
    if(RTC_GetFlagStatus(RTC_FLAG_ALRAF)==SET)//ALARM A
    {
        RTC_ClearFlag(RTC_FLAG_ALRAF);//
    }   
               
          LED_9_ON;//灯亮
    EXTI_ClearITPendingBit(EXTI_Line17);    //                                            
}


int main()
{
        if(PWR_GetFlagStatus(PWR_FLAG_SB) ==SET)
  {
        PWR_ClearFlag(PWR_FLAG_SB);
  }

        LED_GPIO_Config();
        My_RTC_Init();

        RTC_Set_AlarmA(23,58,20);//设定的闹钟,  RTC_Set_Time(23,58,10,RTC_H12_AM);    过10秒后闹钟
        int i=1;
        while(1)//
        {
          LED_9_Reverse;//led亮灭交换
                Delay(0xffffff);//大约一秒
                i++;
                if(i % 6 == 0)   //大约过了六秒进入待机模式
                {
                   My_Sys_Enter_Standby();
                }
       
        }

}
问题:此后一直进入待机模式,跪求大佬问题出现哪里了。


最佳答案

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

铁子们,调试出来,其中有几个错误,要修改下 //进入待机模式 void My_Sys_Enter_Standby(void) 函数 中 RTC->TR &= 0xffffcfff; //关闭闹钟AB中断 RTC->TR |=0x00003000;//开启闹钟AB中断 修改为 RTC->CR &= 0xffffcfff; //关闭闹钟AB中断 RTC->CR |=0x00003000;//开启闹钟AB中断 其中把 RCC_BackupResetCmd(ENABLE);//使能备份区域 其实为复位备份区域 在 My_Sys_Enter_Standby(void) 函数 中 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

10

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2016-5-19
在线时间
26 小时
 楼主| 发表于 2019-9-25 21:41:23 | 显示全部楼层
铁子们,调试出来,其中有几个错误,要修改下

//进入待机模式
void My_Sys_Enter_Standby(void) 函数 中   RTC->TR &= 0xffffcfff; //关闭闹钟AB中断    RTC->TR |=0x00003000;//开启闹钟AB中断   修改为  RTC->CR &= 0xffffcfff; //关闭闹钟AB中断    RTC->CR |=0x00003000;//开启闹钟AB中断   


其中把    RCC_BackupResetCmd(ENABLE);//使能备份区域    其实为复位备份区域     在 My_Sys_Enter_Standby(void) 函数 中  把  RCC_BackupResetCmd(ENABLE);//使能备份区域  这两句屏蔽掉,要不然LES时钟不能工作

最后  这个函数修改为了

void My_Sys_Enter_Standby(void)
{

          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);                                           //使能PWR时钟
          RCC_AHB1PeriphClockLPModeCmd(RCC_AHB1Periph_BKPSRAM,ENABLE);                                  //使能备份域时钟
    PWR_BackupAccessCmd(ENABLE);                                                                  //后备区域访问使能
       
          PWR_ClearFlag(PWR_FLAG_SB);                                                                   //清除待机模式标志
          RTC_WriteProtectionCmd(DISABLE);                                                              //关闭RTC写保护

          //RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,DISABLE);             //关闭相关中断,以防万一
          RTC->CR &=0xffffefff;                                                                         //关闭闹钟A中断
          RTC_ClearFlag(RTC_FLAG_ALRAF|RTC_FLAG_ALRBF|RTC_FLAG_WUTF|RTC_FLAG_TSF|RTC_FLAG_TAMP1F);      //清除相关标志位
          PWR_ClearFlag(PWR_FLAG_WU);                                                                   //清除唤醒标志位

          RTC_WriteProtectionCmd(ENABLE);                                                                //使能写RTC写保护                                             
                 RTC->CR |=0x00001000;                                                                          //开启闹钟A中断
                RTC_Set_AlarmA(23,58,20);                                                                      //设定闹钟时间
       
         // RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA|RTC_IT_TS|RTC_IT_ALRB|RTC_IT_TAMP,ENABLE);               //开启相关中断
          RTC_ITConfig(RTC_IT_WUT|RTC_IT_ALRA,ENABLE);                                                   //使能闹钟A和唤醒中断
          PWR_EnterSTANDBYMode();                                                                        //进入待机模式
       
}


主函数处理

void Delay(__IO u32 nCount);

void SysClockResetFromStop(void);
/**
  * @brief  Ö÷oˉêy
  * @param  ÎT
  * @retval ÎT
  */
int main(void)
{
       
/***********************************************************************************/

        LED_GPIO_Config();
        My_RTC_Init();
       
        // RTC_Set_AlarmA(23,58,15);
  // My_Sys_Enter_Standby();
  // RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,2);//ÖüÆúDÔ»½DÑ
        int i=1;
        while(1)
        {
          LED_9_Reverse;   //pc9  灯亮灭。状态取反
                Delay(0xffffff);//相当于延时1秒
                i++;
                if(i % 4 == 0)
                {
                   My_Sys_Enter_Standby();             //大约4秒后进入待机模式,10秒后闹钟唤醒
                }
       
        }


void Delay(__IO u32 nCount)//延时函数
{
  for(;nCount>0;nCount--);

}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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