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

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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
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_GetLastErrorCodes()
p2-->p1: (HAL_USART_ERROR_XXX)
end
@enduml

Called functions: