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><font color=blue>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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK

App -> Driver : \n<b><font color=blue>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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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_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><font color=blue>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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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 = HAL_TIM_DMABURST_BASE_ADDR_CCR1,\n.source = HAL_TIM_DMABURST_CC1,\n.length = HAL_TIM_DMABURST_1TRANSFER})
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 : <b>HAL_TIM_SetDTSPrescaler</b>(HAL_TIM_DTS_DIV[1|2|4|8])
Driver --> App : HAL_OK
App->Driver : <b>HAL_TIM_SetDTS2Prescaler</b>(HAL_TIM_DTS2_DIV[1|4|16|64|256|1024|4096|16384|65536|262144])
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_SetDTSPrescaler</b>(&TIM<b><font color=green>x</b>,HAL_TIM_DTS_DIV[1|2|4|8])
Driver --> App : HAL_OK
App->Driver : <b>HAL_TIM_SetDTS2Prescaler</b>(&TIM<b><font color=green>x</b>,\nHAL_TIM_DTS2_DIV[1|4|16|64|256|1024|4096|16384|65536|262144])
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_EXT_TRIG_NONINVERTED,\n.filter = HAL_TIM_FDIV1,\n.prescaler = HAL_TIM_EXT_TRIG_DIV1,\n.sync_prescaler = HAL_TIM_EXT_TRIG_SYNC_DIV1})
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_TRIG_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_TRIG_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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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 = α\n.counter_mode = HAL_TIM_COUNTER_UP,\n.period = MAX,\n.repetition_counter = 0,\n.clock_source =  HAL_TIM_CLK_INTERNAL}
Driver -> Driver : Configure TIM3 time base
Driver --> App : HAL_OK

App->Driver : <b>HAL_TIM_SetDTSPrescaler</b>(HAL_TIM_DTS_DIV[1|2|4|8])
Driver --> App : HAL_OK
App->Driver : <b>HAL_TIM_SetDTS2Prescaler</b>(HAL_TIM_DTS2_DIV[1|4|16|64|256|1024|4096|16384|65536|262144])
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>(<font color=cyan>HAL_TIM_CHANNEL_1</font>,\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_FROZEN,\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.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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.repetition_counter = 0,\n.clock_source =  HAL_TIM_CLK_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_SetConfigCompareUnit</b>(<font color=blue>HAL_TIM_OC_COMPARE_UNIT_1</font>,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_FROZEN,\n.pulse = p1})
Driver --> App : HAL_OK

App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=blue>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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK
App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=blue>HAL_TIM_CHANNEL_1N</font>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK

App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(<font color=purple>HAL_TIM_OC_COMPARE_UNIT_2</font>,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_FROZEN,\n.pulse = p2})
Driver --> App : HAL_OK

App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=purple>HAL_TIM_CHANNEL_2</font>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK
App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=purple>HAL_TIM_CHANNEL_2N</font>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK

App -> Driver : \n<b>HAL_TIM_OC_SetConfigCompareUnit</b>(<font color=magenta>HAL_TIM_OC_COMPARE_UNIT_3</font>,\n&(hal_tim_oc_compare_unit_config_t){\n.mode = HAL_TIM_OC_FROZEN,\n.pulse = p3})
Driver --> App : HAL_OK

App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=magenta>HAL_TIM_CHANNEL_3</font>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK
App -> Driver : \n<b>HAL_TIM_OC_SetConfigChannel</b>(<font color=magenta>HAL_TIM_CHANNEL_3N</font>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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(<font color=cyan>HAL_TIM_CHANNEL_1</font>)
Driver --> App : HAL_OK
end

group Start TIM1 (PWM generator)

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

App -> Driver : HAL_TIM_OC_StartChannel(<font color=blue>HAL_TIM_CHANNEL_1N</font>)
Driver --> App : HAL_OK

App -> Driver : HAL_TIM_OC_StartChannel(<font color=purple>HAL_TIM_CHANNEL_2</font>)
Driver --> App : HAL_OK

App -> Driver : HAL_TIM_OC_StartChannel(<font color=purple>HAL_TIM_CHANNEL_2N</font>)
Driver --> App : HAL_OK

App -> Driver : HAL_TIM_OC_StartChannel(<font color=magenta>HAL_TIM_CHANNEL_3</font>)
Driver --> App : HAL_OK

App -> Driver : HAL_TIM_OC_StartChannel(<font color=magenta>HAL_TIM_CHANNEL_3N</font>)
Driver --> App : HAL_OK

App -> Driver : HAL_TIM_Start_IT_Opt(HAL_TIM_OPT_IT_COMMUTATION)
Driver --> App : HAL_OK

IT <[#red]-] : <font color=red><b>TIMx IRQ
IT -> Driver : HAL_TIM_TRGI_COM_DIR_IDX_IRQHandler()
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_SLAVE_MODE_PRELOAD_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><font color=green>HAL_TIM_OC_SetConfigChannel</b>(<font color=green>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_SET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
Driver --> App : HAL_OK

App -> Driver : \n<b><font color=blue>HAL_TIM_IC_SetConfigChannel</b>(<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 : <b>HAL_TIM_SetDTSPrescaler</b>(HAL_TIM_DTS_DIV[1|2|4|8])
Driver --> App : HAL_OK
App->Driver : <b>HAL_TIM_SetDTS2Prescaler</b>(HAL_TIM_DTS2_DIV[1|4|16|64|256|1024|4096|16384|65536|262144])
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.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_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>1</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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>2</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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>3</b>,\n(hal_tim_oc_channel_config_t) {\n.polarity = HAL_TIM_OC_HIGH,\n.idle_state = HAL_TIM_OC_IDLE_STATE_RESET,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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

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,\n.override_state = HAL_TIM_OC_OVERRIDE_RESET,\n.break_mode = HAL_TIM_OC_BREAKMODE_IMMEDIATE})
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.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: