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

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_Receive_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_GetLastErrorsCodes()

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_GetLastErrorsCodes()

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_GetLastErrorsCodes()

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_Start_IT

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_GetLastErrorsCodes()

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_Start_IT

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_GetLastErrorsCodes()

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_GetLastErrorsCodes()

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_ReceiveUntilCharacterMatch(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_GetLastErrorsCodes()

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:

  • HAL_UART_ReceiveUntilCharacterMatch()

  • HAL_UART_GetLastErrorsCodes()

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_GetLastErrorsCodes()

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 "HAL UART ISR register" as p3



== UART HAL Receive Until Character Match Polling ==

p1->p2: HAL_UART_ReceiveUntilCharacterMatch(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_GetLastErrorsCodes()

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_ReceiveUntilCharacterMatch(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:

  • HAL_UART_ReceiveUntilCharacterMatch()

  • HAL_UART_GetLastErrorsCodes()

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_GetLastErrorsCodes()

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_Start_IT

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_GetLastErrorsCodes()

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_ReceiveUntilCharacterMatch_DMA(hal_uart_handle_t *huart, void *p_data, uint32_t size_byte, uint8_t character)

p2->p3: HAL_DMA_Start_IT

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_GetLastErrorsCodes()

p2-->p1: (HAL_UART_ERROR_XXX)

end

@enduml

Called functions:

  • HAL_UART_ReceiveUntilCharacterMatch_DMA()

  • HAL_UART_GetLastErrorsCodes()

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_Start_IT

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_GetLastErrorsCodes()

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_SetConfigAutoBaudRate()

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_GetBaudrate()

p2->p1: baud_rate value

@enduml

Called functions: