HAL HSP Overview

Introducing HSP

group HSP_Introduction

  • The Hardware Abstraction Layer (HAL) for HSP provides an efficient interface to the Hardware Signal Processor (HSP). The HSP is a dedicated signal-processing subsystem designed to offload computation-intensive and time-critical operations from the CPU. It accelerates functions commonly used in demanding embedded applications such as motor control, digital power, metering, audio processing, real-time signal conditioning, and small convolutional neural networks.

  • The HSP is built around a dedicated, high-performance Signal Processor Engine (SPE) capable of operating in 32-bit floating point or 8-bit integer modes. The Signal Processor Engine executes HSP-specific microcode (also referred to as Firmware), part of which is embedded in private ROM, while a second part (FW RAM) must be dynamically loaded into RAM during initialization. This Firmware RAM is delivered through the HSP_Engine middleware.

    The HSP also supports the loading of Plugins to:

    • patch or optimize existing processing function,

    • add new processing function.

  • The HAL HSP allows running processing functions in Accelerator mode or Sequencer mode. In Sequencer mode, it provides services to:

    • record a processing list (Sequence of processing functions)

    • attach a Processing List to a hardware trigger such as a DMA Transfer Complete, TIM Pulse…

Module and files

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

Module and files diagram

Component diagram

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

@startuml
top to bottom direction
hide stereotype
skinparam DefaultFontName Arial
skinparam linetype polyline
skinparam nodesep 45
skinparam ranksep 55

' Corporate color chart
!$C_DARK_BLUE      = "#03234B"
!$C_DARK_BLUE_75   = "#425A78"
!$C_DARK_BLUE_50   = "#8191A5"
!$C_DARK_BLUE_25   = "#C0C8D2"
!$C_LIGHT_BLUE     = "#3CB4E6"
!$C_LIGHT_BLUE_75  = "#6DC6ED"
!$C_LIGHT_BLUE_50  = "#9EDAF3"
!$C_LIGHT_BLUE_25  = "#CEEDF9"
!$C_YELLOW         = "#FFD200"
!$C_PINK           = "#E6007E"
!$C_DARK_GREY      = "#525A63"

' Default mapping
' - outside boxes (packages): dark blue
' - inside boxes/components/interfaces: light blue
' - highlight boxes: <<highlight>> stereotype (yellow)
' - primary connectors: pink
' - secondary connectors: use explicit color -[#525A63]->
skinparam PackageBackgroundColor $C_LIGHT_BLUE_25
skinparam PackageBorderColor $C_DARK_BLUE
skinparam PackageFontColor $C_DARK_BLUE

skinparam DefaultFontColor $C_DARK_BLUE
skinparam TitleFontColor $C_DARK_BLUE
skinparam LegendFontColor $C_DARK_BLUE
skinparam NoteFontColor $C_DARK_BLUE

skinparam ComponentBackgroundColor $C_LIGHT_BLUE
skinparam ComponentBorderColor $C_LIGHT_BLUE_25
skinparam ComponentFontColor $C_LIGHT_BLUE_25

skinparam InterfaceBackgroundColor $C_LIGHT_BLUE
skinparam InterfaceBorderColor $C_LIGHT_BLUE_25
skinparam InterfaceFontColor $C_DARK_BLUE

skinparam ArrowColor $C_PINK
skinparam ArrowFontColor $C_DARK_BLUE

skinparam component<<highlight>> {
  BackgroundColor $C_YELLOW
  BorderColor $C_DARK_BLUE
  FontColor $C_DARK_BLUE
}

' The Driver name to be customized according to the driver
' Example CRC, I2C, NVM, FLASH, ....
!$ppp = "HSP"

' The HAL driver use a core driver - default value 0
!$use_ppp_core = 0

' When using a core driver : the core driver name
!$core = "XXX" + "_CORE"

' enable/disable LL RCC interfaces depandencies - default value 0
!$use_ll_rcc = 0

' the driver provide an LL layer : default value 1
' Set to 0 if core is set to 1
!if ($use_ppp_core == 1)
!$use_ppp_ll = 0  
!else
!$use_ppp_ll = 0
!endif
' the driver provide a HAL Layer : default value 1
!$use_ppp_hal = 1

' the HAL driver use HAL services : default value 1
!$use_hal_service = 1

' the HAL driver use HAL RCC services : default value 1
!$use_hal_rcc = 1

' the HAL driver use HAL DMA services : default value 1
!$use_hal_dma = 0

' The driver use HAL_RCC_HSP_GetClockFreq()
!$use_kernel_clock = 0

' HAL driver use depandencies with generic instead of interfaces
!$use_hal_generic_dep = 0

' The driver use interrupts : default value 1
' Example CCB -->  no interrupts
!$use_ppp_isr = 1

' The driver use an extented file : default value 0
' Example of Usage NVM, FLASH
!$use_hal_ppp_extend = 0

' The HAL Driver extension name
!$ppp_extend = "EXT"

' The HAL Driver interface
!$hal_api_itf = "HAL " + $ppp + " API"

' The HAL Driver extended interface
!$hal_api_ext_itf = "HAL " + $ppp + " " + $ppp_extend + " API"

' The Use Application Interface
!$appli_itf = $ppp+ " User Callback"
!$appli_ext_itf = "\n" + $ppp+ " " + $ppp_extend + " User Callback"

' The HAL HSP name
!$ppp_name = "HAL_" + $ppp
!$ppp_ext_name = "HAL_" + $ppp+ "_" + $ppp_extend

' The HSP isr
!$ppp_ISR  = $ppp + " ISR"
!$ppp_ext_ISR = $ppp+ " " + $ppp_extend + " ISR"

' The LL Driver name
!$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()\n\t\t\tHAL_RCC_SRAMy_EnableClock()"
!endif

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

' HAL Generic interface for the HSP driver
!$hal_generic_itf = "HAL_GetTick()"

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

' HW
!$ppp_xIRQ = $ppp+"x_IRQ"


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

title $ppp Software Component Diagram

Package "Application Layer" {

  component [Appli]
  !if ($use_ppp_isr == 1)
  interface "$appli_itf" as APPLI_Interface
  [Appli] -r- APPLI_Interface
  !if ($use_hal_ppp_extend == 1)
  interface "$appli_ext_itf" as APPLI_EXT_Interface
  [Appli] -l- APPLI_EXT_Interface
  !endif
  !endif
}

Package "Middleware Layer" {

  component [MW HSP Engine]
  interface "HSP Engine API" as MW_HSP_Engine_Service_Interface
  [MW HSP Engine] -r- MW_HSP_Engine_Service_Interface
  interface "HSP Engine Callback" as MW_CB_Interface
  [MW HSP Engine] -r- MW_CB_Interface
}

package "HAL" {
    !if ($use_hal_ppp_extend == 1)
    together {
      component [$ppp_name] <<highlight>>
      component [$ppp_ext_name] <<highlight>>
      [$ppp_name] -[hidden]right- [$ppp_ext_name]
    }
    !if ($use_hal_dma == 1)
      [$ppp_name] -[hidden]d- [HAL_DMA]
      [$ppp_ext_name] -[hidden]d- [HAL_DMA]
    !endif
    !else
    component [$ppp_name] <<highlight>>
    !endif
    !if ($use_hal_dma == 1)
      interface "$hal_ppp_itf" as HAL_HSP_Interface
      [$ppp_name] -d- HAL_HSP_Interface
    !endif
    interface "$hal_api_itf" as HAL_HSP_APPLI_Interface
    !if ($use_hal_ppp_extend == 1)
    interface "$hal_api_ext_itf" as HAL_HSP_APPLI_EXT_Interface
    [$ppp_name] -u- HAL_HSP_APPLI_Interface
    [$ppp_ext_name] -u- HAL_HSP_APPLI_EXT_Interface
    '[$ppp_ext_name] -u-(
    [$ppp_name] ..> [$ppp_ext_name] : <<include>> / <<use>> \nShared types + common APIs
    !else
    [$ppp_name] -u- HAL_HSP_APPLI_Interface
    !endif

    !if ($use_hal_service == 1)
      component [HAL_SERVICE]
      interface "$hal_generic_itf" as HAL_Service_Interface
      [HAL_SERVICE] -r- HAL_Service_Interface
      !if ($use_hal_generic_dep == 0)
        [$ppp_name] -l-( HAL_Service_Interface
        !if ($use_hal_ppp_extend == 1)
          [$ppp_ext_name] -r-( HAL_Service_Interface
        !endif
      !else
          [$ppp_name] .l.> HAL_Service_Interface : <<use>>
          !if ($use_hal_ppp_extend == 1)
            [$ppp_ext_name] .r.> HAL_Service_Interface : <<use>>
      !endif
    !endif
    !if ($use_hal_dma == 1)
      component [HAL_DMA]
      interface "$hal_dma_itf" as HAL_DMA_Interface
      [HAL_DMA] -u- HAL_DMA_Interface
      !if ($use_hal_generic_dep == 0)
        [HAL_DMA] -u-( HAL_HSP_Interface
        [$ppp_name] --( HAL_DMA_Interface
      !else
        [HAL_DMA] .u.> HAL_HSP_Interface : <<use>>
        [$ppp_name] ..> HAL_DMA_Interface: <<use>>
      !endif
    !endif
    !if ($use_hal_rcc == 1)
      component [HAL_RCC]
      interface "$hal_rcc_itf" as HAL_RCC_Interface
      [HAL_RCC] -l- HAL_RCC_Interface
      !if ($use_hal_generic_dep == 0)
        [$ppp_name] -r-( HAL_RCC_Interface
      !else
        [$ppp_name] .r.> HAL_RCC_Interface: <<use>>
      !endif
    !endif

    !if (($use_hal_service == 1) && ($use_hal_rcc == 1))
      together {
        [HAL_SERVICE] -[hidden]right- [$ppp_name]
        [$ppp_name] -[hidden]right- [HAL_RCC]
      }
    !elseif ($use_hal_service == 1)
      [HAL_SERVICE] -[hidden]right- [$ppp_name]
    !elseif ($use_hal_rcc == 1)
      [$ppp_name] -[hidden]right- [HAL_RCC]
    !endif
}


[Appli] -d-( HAL_HSP_APPLI_Interface
[Appli] -d-( MW_HSP_Engine_Service_Interface
[MW HSP Engine] -d-( HAL_HSP_APPLI_Interface
!if ($use_hal_ppp_extend == 1)
[Appli] -d-( HAL_HSP_APPLI_EXT_Interface
!endif
!if ($use_ppp_isr == 1)
[$ppp_name] -u-( MW_CB_Interface
[MW HSP Engine] -u-( APPLI_Interface
!if ($use_hal_ppp_extend == 1)
[$ppp_ext_name] -u-( APPLI_EXT_Interface
!endif
!endif
!if ($use_ppp_core ==1)
Package "Core Layer" {
    component [$core]
    interface "core API" as Core_api_itf
    [$core] -u- Core_api_itf
}
[$ppp_name] -d-( Core_api_itf
!endif
package "Low Layer"  {
    together {
      !if ($use_ppp_ll == 1)
        component [$ll_ppp]
      !endif
      component "CMSIS-Devices"
      !if ($use_ppp_isr == 1)
        component [$ppp_ISR]
      !endif
      !if ($use_hal_dma == 1)
        component [DMA ISR]
      !endif
      !if ($use_ppp_ll == 1)
        [$ll_ppp] -[hidden]right- [CMSIS-Devices]
      !endif
      !if ($use_ppp_isr == 1)
        [CMSIS-Devices] -[hidden]right- [$ppp_ISR]
      !endif
      !if ($use_hal_dma == 1)
        !if ($use_ppp_isr == 1)
          [$ppp_ISR] -[hidden]right- [DMA ISR]
        !else
          [CMSIS-Devices] -[hidden]right- [DMA ISR]
        !endif
      !endif
    }
    !if ($use_ppp_ll == 1)
      interface "$ll_ppp_itf" as LL_HSP_Interface
      [$ll_ppp]  -u- LL_HSP_Interface
      LL_HSP_Interface -[hidden]d- [$ll_ppp]
    !endif

    !if ($use_ppp_isr == 1)
    interface "$ppp_ISR" as HSP_ISR
    [$ppp_ISR] -u- HSP_ISR
    HSP_ISR -[hidden]d- [$ppp_ISR]
    !if ($use_hal_ppp_extend == 1)
      interface "$ppp_ext_ISR" as HSP_EXT_ISR
      [$ppp_ISR] -u- HSP_EXT_ISR
      HSP_EXT_ISR -[hidden]d- [$ppp_ISR]
      [$ppp_ext_name] -d-( HSP_EXT_ISR
    !endif
    !endif

    !if ($use_ll_rcc == 1)
      component [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)
      interface "DMA ISR" as DMA_ISR
      [DMA ISR] -u- DMA_ISR
      DMA_ISR -[hidden]d- [DMA ISR]
    !endif

}

package "HW" {
    component [STM32_HW]
    !if ($use_ppp_isr == 1)
      interface "$ppp_xIRQ" as HSPx_IRQ
      [STM32_HW] -u- HSPx_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
}

' Layout hints: packages top -> down, elements left -> right
[Appli] -[hidden]d- [$ppp_name]
!if ($use_hal_ppp_extend == 1)
  [Appli] -[hidden]d- [$ppp_ext_name]
!endif
!if ($use_hal_ppp_extend == 1)
  [$ppp_name] -[hidden]right- [$ppp_ext_name]
!endif
!if ($use_ppp_core == 1)
  [$ppp_name] -[hidden]d- [$core]
  [$core] -[hidden]d- [CMSIS-Devices]
!else
  [$ppp_name] -[hidden]d- [CMSIS-Devices]
!endif
[CMSIS-Devices] -[hidden]d- [STM32_HW]

!if ($use_ppp_ll == 1)
    !if ($use_hal_ppp_extend == 1)
      [$ppp_name] -d-( LL_HSP_Interface
      [$ppp_ext_name] -d-( LL_HSP_Interface
    !else
      [$ppp_name] -d-( LL_HSP_Interface
    !endif
    [$ll_ppp] .r.> [CMSIS-Devices]: $ppp register def
    [STM32_HW] <.u. [$ll_ppp] : $ppp registers R/W
!else
    !if ($use_ppp_core == 1)
      [$core] .l.> [CMSIS-Devices]: $ppp register def
      [STM32_HW] <.u. [$core] : $ppp registers R/W
    !else
      [$ppp_name] .d.> [CMSIS-Devices]: $ppp register def
      [STM32_HW] <.l. [$ppp_name] : $ppp registers R/W
    !endif
!endif
!if ($use_ppp_isr == 1)
   [$ppp_ISR] -d-( HSPx_IRQ
   [$ppp_name] -d-( HSP_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 HSP module, specifying their locations, default values, and descriptions:

group HSP_Configuration_Table

Configuration inside the HSP driver

Software configuration defined in stm32h7pxx_hal_conf.h:

Preprocessor flags

Default value

Comment

USE_HAL_HSP_MODULE

1

Enable HAL HSP driver module

USE_HAL_HSP_REGISTER_CALLBACKS

0

Allow the user to define their own callback

USE_HAL_CHECK_PARAM

0

Enable runtime parameter check

USE_HAL_HSP_CLK_ENABLE_MODEL

HAL_CLK_ENABLE_NO

Enable the gating of the peripheral clock

USE_HAL_CHECK_PROCESS_STATE

0

Enable atomicity of process state check

USE_HAL_HSP_USER_DATA

0

Add a user data inside HAL HSP handle

USE_HAL_HSP_GET_LAST_ERRORS

0

Enable retrieval of last processes error codes

USE_HAL_HSP_MSGBOX_GET_LAST_ERROR

0

Enable retrieval of last MSGBOX error code

USE_HAL_HSP_TRGIN_IT

0

Enable Trigger Input IT management

USE_HAL_HSP_STREAM_IT

0

Enable STREAM Buffer IT management

USE_HAL_HSP_TCU_IT

0

Enable Task Comparator Unit IT management

USE_HAL_HSP_TSC_IT

0

Enable TimeStamp Capture IT management

USE_HAL_HSP_PROCLIST_NOTIFICATION_IT

0

Enable Processing List Notification IT management

Software configuration defined in preprocessor environment:

Preprocessor flags

Default value

Comment

USE_ASSERT_DBG_PARAM

None

Enable check param for HAL

USE_ASSERT_DBG_STATE

None

Enable check state for HAL

Note

USE_HAL_HSP_TRGIN_IT to USE_HAL_HSP_PROCLIST_NOTIFICATION_IT are set to 0 by default to reduce the HAL handle footprint when these features are not used by the application.