STM32--PWR电源控制

简介: STM32--PWR电源控制


PWR

STM32的PWR模块是其电源管理系统的核心部分,负责控制和管理芯片的供电和电源状态

电源

STM32的工作电压(VDD)为2.0~3.6V。通过内置的电压调节器提供所需的1.8V电源。

当主电源VDD掉电后,通过VBAT脚为实时时钟(RTC)和备份寄存器提供电源。

VDDA供电区域是为模拟电路提供电源的区域。VDDA通常由外部电源提供,通过电源管理单元(PWR)进行控制和管理。

VDDA的电压范围:2.4V~3.6V(具体取决于不同型号的芯片),并且必须在此范围内保持稳定和可靠的供电。

为了提高转换的精确度, ADC使用一个独立的电源供电,过滤和屏蔽来自印刷电路板上的毛刺干扰。

对于不同的引脚封装,所需的电源引脚也是不同的。(如图中的VREF)。

这部分是为数字电路提供的电源区域,也是最主要的电源区域。

Vdd的电压范围:1.8V~3.6V

供电区域包括输入输出接口的电路,待机电路(唤醒逻辑、看门狗)以及电压调节器。

对于我们外设电路,一般都为3.3V,当他连接到内电路时,会通过电压调节器调整到1.8V来链接CPU核心存储器和内置数字外设,此操作是为了能够减少电源消耗。

后备供电区域就是上一节为RTC和备份寄存器提供能源的区域。

主要作用是在主电源失效或断电时,提供持久的电源支持和数据保护。

RTC时钟链接处

电源管理器

电源管理器一般用于电源的监测和进行复位操作。

上电复位(POR)和掉电复位(PDR)

在上电复位(POR)和掉电复位(PDR)方面,PWR模块监测VDD/DDA是否低于设定的阈值,当电压低于设定的阈值时,系统保持在复位状态,以确保电路的正常运行。这种情况一般发生在芯片刚刚接通电源或电源恢复时。上电复位会将芯片的所有寄存器和内部状态初始化为默认值,使系统进入一个已知的、可靠的状态。

在图中我们会发现上电复位会有一些滞后时间,这是由于电源和芯片内部的复位电路之间的时间延迟引起的。当供电电压开始上升时,电源需要经过一个上升时间才能稳定到达复位阈值之以上,同时芯片内部的复位电路也需要一定时间来检测并响应供电电压的变化。这种供电电压上升和内部电路检测的时间延迟导致了上电复位的滞后

掉电复位在芯片的供电电压低于掉电复位阈值(PDR)以下时,系统会触发掉电复位,将芯片的所有寄存器和内部状态初始化为默认值。

可编程电压监测器(PVD)

下面是Vpvd可以选择监测电压范围

总的来说,监测电压范围为2.1V~2.9V;一旦有设置PVD检测,超过这个范围的,就会输出PVD信号。

低功耗模式

在系统或者电源复位后,微控制器会处于运行状态;在CPU不需要运行时,我们可以通过低功耗模式,以实现节能和延长电池寿命。低功耗模式会通过关闭或减少一些不必要的外设和时钟来降低系统功耗,同时又保持一些关键功能的运行。且对于关闭的一些外设,在需要运行的时候,要有手段来唤醒这些外设。

开启流程:

睡眠模式

停止模式

待机模式

睡眠模式工程

SWART串口链接入口

通过对串口的发送和接收数据工程进行验证。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "Serial.h"
#include "OLED.h"
int main()
{
    uint8_t Rxdata;
  OLED_Init();
  Serial_Init();
    
    OLED_ShowString(1,1,"RxData:");
    
    while(1)
    {
        if(Serial_GetRxFlag()==1)
        {
            Rxdata=Serial_GetRxData();
            Serial_SendByte(Rxdata);
            OLED_ShowHexNum(1,8,Rxdata,2);
        }
        OLED_ShowString(2,1,"Running");
        Delay_ms(100);
        OLED_ShowString(2,1,"       ");
        Delay_ms(100);
        
        __WFI();
    }
    
}

当没有睡眠模式时,由于程序不断的跑动,Running会在屏幕上不停闪烁;通过睡眠模式,来使SWART串口非发送和接收状态,不会进行程序的跑动,只有在串口发送和接收时,才会从睡眠模式恢复过来,节省消耗;

WFI是等待中断;只要触发该指令,就会进入睡眠模式;通过接收数据的中断来唤醒。

在开启流程图还需要SLEEPDEEP和SLEEPONEXIT,由于PWR没有内置该模式函数,我们就从简入手;不开这两个相关寄存器也不影响操作;

停止模式

外部中断文章链接入口

通过对对射式红外传感器工程的触发,来验证停止模式。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
#include "OLED.h"
#include "CountSensor.h"
int main()
{
  OLED_Init();
    CountSensor_Init();
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
    OLED_ShowString(1,1,"Count:");
    while(1)
    {
   
        OLED_ShowNum(1,7,CountSensor_Get(),5);
        
        OLED_ShowString(2,1,"Running");
        Delay_ms(100);
        OLED_ShowString(2,1,"       ");
        Delay_ms(100);
        
        PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);
        SystemInit();
        
    }
}

与上一个工程相同的道理,利用闪烁来表示程序的不断进行,停止模式会使程序中断,只有触发外部中断时,才有唤醒电源;

这是库函数内置的停止模式,第一个参数是选择开启电压调节器低功耗和开启;第二个参数是选择唤醒事件指令或者是中断指令;

由于一个中断或唤醒事件导致退出停止模式时,HSI被选为系统时钟,唤醒后时钟频率变为8MHz,需要通过SystemInit()函数来初始化时钟频率。

待机模式

RTC时钟链接处

通过RTC闹钟唤醒和AWAUP的上升唤醒来验证待机模式;

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "MyRTC.h"
int main()
{
    Time time;
    time.year=2023;
    time.mon=1;
    time.mday=1;
    time.hour=23;
    time.min=59;
    time.sec=55;
    
  OLED_Init();
  MyRTC_Init(&time);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);
  
   // PWR_WakeUpPinCmd(ENABLE);
    
    MyRTC_SetTime(&time);
  OLED_ShowString(1, 1, "ALR :");
  OLED_ShowString(2, 1, "ALRF:");
  OLED_ShowString(3, 1, "CNT :");
  
    uint32_t Alarm=RTC_GetCounter()+10;
    RTC_SetAlarm(Alarm);
    OLED_ShowNum(1,6,Alarm,10);
    
  while (1)
  {
    MyRTC_ReadTime(&time);
    
    OLED_ShowNum(3, 6, RTC_GetCounter(), 10);
    OLED_ShowNum(2, 6, RTC_GetFlagStatus(RTC_FLAG_ALR), 1);
  
        OLED_ShowString(4,1,"Running");
        Delay_ms(100);
        OLED_ShowString(4,1,"       ");
        Delay_ms(100);
        
       // OLED_ShowString(4, 9, "STANDBY");
  //  Delay_ms(1000);
  //  OLED_ShowString(4, 9, "       ");
  //  Delay_ms(100);
        
       //   OLED_Clear();
        
        PWR_EnterSTANDBYMode();
        
    }
    
}

让闹钟值大于CNT十秒,当达到闹钟值时,就会让标志位置1,可以先观察标志位是否置换,然后再执行待机模式。

下面的只要让一PA0(有WAUP功能)引脚接上正极,就能触发唤醒。

相关文章
STM32电源框图解析(VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT等的区别)
STM32电源框图解析(VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT等的区别)
STM32电源框图解析(VDD、VSS、VDDA、VSSA、VREF+、VREF-、VBAT等的区别)
|
5月前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
431 2
|
4月前
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
700 0
|
6月前
|
传感器
STM32标准库ADC和DMA知识点总结-1
STM32标准库ADC和DMA知识点总结
|
5月前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
503 4
|
5月前
|
传感器
【经典案例】STM32F407使用HAL库配置I2C详解
STM32F407是一个强大的微控制器,广泛应用于嵌入式系统中。在许多应用中,我们需要使用I2C总线来与传感器、EEPROM、显示屏等外设进行通信。本文将详细介绍如何使用STM32 HAL库来配置和使用I2C接口。
676 2
|
5月前
|
存储 数据采集 数据安全/隐私保护
使用STM32F103读取TF卡并模拟U盘:使用标准库实现
通过以上步骤,你可以实现用STM32F103将TF卡内容变成U盘进行读取。这种功能在数据采集、便携式存储设备等应用中非常有用。如果你有更多的需求,可以进一步扩展此项目,例如添加文件管理功能、加密存储等。希望这篇博客能帮到你,如果有任何问题,欢迎在评论区留言讨论!
230 1
|
5月前
|
开发者
【经典案例】使用HAL库配置STM32F407的SPI外设
在嵌入式系统开发中,STM32F407是一款广泛应用的微控制器,而SPI(Serial Peripheral Interface)是一种常用的通信接口。本文将详细介绍如何使用STM32的硬件抽象层(HAL)库配置STM32F407的SPI外设,并提供完整的代码示例。
555 1
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
157 0