HAL PWR Overview

Introducing PWR

group PWR_Introduction

  • The PWR peripheral in STM32 manages power modes (sleep, stop, standby) and RTC domain access.

  • It reduces power consumption, supports multiple wakeup sources, and is essential for battery-powered applications.

  • Control is achieved through PWR registers. Use HAL functions for simplified configuration.

Module and files

The following diagram illustrates the PWR module and its associated files.

Module and files diagram

Component diagram

The following diagram illustrates the software components involved in the PWR module. It shows the interactions between the user application, HAL drivers, low-level drivers, and the hardware components.

@startuml

!$use_ppp_core = 0
!$use_ll_rcc = 0
!$use_ppp_ll = 1
!$use_ppp_hal = 1

!$use_api_itf = 1
!$use_hal_itf = 1
!$use_ll_itf = 1
!$use_core_itf = 1
!$use_hal_generic_dep = 0
!$use_ppp_isr = 0
!$use_hal_service = 0
!$use_hal_rcc = 0
!$use_hal_dma = 0
!$use_kernel_clock = 1

!$core = "XXX" + "_CORE"
!$ppp = "PWR"
!$hal_api_itf = "HAL " + $ppp + " API"
!$appli_itf = "User Callback"
!$ppp_name = "HAL_"+$ppp
!$ppp_ISR  = $ppp+" ISR"
!$ll_ppp   = "LL_"+$ppp

!$hal_dma_itf = "HAL_DMA_StartDirectXfer_IT_Opt()\nHAL_DMA_Abort_IT"
!if ($use_kernel_clock == 1)
!$hal_rcc_itf = "\t\t\tHAL_RCC_"+$ppp+"_GetClockFreq()\n\t\t\tHAL_RCC_"+$ppp+"_EnableClock()"
!else
!$hal_rcc_itf = "\t\t\tHAL_RCC_"+$ppp+"_EnableClock()"
!endif

!$hal_ppp_itf = "Half transfer complete\nTransfer complete\nError callback\nAbort callback"

!$hal_generic_itf = "HAL_GetTick()"

!$ll_ppp_itf = "LL " + $ppp +" API"
!$ppp_xIRQ = $ppp+"x_IRQ"


<style>
componentDiagram {
   arrow {
      FontSize 8
   }
   interface {
      FontSize 8
   }
}
</style>

title $ppp Software Component Diagram

Package "Application Layer" #DarkMagenta {

  component [Appli]
  interface "$appli_itf" as APPLI_Interface
  [Appli] -r- APPLI_Interface
}

package "HAL" #DarkOrange {
    [$ppp_name]
    !if ($use_hal_dma == 1)
      interface "$hal_ppp_itf" as HAL_PPP_Interface
      [$ppp_name] -d- HAL_PPP_Interface
    !endif
    interface "$hal_api_itf" as HAL_PPP_APPLI_Interface
    [$ppp_name] -u- HAL_PPP_APPLI_Interface

    !if ($use_hal_service == 1)
      [HAL_SERVICE]
      interface "$hal_generic_itf" as HAL_Service_Interface
      [HAL_SERVICE] -r- HAL_Service_Interface
      [$ppp_name] -l-( HAL_Service_Interface
    !endif
    !if ($use_hal_generic_dep == 1)
          [HAL_SERVICE]
          [$ppp_name] .r.> [HAL_SERVICE]
    !endif
    !if ($use_hal_dma == 1)
      [HAL_DMA]
      interface "$hal_dma_itf" as HAL_DMA_Interface
      [HAL_DMA] -u- HAL_DMA_Interface
      [HAL_DMA] -u-( HAL_PPP_Interface
      [$ppp_name] --( HAL_DMA_Interface
    !endif
    !if ($use_hal_rcc == 1)
      [HAL_RCC]
      interface "$hal_rcc_itf" as HAL_RCC_Interface
      [HAL_RCC] -l- HAL_RCC_Interface
      [$ppp_name] -r-( HAL_RCC_Interface
    !endif

}

[Appli] -d-( HAL_PPP_APPLI_Interface
[$ppp_name] -u-( APPLI_Interface
!if ($use_ppp_core ==1)
Package "Core Layer" #Lavender{
    [$core]
    interface "core API" as Core_api_itf
    [$core] -u- Core_api_itf
}
[$ppp_name] -d-( Core_api_itf
!endif
package "Low Layer" #Technology {
    [CMSIS-Devices]
    !if ($use_ppp_ll == 1)
      [$ll_ppp]
      interface "$ll_ppp_itf" as LL_PPP_Interface
      [$ll_ppp]  -u- LL_PPP_Interface
    !endif

    !if ($use_ppp_isr == 1)
    interface "$ppp_ISR" as PPP_ISR
    [$ppp_ISR] -U- PPP_ISR
    [$ppp_ISR]
    !endif


    !if ($use_ll_rcc == 1)
      [LL_RCC]
      interface "LL RCC API" as LL_RCC_API
      [LL_RCC] -u- LL_RCC_API
      [HAL_RCC] -d-(LL_RCC_API
    !endif

    !if ($use_hal_dma == 1)
      [DMA ISR]
      interface "DMA ISR" as DMA_ISR
      [DMA ISR] -u- DMA_ISR
    !endif

  ' Explicit arrow from HAL_PWR to CMSIS-Devices
  [HAL_PWR] -d-( PWR_CorePowerCtrl
  [PWR_CorePowerCtrl] -d- [CMSIS-Devices]
}

package "HW" #LightCyan {
    [ARM_HW]
    [CMSIS-Devices] ..> [ARM_HW] : SCB Arm R/W
    !if ($use_ppp_isr == 1)
      interface "$ppp_xIRQ" as PPPx_IRQ
      [ARM_HW] -l- PPPx_IRQ
    !endif
    !if ($use_hal_dma == 1)
      interface "DMAx_IRQ_Ch" as DMA_IRQ_CH
      [ARM_HW] -u- DMA_IRQ_CH
      [DMA ISR] -d-( DMA_IRQ_CH
      [HAL_DMA] --( DMA_ISR
    !endif
}
!if ($use_ppp_ll == 1)
    [$ppp_name] -d-( LL_PPP_Interface
    [$ll_ppp] .l.> [CMSIS-Devices]: $ppp register def
    [ARM_HW] <.u. [$ll_ppp] : $ppp registers R/W
!else
    !if ($use_ppp_core == 1)
      [$core] .l.> [CMSIS-Devices]: $ppp register def
      [ARM_HW] <.u. [$core] : $ppp registers R/W
    !else
      [$ppp_name] .d.> [CMSIS-Devices]: $ppp register def
      [ARM_HW] <.l. [$ppp_name] : $ppp registers R/W
    !endif
!endif
!if ($use_ppp_isr == 1)
   [$ppp_ISR] -d-( PPPx_IRQ
   [$ppp_name] -d-( PPP_ISR
!endif
!if ($use_ll_rcc == 1)
   [ARM_HW] <.u. [LL_RCC] : RCC registers R/W
!endif
@enduml

Configuration table

The following table lists the configuration defines for the HAL PWR module, specifying their locations, default values, and descriptions:

group PWR_Configuration_Table

Configuration inside the PWR driver

Config defines

Description

Default value

Note

PRODUCT

from IDE

NA

The selected device

USE_HAL_PWR_MODULE

from hal_conf.h

1U

When set, HAL PWR module is enabled.

USE_ASSERT_DBG_PARAM

from IDE

None

When defined, enable parameter assertions.

USE_HAL_CHECK_PARAM

from hal_conf.h

0U

When set, parameters are checked at runtime.