很多单片机有低功耗模式,STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。
睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。 停止模式:所有时钟都已停止。1.8V内核电源工作。 PLL,HIS和HSE RC振荡器功能禁止。 寄存器和SRAM内容保留。 待机模式:1.8V内核电源关闭。 只有备份寄存器和待机电路维持供电。 寄存器和SRAM内容全部丢失。实现最低功耗。
/*进入待机模式*/
void Wkup_Standby(void)
{
//复位全部IO
RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOC|
RCC_APB2Periph_GPIOD|
RCC_APB2Periph_GPIOE|
RCC_APB2Periph_GPIOF|
RCC_APB2Periph_GPIOG,ENABLE);
//RCC PWR
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
//WKUP Cmd
PWR_WakeUpPinCmd(ENABLE);
//进入待机模式
PWR_EnterSTANDBYMode();
}
WKUP初始化
//WKUP Init
void Wkup_Init()
{
GPIO_InitTypeDef GPIO_InitTypeStruct;
EXTI_InitTypeDef EXTI_InitTypeStruct;
NVIC_InitTypeDef NVIC_InitTypeStruct;
//RCC GPIOA AFIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
//PA0 IUD
GPIO_InitTypeStruct.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitTypeStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitTypeStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitTypeStruct);
// Config EXTI
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitTypeStruct.EXTI_Line = EXTI_Line0;
EXTI_InitTypeStruct.EXTI_LineCmd = ENABLE;
EXTI_InitTypeStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitTypeStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitTypeStruct);
//IT config
NVIC_InitTypeStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitTypeStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitTypeStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitTypeStruct.NVIC_IRQChannelSubPriority = 3;
NVIC_Init(&NVIC_InitTypeStruct);
if(Wkup_Keydelay() == 0) Wkup_Standby();
}