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.原理