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線路掛起標志位
}
}