14.stmF4电源管理专解

STM32电源管理简介

STM32实现睡眠模式

STM32实现停止模式

STM32实现待机模式

一。STM32电源管理简介

1.电源管理

        电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。      

        在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。      

        STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。

2.stm32电源管理系统 

 3.STM32低功耗模式

        很多单片机都有低功耗模式,STM32F4 也不例外 ,运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。      

        STM32F4 按功耗由高到低排列具有运行、睡眠、停止和待机四种工作模式。      

        上电复位后STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

(1)睡眠模式

        在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM4核心的外设全都还照常运行。      

        有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是WFI(wait for interrupt)和WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。睡眠模式的各种特性见下表:

 (2)停止模式

        在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其1.2V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息。      

        所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒。在停止模式中可以选择电压调节器为开模式或低功耗模式,可选择内部FLASH工作在正常模式或掉电模式。

 (3)待机模式

        待机模式,它除了关闭所有的时钟,还把1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测boot条件,从头开始执行程序。它有四种唤醒方式,分别是WKUP(PA0)引脚的上升沿,RTC闹钟事件,NRST引脚的复位和IWDG(独立看门狗)复位。

 三种模式的区别:

1、睡眠模式:在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM4核心的外设全都还照常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。唤醒后 ,若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。唤醒延迟:无延迟。(WFI:Wait For Interrupt,WFE:Wait For Event)

2、停止模式:在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其 1.2V 区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。唤醒后,若由中断唤醒,先进入中断,退出中断服务程序后,接着执行 WFI指令后的程序;若由事件唤醒,直接接着执行 WFE 后的程序。停止模式唤醒后,STM32会使用 HSI(f1的HSI为8M,f4为12M)作为系统时钟。所以,有必要在唤醒以后,在程序上重新配置系统时钟,将时钟切换回HSE。唤醒延迟 :基础延迟为 HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若 FLASH 工作在掉电模式,还需要加上 FLASH 从掉电模式唤醒的时间。

3、待机模式:它除了关闭所有的时钟,还把 1.2V区域的电源也完全关闭了,也就是说,从待机模式唤醒后,由于没有之前代码的运行记录,只能对芯片复位,重新检测 boot条件,从头开始执行程序。


二。STM32实现睡眠模式

1.原理

2.cubemx创建工程

(1)灯,蜂鸣器,PA0(按键)设置为中断

(2)RCC,USART

(3)NVIC 的PA0设置中断优先级,降级(2,2)

3.代码

(1)main.c中,main()之外

int fputc(int ch, FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	
	USART1->DR = ch;
	
	return ch;
}

(2)main()内,while()外

	printf("this is sleep mode test\n");
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
	//蜂鸣器高电平有效,灯低电平有效,两者设为低电平,所以灯亮,蜂鸣器不响

(3)while()内

		//灯亮表示系统正常运行
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);   

        //打印“程序正常运行”
		printf("µ±Ç°³ÌÐòÕý³£ÔËÐÐ\n");
		//
		HAL_Delay(2000);

		//打印系统进入睡眠模式,进入睡眠函数在下方
		printf("ϵͳ½øÈë˯Ãßģʽ\n\n");
        //
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);    

        //关闭systick中断,否则会一直被此中断唤醒
		HAL_SuspendTick();   
 
        //进入睡眠模式
		HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
  
		//打印“系统已经被唤醒”,通过按键中断唤醒
		printf("ϵͳÒѾ­±»»½ÐÑ\n");

(4)gpio。c中断回调函数重写

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
	{

        //恢复systick中断,否则无法使用HAl_delay 函数
		HAL_ResumeTick();   
		
        //
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
		
		HAL_Delay(200);
		
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
	}
}

4.实验结果

        点击按钮,蜂鸣器响一下,唤醒stm32

注意:睡眠模式下,不可以重新下载代码进入stm32


三。STM32实现停止模式

1.原理

2.cubemx创建工程(同第一个)

3.步骤

(1)main()之外

int fputc(int ch, FILE *p)
{
	while(!(USART1->SR & (1<<7)));
	
	USART1->DR = ch;
	
    //通过原理图可以得到,第六位是判断串口是否传输完成
    //此函数可以保证数据传输完全,不会中途结束(发生睡眠,中断还是依旧中断)
	while(!(USART1->SR & (1<<6)));
	
	return ch;
}

(2)main()之内,while()之外

	printf("this is sleep mode test\n");
	
    //打开灯,关闭蜂鸣器
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);

(3)while()之内

		//指示灯亮,表示系统正常运行
        HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);   

        //打印"程序正常运行"
		printf("µ±Ç°³ÌÐòÕý³£ÔËÐÐ\n");
		
		HAL_Delay(2000);
		
        //打印"系统进入停止模式"
		printf("ϵͳ½øÈëֹͣģʽ\n\n");

        //关闭灯
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);

        //进入停止模式
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE);   

        //打印"系统已经被唤醒"
		printf("ϵͳÒѾ­±»»½ÐÑ\n");

 (4)gpio.c中重写按键中断的回调函数

//恢复时钟,打开HSE和PLL
void CLK_Resume()
{
	//使能HSE
	__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);

    //判断HSE是否使能完成
	while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET)
	{
	
	}
	
	//使能PLL
	__HAL_RCC_PLL_ENABLE();

    //判断PLL是否使能完成
	while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET)
	{
	
	}	

	//选择PLL作为系统时钟
	__HAL_RCC_SYSCLK_CONFIG(RCC_SYSCLKSOURCE_PLLCLK);
	
    //判断是否完成
	while(__HAL_RCC_GET_SYSCLK_SOURCE() != 0x08 )
	{
		
	}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin == GPIO_PIN_0)
	{
        //恢复时钟,打开HSE和PLL
		CLK_Resume();   
		
        //蜂鸣器响
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_SET);
		
		HAL_Delay(200);
		
        //蜂鸣器停止
		HAL_GPIO_WritePin(GPIOF, GPIO_PIN_6, GPIO_PIN_RESET);
	}
}

4.复位后,两秒后系统自动停止,按键唤醒,并且蜂鸣器响一下 


四。STM32实现待机模式

1.原理

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值