HAL USART use cases

Acquire Release Bus

@startuml

participant "User 1" as p1

participant "User 2" as p2

participant "HAL USART driver" as p3

participant "HAL OS wrapper" as p4



p1-[#green]->p3 : <color #Green> HAL_USART_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_USART_Receive()

end note

p2-[#red]->p3 : <color #Red> HAL_USART_AcquireBus() </color>

p3-[#red]->p4 : <color #Red> HAL_OS_SemaphoreTake </color>

p1-[#green]->p3 : <color #Green> HAL_USART_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_USART_Receive()

end note

@enduml

Called functions:

Full Denit

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "System Driver" as p3



== USART HAL DeInitialization ==

p1->p2: HAL_USART_DeInit

hnote over p2

global_state = HAL_USART_STATE_RESET

end note

p2-->p1: HAL_OK



== USART system DeInitialization ==

p1->p3: ForceReset_USARTx

p1->p3: ReleaseReset_USARTx

p1->p3: Disable USART clock

p1->p3: DeInitialization of GPIOs

alt #lightgrey if USE_HAL_USART_DMA == 1

p1->p3: Disable DMA

end

alt #lightgrey if interrupts needed == 1

p1->p3: Disable needed Interrupts

end

@enduml

Called functions:

Full Init

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "System Driver" as p3



== USART HAL Initialization ==

p1->p2: HAL_USART_Init

alt USE_HAL_USART_CLK_ENABLE_MODEL == USE_CLK_ENABLE

p2->p3: Enable the USART clock

end

hnote over p2

global_state = HAL_USART_STATE_INIT

end note

p2-->p1: HAL_OK



== USART System Initialization ==

note over p1

USART System initialization can be called before

USART HAL initialization

end note

alt #lightgrey if USE_HAL_USART_CLK_ENABLE_MODEL == HAL_CLK_ENABLE_NO

p1->p3: Enable the USART clock

end



p1->p3: Initialization of GPIOs



alt #lightgrey if USE_HAL_USART_DMA == 1

p1->p3: Initialization of DMA

end



alt #lightgrey if interrupts needed == 1

p1->p3: Enable NVIC

end



== USART Configuration ==

p1->p2: HAL_USART_SetConfig

hnote over p2

global_state = HAL_USART_STATE_IDLE

end note

p2-->p1:HAL_OK



note over p1

User can start any process or execute any configuration

end note



== Advanced USART Configuration ==

p1->p2: HAL_USART_SetConfigXXX

p2-->p1:HAL_OK

p1->p2: HAL_USART_EnableXXX

p2-->p1:HAL_OK

@enduml

Called functions:

Prerequisite

@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:

Process Abort

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "DMA" as p3

== USART HAL Abort ==

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p1->p2: HAL_USART_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

User can start any process or execute any configuration

end note

@enduml

Called functions:

Process Abort IT

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "DMA" as p3

participant "DMA_IRQHandler" as p4

hnote over p2

global_state = HAL_USART_STATE_IDLE | HAL_USART_STATE_RX_ACTIVE | HAL_USART_STATE_TX_ACTIVE | HAL_USART_STATE_TXRX _ACTIVE

end note

== USART HAL Abort IT ==

hnote over p2

 global state = HAL_USART_STATE_ABORT

end note

p1->p2: HAL_USART_Abort_IT()

p2->p3: HAL_DMA_Abort_IT()

p3->p2: HAL_OK

p2->p1: HAL_OK

p4<--: DMAx interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: USART_Rx/TxAbortCallback

hnote over p2

global_state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_AbortCpltCallBack

p1-->p2

p2-->p3

p3-->p4

p4-->



note over p1

User can start any process or execute any configuration

end note

@enduml

Called functions:

Process Polling

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Transmit Polling ==

p1->p2: HAL_USART_Transmit(hal_usart_handle_t *husart, const void *p_data, uint32_t size_byte, uint32_t timeout_ms)

hnote over p2

 global state = HAL_USART_STATE_TX_ACTIVE

end note

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_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

@enduml

Called functions:

Process Polling

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Receive Polling ==

p1->p2: HAL_USART_Receive(hal_usart_handle_t *husart, void *p_data, uint32_t size_byte, uint32_t timeout_ms)

hnote over p2

 global state = HAL_USART_STATE_RX_ACTIVE

end note

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_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

@enduml

Called functions:

Process Polling

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL TransmitReceive Polling ==

p1->p2: HAL_USART_TransmitReceive(hal_usart_handle_t *husart, const void *p_tx_data, void *p_rx_data, uint32_t size_byte, uint32_t timeout_ms)

hnote over p2

 global state = HAL_USART_STATE_TX_RX_ACTIVE

end note

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_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

@enduml

Called functions:

Process Rx IT

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "USARTx_IRQHandler" as p3

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Receive IT ==

p1->p2: HAL_USART_Receive_IT(hal_usart_handle_t *husart, const void *p_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_RX_ACTIVE

end note

p2-->p1: HAL_OK



alt successful case

p3<-: USARTx data interrupt

p3->p2: HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_RxCpltCallback(husart->rx_xfer_count)

note over p1: All data (size_byte == husart->rx_xfer_count) have been received

p1-->p2

p2-->p3

p3-->

else error

p3<-: USARTx error interrupt

p3->p2:HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_ErrorCallback

p1-->p2

p2-->p3

p3-->

end



note over p1

User can start any process or execute any configuration

end note

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions:

Process Rx DMA

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "DMA" as p3

participant "DMAx_IRQHandler" as p4



hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Receive DMA ==

p1->p2: HAL_USART_Receive_DMA(hal_usart_handle_t *husart, const void *p_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_RX_ACTIVE

end note

p2->p3: HAL_DMA_StartPeriphXfer_Opt

p3-->p2: HAL_OK

p2-->p1: HAL_OK



alt successful case

p4<-: DMAx complete interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferCpltCallback

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_RxCpltCallback(husart->rx_xfer_count)

note over p1: All data (size_byte == husart->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

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_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_USART_RxHalfCpltCallback

p1-->p2

p2-->p3

p3-->p4

p4-->

end

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions:

Process Tx IT

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "USARTx_IRQHandler" as p3

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Transmit IT ==

p1->p2: HAL_USART_Transmit_IT(hal_usart_handle_t *husart, const void *p_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_TX_ACTIVE

end note

p2-->p1: HAL_OK



alt successful case

p3<-: USARTx Transmit Complete (TCIE)

p3->p2: HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_TxCpltCallback

p1-->p2

p2-->p3

p3-->

else error

p3<-: USARTx error interrupt

p3->p2:HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_ErrorCallback

p1-->p2

p2-->p3

p3-->

end



hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions:

Process Tx DMA

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "USARTx_IRQHandler" as p5

participant "DMA" as p3

participant "DMAx_IRQHandler" as p4

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL Transmit DMA ==

p1->p2: HAL_USART_Transmit_DMA(hal_usart_handle_t *husart, const void *p_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_TX_ACTIVE

end note

p2->p3: HAL_DMA_StartPeriphXfer_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_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_TxCpltCallback

p1-->p2

p2-->p5

p5-->



else error



p4<-: DMAx error interrupt

p4->p3: HAL_DMA_IRQHandler

p3->p2: XferErrorCallback

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_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_USART_TxHalfCpltCallback

p1-->p2

p2-->p3

p3-->p4

p4-->



hnote over p2

 global_state = HAL_USART_STATE_IDLE

end note



note over p1

User can start any process or execute any configuration

end note

end

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions:

Process TxRx IT

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "USARTx_IRQHandler" as p3

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL TransmitReceive IT ==

p1->p2: HAL_USART_TransmitReceive_IT(hal_usart_handle_t *husart, const void *p_tx_data, void *p_rx_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_TX_RX_ACTIVE

end note

p2-->p1: HAL_OK



alt successful case

p3<-: USARTx data interrupt

p3->p2: HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_TxRxCpltCallback()

p1-->p2

p2-->p3

p3-->

else error

p3<-: USARTx error interrupt

p3->p2:HAL_USART_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_ErrorCallback

p1-->p2

p2-->p3

p3-->

end

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions:

Process TxRx DMA

@startuml

participant "User Application" as p1

participant "HAL USART driver" as p2

participant "USARTx_IRQHandler" as p3

participant "DMA" as p4

participant "DMAx_IRQHandler" as p5

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

== USART HAL TransmitReceive DMA ==

p1->p2: HAL_USART_TransmitReceive_DMA(hal_usart_handle_t *husart, const void *p_tx_data, void *p_rx_data, uint32_t size_byte)

hnote over p2

 global state = HAL_USART_STATE_TX_RX_ACTIVE

end note

p2->p4: HAL_DMA_StartPeriphXfer_Opt(Rx_Channel)

p4-->p2: HAL_OK

p2->p4: HAL_DMA_StartPeriphXfer_Opt(Tx_Channel)

p4-->p2: HAL_OK

p2-->p1: HAL_OK



alt successful case

p5<-: DMAx complete interrupt

p5->p4: HAL_DMA_IRQHandler

p4->p2: XferCpltCallback(Rx)

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p2->p1: HAL_USART_TxRxCpltCallback()

p1-->p2

p2-->p4

p4-->p5

p5-->



else error on DMA



p5<-: DMAx error interrupt

p5->p4: HAL_DMA_IRQHandler

hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

p4->p2: XferErrorCallback

p2->p1: HAL_USART_ErrorCallback

p1-->p2

p2-->p4

p4-->p5

p5-->



else error on USART



p3<-: USART error interrupt

p3->p1: HAL_USART_ErrorCallback

p1-->p3

p3-->



else intermediate case

p5<-: DMAx half complete interrupt

p5->p4: HAL_DMA_IRQHandler

p4->p2: XferHalfCpltCallback

p2->p1: HAL_USART_(Rx/Tx)HalfCpltCallback

p1-->p2

p2-->p4

p4-->p5

p5-->



hnote over p2

 global state = HAL_USART_STATE_IDLE

end note

note over p1

User can start any process or execute any configuration

end note

end

alt #lightgrey If USE_HAL_USART_GET_LAST_ERRORS == 1

p1->p2: HAL_USART_GetLastErrorsCodes()

p2-->p1: (HAL_USART_ERROR_XXX)

end

@enduml

Called functions: