HAL WWDG Overview

Introducing WWDG

group WWDG_Introduction

The WWDG hardware abstraction layer provides a set of APIs to interface with the WWDG peripheral on STM32 microcontrollers.

The system window watchdog (WWDG) is used to detect the occurrence of a software fault, usually generated by external interference or by unforeseen logical conditions, which causes the application program to abandon its normal sequence.

The WWDG clock is prescaled from the APB clock and has a configurable time-window that can be programmed to detect abnormally late or early application behavior.

An Early Wakeup Interrupt can be generated before a reset happens to perform a system recovery or manage certain actions before a system restart.

Once the WWDG is enabled, it can only be disabled by a device reset.

The WWDG is best suited for applications requiring the watchdog to react within an accurate timing window.

This abstraction layer guarantees portability and ease of use across different STM32 series.

Module and files

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

Module and files diagram

Component diagram

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


@startuml
!$use_ppp_core = 1
!$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_ppp_isr = 1
!$use_hal_service = 1
!$use_hal_rcc = 1
!$use_hal_dma = 0
!$use_ll_rcc = 0
!$ppp = "WWDG"
!$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()\nHAL_DMA_Abort_IT"
!$hal_rcc_itf = "\t\t\tHAL_RCC_GetPCLK1Freq()\n\t\t\tHAL_RCC_"+$ppp+"_EnableClock()"
!$hal_ppp_itf = "DMA CallBacks\nDMA Half transfer complete CallBack\nError CallBacks"
!$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_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
package "Low Layer" #Technology {
!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
[CMSIS-Devices]
!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
}
package "HW" #LightCyan {
[STM32_HW]
!if ($use_ppp_isr == 1)
interface "$ppp_xIRQ" as PPPx_IRQ
[STM32_HW] -u- PPPx_IRQ
!endif
!if ($use_hal_dma == 1)
interface "DMAx_IRQ_Ch" as DMA_IRQ_CH
[STM32_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] .r.> [CMSIS-Devices]: $ppp register def
[STM32_HW] <.u. [$ll_ppp] : $ppp registers R/W
!else
[$ppp_name] .d.> [CMSIS-Devices]: $ppp register def
[STM32_HW] <.l. [$ppp_name] : $ppp registers R/W
!endif
!if ($use_ppp_isr == 1)
[$ppp_ISR] -d-( PPPx_IRQ
[$ppp_name] -d-( PPP_ISR
!endif
!if ($use_ll_rcc == 1)
[STM32_HW] <.u. [LL_RCC] : RCC registers R/W
!endif
@enduml

Configuration table

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

group WWDG_Configuration_Table

Configuration inside the WWDG driver:

Config defines

Where

Default value

Note

USE_HAL_WWDG_MODULE

hal_conf.h

1

Enable the HAL WWDG module.

USE_HAL_WWDG_REGISTER_CALLBACKS

hal_conf.h

0

Enable the register callbacks assert

USE_HAL_CHECK_PARAM

hal_conf.h

0

Enable checking of vital parameters at runtime

USE_HAL_WWDG_HARDWARE_START

hal_conf.h

0

WWDG driver starts in HW mode

USE_HAL_WWDG_CLK_ENABLE_MODEL

hal_conf.h

HAL_CLK_ENABLE_NO

Clock activation

USE_HAL_WWDG_TIME_UNIT (*)

hal_conf.h

HAL_WWDG_TIME_UNIT_MS

Time unit to be used for WWDG driver

USE_HAL_WWDG_USER_DATA

hal_conf.h

0

Enable the set/get user data

USE_ASSERT_DBG_PARAM

PreProcessor env

None

Enable the params assert

USE_ASSERT_DBG_STATE

PreProcessor env

None

Enable the state assert

(*) Select the time unit value with the USE_HAL_WWDG_TIME_UNIT define:

  • HAL_WWDG_TIME_UNIT_US: WWDG driver time unit in microseconds.

  • HAL_WWDG_TIME_UNIT_MS: WWDG driver time unit in milliseconds.

  • HAL_WWDG_TIME_UNIT_S: WWDG driver time unit in seconds.

The default time unit is milliseconds if not set.