HAL SMARTCARD Use Cases

Acquire Release Bus

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

p1-[#green]->p3 : <color #Green> HAL_SMARTCARD_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_SMARTCARD_Receive()
end note
p2-[#red]->p3 : <color #Red> HAL_SMARTCARD_AcquireBus() </color>
p3-[#red]->p4 : <color #Red> HAL_OS_SemaphoreTake </color>
p1-[#green]->p3 : <color #Green> HAL_SMARTCARD_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_SMARTCARD_Receive()
end note
@enduml

Called functions:

Full Denit

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

== SMARTCARD HAL DeInitialization ==
p1->p2: HAL_SMARTCARD_DeInit
note over p2
global_state = HAL_SMARTCARD_STATE_RESET
end note
p2-[#green]-->p1: <color #Green> HAL_OK </color>

== SMARTCARD system DeInitialization ==
p1->p3: ForceReset_SMARTCARD
p1->p3: ReleaseReset_SMARTCARD
p1->p3: Disable SMARTCARD clock
p1->p3: DeInitialization of GPIOs
alt #lightgrey if USE_HAL_SMARTCARD_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 SMARTCARD driver" as p2
participant "System Driver" as p3

== SMARTCARD HAL Initialization ==
p1->p2: HAL_SMARTCARD_Init
note over p2
global_state = HAL_SMARTCARD_STATE_INIT
end note
alt USE_HAL_SMARTCARD_CLK_ENABLE_MODEL == USE_CLK_ENABLE
p2->p3: Enable the SMARTCARD clock
end
p2-[#green]-->p1: <color #Green> HAL_OK </color>

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

p1->p3: Initialization of GPIOs

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

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

== SMARTCARD Configuration ==
p1->p2: HAL_SMARTCARD_SetConfig
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2-[#green]-->p1: <color #Green> HAL_OK </color>

note over p1
Driver global state is HAL_SMARTCARD_STATE_IDLE
User can start any process or execute any configuration
end note

== Advanced SMARTCARD Configuration ==
p1->p2: HAL_SMARTCARD_SetXXX
p2-[#green]-->p1: <color #Green> HAL_OK </color>
p1->p2: HAL_SMARTCARD_EnableXXX
p2-[#green]-->p1: <color #Green> HAL_OK </color>
@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 SMARTCARD driver" as p2
participant "DMA" as p3
== SMARTCARD HAL Abort ==
p1->p2: HAL_SMARTCARD_Abort()
note over p2
global_state = HAL_SMARTCARD_STATE_ABORT
end note
p2->p3: HAL_DMA_Abort(timeout_ms)

alt successful case
p3-[#green]-->p2: <color #Green> HAL_OK </color>
p2-[#green]-->p1: <color #Green> HAL_OK </color>
else timeout
p3-[#03234b]->p2: <color #03234b> HAL_TIMEOUT </color>
p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>
end
note over p1
Driver global state is HAL_SMARTCARD_STATE_IDLE
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 SMARTCARD driver" as p2
participant "DMA" as p3
participant "DMA_IRQHandler" as p4

== SMARTCARD HAL Abort IT ==
p1->p2: HAL_SMARTCARD_Abort_IT()
note over p2
global_state = HAL_SMARTCARD_STATE_ABORT
end note
p2->p3: HAL_DMA_Abort_IT()
p3-[#green]-->p2: <color #Green> HAL_OK </color>
p2-[#green]-->p1: <color #Green> HAL_OK </color>
p4<--: DMAx interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: SMARTCARD_Rx/TxAbortCallback
note over p2
Driver global state is HAL_SMARTCARD_STATE_IDLE
User can start any process or execute any configuration
end note
p2->p1: HAL_SMARTCARD_AbortCpltCallback
p1-->p2
p2-->p3
p3-->p4
p4-->


@enduml

Called functions:

Process TX Polling

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

== SMARTCARD HAL Transmit Polling ==
p1->p2: HAL_SMARTCARD_Transmit(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte, uint32_t timeout_ms)

note over p2
global_state = HAL_SMARTCARD_STATE_TX_ACTIVE
end note

alt successful case
p2-[#green]-->p1: <color #Green> HAL_OK </color>
else invalid param
p2-[#8c0078]->p1: <color #8c0078> HAL_INVALID_PARAM </color>
else busy
p2-[#ffd200]->p1: <color #ffd200> HAL_BUSY </color>
note over p1
Another Process is running...
Please wait and retry
end note
else timeout
p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>
end
alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
note over p1
Driver global state is HAL_SMARTCARD_STATE_IDLE
User can start any process or execute any configuration
end note
@enduml

Called functions:

Process RX Polling

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

== SMARTCARD HAL Receive Polling ==
p1->p2: HAL_SMARTCARD_Receive(hal_smartcard_handle_t *hsmartcard, void *p_data, uint32_t size_byte, uint32_t timeout_ms)

note over p2
global_state = HAL_SMARTCARD_STATE_RX_ACTIVE
end note

alt successful case
p2-[#green]-->p1: <color #Green> HAL_OK </color>
else invalid param
p2-[#8c0078]->p1: <color #8c0078> HAL_INVALID_PARAM </color>
else busy
p2-[#ffd200]->p1: <color #ffd200> HAL_BUSY </color>
note over p1
Another Process is running...
Please wait and retry
end note
else timeout
p2-[#03234b]->p1: <color #03234b> HAL_TIMEOUT </color>
end
alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
note over p1
Driver global state is HAL_SMARTCARD_STATE_IDLE
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 SMARTCARD driver" as p2
participant "SMARTCARD_IRQHandler" as p3

== SMARTCARD HAL Receive IT ==
p1->p2: HAL_SMARTCARD_Receive_IT(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)
note over p2
global_state = HAL_SMARTCARD_STATE_RX_ACTIVE
end note
p2-[#green]-->p1: <color #Green> HAL_OK </color>

alt successful case
p3<-: SMARTCARD data interrupt
p3->p2: HAL_SMARTCARD_IRQHandler
note over p2: All data (size_byte == hsmartcard->rx_xfer_count) have been received
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_RxCpltCallback()

else error
p3<-: SMARTCARD error interrupt
p3->p2:HAL_SMARTCARD_IRQHandler
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_ErrorCallback

end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
@enduml

Called functions:

Process Rx DMA

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

== SMARTCARD HAL Receive DMA ==
p1->p2: HAL_SMARTCARD_Receive_DMA(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)
note over p2
global_state = HAL_SMARTCARD_STATE_RX_ACTIVE
end note
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
note over p3
interrupt dma can be :
HAL_SMARTCARD_OPT_DMA_RX_IT_HT
HAL_SMARTCARD_OPT_DMA_RX_IT_DEFAULT
end note
p3-[#green]-->p2: <color #Green> HAL_OK </color>
p2-[#green]-->p1: <color #Green> HAL_OK </color>

alt successful case
p4<-: DMAx complete interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferCpltCallback
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_RxCpltCallback()
note over p1
All data(size_byte =hsmartcard->rx_xfer_count) have been received
end note

else error

p4<-: DMAx error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_ErrorCallback

end
alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
@enduml

Called functions:

Process Tx IT

@startuml
participant "User Application" as p1
participant "HAL SMARTCARD driver" as p2
participant "SMARTCARD_IRQHandler" as p3

== SMARTCARD HAL Transmit IT ==
p1->p2: HAL_SMARTCARD_Transmit_IT(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)
note over p2
global_state = HAL_SMARTCARD_STATE_TX_ACTIVE
end note
p2-[#green]-->p1: <color #Green> HAL_OK </color>

alt successful case
p3<-: SMARTCARD Transmit Complete (TC)
p3->p2: HAL_SMARTCARD_IRQHandler
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_TxCpltCallback

else error
p3<-: SMARTCARD error interrupt
p3->p2:HAL_SMARTCARD_IRQHandler
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_ErrorCallback
end

alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
@enduml

Called functions:

Process Tx DMA

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

== SMARTCARD HAL Transmit DMA ==
p1->p2: HAL_SMARTCARD_Transmit_DMA(hal_smartcard_handle_t *hsmartcard, const void *p_data, uint32_t size_byte)
note over p2
global_state = HAL_SMARTCARD_STATE_TX_ACTIVE
end note
p2->p3: HAL_DMA_StartPeriphXfer_IT_Opt
p3-[#green]-->p2: <color #Green> HAL_OK </color>
p2-[#green]-->p1: <color #Green> HAL_OK </color>

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

p5<-: SMARTCARD Transmit Complete (TC)
p5->p2: HAL_SMARTCARD_IRQHandler
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_TxCpltCallback

else error

p4<-: DMAx error interrupt
p4->p3: HAL_DMA_IRQHandler
p3->p2: XferErrorCallback
note over p2
global_state = HAL_SMARTCARD_STATE_IDLE
end note
p2->p1: HAL_SMARTCARD_ErrorCallback

end
alt #lightgrey If USE_HAL_SMARTCARD_GET_LAST_ERRORS == 1
p1->p2: HAL_SMARTCARD_GetLastErrorCodes()
p2-->p1: (HAL_SMARTCARD_ERROR_XXX)
end
@enduml

Called functions: