打印
[应用相关]

stm32 f103 停机模式rtc和gpio中断唤醒reset按键复位后失效

[复制链接]
426|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2021-2-23 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
复位后无论是rtc闹钟还是gpio都唤醒不了了..
static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);               




        NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;               
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;      
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;        
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;               
        NVIC_Init(&NVIC_InitStructure);               
        NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
      
}




void EXTI_Key_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        EXTI_InitTypeDef EXTI_InitStructure;


      
        RCC_APB2PeriphclockCmd(RCC_APB2Periph_GPIOC  |RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO,ENABLE);
                                                                                               
     
        NVIC_Configuration();


           
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;      
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;      
  GPIO_Init(GPIOC, &GPIO_InitStructure);
      


     
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
      
  EXTI_InitStructure.EXTI_Line = EXTI_Line13;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);



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




void RTC_Configuration(void)
{
      
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
      
        
        PWR_BackupAccessCmd(ENABLE);
      
      
        BKP_DeInit();
      
      
        RCC_LSEConfig(RCC_LSE_ON);
      
      
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
        {}
      
      
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
      
        
        RCC_RTCCLKCmd(ENABLE);
      
        
        RTC_WaitForSynchro();
      
        
        RTC_WaitForLastTask();
      
        
        RTC_ITConfig(RTC_IT_SEC, ENABLE);
      


        RTC_WaitForLastTask();
      
      
        RTC_SetPrescaler(32767);
      
      
        RTC_WaitForLastTask();
                              
                              
                                 
}




void RTC_CheckAndConfig(void)
{
            
        if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
        {
               
                RTC_Configuration();
               
               
          RTC_SetCounter(0);        
          RTC_WaitForLastTask();      
               
               
               
                RTC_SET_ALARM(10);      
                BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
        }
        else
        {
         
                RTC_WaitForSynchro();
               
               
                RTC_ITConfig(RTC_IT_SEC, ENABLE);
               
               
                RTC_WaitForLastTask();
        }

          RCC_CleaRFlag();


}


void RTC_SET_ALARM(u32 sec)
{
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);        
          PWR_BackupAccessCmd(ENABLE);      
         
    RTC_SetAlarm(RTC_GetCounter()+sec);
   
   RTC_WaitForLastTask();
  
   RTC_ITConfig(RTC_FLAG_ALR,ENABLE);
      
      
      
      
}




void SYSCLKConfig_STOP(void)
{
  
  RCC_HSEConfig(RCC_HSE_ON);
  

  while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET)
  {
  }
  
  
  RCC_PLLCmd(ENABLE);
  
  
  while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  {
  }
  
  
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  

  while (RCC_GetSYSCLKSource() != 0x08)
  {
  }
      
}

         中断
void KEY2_IRQHandler(void)
{
  
        if(EXTI_GetITStatus(EXTI_Line13) != RESET)
        {
               
               
      
                EXTI_ClearITPendingBit(EXTI_Line13);   


            SYSCLKConfig_STOP();               
        }  
}


void RTC_IRQHandler(void)
{
          if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
          {
            
            RTC_ClearITPendingBit(RTC_IT_SEC);
            
            RTC_WaitForLastTask();
          }
}




void RTCAlarm_IRQHandler(void)
{
         if(RTC_GetITStatus(RTC_IT_ALR)!= RESET)//ÄÖÖóÖD¶Ï
        {
              SYSCLKConfig_STOP();
      
              
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, DISABLE);      
                RTC_SetCounter(0);        
          RTC_WaitForLastTask();            
    RTC_SET_ALARM(5);        
                BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
                RTC_ClearITPendingBit(RTC_IT_ALR);                     
          EXTI_ClearITPendingBit(EXTI_Line17);
                RTC_WaitForLastTask();
  }                                                                                                   


}


   主函数
int main()
{

        //LED初始化
        LED_GPIO_Config( );
      
      


        while(1)
        {
                              
                  

                RTC_CheckAndConfig();
        EXTI_Key_Config();
               
               
         
               
                                SysTick_Delay_Ms(50);      
                                  LED2_ON;
               
                SysTick_Delay_Ms(500);
                                               
                                   LED2_OFF;

    PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);
      
      
      
        }


}

使用特权

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

本版积分规则

2028

主题

7308

帖子

10

粉丝