目录
-
单片机的低功耗
很多单片机有低功耗模式,STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下,HCLK为CPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。
-
STM32电源框图
-
STM32的三种低功耗模式
睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。
停止模式:所有时钟都已停止。1.8V内核电源工作。
PLL,HIS和HSE RC振荡器功能禁止。
寄存器和SRAM内容保留。
待机模式:1.8V内核电源关闭。
只有备份寄存器和待机电路维持供电。
寄存器和SRAM内容全部丢失。实现最低功耗。
-
低功耗配置图(详细配置参考STM32参考手册)
睡眠模式
停止模式
待机模式
-
电源控制寄存器
PWR_CR电源控制寄存器
PWR_CSR电源控制/状态寄存器
-
部分相关代码
进入待机模式
/*进入待机模式*/
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();
}
-
附录
WKUP唤醒实验(基于正点原子战舰) : https://github.com/kks1234/STM32/tree/master/16.%E5%BE%85%E6%9C%BA%E5%94%A4%E9%86%92(LCD)