stm32f103的低功耗開啟和關閉


stm32f103低功耗分為WFI等待中斷和WFE等待事件,我只用到等待中斷,這里沒有細究。

待機模式
最低功耗2uA,只有備份寄存器和待機電路供電,
PLL,HSI,HSE斷開,寄存器和SRAM復位,除了喚醒引腳其余都處於高阻態
可以被wake_up上升沿,RTC鬧鍾上升沿,IWDG復位,NRST外部復位 , 喚醒

進入待機模式    
void Sys_Enter_Standby(void)/*復位IO端口,並且進入待機狀態*/
{            
    RCC_APB2PeriphResetCmd(0X01FC,DISABLE);    //復位IO口時鍾,可選擇
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);    //使能PWR外設時鍾
    PWR_WakeUpPinCmd(ENABLE);  //使能喚醒管腳功能
    PWR_EnterSTANDBYMode();      //進入待命(STANDBY)模式             
}

端口配置
void GPIO_INI(void){
    GPIO_InitTypeDef  GPIO_InitStructure;
     EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA , ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;            //PA0 上拉輸入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOA, &GPIO_InitStructure);    

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);  //GPIOA 0
      EXTI_InitStructure.EXTI_Line=EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿觸發
      EXTI_Init(&EXTI_InitStructure);          //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //GPIO0  所在的中斷
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                            
      NVIC_Init(&NVIC_InitStructure);  
}

wake_up喚醒,退出待機模式
void EXTI0_IRQHandler(void)
{
    delay1ms(10);//消抖
    printf("ent exit 0\n");
    printf("work");
        
    EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0線路掛起位
}


停止模式(STOP)
最低功耗20uA,,
PLL,HSI,HSE斷開,
寄存器和SRAM被保存下來,所有I/O引腳都保持他們在運行模式時的狀態
可以被任意中斷喚醒
進入停機模式
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); //進入STOP模式,任意外部中斷都會喚醒

端口配置
void GPIO_INI(void){
    GPIO_InitTypeDef  GPIO_InitStructure;
     EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA , ENABLE);
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;            //PA0 上拉輸入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOA, &GPIO_InitStructure);    

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);  //GPIOA 0
      EXTI_InitStructure.EXTI_Line=EXTI_Line0;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;    
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿觸發
      EXTI_Init(&EXTI_InitStructure);          //根據EXTI_InitStruct中指定的參數初始化外設EXTI寄存器    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;            //GPIO0  所在的中斷
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                            
      NVIC_Init(&NVIC_InitStructure);  
}

退出停機模式(外部中斷0喚醒)
void EXTI0_IRQHandler(void)
{
    delay1ms(10);//消抖
    SystemInit();
    printf("ent exit 0\n");
    
    if(EXTI_GetITStatus(EXTI_Line0) != RESET)     //檢查指定的EXTI0線路觸發請求發生與否
    {
            EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0線路掛起位
            EXTI_ClearFlag(EXTI_Line0);          //清楚EXTI0線路掛起標志位
    }
}



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM