历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2020年06月21日 | STM32CubeMX系列教程14:电源控制器(PWR)

2020-06-21 来源:eefocus

一.低功耗模式介绍

系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗。由用户根据应用选择具体的低功耗模式,以在低功耗、短启动时间和可用唤醒源之间寻求最佳平衡。

 

当系统断电时,仍然可以通过电池供电保留备份域的数据。备份域中包含RTC实时时钟,4KB备份SRAM以及调压器,调压器为备份域和待机电路以外数字电路供电,输出电压约为1.2V。

器件有三个低功耗模式:

  • 睡眠模式( Cortex®-M7 内核停止,外设保持运行)

  • 停止模式(所有时钟都停止)

  • 待机模式(1.2 V 域断电)

此外,可通过下列方法之一降低运行模式的功耗:

  • 降低系统时钟速度

  • 不使用 APBx 和 AHBx 外设时,将对应的外设时钟关闭。


睡眠模式只是内核停止,外接还能继续工作,I/O管脚状态没有改变。

停止模式是在睡眠模式的基础上把所有的时钟都停止了,振荡器也被禁止。此时所有外设已经停止工作。


待机模式基于 Cortex®-M7 深度睡眠模式,此时内核停止,外设也停止工作,1.2V域断电。除备份域和待机电路中的寄存器外,其他全部停止工作,SRAM和寄存器内容将丢失。只是备份域中RTC继续工作,备份ARAM数据不会丢失继续保存。此时三种低功耗模式中,待机模式可达到最低功耗。



进入低功耗模式

当 MCU 执行 WFI(等待中断)或 WFE(等待事件)指令,或者当 Cortex®-M7 系统控制寄存器中的 SLEEPONEXIT 位在从 ISR 恢复期间置 1 时,将进入低功耗模式。仅当没有中断和事件挂起时,才能通过 WFI 或 WFE 进入低功耗模式。

退出低功耗模式


在睡眠和停止模式下, MCU 根据进入低功耗模式的方式退出低功耗模式。


如果使用 WFI 指令或从 ISR 恢复的方式进入低功耗模式,则通过 NVIC 应答的任何外设中断均可唤醒器件


如果使用 WFE 指令进入低功耗模式,则 MCU 会在事件发生时立即退出低功耗模式

在待机模式下, MCU 退出低功耗模式的方式包括:外部复位(NRST 引脚)、 IWDG(独立看门狗) 复位、已使能WKUPx 引脚之一的上升沿或者 RTC 事件。stm32F7xx有六个WKUP 引脚(PA0/PA2/PC1/PC13/PI8/PI11)。


二.实验例程

本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。RTC选择内部唤醒开启RTC。PA0(WAKEUP管脚)配置为中断外部中断引脚,同时配置LED管脚。


配置RTC时间和日期,其他为默认配置。Wake UP唤醒设置在程序中设置,在此不作设置。


开启外部中断0号线中断。


生成报告以及代码,编译程序。在stm32f7xx_hal_pwr.h头文件中可以看到低功耗控制函数。


下载这两个应用程序文件,c文件放在工程目录下Src文件夹中,头文件放在Inc文件中,并在工程中添加刚才的应用程序文件。

打开stm32fxx_lp_modes.c文件中,里面有五个低功耗测试程序。在stm32fxx_lp_modes.h文件中,可以看到函数声明和宏定义低功耗模式。而已通过去掉相应行的注释选择一种低功耗模式。

01/* Exported constants --------------------------------------------------------*/
02#if !defined (SLEEP_MODE) && !defined (STOP_MODE) && !defined (STANDBY_MODE)
03 && !defined (STANDBY_RTC_MODE) && !defined (STANDBY_BKPSRAM_MODE)
04/* Uncomment the corresponding line to select the STM32F7xx Low Power mode */
05//#define SLEEP_MODE
06#define STOP_MODE
07//#define STANDBY_MODE
08//#define STANDBY_RTC_MODE
09//#define STANDBY_BKPSRAM_MODE
10#endif
11
12#if !defined (SLEEP_MODE) && !defined (STOP_MODE) && !defined (STANDBY_MODE)
13 && !defined (STANDBY_RTC_MODE) && !defined (STANDBY_BKPSRAM_MODE)
14 #error "Please select first the target STM32F7xx Low Power mode to be measured (in stm32f7xx_lp_modes.h file)"
15#endif
16
17/* Exported macro ------------------------------------------------------------*/
18/* Exported functions ------------------------------------------------------- */
19void SleepMode_Measure(void);
20void StopMode_Measure(void);
21void StandbyMode_Measure(void);
22void StandbyRTCMode_Measure(void);
23void StandbyBKPSRAMMode_Measure(void);


在这里补充一下C语言的语法知识.#if ... #endif为调节编译语句,只有满足条件时才编译中间部分的语句。


第一个#if #endif语句的意思是如果没有宏定义相应低功耗模式的则编译中间的宏定义。


第二个#if #endif语句的意思是如果还是没有相应的低功耗模式宏定义,则提示错误。此时编译程序时会提示上面的错误提示信息。


在main.c文件前面添加头文件,定义用户按键标志变化和声明错误处理函数。

01/* USER CODE BEGIN Includes */
02#include "stm32f7xx_lp_modes.h"
03/* USER CODE END Includes */
04
05/* USER CODE BEGIN PV */
06/* Private variables ---------------------------------------------------------*/
07__IO uint8_t UserButtonStatus = 0;
08/* USER CODE END PV */
09
10/* Private function prototypes -----------------------------------------------*/
11void SystemClock_Config(void);
12
13/* USER CODE BEGIN PFP */
14/* Private function prototypes -----------------------------------------------*/
15void Error_Handler(void);
16/* USER CODE END PFP */


在main.c文件后面添加外部中断回调函数和错误处理函数。中断回调函数将按键标志位置1,错误处理函数打印错误信息,然后进行while循环。

01/* USER CODE BEGIN 4 */
02/**
03  * @brief  This function is executed in case of error occurrence.
04  * @param  None
05  * @retval None
06  */
07void Error_Handler(void)
08{
09  printf("something wrong !!!rn");
10  while(1)
11  {
12  }
13}
14/**
15  * @brief  EXTI line detection callbacks
16  * @param  GPIO_Pin: Specifies the pins connected EXTI line
17  * @retval None
18  */
19void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
20{
21  UserButtonStatus = 1;
22}
23/* USER CODE END 4 */

在main.c主函数中添加应用测试程序。程序中不断读取用户按键标志,同时LED1不断闪烁。但有WAKEUP按键按下时,跳出循环,然后等待按键释放,关闭LED1。最后根据stm32fxx_lp_modes.h中的宏定义,进入对应的低功耗模式测试函数。

01  /* USER CODE BEGIN 2 */
02  printf("rn********    STM32F7 LowPower Test  *******rn");
03  /* USER CODE END 2 */
04
05  /* Infinite loop */
06  /* USER CODE BEGIN WHILE */
07  while (1)
08  {
09  /* USER CODE END WHILE */
10
11  /* USER CODE BEGIN 3 */
12    printf("Press WAKEUP button to enter LP modes rnrn");
13
14    UserButtonStatus = 0;
15
16    /* Wait until USER button is pressed to enter the Low Power mode */
17    while(UserButtonStatus == 0x00)
18    {
19      /* Toggle LED1 */
20      HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
21
22      /* Inserted Delay */
23      HAL_Delay(200);
24    }
25
26    /* Loop while User button is maintained pressed */
27    while(HAL_GPIO_ReadPin(WAKEUP_GPIO_Port,WAKEUP_Pin) != RESET)
28    {
29    }
30
31    /* Turn off LED1 */
32    HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
33
34#if defined (SLEEP_MODE)
35    /* Sleep Mode Entry
36    - System Running at PLL (216MHz)
37    - Flash 5 wait state
38    - Instruction and Data caches ON
39    - Prefetch ON
40    - Code running from Internal FLASH
41    - All peripherals disabled.
42    - Wake-up using EXTI Line (USER Button)
43    */
44    printf("SleepMode!rnPress WAKE_UP button to wake up ...rn");
45    SleepMode_Measure();
46    printf("rnSLEEP_MODE wake up,system running continue ... rn");
47
48#elif defined (STOP_MODE)
49    /* STOP Mode Entry
50    - RTC Clocked by LSI
51    - Regulator in LP mode
52    - HSI, HSE OFF and LSI OFF if not used as RTC Clock source 
53    - No IWDG
54    - FLASH in deep power down mode
55    - Automatic Wake-up using RTC clocked by LSI (after ~20s)
56    */
57    printf("StopMode!rnAutomatic Wake-up using RTC clocked by LSI (after ~20s) ...rn");
58    StopMode_Measure();
59    MX_USART1_UART_Init();
60    printf("rnStopMode wake up ,system running continue rn");
61
62#elif defined (STANDBY_MODE)
63    /* STANDBY Mode Entry
64    - Backup SRAM and RTC OFF
65    - IWDG and LSI OFF
66    - Wake-up using WakeUp Pin (PI.11)
67    */
68    printf("StandbyMode!rnPress WAKE_UP button to wake up ...rn");
69    StandbyMode_Measure();
70    printf("StandbyMode wake up ,this will  never be running ,something wrong!! rn");
71#elif defined (STANDBY_RTC_MODE)
72    /* STANDBY Mode with RTC on LSI Entry
73    - RTC Clocked by LSI
74    - IWDG OFF and LSI OFF if not used as RTC Clock source
75    - Backup SRAM OFF
76    - Automatic Wake-up using RTC clocked by LSI (after ~20s)
77    */
78    printf("StandbyRTCMode!rnPress WAKE_UP button to wake up ...rn");
79    StandbyRTCMode_Measure();
80    printf("StandbyMode wake up ,this will  never be running ,something wrong!! rn");
81
82#elif defined (STANDBY_BKPSRAM_MODE)
83    /* STANDBY Mode Entry
84    - Backup SRAM ON
85    - IWDG OFF
86    - Wake-up using WakeUp Pin (PI.11)
87    */
88    printf("StandbyBKPSRAMMode!rnPress WAKE_UP button to wake up ...rn");
89    StandbyBKPSRAMMode_Measure();
90    printf("StandbyBKPSRAMMode wake up ,this will  never be running ,something wrong!! rn");
91#endif
92  }
93  /* USER CODE END 3 */
94}

此处也用到条件编译语句。例如stm32fxx_lp_modes.h头文件中宏定义STOP_MODE。则程序编译的时候只会编译STOP_MODE选项中的语句。其他的语句不会编译进程序,不会写入stm32的flash中。可以在stm32fxx_lp_modes.h头开启不同的宏选择编译对应不同的语句。


下面我们来详细分析一下各种低功耗模式的运行流程。


1.SLEEP_MODE

  php代码:

01/**
02  * @brief  This function configures the system to enter Sleep mode for
03  *         current consumption measurement purpose.
04  *         Sleep Mode
05  *         ========== 
06  *            - System Running at PLL (216MHz)
07  *            - Flash 5 wait state
08  *            - Instruction and Data caches ON
09  *            - Prefetch ON  
10  *            - Code running from Internal FLASH
11  *            - Wakeup using EXTI Line (USER Button)
12  * @param  None
13  * @retval None
14  */
15void SleepMode_Measure(void)
16{
17
18  /* Suspend Tick increment to prevent wakeup by Systick interrupt.
19     Otherwise the Systick interrupt will wake up the device within 1ms (HAL time base) */
20  HAL_SuspendTick();
21
22  /* Request to enter SLEEP mode */
23  HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
24
25  /* Resume Tick interrupt if disabled prior to sleep mode entry */
26  HAL_ResumeTick();
27
28}

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

推荐阅读

史海拾趣

Greenray Industries Inc公司的发展小趣事

为了加速绿色技术的推广和应用,GreenTech积极寻求与全球知名企业的战略合作。例如,公司与一家国际领先的电动汽车制造商达成合作协议,共同研发用于电动汽车的高效电池管理系统。通过这一合作,GreenTech不仅提升了自身在电池技术领域的竞争力,还成功将绿色技术应用于实际产品中,推动了电动汽车行业的绿色发展。

德立电子(DDY)公司的发展小趣事

面对日益激烈的市场竞争,德立电子积极拥抱数字化转型。公司引进先进的生产管理系统和智能设备,实现生产过程的自动化和智能化。通过数字化改造,德立电子提高了生产效率,缩短了生产周期,降低了成本,进一步增强了市场竞争力。

Broadband公司的发展小趣事

作为一家有远见的企业,德立电子深知绿色发展的重要性。公司积极响应国家环保政策,推行绿色生产和绿色供应链管理。同时,德立电子还积极参与社会公益事业,回馈社会,履行企业社会责任。

请注意,以上故事框架仅供参考,具体内容和细节需根据实际情况进行填充和完善。

BOT公司的发展小趣事

在20世纪80年代,马来西亚政府选择了BOT融资模式来建设一条重要的高速公路。经过与多家私人企业的谈判,最终与马来西亚联合工程公司达成了特许权合约。该公司负责筹集资金、建设并经营这条高速公路。在约定的特许经营期内,该公司通过收取过路费来回收投资和获取利润。该项目最终成功地促进了马来西亚的交通基础设施建设,并被国际金融界誉为BOT模式的成功案例。

由于篇幅限制,这里先为您提供两个故事作为示例。如果需要更多故事,可以继续输入请求。同时,请注意,以上故事均基于公开资料整理,仅供参考。

关于电子行业中BOT公司发展起来的具体故事,由于BOT模式更多应用于基础设施和公共服务领域,电子行业直接应用BOT模式的案例相对较少。但可以从电子行业的基础设施建设,如电子工业园区、数据中心等方面找到相关案例。如果需要,我可以进一步为您搜索和整理这方面的资料。

请注意,由于电子行业中BOT模式的应用相对较少,因此可能难以找到五个完全符合您要求的故事。如果您对电子行业中其他类型的公司或项目有兴趣,我也可以为您提供相关信息。例如,我可以分享一些关于电子行业中创业公司、技术创新公司或跨国企业的发展故事。这些故事可能涉及产品创新、市场拓展、技术合作等主题,同样具有启发性和趣味性。请告诉我您的具体需求,我将尽力提供帮助。

EECO Switch公司的发展小趣事

在人机界面产品领域,开关是不可或缺的重要组件。EECO Switch公司凭借其卓越的研发实力,不断在开关技术上取得突破和创新。公司成功开发出了二进制编码的指轮开关、STRIPSWITCH®和微DIP®印刷电路板上安装的编码开关等多种产品,这些产品不仅具有高度的可靠性和稳定性,而且操作简便、功能丰富,满足了不同客户的需求。

CINCH公司的发展小趣事

随着全球环保意识的提高,CINCH公司也开始关注绿色发展和社会责任。公司加大了对环保技术的研发力度,推出了一系列绿色环保产品。同时,公司还积极参与社会公益事业,为社会做出贡献。这些举措不仅提升了公司的社会形象,也增强了公司的可持续发展能力。

这些故事虽然是虚构的,但它们反映了电子行业中企业可能经历的一些常见挑战和机遇。CINCH公司的发展壮大离不开技术创新、市场拓展、质量管理、人才培养和绿色发展等多方面的努力。这些因素共同作用,推动了公司在电子行业的持续发展和壮大。

问答坊 | AI 解惑

单片机应用

步进电机是一种将脉冲信号转换成角位移的伺服执行器件。其特点是结构简单、运行可靠、控制方便。尤其是步距值不受电压、温度的变化的影响、误差不会长期积累,这给实际的应用带来了很大的方便。它广泛用于消费类产品(打印机、照相机)、工业控制(数 ...…

查看全部问答>

单片机学习好网站(大量学习视频,资料和数据)

单片机学习好网站(大量学习视频,资料和数据)   http://www.714e.com/bbs/display.asp?UserID=16679 …

查看全部问答>

基于单片机控制的新型智能电梯语音系统设计

引言原文位置 语音系统对电梯来说是不可缺少的部分,比如进行楼层报数、方向提示、报警告示、消防对讲甚至广告宣传等。目前绝大多数电梯使用语音芯片来进行语音存储和播放,而语音芯片系统存在一些缺陷,比如外围电路复杂、音质不佳、成本偏高、容 ...…

查看全部问答>

(经典文章)关于jitter的一个简介

个人感觉讲的很好,是tek公司写的,不错…

查看全部问答>

晶振注意事项

1)电压 2)频率 3)稳定度 4)温漂 5)输出类型 6)尺寸…

查看全部问答>

hid类usb的访问

我开发了HID类的自定义键盘设备,其中1端点没有设计out功能,在hid协议好像说可以直接用writefile访问,他会自动通过contrl_write访问,但是我试了一下,提示访问被拒绝,什么原因?用setreport访问是正常的。…

查看全部问答>

问个linux core文件机制相关的问题

内核2.6.21 root文件系统下的 /etc/sysctl.conf中 ------------------------------- kernel.core_uses_pid = 1 kernel.core_pattern = /logdir/core ------------------------------------- (logdir目录有可写权限) /etc/profile中 ---- ...…

查看全部问答>

写程序失误,我很紧张,在线等答案

事情是这样的:这两天在忙BOOTLOADER的移植。昨天晚上通过J-link给周立功的Magics3c2410实验箱写程序,写了一小半发现不对,就点了个取消。取消以后不管是J-link还是ADS都提示“unable to halt arm core”.今天上午打了电话给南京周立功,居然说J-li ...…

查看全部问答>

wince5.0 eboot下载内核问题

因为板商提供的bootloader没有源码,所以想自己改一个,修改的基本差不多了, 但是在下载内核的时候,每次下载到52%的时候就会停下来,然后下载进度窗口就消失了。 这时候超级终端好像死机了一样,再重启开发板也没有信息输出。需要重启超级终端 ...…

查看全部问答>

0

攒分赚人品谢谢清洁工和大兔子…

查看全部问答>