HAL TIM Use Cases

Complementary Signals





@startuml

skinparam maxMessageSize 550

' To add a number by line

'autonumber



title "Complementary Signals in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



group Initialization

App -[hidden]>Driver

end



group Configuration

App->Driver : HAL_TIM_SetConfig()

Driver -> Driver : Configure TIMx time base

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(\nHAL_TIM_OC_COMPARE_UNIT_1,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_PWM1,\n.pulse = α})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(\nHAL_TIM_CHANNEL_1,\n&(hal_tim_oc_channel_config_t){\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK





App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(\nHAL_TIM_CHANNEL_1<b>N</b>,\n&(hal_tim_oc_channel_config_t){\n.polarity = HAL_TIM_OC_LOW,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_BREAK_SetOutputOffStates</b>((hal_tim_off_states_config_t) {\n.ossr_mode = HAL_TIM_OSSR_MODE_ENABLED,\n.ossi_mode =  HAL_TIM_OSSI_MODE_FORCED_TO_IDLE})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_SetDeadtime</b>(.rising_edge_deadtime = 100, .falling_edge_deadtime = 100)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_BREAK_SetConfigInput</b>((HAL_TIM_BREAK_INPUT_1,\n&(hal_tim_break_input_config_t){\n.polarity = HAL_TIM_BREAK_INPUT_POLARITY_HIGH,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1,\n.af_mode = HAL_TIM_BREAK_INPUT_AFMODE_INPUT})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_BREAK_EnableInput</b>(HAL_TIM_BREAK_INPUT_1)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_SetLockLevel</b>(HAL_TIM_LOCK_1)

Driver --> App : HAL_OK



end



group Start TIMx

App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_1N)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_Start()

Driver --> App : HAL_OK



end

@enduml

<hr>

Called functions:

DMAburst



@startuml

skinparam maxMessageSize 350

' To add a number by line

'autonumber



title "DMAburst in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver

participant "HAL DMA" as DMA

participant "IT" as IT



group Initialization

App -[hidden]>IT

end



group Configuration

App->Driver : <b>HAL_TIM_SetConfig</b>()

Driver -> Driver : Configure TIMx time base

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(HAL_TIM_OC_COMPARE_UNIT_1,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_ACTIVE,\n.pulse = α})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(HAL_TIM_CHANNEL_1,\n&(hal_tim_oc_channel_config_t){\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_RegisterUpdateCallback</b>()

Driver --> App : HAL_OK



end



group Start TIMx





App -> Driver : <b>HAL_TIM_OC_StartChannel</b>(HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_Start</b>()

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_SetConfigDMABurst</b>(&(hal_tim_dmaburst_config_t){\n.address,\n.source,\n.length})

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_StartDMABurst</b>(HAL_TIM_DMABURST_WRITE, &p_data, size_byte)

Driver --> App : HAL_OK



Driver -> IT : <b>HAL_DMA_Start_IT</b>()

IT --> Driver



Driver -> Driver : Configure DMA burst\nEnable Update DMA request

Driver --> App: HAL_OK





IT <[#red]-] : <font color=red><b>DMA Channelx IRQ</b>\n<font color=red>(transfer complete)



IT -> DMA : <b>HAL_DMA_IRQHandler</b>()



DMA -> Driver : <b>UpdateCallback</b>()



Driver -> App : <b>HAL_TIM_UpdateCallback</b>()

App --> Driver 



Driver --> DMA 

DMA --> IT



end

@enduml

<hr/>

Called functions:

Encoder



@startuml

skinparam maxMessageSize 450

' To add a number by line

'autonumber



title "Encoder in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



group Initialization

App -[hidden]>Driver

end



group Configuration

App->Driver : <b>HAL_TIM_SetConfig</b>(&(hal_tim_config_t) {\n.clock_source = HAL_TIM_CLK_ENCODER_X4_TI12})

Driver -> Driver : Configure TIMx time base

Driver -> Driver : Configure encoder interface

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_1,\n(hal_tim_ic_channel_config_t) {\n.source = <font color=grey>HAL_TIM_TIMx_TI1_GPIO,\n.polarity = <font color=blue>HAL_TIM_IC_POLARITY_<b>RISING</b></font>,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=red>HAL_TIM_IC_SetConfigCaptureUnit</b>(\ncapture_unit = <font color=red>HAL_TIM_IC_CAPTURE_UNIT_1,\n&(hal_tim_ic_capture_unit_config_t){\n.active_input = <font color=red>HAL_TIM_IC_DIRECT\n.prescaler = HAL_TIM_IC_PRESCALER_DIV1})



App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_2,\n&(hal_tim_ic_channel_config_t) {\n.source = <font color=grey>HAL_TIM_TIMx_TI2_GPIO,\n.polarity = <font color=blue>HAL_TIM_IC_POLARITY_<b>RISING</b></font>,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=red>HAL_TIM_IC_SetConfigCaptureUnit</b>(\ncapture_unit = <font color=red>HAL_TIM_IC_CAPTURE_UNIT_2,\n&(hal_tim_ic_capture_unit_config_t){\n.active_input = <font color=red>HAL_TIM_IC_DIRECT\n.prescaler = HAL_TIM_IC_PRESCALER_DIV1})



App -> Driver : <b>HAL_TIM_RegisterUpdateCallback</b>()

Driver --> App : HAL_OK



end



group Start TIMx



App -> Driver : <b>HAL_TIM_IC_StartChannel</b>(HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_IC_StartChannel</b>(HAL_TIM_CHANNEL_2)

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_Start</b>()

Driver --> App : HAL_OK



end

@enduml

<hr/>

Called functions:

ExtTriggerSynchro



@startuml

skinparam maxMessageSize 450

' To add a number by line

'autonumber



title "ExtTriggerSynchro in Cube 2"





' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



group Initialization

App -[hidden]>Driver

end



group Configuration



App -> Driver : \n<b>HAL_TIM_SetConfig</b>(&TIM<b><font color=green>x</b>)

Driver -> Driver : Configure TIMx time base

Driver -> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_SetConfig</b>(&TIM<b><font color=red>y</b>)

Driver -> Driver : Configure TIMy time base

Driver -> App : HAL_OK



App->Driver : <b>HAL_TIM_SetExternalTriggerInput</b>(&TIM<b><font color=green>x</b>,\n&(hal_tim_ext_trig_config_t) {\n.source = HAL_TIM_EXT_TRIG_TIM<font color=green>x</font>_GPIO,\n.polarity = HAL_TIM_EXTERNAL_POLARITY_NONINVERTED,\n.prescaler = HAL_TIM_EXTERNAL_PRESCALER_DIV1,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1})

Driver --> App : HAL_OK



App->Driver : \n<b>HAL_TIM_SetSynchroSlave</b>(&TIM<b><font color=green>x</b>,\n&(hal_tim_slave_config_t) {\n.mode = HAL_TIM_SLAVE_TRIGGER,\n.trigger = HAL_TIM_TRIGGER_SELECTION_ETRF})})

Driver -> App : HAL_OK



App->Driver : \n<b>HAL_TIM_SetTriggerOutput</b>(&TIM<b><font color=green>x</b>, HAL_TIM_TRGO_ENABLE)

Driver -> App : HAL_OK



App->Driver : \n<b>HAL_TIM_EnableMasterSlaveMode</b>(&TIM<b><font color=green>x</b>)

Driver -> App : HAL_OK



App->Driver : \n<b>HAL_TIM_SetSynchroSlave</b>(&TIM<b><font color=red>y</b>,\n&(hal_tim_slave_config_t) {\n.mode = HAL_TIM_SLAVE_MODE_GATED,\n.trigger = HAL_TIM_TRIGGER_SELECTION_ITR2})

Driver -> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(&TIM<b><font color=red>y</b>,\nHAL_TIM_OC_COMPARE_UNIT_1,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_PWM1,\n.pulse = α})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(&TIM<b><font color=red>y</b>,\nHAL_TIM_CHANNEL_1,\n&(hal_tim_oc_channel_config_t){\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET})

Driver --> App : HAL_OK



App -> App : CH1 GPIO AF config



end



group Start TIMx and TIMy



App -> Driver : <b>HAL_TIM_OC_StartChannel</b>(TIM<b><font color=red>y</b>, HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_Start</b>(TIM<b><font color=red>y</b>)

Driver --> App : HAL_OK



end

@enduml

<hr/>

Called functions:

Hall Sensor and PWM Output



@startuml

skinparam maxMessageSize 450

' To add a number by line

'autonumber



title "Hall sensor and PWM Output"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



participant "IT" as IT



group Initialization

App -[hidden]>Driver

end





group Configuration



App->App : Enable port pins for hall inputs



group Configure TIM3 (interfacing timer)



App->Driver : HAL_TIM_SetConfig((hal_tim_config_t) {\n.prescaler = 0\n.counter_mode = HAL_TIM_COUNTER_UP,\n.period = MAX,\n.clock_division = 0,\n.repetition_counter = 0,\n.clock_source =  HAL_TIM_CLOCK_SOURCE_INTERNAL}

Driver -> Driver : Configure TIM3 time base

Driver --> App : HAL_OK



App->Driver : \nHAL_TIM_RegisterInputCaptureCallback(speed_capture_cb)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_SetSynchroSlave</b>((hal_tim_slave_config_t) {\n.mode =  HAL_TIM_SLAVE_COMBINED_RESET_TRIGGER,\n.trigger = <font color=#e0a4fc>HAL_TIM_TRIG_TI1F_ED})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_IC_SetConfigChannel</b>(channel = HAL_TIM_CHANNEL_1,\n(hal_tim_ic_channel_config_t) {\n.source =  HAL_TIM_INPUT_TIM1_TI1_GPIO,\n.polarity = HAL_TIM_IC_RISING,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_IC_SetConfigCaptureUnit</b>(\ncapture_unit = HAL_TIM_CAPTURE_UNIT_1,\n(hal_tim_ic_capture_unit_config_t){\n.active_input = <font color=#e0a4fc>HAL_TIM_IC_TRC\n.prescaler = HAL_TIM_IC_PRESCALER_DIV1})

Driver --> App : HAL_OK





App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(<font color=green>HAL_TIM_OC_COMPARE_UNIT_2</font>,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_TIMING,\n.pulse = 1})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=green>HAL_TIM_CHANNEL_2</font>,\n&(hal_tim_oc_channel_config_t) {\n.oc_polarity = HAL_TIM_OC_HIGH,\n.oc_idle_state = HAL_TIM_OC_IDLE_STATE_SET})

Driver --> App : HAL_OK



App->Driver : \n<b>HAL_TIM_SetTriggerOutput</b>(HAL_TIM_TRGO_OC2)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_IC_EnableXORGate</b>()

Driver --> App : HAL_OK



App->Driver : \n<b>HAL_TIM_EnableMasterSlaveMode</b>()

Driver --> App : HAL_OK



App->Driver : \n<b>HAL_TIM_EnableCommutation</b>(HAL_TIM_COMMUTATION_SOFTWARE_AND_TRIGGER)

Driver --> App : HAL_OK



end



group Configure TIM1 (PWM generator)



App->Driver : HAL_TIM_SetConfig((hal_tim_config_t) {\n.prescaler = 0\n.counter_mode = HAL_TIM_COUNTER_UP,\n.period = BLDC_CHOPPER_PERIOD,\n.clock_division = 0,\n.repetition_counter = 0,\n.clock_source = HAL_TIM_CLOCK_SOURCE_INTERNAL}

Driver -> Driver : Configure TIM1 time base

Driver --> App : HAL_OK



 App->Driver : \nHAL_TIM_RegisterCommutationCallback(change_channel_config_cb)

 Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(HAL_TIM_CHANNEL_1,\n&(hal_tim_oc_channel_config_t) {\n.oc_mode = HAL_TIM_OC_TIMING,\n.oc_pulse = p1,\n.oc_polarity = HAL_TIM_OC_HIGH,\n.oc_idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.ocn_polarity = HAL_TIM_OCN_HIGH,\n.ocn_idle_state = HAL_TIM_OCN_IDLE_STATE_SET})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(HAL_TIM_CHANNEL_2,\n&(hal_tim_oc_channel_config_t) {\n.oc_mode = HAL_TIM_OC_TIMING,\n.oc_pulse = p2,\n.oc_polarity = HAL_TIM_OC_HIGH,\n.oc_idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.ocn_polarity = HAL_TIM_OCN_HIGH,\n.ocn_idle_state = HAL_TIM_OCN_IDLE_STATE_SET})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(HAL_TIM_CHANNEL_3,\n&(hal_tim_oc_channel_config_t) {\n.oc_mode =  HAL_TIM_OC_TIMING,\n.oc_pulse = p3,\n.oc_polarity = HAL_TIM_OC_HIGH,\n.oc_idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.ocn_polarity = HAL_TIM_OCN_HIGH,\n.ocn_idle_state = HAL_TIM_OCN_IDLE_STATE_SET})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_BREAK_SetOutputOffStates</b>(&(hal_tim_off_states_config_t) {\n.off_state_run =  HAL_TIM_OFF_STATE_RUN_ENABLE,\n.off_state_idle = HAL_TIM_OFF_STATE_IDLE_ENABLE})

Driver --> App : HAL_OK





App -> Driver : \n<b>HAL_TIM_EnableCommutation</b>(HAL_TIM_COMMUTATION_SOFTWARE_AND_TRIGGER)

Driver --> App : HAL_OK



end



group Start TIMx in IT mode



group Start TIM3 (interfacing timer)

App -> Driver : HAL_TIM_IC_StartChannel(HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK

end



group Start TIM1 (PWM generator)



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_1)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_1N)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_2)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_2N)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_3)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_3N)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_Start_IT()

Driver --> App : HAL_OK



IT <[#red]-] : <font color=red><b>TIMx IRQ

IT -> Driver : HAL_TIM_IRQHandler_TRG_COM_DIR_IDX()

Driver -> Driver : Clear flag

Driver -> App: change_channel_config_cb()

App --> Driver

Driver --> IT



end



@enduml

<hr/>

Called functions:

OnePulse



@startuml

skinparam maxMessageSize 450

' To add a number by line

'autonumber



title "One Pulse in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



group Initialization

App -[hidden]>Driver

end



group Configuration

App->Driver : <b>HAL_TIM_SetConfig</b>()

Driver -> Driver : Configure TIMx time base

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_EnableOnePulseMode</b>()

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_SetSynchroSlave</b>(&(hal_tim_slave_config_t){\n.mode = HAL_TIM_SLAVE_TRIGGER,\n.trigger = <font color=red><b>HAL_TIM_TRIG_TI2FP2</b></font>)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_EnableSlaveModePreload</b>(HAL_TIM_SMS_PRELOAD_SRC_UPDATE)

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(<font color=green>HAL_TIM_OC_COMPARE_UNIT_1</font>,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_PWM2,\n.pulse = α})

Driver --> App : HAL_OK



App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=green>HAL_TIM_CHANNEL_1</font>,\n&(hal_tim_oc_channel_config_t){\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_<b>2</b>,\n(hal_tim_ic_channel_config_t) {\n.source = <font color=grey>HAL_TIM_TIMx_TI1_GPIO,\n.polarity = <font color=blue>HAL_TIM_IC_POLARITY_RISING</font>,\n.filter = HAL_TIM_DIGITAL_FILTER_FDIV1})

Driver --> App : HAL_OK



end

group Start TIMx

App -> Driver : HAL_TIM_OC_StartChannel(<font color=green>HAL_TIM_CHANNEL_1</font>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_IC_StartChannel(<font color=blue>HAL_TIM_CHANNEL_2</font>)

Driver --> App : HAL_OK





App [#grey]-> Driver : <font color=grey>HAL_TIM_Start()</font>

Driver [#grey]--> App : <font color=grey>HAL_OK</font>





end

@enduml

<hr/>

Called functions:

PWM Input



@startuml

skinparam maxMessageSize 450

' To add a number by line

'autonumber



title "PWM Input in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



participant "IT" as IT



group Initialization

App -[hidden]>Driver

end





group Configuration

App->App : Set TIMx configuration

App->Driver : HAL_TIM_SetConfig()



Driver --> App : HAL_OK



App -> Driver : \n<b><font color=green>HAL_TIM_SetSynchroSlave</b>((hal_tim_slave_config_t) {\n.mode =  HAL_TIM_SLAVE_RESET,\n.trigger = <font color=green>HAL_TIM_TRIG_<b>TI2</b>FP2})

Driver --> App : HAL_OK





App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_2,\n(hal_tim_ic_channel_config_t) {\n.source = <font color=black>HAL_TIM_TIMx_<b>TI2</b>_GPIO,\n.polarity = <font color=blue >HAL_TIM_IC_<b>RISING</b></font>,\n.filter = HAL_TIM_FDIV1})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=brown>HAL_TIM_IC_SetConfigCaptureUnit</b>(\ncapture_unit = <font color=brown>HAL_TIM_IC_CAPTURE_UNIT_1,\n(hal_tim_ic_capture_unit_config_t){\n.active_input = <font color=brown> HAL_TIM_IC_INDIRECT_<b>FALLING</b>\n.prescaler = HAL_TIM_IC_DIV1})





App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigCaptureUnit</b>(\ncapture_unit = <font color=blue>HAL_TIM_CAPTURE_UNIT_2\n, (hal_tim_ic_capture_unit_config_t){\n.active_input = <font color=blue>HAL_TIM_IC_DIRECT\n.prescaler = HAL_TIM_IC_DIV1})

Driver --> App : HAL_OK



App -> Driver : <b>HAL_TIM_RegisterInputCaptureCallback</b>()

Driver --> App : HAL_OK

end



group Start TIMx in IT mode



App -> Driver : HAL_TIM_IC_StartChannel(<font color=brown>HAL_TIM_CHANNEL_1</font>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_IC_StartChannel_IT(<font color=blue>HAL_TIM_CHANNEL_2</font>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_Start()

Driver --> App : HAL_OK



IT <[#red]-] : <font color=red><b>TIMx IRQ

IT -> Driver : HAL_TIM_CC_IRQHandler()

Driver -> Driver : Clear flag

Driver -> App : HAL_TIM_InputCaptureCallback(<font color=blue>HAL_TIM_CHANNEL_2</font>)

App -> Driver : HAL_TIM_IC_ReadChannelCapturedValue(<font color=brown>HAL_TIM_CHANNEL_1</font>)

App -> Driver : HAL_TIM_IC_ReadChannelCapturedValue(<font color=blue>HAL_TIM_CHANNEL_2</font>)

Driver --> App : HAL_OK



App -> App : Calculate frequency and duty cycle

App --> Driver

Driver --> IT



end

@enduml

<hr/>

Called functions:

PWM Output



@startuml

skinparam maxMessageSize 440

' To add a number by line

'autonumber



title "PWM Output in Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver



participant "IT" as IT



group Initialization

App -[hidden]>Driver

end





group Configuration

App->Driver : HAL_TIM_SetConfig((hal_tim_config_t) {\n.prescaler = α\n.counter_mode = HAL_TIM_COUNTER_UP,\n.period = β,\n.clock_division = HAL_TIM_CLK_DIV1,\n.repetition_counter = δ,\n.clock_source =  HAL_TIM_CLK_INTERNAL}

Driver -> Driver : Configure TIMx time base

Driver --> App : HAL_OK





App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_<b>1</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigCompareUnit</b>(\ncompare_unit = <font color=blue>HAL_TIM_OC_COMPARE_UNIT_<b>1</b>,\n(hal_tim_oc_compare_unit_config_t ) {\n.mode = <font color=black>HAL_TIM_OC_PWM1,\n.pulse = PULSE1_VALUE})

Driver --> App : HAL_OK







App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_<b>2</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigCompareUnit</b>(\ncompare_unit = <font color=blue>HAL_TIM_OC_COMPARE_UNIT_<b>2</b>,\n(hal_tim_oc_compare_unit_config_t ) {\n.mode = <font color=black>HAL_TIM_OC_PWM1,\n.pulse = PULSE2_VALUE})

Driver --> App : HAL_OK







App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_<b>3</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigCompareUnit</b>(\ncompare_unit = <font color=blue>HAL_TIM_OC_COMPARE_UNIT_<b>3</b>,\n(hal_tim_oc_compare_unit_config_t ) {\n.mode = <font color=black>HAL_TIM_OC_PWM1,\n.pulse = PULSE3_VALUE})

Driver --> App : HAL_OK





App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigChannel</b>(channel = <font color=blue>HAL_TIM_CHANNEL_<b>4</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET})

Driver --> App : HAL_OK



App -> Driver : \n<b><font color=blue>HAL_TIM_OC_SetConfigCompareUnit</b>(\ncompare_unit = <font color=blue>HAL_TIM_OC_COMPARE_UNIT_<b>4</b>,\n(hal_tim_oc_compare_unit_config_t ) {\n.mode = <font color=black>HAL_TIM_OC_PWM1,\n.pulse = PULSE4_VALUE})

Driver --> App : HAL_OK



end



group Start TIMx in IT mode



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_<b>1</b>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_<b>2</b>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_<b>3</b>)

Driver --> App : HAL_OK



App -> Driver : HAL_TIM_OC_StartChannel(HAL_TIM_CHANNEL_<b>4</b>)

Driver --> App : HAL_OK





App -> Driver : HAL_TIM_Start()

Driver --> App : HAL_OK



end

@enduml

<hr/>

Called functions:

Timebase



@startuml

' To add a number by line

'autonumber



title "Timer as basic counter Cube 2"



' Fix order of each column

participant "User Application" as App

participant "HAL TIM" as Driver

participant "IT" as IT



group Initialization

App -[hidden]>Driver

end





group Configuration

App->Driver : HAL_TIM_SetConfig((hal_tim_config_t) {\n.prescaler = α\n.counter_mode = HAL_TIM_COUNTER_[UP|DOWN|CENTER_ALIGNED[1|2|3]],\n.period = β,\n.clock_division = HAL_TIM_CLK_DIV[1|2|3],\n.repetition_counter = δ,\n.clock_source =  HAL_TIM_CLK_INTERNAL}

Driver -> Driver : Configure TIMx time base

Driver --> App : HAL_OK

end



group Start TIMx in IT mode

App->Driver : HAL_TIM_Start_IT()

Driver->Driver : Enable UPDATE interrupt\nEnable TIMx counter

Driver --> App : HAL_OK

IT <[#red]-] : <font color=red><b>TIMx IRQ

IT -> Driver : HAL_TIM_UPD_IRQHandler()

Driver -> Driver : Clear flag

Driver -> App: HAL_TIM_UpdateCallback()

App --> Driver

Driver --> IT

end

@enduml

<hr/>

Called functions: