HAL CORDIC Overview

Introducing CORDIC

group CORDIC_Introduction

  • The Hardware Abstraction Layer CORDIC provides an efficient interface to the hardware CORDIC coprocessor, which accelerates mathematical functions commonly used in motor control, metering, signal processing, and other embedded applications.

  • It supports a variety of functions including sine, cosine, hyperbolic sine and cosine, arctangent, modulus, square root, and natural logarithm, enabling flexible use across different computational needs.

  • The CORDIC HAL allows configurable precision, scaling factors, and flexible settings for the number and width of input arguments and output results to optimize performance and data handling.

  • The HAL CORDIC provides calculation modes including polling, zero-overhead, interrupt, and DMA to accommodate different application requirements.

  • These features simplify the integration of complex mathematical calculations in embedded systems, improving performance and offloading the processor to handle other processes.

Module and files

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

Module and files diagram

Component diagram

The following diagram illustrates the software components involved in the CORDIC 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 = 1

!$use_ll_rcc = 0

!$ppp = "CORDIC"
!$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_"+$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 CORDIC module, specifying their locations, default values, and descriptions:

group CORDIC_Configuration_Table

Configuration inside the CORDIC driver

Software configuration defined in stm32c5xx_hal_conf.h:

preprocessor flags

Default value

Comment

USE_HAL_CORDIC_MODULE

1

Enable HAL CORDIC driver module

USE_HAL_CORDIC_REGISTER_CALLBACKS

0

Allow the user to define their own callback

USE_HAL_CORDIC_DMA

1

Enable DMA code inside CORDIC

USE_HAL_CHECK_PARAM

0

Enable runtime parameter check

USE_HAL_CORDIC_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_CORDIC_USER_DATA

0

Add a user data inside HAL CORDIC handle

USE_HAL_CORDIC_GET_LAST_ERRORS

0

Enable retrieval of last processes error codes

Software configuration defined in preprocessor environment:

preprocessor flags

Default value

Comment

USE_ASSERT_DBG_PARAM

Not defined

Enable check param for HAL and LL

USE_ASSERT_DBG_STATE

Not defined

Enable check state for HAL