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

  • Post author:
  • Post category:其他

目录

单片机的低功耗

STM32电源框图

STM32的三种低功耗模式

低功耗配置图(详细配置参考STM32参考手册)

电源控制寄存器

部分相关代码

附录


 

  • 单片机的低功耗

很多单片机有低功耗模式STM32也不例外。在系统或者电源复位后,微控制器出于运行状态之下,HCLKCPU提供时钟,内核执行代码。当CPU不需要继续运行时,可以利用多种低功耗模式来节省功耗,例如等待某个事件触发。

  • STM32电源框图

  • STM32的三种低功耗模式

睡眠模式:内核停止,外设如NVIC,系统时钟Systick仍运行。

停止模式:所有时钟都已停止。1.8V内核电源工作。

                         PLL,HISHSE 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)

 


版权声明:本文为Kk_01110001B原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。