新手入门 
 
	- 积分
 - 6
 
        - 金钱
 - 6 
 
       - 注册时间
 - 2021-8-27
 
      - 在线时间
 - 1 小时
 
 
 
 | 
 
 
发表于 2022-3-30 12:05:04
|
显示全部楼层
 
 
 
//系统进入待机模式 
void Sys_Enter_Standby(void) 
{ 
    __HAL_RCC_AHB1_FORCE_RESET();       //复位所有IO口  
         
        while(WKUP_KD);                     //等待WK_UP按键松开(在有RTC中断时,必须等WK_UP松开再进入待机) 
    
        __HAL_RCC_PWR_CLK_ENABLE();         //使能PWR时钟 
    __HAL_RCC_BACKUPRESET_FORCE();      //复位备份区域 
    HAL_PWR_EnableBkUpAccess();         //后备区域访问使能   
         
        //STM32F4,当开启了RTC相关中断后,必须先关闭RTC中断,再清中断标志位,然后重新设置 
        //RTC中断,再进入待机模式才可以正常唤醒,否则会有问题.         
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); 
    __HAL_RTC_WRITEPROTECTION_DISABLE(&RTC_Handler);//关闭RTC写保护 
     
    //关闭RTC相关中断,可能在RTC实验打开了 
    __HAL_RTC_WAKEUPTIMER_DISABLE_IT(&RTC_Handler,RTC_IT_WUT); 
    __HAL_RTC_TIMESTAMP_DISABLE_IT(&RTC_Handler,RTC_IT_TS); 
//    __HAL_RTC_ALARM_DISABLE_IT(&RTC_Handler,RTC_IT_ALRA|RTC_IT_ALRB); 
     
    //清除RTC相关中断标志位 
    __HAL_RTC_ALARM_CLEAR_FLAG(&RTC_Handler,RTC_FLAG_ALRAF|RTC_FLAG_ALRBF); 
    __HAL_RTC_TIMESTAMP_CLEAR_FLAG(&RTC_Handler,RTC_FLAG_TSF);  
    __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&RTC_Handler,RTC_FLAG_WUTF); 
     
    __HAL_RCC_BACKUPRESET_RELEASE();                    //备份区域复位结束 
    __HAL_RTC_WRITEPROTECTION_ENABLE(&RTC_Handler);     //使能RTC写保护 
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);                   //清除Wake_UP标志 
                 
                RTC_Init();                     //初始化RTC  
                RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS,9); //配置WAKE UP中断,10秒钟中断一次   
                __HAL_RTC_TIMESTAMP_ENABLE_IT(&RTC_Handler,RTC_IT_TS); 
//    __HAL_RTC_ALARM_ENABLE_IT(&RTC_Handler,RTC_IT_ALRA|RTC_IT_ALRB); 
          __HAL_RTC_WAKEUPTIMER_ENABLE_IT(&RTC_Handler,RTC_IT_WUT); 
//                RTC_Init();                     //初始化RTC  
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);           //设置WKUP用于唤醒 
    HAL_PWR_EnterSTANDBYMode();                         //进入待机模式      
} 
 注意,要先配置RTC,后开中断,才能正常定时唤醒,否则唤醒异常 
 |   
 
 
 
 |