单片机 > 单片机程序设计 > 详情

STM32之低功耗——WKUP待机唤醒(LCD显示)

发布时间:2020-06-01 发布时间:
|

单片机的低功耗

很多单片机有低功耗模式,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();

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM基础知识八