CubeMX配置PWR电源管理

  • 前言
  • 一、什么是PWR?
    • 1.电源系统
    • 2.电源监控器
    • 3.电源管理
  • 二、实验过程
    • 1.STM32CubeMX配置
    • 2.代码实现
      • SLEEP_MODE模式
      • 实验结果
      • STOP_MODE模式
      • 实验结果
      • STANDBY_MODE模式
  • 总结

前言

本章介绍使用STM32CubeMX对PWR进行配置的方法,PWR的原理、概念和特点,配置各个步骤的功能,并通过实验方式实现展示结果。

一、什么是PWR?

电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。因此, STM32 有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。

PWR分为下列几个部分内容:

1.电源系统

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

从上图可知,STM32 的电源系统主要分为备份域供电、内核供电以及 AD/传感器供电三部分:
① AD/传感器电路供电和参考电压
STM32 的 ADC/温度传感器 模块配备独立的供电方式

② 电压调节器
在 STM32 的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及 RAM,调压器的输出电压约为 1.8V,因而使用调压器供电的这些电路区域被称为 1.8V 域。调压器可以运行在“运行模式”、“停止模式”以及“待机模式”。在运行模式下, 1.8V域全功率运行;在停止模式下 1.8V 域运行在低功耗状态, 1.8V 区域的所有时钟都被关闭,相应的外设都停止了工作,但它会保留内核寄存器以及 SRAM 的内容;在待机模式下,整个 1.8V 域都断电,该区域的内核寄存器及 SRAM 内容都会丢失 (备份区域的寄存器不受影响)

③ 电池备份区域
电池备份区域也就是后备供电区域,使用电池或者其他电源连接到 VBAT 脚上,当 VDD断电时,可以保存备份寄存器的内容和维持 RTC 的功能。同时 VBAT 引脚也为 RTC 和 LSE 振荡器供电,这保证了当主要电源被切断时, RTC 能够继续工作。切换到 VBAT 供电由复位模块中的掉电复位功能控制。

2.电源监控器

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

从上图中可知: POR、 PDR 功能是使用其电压阈值与外部供电电压 VDD 比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作。除此之外, STM32 还提供了可编程电压检测器 PVD,它也是实时检测 VDD 的电压,当检测到电压低于编程的 VPVD 阈值时,会向内核产生一个 PVD 中断 (EXTI16 线中断) 以使内核在复位前进行紧急处理。

3.电源管理

在 STM32 的除了正常工作外具有三种低功耗模式:睡眠、停止以及待机。在上电复位后, STM32 处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种模式降低功耗。这三种低功耗模式电源消耗不同、唤醒时间不同和唤醒源不同。
睡眠模式:

停止模式:

待机模式:

二、实验过程

1.STM32CubeMX配置

选择芯片stm32f103c6t6,新建工程

设置时钟源,最小系统外部晶振8Mhz,作为外部高速HSE时钟源。由于没有外接外部低速晶振,这里低速时钟源选择旁路时钟源。

配置时钟树,这里使用官方推荐的配置


配置GPIO中断用于唤醒

使能中断

配置串口用于打印测试

USART1的参数配置如下,波特率115200,传输数据长度为8 Bit,奇偶检验无,停止位1.其他参数默认

RTC配置

Code Generator中设置只拷贝使用到的库,分离.c和.h文件

设置好项目名称和路径,点击GENERATE CODE即可,生成后使用keil5 IDE打开。

2.代码实现

在usart.c文件后面添加如下代码,代码中添加了#ifdef宏定义进行条件编译,如果使用GUNC编译,则PUTCHAR_PROTOTYPE 定义为int __io_putchar(int ch)函数,否则定义为int fputc(int ch, FILE *f)函数。

/* USER CODE BEGIN 0 */
#include "stdio.h"
#ifdef __GNUC__/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printfset to 'Yes') calls __io_putchar() */#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/*** @brief  Retargets the C library printf function to the USART.* @param  None* @retval None*/
PUTCHAR_PROTOTYPE
{/* Place your implementation of fputc here *//* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END 0 */

SLEEP_MODE模式

睡眠模式: 内核停止,程序以WFI指令进入睡眠模式,所以只要产生任意中断都会退出睡眠模式。所以进入睡眠模式前先调用HAL_SuspendTick()函数挂起系统滴答定时器,否则将会被系统滴答定时器(SysTick)中断在1ms内唤醒。程序运行到HAL_PWR_EnterSLEEPMode()函数时,系统进入睡眠模式,程序停止运行。当按下WAKEUP按键时,触发外部中断0,此时系统被唤醒。继续执行HAL_ResumeTick()语句回复系统滴答定时器。

main函数如下:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_RTC_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("\r\n********    STM32F13c6t6 LowPower Test  *******\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Press WAKEUP button to enter LP modes \r\n\r\n");printf("SleepMode!\r\nPress WAKE_UP button to wake up ...\r\n");HAL_SuspendTick();/* Request to enter SLEEP mode */HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);/* Resume Tick interrupt if disabled prior to sleep mode entry */HAL_ResumeTick();printf("\r\nSLEEP_MODE wake up,system running continue ... \r\n");}/* USER CODE END 3 */
}

实验结果

程序开始,进入低功耗模式,触发中断系统继续执行,运行结果如下

STOP_MODE模式

停止模式: 内核停止,外设也停止工作,所有外设时钟也关闭。此处设置了RTC唤醒。RTC时钟配置为外部时钟,频率为32.768KHz。经过16分频后的时基为16 /(~32.768KHz) = ~0,488 ms。若要20s后唤醒,则唤醒计数器的值为~20s/0,488ms = 40983 = 0xA017。由于停止模式PLL、HSI、HSE RC振荡器均被禁止,所以系统被唤醒(RTC唤醒或WAKUP按键外部中断唤醒)后需要重新配置系统时钟,同时关闭WAKEUP定时器。
由于外设时钟停止,所以程序返回main()函数中也需要重新初始化串口才能打印输出信息。

/* USER CODE BEGIN 0 */
static void SYSCLKConfig_STOP(void)
{RCC_ClkInitTypeDef RCC_ClkInitStruct;RCC_OscInitTypeDef RCC_OscInitStruct;uint32_t pFLatency = 0;/* Get the Oscillators configuration according to the internal RCC registers */HAL_RCC_GetOscConfig(&RCC_OscInitStruct);/* After wake-up from STOP reconfigure the system clock: Enable HSE and PLL */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/* Get the Clocks configuration according to the internal RCC registers */HAL_RCC_GetClockConfig(&RCC_ClkInitStruct, &pFLatency);/* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, pFLatency) != HAL_OK){Error_Handler();}
}/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_RTC_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */printf("\r\n********    STM32F13c6t6 LowPower Test  *******\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */printf("Press WAKEUP button to enter STOP modes \r\n\r\n");printf("STOPpMode!\r\nPress WAKE_UP button to wake up ...\r\n");HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);SYSCLKConfig_STOP();MX_USART1_UART_Init();printf("\r\nSTOP_MODE wake up,system running continue ... \r\n");
}/* USER CODE END 3 */
}

实验结果

程序开始,进入STOP_MODE低功耗模式,运行结果如下

STANDBY_MODE模式

待机模式:此时内核停止,外设也停止工作,1.2V域断电,SRAM和寄存器内容将丢失。待机模式唤醒后是重新运行程序,相当于重启,而不是在程序原来的位置继续运行。待机模式只能从WAKEUP引脚上升沿或下降沿,RTC,复位引脚,IWDG(独立看门狗) 复位唤醒。不能通过其他中断唤醒。前面睡眠模式和停止模式可以通过WAKEUP引脚的外部中断唤醒,但是待机模式不能通过外部中断唤醒。

实验过程以后再添加

总结

本章介绍了STM32的几种低功耗模式,这个在实际项目中用的非常多,特别是STOP_MODE和SLEEP_MODE

STM32开发(19)----CubeMX配置PWR电源管理相关推荐

  1. STM32 HAL库 CUBEMX配置 ADC采集

    文章目录 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 1.单通道不定时任意时刻采集信号 CUBEMX配置 代码添加 2.单通道ADC采集+DMA传输 CUBEMX添加配置 代码添加 ...

  2. stm32外部中断_STM32学习笔记 | 电源管理及低功耗设计要点

    一款好的电子产品,都需要认真考虑电源管理的问题,电池供电的产品更应该注意低功耗的实现. STM32电源介绍 嵌入式开发直播课 - STM32 USART串口的应用 - 创客学院直播室​www.make ...

  3. ESPIDF开发ESP32学习笔记【电源管理与低功耗模式】

    电源管理 ESP-IDF中集成的电源管理算法可以根据应用程序组件的需求,调整外围总线 (APB) 频率.CPU 频率,并使芯片进入 Light-sleep 模式,尽可能减少运行应用程序的功耗 应用程序 ...

  4. 第19章 Linux电源管理的系统架构和驱动之CPUIdle驱动

    19.3 CPUIdle驱动 目前的ARM SoC(System on Chip)大多支持几个不同的Idle级别,CPUIdle驱动子系统存在的目的就是对这些Idle状态进行管理,并根据系统的运行情况 ...

  5. STM32 I2C通信协议+CubeMx配置

    概念 两线式串行总线.由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据.(半双工通信 )在CPU与被控IC之间.IC与IC之间进行双向传送,高速IIC总线一般可以达到400kbps以上. I ...

  6. 第19章 Linux电源管理的系统架构和驱动之CPUFreq驱动

    19.2 CPUFreq驱动 CPUFreq子系统位于drivers/cpufreq目录下,负责进行运行过程中CPU频率和电压的动态调整,即DVFS(Dynamic Voltage Frequency ...

  7. CubeMX配置STM32实现httpd服务器CGI功能并使用网页控制STM32单片机(四)

    CubeMX配置STM32实现httpd服务器CGI功能并使用网页控制STM32单片机 引言 CubeMX配置HTTPD的CGI功能 实验过程 发现的问题 总结 引言 在前三篇文章中自己介绍了如何配置 ...

  8. linux 电池管理软件,Linux电源管理(2)_Generic PM之基本概念和软件架构

    Linux电源管理(2)_Generic PM之基本概念和软件架构 作者:wowo 发布于:2014-5-13 19:24 分类:电源管理子系统 1. 前言 这里的Generic PM,是蜗蜗自己起的 ...

  9. 智驾系统的设计瓶颈之:电源管理和功耗分配

    作者 | Orchid 知圈 | 进"滑板底盘群"请加微yanzhi-6,备注底盘 高阶自动驾驶系统在进行架构设计时,其域控内部的架构通常涉及主控芯片MCU.计算芯片SOC.电源管 ...

  10. android电源驱动程序,[转]Android虚拟电源管理驱动

    Android系统如果没有电源管理相关的驱动程序,在启动时将会提示如下错误: I/SystemServer(   50): Starting Battery Service. E/BatterySer ...

最新文章

  1. 《深入理解Elasticsearch(原书第2版)》——1.4 小结
  2. 一个北漂女孩-不想嫁给有钱人
  3. GlusterFS常用命令小结
  4. 2021/6/20~22 每天学习python 30分钟 -了解python - python的运算符
  5. 数据库mysql中delimiter的作用和用法
  6. 斐波那契数列规律的计算。
  7. Java8-初识Lambda
  8. 速修复!这个严重的 Apache Struts RCE 漏洞补丁不完整
  9. 32蜂鸣器天空之城代码_stm32版蜂鸣器播放爱若琉璃
  10. Spring Framework标记库初学指南
  11. mongoTemplate.aggregate() 聚合查询,关联查询
  12. c语言翻转棋ai算法,有没有人懂黑白棋(翻转棋)的核心算法
  13. SpringCloud之Zuul微服务网关 什么是Zuul微服务网关?
  14. python电影名称词云_Python爬取最近上映的电影评论并生成词云——误杀
  15. 【网络】H3C 交换机telnet查看端口流量Python小工具
  16. SCAP标准协议和威胁情报关键词术语
  17. About云双11两大福利:送书【9本】|送1T资源
  18. 购买汽车都有哪些费用,以及计算公式
  19. 世界一流水平的中国 10 大顶尖科学家
  20. 解决MPx 无法在windows下运行

热门文章

  1. Gentoo更新portage记录
  2. 联想拯救者电脑和华为matepad多屏协同解决“驱动版本过低”的问题
  3. (17)2020-12-23(三栏布局、视口、百分比布局、媒体查询)
  4. linux脚本编辑按上键出现A,[转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法...
  5. 人类社会形态发展前瞻
  6. 因果推断-异质性分析
  7. 1-byte array(byte[], boolean[])图片导致的内存过大
  8. CCF2022版最新目录已发布,最新变动情况分析
  9. [Mysql] 聚合函数
  10. ora-00604 表空间不足无法登陆 解决方案