硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6390|回复: 5
收起左侧

[HAL学习笔记] HAL库源文件stm32h7xx_hal_pwr.c学习笔记,主要是睡眠,停机,待机的低功耗处理(2018-12-30 V1.0)

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
发表于 2018-12-30 16:31:01 | 显示全部楼层 |阅读模式



1、上电复位后,备份域(RTC registers, RTC backup data registers 和 backup SRAM)是受保护的,防止意外的写操作。
void HAL_PWR_DeInit(void)
void HAL_PWR_EnableBkUpAccess(void)
void HAL_PWR_DisableBkUpAccess(void)

2、PVD配置
(1)PVD用于监测VDD电源供电情况,通过与寄存器PWR_CR1的PLS[7:0]位设置的PVD阀值做比较。
(2)PVDO标准可以监测VDD是高于设置的阀值还是低于设置的阀值,在内部是与EXTI Line16连接。
(3)通过函数__HAL_PWR_PVD_EXTI_ENABLE_IT可以使能此中断。
(4)在待机模式,PVD停止工作。

3、唤醒引脚配置
(1)唤醒引脚用于将系统从待机模式唤醒
(2)唤醒引脚可以通过WKUPEPR寄存器配置引脚的上拉电阻,下拉电阻或者无上拉下拉电阻。
(3)唤醒引脚的极性也可以通过寄存器WKUPEPR配置,可以设置上升沿或者下降沿唤醒。
(4)STM32H7系列有6个唤醒引脚。

4、低功耗模式
STM32H7支持三种低功耗模式
(1)休眠模式:CM7内核停止运行,D1,D2和D3域的外设继续运行。
(2)停机模式:所有时钟停止,稳压器在主电源或低功率模式下运行。
(3)待机模式:D1,D2和D3域进去DSTANDBY模式,VCORE的供电稳压器关闭。

5、休眠模式
(1)进入方式
HAL_PWR_EnterSLEEPMode(Regulator, SLEEPEntry)

参数Regulator
STM32H7用不到这个参数,是为了跟STM32L系列的API保持兼容。

参数SLEEPEntry
PWR_SLEEPENTRY_WFI:  enter SLEEP mode with WFI instruction
PWR_SLEEPENTRY_WFE:  enter SLEEP mode with WFE instruction

(2)退出方式
任何受NVIC控制的中断都可以唤醒休眠模式。

6、停机模式
在系统停止模式下,1.2V域中的所有时钟都停止,PLL,HSI和HSE RC振荡器被禁用。 内部SRAM和寄存器内容保留。

电压调节器可配置为正常或低功耗模式。为了进一步降低停机模式下的功耗,可以使用函数HAL_PWREx_EnableFlashPowerDown先关闭FLASH电源,再进入停止模式。退出停止模式后,再使用函数HAL_PWREx_DisableFlashPowerDown()打开。

(1)进入方式
函数HAL_PWR_EnterSTOPMode(Regulator, STOPEntry)

参数 Regulator:
PWR_MAINREGULATOR_ON: Main regulator ON.
PWR_LOWPOWERREGULATOR_ON: Low Power regulator ON.
参数STOPEntry:
PWR_STOPENTRY_WFI: enter STOP mode with WFI instruction
PWR_STOPENTRY_WFE: enter STOP mode with WFE instruction

(2)退出方式
在中断/事件模式下配置的任何EXTI Line(内部或外部)。


7、待机模式
系统待机模式允许实现最低功耗。它是基于Cortex-M7深度睡眠模式下,禁用电压调节器,因此系统断电。

PLL,HSI振荡器和HSE振荡器也被关闭。

SRAM和寄存器内容丢失,除了RTC寄存器,RTC备份寄存器,备份SRAM和待机电路。

进入方式:
使用HAL_PWR_EnterSTANDBYMode()函数输入待机模式。

退出方式:
WKUP引脚上升沿或下降沿,RTC Alarm(Alarm A和Alarm B),RTC唤醒,入侵事件,时间戳事件,NRST引脚的外部复位,IWDG复位。


8、从低功耗模式自动唤醒(AWU Auto-wakeup)
通过RTC Alarm 事件,唤醒事件,入侵事件或时间戳事件唤醒MCU,而不依赖于外部中断(AWU)。

STOP和STANDBY模式下的RTC自动唤醒(AWU)
(1)使用RTC Alarm事件唤醒停止模式,使用函数HAL_RTC_SetAlarm_IT配置RTC Alarm。
(2)使用RTC 入侵或时间戳事件唤醒停机模式。使用函数HAL_RTCEx_SetTimeStamp_IT()或HAL_RTCEx_SetTamper_IT()进行配置。
(3)使用RTC WakeUp事件唤醒停止模式,使用函数HAL_RTCEx_SetWakeUpTimer_IT()配置RTC WakeUp事件。


/* Initialization and de-initialization functions */
void HAL_PWR_DeInit(void);
void HAL_PWR_EnableBkUpAccess(void);
void HAL_PWR_DisableBkUpAccess(void);

/* PVD configuration */
void HAL_PWR_ConfigPVD(PWR_PVDTypeDef *sConfigPVD);
void HAL_PWR_EnablePVD(void);
void HAL_PWR_DisablePVD(void);

/* WakeUp pins configuration */
void HAL_PWR_EnableWakeUpPin(uint32_t WakeUpPinPolarity);
void HAL_PWR_DisableWakeUpPin(uint32_t WakeUpPinx);

/* Low Power modes entry */
void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry);
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry);
void HAL_PWR_EnterSTANDBYMode(void);

/* Power PVD IRQ Handler */
void HAL_PWR_PVD_IRQHandler(void);
void HAL_PWR_PVDCallback(void);

/* Cortex System Control functions   */
void HAL_PWR_EnableSleepOnExit(void);
void HAL_PWR_DisableSleepOnExit(void);
void HAL_PWR_EnableSEVOnPend(void);
void HAL_PWR_DisableSEVOnPend(void);






回复

使用道具 举报

2

主题

87

回帖

93

积分

初级会员

积分
93
发表于 2018-12-30 20:31:09 来自手机 | 显示全部楼层
学习了,真用功 放假了还在工作 佩服
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-4 20:33:00 | 显示全部楼层
请问一下:
/* Cortex System Control functions   */
这里的几个 API 不是很明白,这里面操作的都是 ARM 内核的寄存器
这里的注释是 Indicate Sleep-On-Exit when returning from Handler mode to Thread mode。
Handler mode 和 Thread mode 应该怎么理解,这些 API 的使用场景又是什么样的呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2021-4-5 07:14:05 | 显示全部楼层
王海靖 发表于 2021-4-4 20:33
请问一下:
/* Cortex System Control functions   */
这里的几个 API 不是很明白,这里面操作的都是 ARM ...

handler就是中断服务程序,Thread是中断之外的执行。

这个函数的意思应该是那种仅在中断里面执行程序的应用场合,退出中断就进入Sleep模式。
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2021-4-5 09:35:11 | 显示全部楼层
eric2013 发表于 2021-4-5 07:14
handler就是中断服务程序,Thread是中断之外的执行。

这个函数的意思应该是那种仅在中断里面执行程序 ...

void HAL_PWR_EnableSleepOnExit(void); // 中断会导致唤醒已经睡眠的MCU 这个API 可以在中断退出后继续睡眠
void HAL_PWR_DisableSleepOnExit(void);// 中断退出后就唤醒MCU了

下面两个作用是,外部中断能否唤醒MCU的模式
void HAL_PWR_EnableSEVOnPend(void); // 被屏蔽的中断也会唤醒MCU,例如引脚开了中断,但是没有使能中断也可以唤醒MCU
void HAL_PWR_DisableSEVOnPend(void);// 被屏蔽的中断无法唤醒MCU,例如引脚开了中断,但是没有使能中断就不可以唤醒MCU了

以上功能全部在 NUCLEO-L433 上测试通过
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106826
QQ
 楼主| 发表于 2021-4-6 07:14:24 | 显示全部楼层
王海靖 发表于 2021-4-5 09:35
void HAL_PWR_EnableSleepOnExit(void); // 中断会导致唤醒已经睡眠的MCU 这个API 可以在中断退出后继续 ...

感谢告知测试结果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 04:27 , Processed in 0.293325 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表