HAL UART Use Cases

Prerequisite

This diagram illustrates the prerequisite steps for initializing the system

@startuml
participant "User Application" as p1
participant "System Driver" as p2

== Prerequisite ==
p1->p2: HAL_Init
p2-->p1
p1->p2: Configure system clock
p2-->p1
@enduml

Called functions:

Full Initialization sequence

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "System Driver" as p3

== UART HAL Initialization ==
p1->p2: HAL_UART_Init
alt USE_HAL_UART_CLK_ENABLE_MODEL == USE_CLK_ENABLE
p2->p3: Enable the UART clock
end
p2-->p1: HAL_OK

== UART System Initialization ==
note over p1
UART System initialization can be called before
UART HAL initialization
end note
alt #lightgrey if USE_HAL_UART_CLK_ENABLE_MODEL == HAL_CLK_ENABLE_NO
p1->p3: Enable the UART clock
end

p1->p3: Initialization of GPIOs

alt #lightgrey if USE_HAL_UART_DMA == 1
p1->p3: Initialization of DMA
end

alt #lightgrey if interrupts needed == 1
p1->p3: Enable NVIC
end

== UART Configuration ==
p1->p2: HAL_UART_SetConfig
p2-->p1:HAL_OK

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note

== Advanced UART Configuration ==
p1->p2: HAL_UART_SetConfigXXX
p2-->p1:HAL_OK
p1->p2: HAL_UART_EnableXXX
p2-->p1:HAL_OK
@enduml

Called functions:

Full Deinitialization sequence

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "System Driver" as p3

== UART HAL DeInitialization ==
p1->p2: HAL_UART_DeInit
p2-->p1: HAL_OK

== UART system DeInitialization ==
p1->p3: ForceReset_UARTx
p1->p3: ReleaseReset_UARTx
p1->p3: Disable UART clock
p1->p3: DeInitialization of GPIOs
alt #lightgrey if USE_HAL_UART_DMA == 1
p1->p3: Disable DMA
end
alt #lightgrey if interrupts needed == 1
p1->p3: Disable needed Interrupts
end
@enduml

Called functions:

Modes user sequences

LIN Mode

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2

== UART System Initialization ==
note over p1, p2
Refer to full initialization diagram
end note
== UART Initialization ==
p1->p2: HAL_UART_Init()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfig()
p2-->p1: HAL_OK
alt
p1->p2: HAL_UART_RegisterLINBreakCallback()
p2-->p1: HAL_OK
end
p1->p2: HAL_UART_SetLINModeBreakDetectLength()
p2-->p1: HAL_OK
p1->p2: HAL_UART_EnableLINMode()
p2-->p1: HAL_OK
== UART Processing ==
alt config
p1->p2: HAL_UART_SetConfig<Feature>xxxx()
p2-->p1: HAL_OK
else enable
p1->p2: HAL_UART_Enable<Feature>xxxx()
p2-->p1: HAL_OK
else register callback
p1->p2: HAL_UART_Register<Callback>xxxx()
p2-->p1: HAL_OK
end
alt polling
p1->p2: HAL_UART_Transmit()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive()
p2-->p1: HAL_OK
end
alt IT
p1->p2: HAL_UART_Transmit_IT()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_IT()
p2-->p1: HAL_OK
end
alt #lightgrey if USE_HAL_UART_DMA == 1 \n DMA
p1->p2: HAL_UART_Transmit_DMA()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_DMA()
p2-->p1: HAL_OK
end
@enduml

Called functions:

RS485 Mode

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2

== UART System Initialization ==
note over p1, p2
Refer to full initialization diagram
end note
== UART Initialization ==
p1->p2: HAL_UART_Init()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfig()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfigRS485Mode()
p2-->p1: HAL_OK
p1->p2: HAL_UART_EnableRS485Mode()
p2-->p1: HAL_OK
alt config
p1->p2: HAL_UART_SetConfig<Feature>xxxx()
p2-->p1: HAL_OK
else enable
p1->p2: HAL_UART_Enable<Feature>xxxx()
p2-->p1: HAL_OK
else register callback
p1->p2: HAL_UART_Register<Callback>xxxx()
p2-->p1: HAL_OK
end
== UART Processing ==
alt polling
p1->p2: HAL_UART_Transmit()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive()
p2-->p1: HAL_OK
end
alt IT
p1->p2: HAL_UART_Transmit_IT()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_IT()
p2-->p1: HAL_OK
end
alt #lightgrey if USE_HAL_UART_DMA == 1 \n DMA
p1->p2: HAL_UART_Transmit_DMA()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_DMA()
p2-->p1: HAL_OK
end
@enduml

Called functions:

Multiprocessor Mode

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2

== UART System Initialization ==
note over p1, p2
Refer to full initialization diagram
end note
== UART Initialization ==
p1->p2: HAL_UART_Init()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfig()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfigMultiProcessorMode()
p2-->p1: HAL_OK
p1->p2: HAL_UART_EnableMultiProcessorMode()
p2-->p1: HAL_OK
alt config
p1->p2: HAL_UART_SetConfig<Feature>xxxx()
p2-->p1: HAL_OK
else enable
p1->p2: HAL_UART_Enable<Feature>xxxx()
p2-->p1: HAL_OK
else register callback
p1->p2: HAL_UART_Register<Callback>xxxx()
p2-->p1: HAL_OK
end
== UART Processing ==
p1->p2: HAL_UART_EnterMultiProcessorMuteMode()
p2-->p1: HAL_OK
note over p1, p2
Wait for the wakeup trigger
end note
p1->p2: HAL_UART_IsEnteredMultiProcessorMuteMode()
alt still in mute
p2-->p1: HAL_UART_MULTIPROCESSOR_MODE_IN_MUTE
else woke up
p2-->p1: HAL_UART_MULTIPROCESSOR_MODE_IN_ACTIVE
end
alt polling
p1->p2: HAL_UART_Transmit()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive()
p2-->p1: HAL_OK
end
alt IT
p1->p2: HAL_UART_Transmit_IT()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_IT()
p2-->p1: HAL_OK
end
alt #lightgrey if USE_HAL_UART_DMA == 1 \n DMA
p1->p2: HAL_UART_Transmit_DMA()
p2-->p1: HAL_OK
else
p1->p2: HAL_UART_Receive_DMA()
p2-->p1: HAL_OK
end
@enduml

Called functions:

Half Duplex Mode

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2

== UART System Initialization ==
note over p1, p2
Refer to full initialization diagram
end note
== UART Initialization ==
p1->p2: HAL_UART_Init()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfig()
p2-->p1: HAL_OK
p1->p2: HAL_UART_EnableHalfDuplexMode()
p2-->p1: HAL_OK
alt config
p1->p2: HAL_UART_SetConfig<Feature>xxxx()
p2-->p1: HAL_OK
else enable
p1->p2: HAL_UART_Enable<Feature>xxxx()
p2-->p1: HAL_OK
else register callback
p1->p2: HAL_UART_Register<Callback>xxxx()
p2-->p1: HAL_OK
end
== UART Processing ==
alt Only one process can run at a time
alt transmit in polling
p1->p2: HAL_UART_Transmit()
p2-->p1: HAL_OK
else transmit in IT
p1->p2: HAL_UART_Transmit_IT()
p2-->p1: HAL_OK
else #lightgrey if USE_HAL_UART_DMA == 1 \n transmit in DMA
p1->p2: HAL_UART_Transmit_DMA()
p2-->p1: HAL_OK
end
else
alt receive in polling
p1->p2: HAL_UART_Receive()
p2-->p1: HAL_OK
else receive in IT
p1->p2: HAL_UART_Receive_IT()
p2-->p1: HAL_OK
else #lightgrey if USE_HAL_UART_DMA == 1 \n receive in DMA
p1->p2: HAL_UART_Receive_DMA()
p2-->p1: HAL_OK
end
end
@enduml

Called functions:

Process

Process Transmit/Receive Polling

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2

== UART HAL Transmit/Receive Polling ==
p1->p2: HAL_UART_Transmit/Receive(hal_uart_handle_t *huart, const void *p_data, uint32_t size_byte, uint32_t timeout_ms)

alt successful case
p2-->p1: HAL_OK
else invalid param
p2-->p1: HAL_INVALID_PARAM
else busy
p2-->p1: HAL_BUSY
note over p1
Another Process is running...
Please wait and retry
end note
else timeout
p2-->p1: HAL_TIMEOUT
else error case
p2-->p1: HAL_ERROR
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== UART HAL Receive IT ==
p1->p2: HAL_UART_Receive_IT(hal_uart_handle_t *huart, const void *p_data, uint32_t size_byte)
p2-->p1: HAL_OK

alt successful case
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->
else error
p3<-: UARTX error interrupt
p3->p2:HAL_UART_IRQHandler
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->
end

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Transmit IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== UART HAL Transmit IT ==
p1->p2: HAL_UART_Transmit_IT(hal_uart_handle_t *huart, const void *p_data, uint32_t size_byte)
p2-->p1: HAL_OK

alt successful case
p3<-: USARTx Transmit Complete (TCIE)
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_TxCpltCallback
p1-->p2
p2-->p3
p3-->
else error
p3<-: UARTX error interrupt
p3->p2:HAL_UART_IRQHandler
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->
end

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Receive DMA

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== UART HAL Receive DMA ==
p1->p2: HAL_UART_Receive_DMA(hal_uart_handle_t *huart, const void *p_data, uint32_t size_byte)
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-->p2: HAL_OK
p2-->p1: HAL_OK

alt successful case
p4<-: DMAX complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->p4
p4-->

else error

p4<-: DMAX error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

else intermediate case
p4<-: DMAX half complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferHalfCpltCallback
p2->p1: HAL_UART_RxHalfCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Transmit DMA

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p5
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== UART HAL Transmit DMA ==
p1->p2: HAL_UART_Transmit_DMA(hal_uart_handle_t *huart, const void *p_data, uint32_t size_byte)
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-->p2: HAL_OK
p2-->p1: HAL_OK

alt successful case
p4<-: DMAX complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
p2->p2: Enable USARTx Transmit Complete IRQ (TCIE)
p2-->p3
p3-->p4
p4-->

p5<-: USARTx Transmit Complete (TCIE)
p5->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_TxCpltCallback
p1-->p2
p2-->p5
p5-->

else error

p4<-: DMAX error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

else intermediate case
p4<-: DMAX half complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferHalfCpltCallback
p2->p1: HAL_UART_TxHalfCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Receive To Idle Polling

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "HAL UART ISR register" as p3

== UART HAL Receive to IDLE ==
p1->p2: HAL_UART_ReceiveToIdle(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint32_t *p_rx_size_byte, uint32_t timeout_ms);
alt successful case
p2->p3: poll IDLE || RXNE
p3-->p2
p2-->p1: HAL_OK: IDLE received or Rx_counter == size_byte
else invalid param
p2-->p1: HAL_INVALID_PARAM
else busy
p2-->p1: HAL_BUSY
note over p1
Another Process is running...
Please wait and retry
end note
else timeout
p2-->p1: HAL_TIMEOUT
else error case
p2-->p1: HAL_ERROR
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive Until Character Match Polling

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "HAL UART ISR register" as p3

== UART HAL Receive Until Character Match Polling ==
p1->p2: HAL_UART_ReceiveUntilCM(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint8_t character, uint32_t *p_rx_size_byte, uint32_t timeout_ms);
alt successful case
p2->p3: poll CMF || RXNE
p3-->p2
p2-->p1: HAL_OK: CMF received or Rx_counter == size_byte
else invalid param
p2-->p1: HAL_INVALID_PARAM
else busy
p2-->p1: HAL_BUSY
note over p1
Another Process is running...
Please wait and retry
end note
else timeout
p2-->p1: HAL_TIMEOUT
else error case
p2-->p1: HAL_ERROR
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive Until Timeout Polling

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "HAL UART ISR register" as p3

== UART HAL Receive Until Timeout Polling ==
p1->p2: HAL_UART_ReceiveUntilTMO(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint32_t *p_rx_size_byte, uint32_t char_timeout_bit);
alt successful case
p2->p3: poll RTO || RXNE
p3-->p2
p2-->p1: HAL_OK: RTO received or Rx_counter == size_byte
else invalid param
p2-->p1: HAL_INVALID_PARAM
else busy
p2-->p1: HAL_BUSY
note over p1
Another Process is running...
Please wait and retry
end note
else error case
p2-->p1: HAL_ERROR
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
note over p1
Driver state is IDLE
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive To Idle IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3
== UART HAL Receive To Idle IT ==
p1->p2: HAL_UART_ReceiveToIdle_IT(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte);
p2-->p1: HAL_OK
alt successful case
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
p2->p2: UART_RxISR
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->
p3<-: UARTX IDLE interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_IDLE, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->
else error
p3<-: UARTX error interrupt
p3->p2:HAL_UART_IRQHandler
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive Until Character Match IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== UART HAL Receive Until Character Match ==
p1->p2: HAL_UART_ReceiveUntilCM(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint8_t character, uint32_t *p_rx_size_byte, uint32_t timeout_ms);

p2-->p1: HAL_OK

alt successful case
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
p2->p2: UART_RxISR
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->
p3<-: UARTX CMF interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_CHARMATCH, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->

else error
p3<-: UARTX error interrupt
p3->p2:HAL_UART_IRQHandler
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->
end

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Receive Until Timeout IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== UART HAL Receive Until Timeout IT ==
p1->p2: HAL_UART_ReceiveUntilTMO_IT(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint32_t char_timeout_bit);
p2-->p1: HAL_OK

alt successful case
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
p2->p2: UART_RxISR
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->
p3<-: UARTX RTOF interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TIMEOUT, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->

else error
p3<-: UARTX error interrupt
p3->p2:HAL_UART_IRQHandler
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->
end

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Receive To Idle DMA

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== UART HAL Receive DMA ==
p1->p2: HAL_UART_ReceiveToIdle_DMA(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte)
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-->p2: HAL_OK
p2-->p1: HAL_OK

alt successful case
p4<-: DMAX complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->p4
p4-->

p3<-: UART IDLE interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_IDLE, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->

else error

p4<-: DMAX error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

else intermediate case
p4<-: DMAX half complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferHalfCpltCallback
p2->p1: HAL_UART_RxHalfCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Receive Until Character Match DMA

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== UART HAL ReceiveUntilCM DMA ==
p1->p2: HAL_UART_ReceiveUntilCM_DMA(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint8_t character)
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-->p2: HAL_OK
p2-->p1: HAL_OK

alt successful case
p4<-: DMAX complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->p4
p4-->

p3<-: UART CMF interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_CHARMATCH, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->

else error

p4<-: DMAX error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

else intermediate case
p4<-: DMAX half complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferHalfCpltCallback
p2->p1: HAL_UART_RxHalfCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Receive Until Timeout DMA

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMAx_IRQHandler" as p4

== UART HAL Receive until Timeout DMA ==
p1->p2: HAL_UART_ReceiveUntilTMO_DMA(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint32_t char_timeout_bit)
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-->p2: HAL_OK
p2-->p1: HAL_OK

alt successful case
p4<-: DMAX complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TC, huart->rx_xfer_count)
note over p1: All data (size_byte == huart->rx_xfer_count) have been received
p1-->p2
p2-->p3
p3-->p4
p4-->

p3<-: UART RTOF interrupt
p3->p2: HAL_UART_IRQHandler
p2->p1: HAL_UART_RxCpltCallback(HAL_UART_RXEVENT_TIMEOUT, huart->rx_xfer_count)
note over p1: Partial data (huart->rx_xfer_count == nb of received data) have been received
p1-->p2
p2-->p3
p3-->

else error

p4<-: DMAX error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
p2->p1: HAL_UART_ErrorCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

else intermediate case
p4<-: DMAX half complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferHalfCpltCallback
p2->p1: HAL_UART_RxHalfCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
end
alt #lightgrey If USE_HAL_UART_GET_LAST_ERRORS == 1
p1->p2: HAL_UART_GetLastErrorCodes()
p2-->p1: (HAL_UART_ERROR_XXX)
end
@enduml

Called functions:

Process Abort

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
== UART HAL Abort ==
p1->p2: HAL_UART_Abort()
p2->p3: HAL_DMA_Abort(timeout_ms)

alt successful case
p3->p2: HAL_OK
p2->p1: HAL_OK
else timeout
p3->p2: HAL_TIMEOUT
p2->p1: HAL_TIMEOUT
end
note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Process Abort IT

@startuml
participant "User Application" as p1
participant "HAL UART driver" as p2
participant "DMA" as p3
participant "DMA_IRQHandler" as p4

== UART HAL Abort IT ==
p1->p2: HAL_UART_Abort_IT()
p2->p3: HAL_DMA_Abort_IT()
p3->p2: HAL_OK
p2->p1: HAL_OK
p4<--: DMAx interupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: UART_Rx/TxAbortCallback
p2->p1: HAL_UART_AbortCpltCallBack
p1-->p2
p2-->p3
p3-->p4
p4-->

note over p1
Driver global state is HAL_UART_STATE_CONFIGURED
User can start any process or execute any configuration only if both sub processes state are HAL_UART_<RX/TX>_STATE_IDLE
end note
@enduml

Called functions:

Acquire Release BUS

@startuml
participant "User 1" as p1
participant "User 2" as p2
participant "HAL UART driver" as p3
participant "HAL OS wrapper" as p4

p1-[#green]->p3 : <color #Green> HAL_UART_AcquireBus() </color>
p3-[#green]->p4 : <color #Green> HAL_OS_SemaphoreTake </color>
p4-[#green]-->p3
p3-[#green]-->p1: <color #Green> HAL_OK </color>
note over p3
Bus acquired by user 1. Any Process can be executed. For instance : HAL_UART_Receive()
end note
p2-[#red]->p3 : <color #Red> HAL_UART_AcquireBus() </color>
p3-[#red]->p4 : <color #Red> HAL_OS_SemaphoreTake </color>
p1-[#green]->p3 : <color #Green> HAL_UART_ReleaseBus() </color>
p3-[#green]-->p1:<color #Green>  HAL_OK </color>
p4-[#red]-->p3
p3-[#red]-->p2: <color #Red> HAL_OK </color>
note over p3
Bus acquired by user 1. Any Process can be executed. For instance : HAL_UART_Receive()
end note
@enduml

Called functions:

Auto Baud Rate

@startuml
participant "User Application" as p1
participant HAL_UART as p2
participant USART_REGISTER as p3

== UART System Initialization ==
note over p1, p2
Refer to full initialization diagram
end note
== UART Initialization ==
p1->p2: HAL_UART_Init()
p2-->p1: HAL_OK
p1->p2: HAL_UART_SetConfig()
p2-->p1: HAL_OK

== UART HAL Auto Baud Rate ==

p1->p2: HAL_UART_SetConfigAutoBaudRateMode()
p1<-p2: HAL_OK
p1->p2: HAL_UART_EnableAutoBaudRate()
p1<-p2: HAL_OK
p1->p2: HAL_UART_Receive()
p2->p1: HAL_OK
p1->p2: HAL_UART_GetAutoBaudRateStatus()
alt Successfull case
p3->p2: ABREN = 1 && ABRF = 1
p2->p1: HAL_UART_AUTO_BAUD_RATE_DETECTION_SUCCESS
else ongoing
p3->p2: ABREN = 1 && ABRF = 0
p2->p1: HAL_UART_AUTO_BAUD_RATE_DETECTION_ONGOING
else error
p3->p2: ABREN = 1 && (RXFE = 1 || FE = 1)
p2->p1: HAL_UART_AUTO_BAUD_RATE_DETECTION_ERROR
else not enabled
p3->p2: ABREN = 0
p2->p1: HAL_UART_AUTO_BAUD_RATE_DETECTION_NOT_ENABLED

end
p1->p2: HAL_UART_GetConfigAutoBaudRateMode()
p2->p1: baud_rate value
@enduml

Called functions: