当前位置: 首页 > news >正文

STM32电源管理—实现低功耗

注: 本文是学习野火的指南针开发板过程的学习笔记,可能有误,详细请看B站野火官方配套视频教程(这个教程真的讲的很详细,请给官方三连吧)

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

 01 STM32的电源管理简介

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

电源监控器:

STM32芯片主要通过引脚VDD从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行。

1. 上电复位与掉电复位(POR与PDR)

POR、PDR功能是使用其电压阈值与外部供电电压VDD比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作

当检测到VDD的电压低于阈值VPOR及VPDR时(无需外部电路辅助)STM32芯片会自动保持在复位状态,防止因电压不足强行工作而带来严重的后果。在刚开始电压低于VPOR时(约1.92V),STM32保持在上电复位状态(POR,Power On Reset),当VDD电压持续上升至大于VPOR时,芯片开始正常运行,而在芯片正常运行的时候,当检测到VDD电压下降至低于VPDR阈值(约1.88V),会进入掉电复位状态(PDR,Power Down Reset)。

2.可编程电压检测器PVD

STM32还提供了可编程电压检测器PVD,它也是实时检测VDD的电压

当检测到电压低于编程的VPVD阈值时,会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理。该电压阈值可通过电源控制寄存器PWR_CSR设置。

使用PVD可配置8个等级,如下表。其中的上升沿和下降沿分别表示类似前面图中的VDD电压上升过程及下降过程的阈值:

阈值等级

条件

最小值

典型值

最大值

单位

级别0

上升沿

2.1

2.18

2.26

V

下降沿

2

2.08

2.16

V

级别1

上升沿

2.19

2.28

2.37

V

下降沿

2.09

2.18

2.27

V

级别2

上升沿

2.28

2.38

2.48

V

下降沿

2.18

2.28

2.38

V

级别3

上升沿

2.38

2.48

2.58

V

下降沿

2.28

2.38

2.48

V

级别4

上升沿

2.47

2.58

2.69

V

下降沿

2.37

2.48

2.59

V

级别5

上升沿

2.57

2.68

2.79

V

下降沿

2.47

2.58

2.69

V

级别6

上升沿

2.66

2.78

2.9

V

下降沿

2.56

2.68

2.8

V

级别7

上升沿

2.76

2.88

3

V

下降沿

2.66

2.78

2.9

V

 STM32的电源系统:

为了方便进行电源管理,STM32把它的外设、内核等模块跟据功能划分了供电区域,其内部电源区域划分如图:

  STM32的电源系统主要分为备份域电路、内核电路以及ADC电路三部分,介绍如下:

  • ADC电源及参考电压(VDDA供电区域):
    为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。
  • 调压器供电电路( V DD /1.8V 供电区域):
    STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路的所有数字电路供电,其中包括内核、数字外设以及 RAM ,调压器的输出电压约为 1.8V ,因而使用调压器供电的这些电路区域被称为 1.8V 域。
调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下,1.8域全功率运行;在停止模式下 1.8V 域运行在低功耗状态,1.8V 区域的所有时钟都关闭,相应的外设都停止了工作,但它会保留内核寄存器以及 SRAM 的内容;在机模式下,整个 1.8V 域都断电,该区域的内核寄存器及 SRAM 内容都会丢失 (备区域的寄存器不受影响)。
  • 备份域电路(后备供电区域):     
    STM32的LSE振荡器、RTC及备份寄存器这些器件被包含进备份域电路中,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。

 在图中后备供电区域的左侧有一个电源开关结构,它的功能类似下图的双二极管,在它的“1”处连接了VBAT电源,“2”处连接了VDD主电源(一般为3.3V),右侧“3”处引出到备份域电路中。当VDD主电源存在时,由于VDD电压较高,备份域电路通过VDD供电,节省钮扣电池的电源,仅当VDD掉电时,备份域电路由钮扣电池通过VBAT供电,保证电路能持续运行,从而可利用它保留关键数据。


02 STM32的功耗模式 

按功耗由高到低排列,STM32具有运行、睡眠、停止和待机四种工作模式。上电复位后STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。

这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。

 1.睡眠模式

在睡眠模式中,仅关闭了内核时钟,内核停止运行,但其片上外设,CM3核心的外设全都还照常运行。     有两种方式进入睡眠模式,它的进入方式决定了从睡眠唤醒的方式,分别是WFI(wait for interrupt)和WFE(wait for event),即由等待“中断”唤醒和由“事件”唤醒。睡眠模式的各种特性见下表:

2.停止模式 

在停止模式中,进一步关闭了其它所有的时钟,于是所有的外设都停止了工作,但由于其1.8V区域的部分电源没有关闭,还保留了内核的寄存器、内存的信息,所以从停止模式唤醒,并重新开启时钟后,还可以从上次停止处继续执行代码。停止模式可以由任意一个外部中断(EXTI)唤醒,在停止模式中可以选择电压调节器为开模式或低功耗模式。停止模式的各种特性见下表:

3.待机模式

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

在以上讲解的睡眠模式、停止模式及待机模式中,若备份域电源正常供电,备份域内的RTC都可以正常运行,备份域内的寄存器的数据会被保存,不受功耗模式影响。 


03电源管理相关的库函数及命令

STM32标准库对电源管理提供了完善的函数及命令,使用它们可以方便地进行控制。

配置PVD监控功能

PVD可监控VDD的电压,当它低于阈值时可产生PVD中断以让系统进行紧急处理,这个阈值可以直接使用库函数PWR_PVDLevelConfig配置成前面阈值表中说明的阈值等级。

进入睡眠——WFI与WFE命令

在前面可了解到进入各种低功耗模式时都需要调用WFI或WFE命令,它们实质上都是内核指令,在库文件core_cm3.h中把这些指令封装成了函数:

对于这两个指令,应用时只需要知道,调用它们都能进入低功耗模式,需要使用函数的格式“__WFI();”和“__WFE();”来调用(因为__wfi及__wfe是编译器内置的函数,函数内部使用调用了相应的汇编指令)。

进入停止模式

直接调用WFI和WFE指令可以进入睡眠模式,而进入停止模式则还需要在调用指令前设置一些寄存器位,STM32标准库把这部分的操作封装到PWR_EnterSTOPMode函数中了,它的定义如下:

1 /**
2 * @brief 进入停止模式
3 *
4 * @note 在停止模式下所有 I/O 的会保持在停止前的状态
5 * @note 从停止模式唤醒后,会使用 HSI 作为时钟源
6 * @note 调压器若工作在低功耗模式,可减少功耗,但唤醒时会增加延迟
7 * @param PWR_Regulator: 设置停止模式时调压器的工作模式
8 * @arg PWR_MainRegulator_ON: 调压器正常运行
9 * @arg PWR_Regulator_LowPower: 调压器低功耗运行
10 * @param PWR_STOPEntry: 设置使用 WFI 还是 WFE 进入停止模式
11 * @arg PWR_STOPEntry_WFI: WFI 进入停止模式
12 * @arg PWR_STOPEntry_WFE: WFE 进入停止模式13 * @retval None
14 */
15 void PWR_EnterSTOPMode(uint32_t PWR_Regulator, uint8_t PWR_STOPEntry)
16 {
17 uint32_t tmpreg = 0;
18 /* 检查参数 */
19 assert_param(IS_PWR_REGULATOR(PWR_Regulator));
20 assert_param(IS_PWR_STOP_ENTRY(PWR_STOPEntry));
21
22 /* 设置调压器的模式 ------------*/
23 tmpreg = PWR->CR;
24 /* 清除 PDDS 及 LPDS 位 */
25 tmpreg &= CR_DS_MASK;
26 /* 根据 PWR_Regulator 的值 (调压器工作模式) 配置 LPDS,MRLVDS 及 LPLVDS 位 */
27 tmpreg |= PWR_Regulator;
28 /* 写入参数值到寄存器 */
29 PWR->CR = tmpreg;
30 /* 设置内核寄存器的 SLEEPDEEP 位 */
31 SCB->SCR |= SCB_SCR_SLEEPDEEP;
32
33 /* 设置进入停止模式的方式-----------------*/
34 if (PWR_STOPEntry == PWR_STOPEntry_WFI) {
35 /* 需要中断唤醒 */
36 __WFI();
37 } else {
38 /* 需要事件唤醒 */
39 __WFE();
40 }
41
42 /* 以下的程序是当重新唤醒时才执行的,清除 SLEEPDEEP 位的状态 */
43 SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP);
44 }

        这个函数有两个输入参数,分别用于控制调压器的模式及选择使用WFI或WFE停止,代码中先是根据调压器的模式配置PWR_CR寄存器,再把内核寄存器的SLEEPDEEP位置1,这样再调用WFI或WFE命令时,STM32就不是睡眠,而是进入停止模式了。函数结尾处的语句用于复位SLEEPDEEP位的状态,由于它是在WFI及WFE指令之后的,所以这部分代码是在STM32被唤醒的时候才会执行。     

        要注意的是进入停止模式后,STM32的所有I/O都保持在停止前的状态,而当它被唤醒时,STM32使用HSI作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启HSE,把系统时钟设置回原来的状态。

进入待机模式

STM32标准库也提供了控制进入待机模式的函数,其定义如下:

1 /**
2 * @brief 进入待机模式
3 * @note 待机模式时,除以下引脚,其余引脚都在高阻态:
4 * -复位引脚
5 * - RTC_AF1 引脚 (PC13) (需要使能侵入检测、时间戳事件或 RTC 闹钟事件)
6 * - RTC_AF2 引脚 (PI8) (需要使能侵入检测或时间戳事件)
7 * - WKUP 引脚 (PA0) (需要使能 WKUP 唤醒功能)
8 * @note 在调用本函数前还需要清除 WUF 寄存器位
9 * @param None
10 * @retval None
11 */
12 void PWR_EnterSTANDBYMode(void)
13 {
14 /* 清除 Wake-up 标志 */
15 PWR->CR |= PWR_CR_CWUF;
16 /* 选择待机模式 */
17 PWR->CR |= PWR_CR_PDDS;
18 /* 设置内核寄存器的 SLEEPDEEP 位 */
19 SCB->SCR |= SCB_SCR_SLEEPDEEP;
20 /* 存储操作完毕时才能进入待机模式,使用以下语句确保存储操作执行完毕 */
21 #if defined ( __CC_ARM )
22 __force_stores();
23 #endif
24 /* 等待中断唤醒 */
25 __WFI();
26 }

该函数中先配置了PDDS寄存器位及SLEEPDEEP寄存器位,接着调用__force_stores函数确保存储操作完毕后再调用WFI指令,从而进入待机模式。这里值得注意的是,待机模式也可以使用WFE指令进入的,如果您有需要可以自行修改。     在进入待机模式后,除了被使能了的用于唤醒的I/O,其余I/O都进入高阻态,而从待机模式唤醒后,相当于复位STM32芯片,程序重新从头开始执行。


 04电源管理实验

PWR—睡眠模式(如何控制 STM32 进入低功耗睡眠模式。

程序设计:

int main()
{(1) 初始化用于唤醒的中断按键;
…………………………………………………………………… 
while(1){	/*********执行任务***************************/printf("\r\n STM32正常运行,亮绿灯\r\n");LED_GREEN;	Delay(0x3FFFFF);
(2) 进入睡眠状态;/*****任务执行完毕,进入睡眠降低功耗***********/printf("\r\n 进入睡眠模式,按KEY1或KEY2按键可唤醒\r\n");//使用红灯指示,进入睡眠状态LED_RED;//进入睡眠模式__WFI();	//WFI指令进入睡眠(3) 使用按键中断唤醒芯片;//由于 WFI 睡眠模式可以使用任意中断唤醒,所以我们可以使用按键中断唤醒。//等待中断唤醒  K1或K2按键中断	/***被唤醒,亮蓝灯指示***/LED_BLUE;	Delay(0x1FFFFF);		printf("\r\n 已退出睡眠模式\r\n");//继续执行while循环}
}
/*按键中断部分*/
void KEY1_IRQHandler(void)
{//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) {LED_BLUE;		printf("\r\n KEY1 按键中断唤醒 \r\n");    EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     }  
}void KEY2_IRQHandler(void)
{//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) {LED_BLUE;printf("\r\n KEY2 按键中断唤醒 \r\n");   //清除中断标志位EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     }  
}
注意 : 当系统处于睡眠模式低功耗状态时 ( 包括后面讲解的停止模式及待机模式 ) ,使用 DAP下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒。或者使用如下方法:按着板子的复位按键,使系统处于复位状态,然后点击电脑端的下载按钮下载程序,这时再释放复位按键,就能正常给板子下载程序了。

PWR—停止模式实验(解如何进入停止模式及唤醒后的状态恢复。

与睡眠模式不一样,系统从停止模式被唤醒时,是使用 HSI 作为系统时钟的,在 STM32F103 中, HSI 时钟一般为 8MHz ,与我们常用的 72MHz 相关太远,它会影响各种外设的工作频率。所以在系统从停止模式唤醒后,若希望各种外设恢复正常的工作状态,就要恢复停止模式前使用的系统时钟,本实验中定义了一个 SYSCLKConfig_STOP 函数,用于恢复系统时钟:
/*** @brief  停机唤醒后配置系统时钟:
这个函数主要是调用了各种 RCC 相关的库函数,
开启了 HSE 时钟、使能 PLL 并且选择 PLL 作
为时钟源,从而恢复停止前的时钟状态。* @param  None* @retval None*/
static void SYSCLKConfig_STOP(void)
{/* After wake-up from STOP reconfigure the system clock *//* 使能 HSE */RCC_HSEConfig(RCC_HSE_ON);/* 等待 HSE 准备就绪 */while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET){}/* 使能 PLL */ RCC_PLLCmd(ENABLE);/* 等待 PLL 准备就绪 */while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET){}/* 选择PLL作为系统时钟源 */RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);/* 等待PLL被选择为系统时钟源 */while (RCC_GetSYSCLKSource() != 0x08){}
}

main函数部分

/* 进入停止模式,设置电压调节器为低功耗模式,等待中断唤醒 */PWR_EnterSTOPMode(PWR_Regulator_LowPower,PWR_STOPEntry_WFI);	
由于 WFI 停止模式可以使用任意 EXTI 的中断唤醒,所以我们可以 使用按键中断唤醒
void KEY_IRQHandler(void)
{//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) {LED_BLUE;//由于停止唤醒后使用的是HSI时钟,与原来使用的HSE时钟时的频率不一致,会影响波特率,若此处直接printf会乱码//printf("\r\n KEY2 按键中断唤醒 \r\n");   //清除中断标志位EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     }  
}
当执行完中断服务函数后,会继续执行 WFI 指令 ( PWR_EnterSTOPMode 函数 ) 后的代码。

为了更清晰地展示停止模式的影响,在刚唤醒后,我们定义了

	RCC_ClocksTypeDef clock_status_wakeup,clock_status_config;uint8_t clock_source_wakeup,clock_source_config; 

用于调用库函数 RCC_GetSYSCLKSourc以及 RCC_GetClocksFreq 获取刚唤醒后的系统的时钟源以及时钟频率,在使用 SYSCLKCon-fig_STOP 恢复时钟后,我们再次获取这些时状态,最后再通过串口打印出来。

//获取刚被唤醒时的时钟状态	//时钟源clock_source_wakeup = RCC_GetSYSCLKSource ();//时钟频率RCC_GetClocksFreq(&clock_status_wakeup);//从停止模式下被唤醒后使用的是HSI时钟,此处重启HSE时钟,使用PLLCLKSYSCLKConfig_STOP();//获取重新配置后的时钟状态	//时钟源clock_source_config = RCC_GetSYSCLKSource ();//时钟频率RCC_GetClocksFreq(&clock_status_config);
//因为刚唤醒的时候使用的是HSI时钟,会影响串口波特率,输出不对,所以在重新配置时钟源后才使用串口输出。printf("\r\n重新配置后的时钟状态:\r\n");printf(" SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d (0表示HSI,8表示PLLCLK)\n", clock_status_config.SYSCLK_Frequency, clock_status_config.HCLK_Frequency, clock_status_config.PCLK1_Frequency, clock_status_config.PCLK2_Frequency, clock_source_config);printf("\r\n刚唤醒的时钟状态:\r\n");	printf(" SYSCLK频率:%d,\r\n HCLK频率:%d,\r\n PCLK1频率:%d,\r\n PCLK2频率:%d,\r\n 时钟源:%d (0表示HSI,8表示PLLCLK)\n", clock_status_wakeup.SYSCLK_Frequency, clock_status_wakeup.HCLK_Frequency, clock_status_wakeup.PCLK1_Frequency, clock_status_wakeup.PCLK2_Frequency, clock_source_wakeup);
通过串口调试信息我们会知道刚唤醒时系统时钟使用的是 HSI 时钟,频率为 8MHz ,恢复后的系统时钟采用 HSE 倍频后的 PLL 时钟,时钟频率为 72MHz

PWR—待机模式实验 最低功耗的待机模式

要强调的是,由于 WKUP 引脚 (PA0) 必须使用上升沿才能唤醒待机状态的系统,所以我们硬件设计的 PA0 引脚连接到按键 KEY1 ,且按下按键的时候会在 PA0 引脚产生上升沿,从而可实现唤醒的功能,按键的具体电路请查看配套的原理图。
1.程序首先使用库函数 RCC_APB1PeriphClockCmd 和参数 RCC_APB1Periph_PWR 初始化了源管理外设的时钟,要先使能该时钟,后面才能正常使用命令进入待机状态和唤醒。
	/* 使能电源管理单元的时钟,必须要使能时钟才能进入待机模式 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);
2.由于待机模式唤醒使用 WKUP 引脚并不需要特别的引脚初始化,所以我们调用普通的按键初始化函数即可(模式的 WKUP 唤醒不需要中断,也不需要像按键那样初始化)
int main(void)
{	/* 使能电源管理单元的时钟,必须要使能时钟才能进入待机模式 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);//检测复位来源if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET){LED_BLUE;printf("\r\n 待机唤醒复位 \r\n");}else{LED_GREEN;printf("\r\n 非待机唤醒复位 \r\n");}while(1){}
}
3.在使用库函数 PWR_EnterSTANDBYMode发送待机命令前,要先使用库函数 PWR_ClearFlag 清除 PWR_FLAG_WU 标志位,并且使用库函数 PWR_WakeUpPinCmd 使能 WKUP 唤醒功能,这样进入待机模式后才能使用 WKUP 唤醒。
	/*清除WU状态位*/PWR_ClearFlag (PWR_FLAG_WU);/* 使能WKUP引脚的唤醒功能 ,使能PA0*/PWR_WakeUpPinCmd (ENABLE);/* 进入待机模式 */PWR_EnterSTANDBYMode();
在进入待机模式前我们控制了 LED 彩灯为红色,但在待机状态时,由于 I/O 口会处于高阻态,所以 LED 灯会熄灭。
按下 KEY1 按键,会使 PA0 引脚产生一个上升沿,从而唤醒系统。
系统唤醒后会进行复位,从头开始执行上述过程,与第一次上电时不同的是,这样的复位会使 PWR_FLAG_WU 标志位改为 SET 状态,所以这个时候 LED 彩灯会亮蓝色。(这也为什么我们可以从while循环外获取是否是待机启动)

PWRPVD 电源监控实验(如何使用 PVD 监控供电电源,增强系统的鲁棒性

中使用 PVD 监控 STM32 芯片的 VDD 引脚,当监测到供电电压低于阈值时会产生 PVD 中断,系统进入中断服务函数进入紧急处理过程。所以进行这个实验时需要使用一个可调的电压源给实验板供电,改变给 STM32 芯片的供电电压,为此我们需要先了解实验板的电源供电系统,见图实验板的电源供电系统

整个电源供电系统主要分为以下五部分:

  • (1) 6-12V DC 电源供电系统,这部分使用 DC 电源接口引入 6-12V 的电源,经过 RT7272 进行电压转换成 5V 电源,再与第二部分的“5V_USB”电源线连接在一起。
  • (2) 第二部分使用 USB 接口,使用 USB 线从外部引入 5V 电源,引入的电源经过电源开关及保险丝连接到“5V”电源线。
  • (3) 第三部分的是电源开关及保险丝,即当我们的实验板使用 DC 电源或“5V_USB”线供电时,可用电源开关控制通断,保险丝也会起保护作用。
  • (4) 5V”电源线遍布整个板子,板子上各个位置引出的标有“5V”丝印的排针都与这个电源线直接相连。5V 电源线给板子上的某些工作电压为 5V 的芯片供电。5V 电源还经过 LDO 稳压芯片,输出 3.3V 电源连接到“3.3V”电源线。
  • (5) 同样地,“3.3V”电源线也遍布整个板子,各个引出的标有“3.3V”丝印的排针都与它直接相连,3.3V 电源给工作电压为 3.3V 的各种芯片供电。STM32 芯片的 VDD 引脚就是直接与这个3.3V 电源相连的,所以通过 STM32 PVD 监控的就是这个“3.3V”电源线的电压。

当我们进行这个 PVD 实验时,为方便改变“ 3.3V ”电源线的电压,我们可以把可调电源通过实
验板上引出的“ 5V ”及“ GND ”排针给实验板供电,当可调电源电压降低时, LDO 在“ 3.3V ”电
源线的供电电压会随之降低,即 STM32 PVD 监控的 VDD 引脚电压会降低,这样我们就可以
模拟 VDD 电压下降的实验条件,对 PVD 进行测试了。不过,由于这样供电不经过保险丝,所以
在调节电压的时候要小心,不要给它供电远高于 5V ,否则可能会烧坏实验板上的芯片。

软件设计:

初始化 PVD
使用 PVD 功能前需要先初始化,我们把这部分代码封装到 PVD_Config 函数中
/*** @brief  配置PVD.* @param  None* @retval None*/
void PVD_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;/*使能 PWR 时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* 使能 PVD 中断 */NVIC_InitStructure.NVIC_IRQChannel = PVD_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* 配置 EXTI16线(PVD 输出) 来产生上升下降沿中断*/EXTI_ClearITPendingBit(EXTI_Line16);EXTI_InitStructure.EXTI_Line = EXTI_Line16;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);/* 配置PVD级别PWR_PVDLevel_2V6 (PVD检测电压的阈值为2.6V,VDD电压低于2.6V时产生PVD中断) *//*具体级别根据自己的实际应用要求配置*/PWR_PVDLevelConfig(PWR_PVDLevel_2V6);/* 使能PVD输出 */PWR_PVDCmd(ENABLE);
}
在这段代码中,执行的流程如下:
(1) 配置 PVD 的中断优先级。由于电压下降是非常危急的状态,所以请尽量把它配置成最高优先级。
(2) 配置了 EXTI16 线的中断源,设置 EXTI16 是因为 PVD 中断是通过 EXTI16 产生中断的 (GPIO的中断是 EXTI0-EXTI15)
(3) 使用库函数 PWR_PVDLevelConfig 设置 PVD 监控的电压阈值等级,各个阈值等级表示的电压值请查阅表 PVD 的阈值等级 STM32 的数据手册。
(4) 最后使用库函数 PWR_PVDCmd 使能 PVD 功能。
	/*** @brief  PVD中断请求* @param  None* @retval None*/
void PVD_IRQHandler(void)
{/*检测是否产生了PVD警告信号*/if(PWR_GetFlagStatus (PWR_FLAG_PVDO)==SET)			{/* 亮红灯,实际应用中应进入紧急状态处理 */LED_RED; }/* 清除中断信号*/EXTI_ClearITPendingBit(EXTI_Line16);}
注意这个中断服务函数的名是 PVD_IRQHandler 而不是 EXTI16_IRQHandler(STM32 没有这样的中断函数名) ,示例中我们仅点亮了 LED 红灯,不同的应用中要根据需求进行相应的紧急处理。

主函数

本电源监控实验的 main 函数执行流程比较简单,仅调用了 PVD_Config 配置监控功能,当 VDD供电电压正常时,板子亮绿灯,当电压低于阈值时,会跳转到中断服务函数中,板子亮红灯
​int main(void)
{	LED_GPIO_Config();	//亮绿灯,表示正常运行LED_GREEN; //配置PVD,当电压过低时,会进入中断服务函数,亮红灯PVD_Config();while(1){			/*正常运行的程序*/}
}

【 !】实验操作:
 1.使用外部可调电源,调节成5V输出,连接到实验板引出的 5V<--->GND排针给板子供电;
2.复位实验板,电压正常时板子上的LED彩灯应为绿色
3.向下调节可调电源的电压,大约当降至4.2V的时候,LED彩灯会转为红色。
(程序中控制PVD监控电压约为2.6V,当5V电源降至4.2V的时候,连接STM32的VDD电源(3.3V电源)会低于2.5V,产生PVD事件,在中断中控制亮红灯)

【 !!】注意事项:
使用可调电源给实验板供电,其它电源线都拔掉(包括下载器、USB线)。
由于直接接排针供电没有电路保护,调节电源时小心不要使供电电压远高于5V,电压太高会烧坏实验板!!

相关文章:

STM32电源管理—实现低功耗

注&#xff1a; 本文是学习野火的指南针开发板过程的学习笔记&#xff0c;可能有误&#xff0c;详细请看B站野火官方配套视频教程&#xff08;这个教程真的讲的很详细&#xff0c;请给官方三连吧&#xff09; 在响应绿色发展的同时&#xff0c;在很多应用场合中都对电子设备的功…...

【链路层】空口数据包详解(4):数据物理通道协议数据单元(PDU)

目录 一、概述 1.1. 头部&#xff08;Header&#xff09;结构 1.2. MIC字段的情况说明 1.3. 有效载荷&#xff08;Payload&#xff09;格式与LLID字段的关联 二、LL Data PDU 2.1. 定义与用途 2.2. 头部字段设置 2.3. 空PDU&#xff08;Empty PDU &#xff09; 2.4. 数…...

数学分组求偶数和

问题描述 小M面对一组从 1 到 9 的数字&#xff0c;这些数字被分成多个小组&#xff0c;并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 numbers: 一个由多个整数字符串组…...

机器学习基础02_特征工程

目录 一、概念 二、API 三、DictVectorize字典列表特征提取 四、CountVectorize文本特征提取 五、TF-IDF文本1特征词的重要程度特征提取 六、无量纲化预处理 1、MinMaxScaler 归一化 2、StandardScaler 标准化 七、特征降维 1、特征选择 VarianceThreshold 底方差…...

CSS Modules中的 :global

最近写需求遇到如下代码&#xff0c;我们来分析一番&#xff1a; .medicine-bot {:global(.cosd-site-vcard-card) {margin-top: -3px;}:global(.cosd-site-vcard-title-text) {font-size: var(--cos-text-headline-sm);}:global(.cosd-site-vcard-button) {background-color: …...

linux病毒编写+vim shell编程

学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 请一定遵循《网络空间安全法》&#xff01;&#xff01;&#xff01; Linux目录介绍 /bin 二进制可执行文件&#xff08;kali里面是工具一些文件&#xff09;/etc 系统的管理和配置文…...

WinDefender Weaker

PPL Windows Vista / Server 2008引入 了受保护进程的概念&#xff0c;其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM &#xff08;数字版权管理&#xff09;要求。Microsoft开发了此机制&#xff0c;以便您的媒体播放器可以读取例如蓝光&#xff0c;同时…...

智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序5 架构for认知系统 总述 (架构全图)

本文提要 本文讨论的“智能工厂的设计软件” for认知系统的架构全图 &#xff0c;这有别于前面所说的“智能工厂的设计软件”的“全景图”。两者在内容和侧重点上有所不同&#xff0c;但它们共同构成了对智能工厂设计软件的全面描述。 全景图是对智能工厂设计软件的整体概览&…...

vmware集群 vSAN HCL 数据库

HCL数据库升级 https://partnerweb.vmware.com/service/vsan/all.json VSAN版本目录升级 https://vcsa.vmware.com/ph/api/v1/results?deploymentId2d02e861-7e93-4954-9a73-b08692a330d1&collectorIdVsanCloudHealth.6_5&objectId0c3e9009-ba5d-4e5f6-bae8-f25ec5…...

人工智能引发直播革命:AI 技术塑造无人直播全新体验

在数字化浪潮席卷全球的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术以其无与伦比的速度和广度&#xff0c;正深刻地改变着各行各业的面貌。其中&#xff0c;直播行业作为新媒体时代的宠儿&#xff0c;也迎来了由AI技术引领的颠覆性变革。这场由人工智能引发的直播…...

数据研发基础 | 什么是流批一体

流批一体的概念是可能出现在大厂的面试题中的&#xff0c;虽然就算大厂实习也没机会实操这样的高级操作&#xff0c;学一点概念&#xff0c;面试多少是能说上一两句的。大致就是希望一套代码能同时在批处理和流处理中运行&#xff08;同时做离线计算和实时计算&#xff09;。下…...

《Python网络安全项目实战》项目6 编写密码工具程序

《Python网络安全项目实战》项目6 编写密码工具程序 项目6 编写密码工具程序任务6.1 猜数字游戏任务描述任务分析任务实施6.1.1 编写基本的猜数字程序6.1.3 测试并修改程序6.1.4 给程序增加注释 任务拓展任务实施6.2.1 生成随机密码6.2.4 菜单功能 相关知识1. 密码字典2. 密码字…...

现代C++HTTP框架cinatra

文章目录 cinatra简介主要特点 快速上手编译器版本要求使用指南快速示例 项目地址 cinatra简介 cinatra是一个基于C20协程的高性能HTTP框架&#xff0c;它的目标是提供一个快速开发的C HTTP框架解决方案 它不仅支持HTTP/1.1和1.0&#xff0c;还支持SSL和WebSocket&#xff0c…...

【功耗现象】com.gorgeous.lite后台Camera 使用2小时平均电流200mA耗电量400mAh现象

现象 轻颜相机(com.gorgeous.lite)后台Camera 使用2小时平均电流200mA(BugReport提供的电流参考数据),耗电量400mAh 即耗电占比(200mA*2h)/(12.83h*52.68mA )400mAh/623mAh62% CameraOct 10 202321:03:08 - 23:03:372h16m15s859ms to 4h16m44s984msactive duration: 2h 0m 29…...

06.VSCODE:备战大项目,CMake专项配置

娇小灵活的简捷配置不过是年轻人谈情说爱的玩具&#xff0c;帝国大厦的构建&#xff0c;终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目&#xff0c;就像未来世界里的一台相声表演&#xff0c;有了德纲却无谦&#xff0c;观众笑着遗憾。—— 语出《双城记》作者&…...

还是小时候味道的麻辣片

麻辣片的诞生&#xff0c;源于人们对辣味的热爱和对丰富口感的追求。它将辣椒的火辣、香料的浓郁和豆制品的醇厚完美结合在一起&#xff0c;创造出了一种令人回味无穷的美食体验。无论是在学校的小卖部、街头的小吃摊&#xff0c;还是超市的货架上&#xff0c;麻辣片都以其鲜艳…...

GaussDB部署架构

GaussDB部署架构 云数据库GaussDB管理平台&#xff08;TPOPS&#xff09;基于B/S架构开发&#xff0c;由Web、管控Service、管控Agent三部分组成&#xff0c;软件结构如图1所示。 图1 各节点部署架构 Web&#xff1a;作为用户接入子系统&#xff0c;用于将用户在Web下发的操作…...

遥测数据采集工具Grafana Alloy

介绍 Alloy是Grafana产品公司旗下的一款新主推遥测数据采集工具&#xff0c;Grafana Alloy也是一个开源OpenTelemetry收集器&#xff0c;具有内置 Prometheus管道并支持指标、日志、跟踪和配置文件。Alloy支持为OTEL、Prometheus、Pyroscope、Loki等服务提供许多指标、日志、跟…...

线性数据结构

数组 数组&#xff08;Array&#xff09; 是一种很常见的数据结构。它由相同类型的元素&#xff08;element&#xff09;组成&#xff0c;并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引&#xff08;index&#xff09;可以计算出该元素对应的存储地址。 数组…...

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…...

【算法】二分

1. 找到有序区间中 x 最左边的数字的位置 static int getL(int a[], int l, int r, int x) {while (l < r) {int mid l r >> 1;if (x < a[mid]) {r mid;} else {l mid 1;}}if (a[l] ! x) return -1;return l;} 2. 找到有序区间中 x 最右边的数字的位置 stati…...

ARM CCA机密计算安全模型之简介

安全之安全(security)博客目录导读 目录 1、引言 2、问题陈述 3、CCA 安全保证 3.1 对领域所有者的安全保证 3.2 对host环境的安全保证 Arm 机密计算架构&#xff08;CCA&#xff09;安全模型&#xff08;SM&#xff09;定义了 CCA 隔离架构的安全要求和基本安全属性。这…...

蓝桥杯-洛谷刷题-day3(C++)

目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…...

K8S资源限制之ResourceQuota

ResourceQuota介绍 在K8S中&#xff0c;大部分资源都可以指定到一个名称空间下&#xff0c;因此可以对一个名称空间的计算资源&#xff0c;存储资源&#xff0c;资源数量等维度做资源限制。 如限制pod数量、svc数量&#xff0c;控制器数量&#xff0c;限制PVC请求的存储量 注…...

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o

在不断发展的人工智能领域&#xff0c;Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用&#xff0c;突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…...

MongoDB索引操作和执行计划Explain()详解

一、索引操作 说明&#xff0c;下面的内容举例时&#xff0c;以"dailyTrip"collection为例。 字段内容如下&#xff1a; {"_id" : ObjectId("63ec5a971ddbe429cbeeffe3"), // object id"car_type" : "Gett", // string&…...

H3C NX30Pro刷机教程-2024-11-16

H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…...

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…...

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)

HarmonyOS ArkUI(基于ArkTS) 开发布局 &#xff08;上&#xff09; 四 层叠布局 (Stack) 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…...

org.springframework.context.support.ApplicationListenerDetector 详细介绍

一&#xff0c;功能介绍 early post-processor for detecting inner beans as ApplicationListeners 早期的PostProcessor用来检测并处理内部&#xff08;inner&#xff09;bean作为 ApplicationListeners BeanPostProcessor that detects beans which implement the Applica…...