最低功耗是halt();
因為halt會關閉所有時鍾,所以不用刻意去關時鍾。
重要的是管腳的配置,根據不同情況配置板上的管腳
我的空板上用PB1作為外部中斷來喚醒所以配置為上拉輸入,下降沿觸發。
GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT);
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling);
ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_2);
有一個指示燈
GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_Low_Slow);
因為PA1是復位電路10K上拉,100nF電容接地,所以沒管,其余的引腳設置推挽輸出低
代碼如下:
時鍾配置
void SysClock_Init(void) { CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//SysClock = ClockFreq/1即16MHz/1=16MHz; if(CLK_GetSYSCLKSource() != CLK_SYSCLKSource_HSI)//if not HSI { CLK_SYSCLKSourceSwitchCmd(ENABLE); // enable switch sysclock source CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI); // wait switch finished } SysClockFreq = CLK_GetClockFreq(); }
端口配置
void IO_Init(void)
{
GPIO_Init(GPIOA, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3, GPIO_Mode_Out_PP_Low_Slow);//沒有配置PA1
GPIO_Init(GPIOB, GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7, GPIO_Mode_Out_PP_Low_Slow);
GPIO_Init(GPIOC, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6, GPIO_Mode_Out_PP_Low_Slow);
GPIO_ResetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3);//沒有配置PA1
GPIO_ResetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
GPIO_ResetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6);
GPIO_Init(LEDB_PORT, LEDB_PIN, GPIO_Mode_Out_PP_Low_Slow);//指示燈
//喚醒按鍵
GPIO_Init(KEYP_PORT, KEYP_PIN, GPIO_Mode_In_PU_IT);
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling);
ITC_SetSoftwarePriority(EXTI1_IRQn, ITC_PriorityLevel_2);
}
主函數
void main(void) { SysClock_Init();//時鍾配置 IO_Init();//端口配置 enableInterrupts();//使能中斷 while (1) { if (Sys.Mode == RESET) { PWR_UltraLowPowerCmd(ENABLE);//不加這句1.2uA加入后0.38uA halt(); nop(); } }
中斷處理
void KeyP_Int(void) { if (Sys.Mode) { Sys.Mode = 0; GPIO_SetBits(LEDB_PORT, LEDB_PIN); } else { Sys.Mode = 1; GPIO_ResetBits(LEDB_PORT, LEDB_PIN); } }
中斷入口
INTERRUPT_HANDLER(EXTI1_IRQHandler, 9) { KeyP_Int(); EXTI_ClearITPendingBit(EXTI_IT_Pin1); }
空板0.38uA,追求不高已經達到了預期,如果有心的朋友,加把勁或許輕松達到官方的350nA。
