HAL DMA Use Cases

Direct Mode Transfer: Polling

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "DMA Driver"       as part3



group #GreenYellow Initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

part1->part3 : HAL_DMA_Init()

end



group #LimeGreen Configuration

group #lightblue Mandatory

part1->part3 : HAL_DMA_SetConfigDirectXfer()

note right : Or HAL_DMA_SetConfigPeriphDirectXfer()

end



group #LightYellow Optional

part1->part3 : HAL_DMA_SetConfigDirectXferHardwareRequestMode()

part1->part3 : HAL_DMA_SetConfigDirectXferPort()

part1->part3 : HAL_DMA_SetConfigDirectXferBurst()

part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()

part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()

part1->part3 : HAL_DMA_SetConfigDirectXferRepeatBlock()

part1->part3 : HAL_DMA_SetConfigAccessAttributes()

end

end



group #Green Process

    group #Salmon Start

        part1->part3 : HAL_DMA_StartDirectXfer()

    end

    group #LightYellow Optional

        group #Salmon Abort

            part1->part3 : HAL_DMA_Abort()

        end

        group #Salmon Suspend

            part1->part3 : HAL_DMA_Suspend()

            part1->part3 : HAL_DMA_Resume()

        end

    end

    group #Salmon Polling for transfer

        part1->part3 : HAL_DMA_PollForXfer()

        part3->part1:

    end

end



group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions:

Direct Mode Transfer: Interrupt

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "DMA Driver"       as part3

participant "NVIC"             as part4

participant "HW"               as part5



group #GreenYellow Initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

part1->part3 : HAL_DMA_Init()

end



group #LimeGreen Configuration

group #lightblue Mandatory

part1->part3 : HAL_DMA_SetConfigDirectXfer()

note right : Or HAL_DMA_SetConfigPeriphDirectXfer()

end



group #LightYellow Optional

part1->part3 : HAL_DMA_SetConfigDirectXferHardwareRequestMode()

part1->part3 : HAL_DMA_SetConfigDirectXferPort()

part1->part3 : HAL_DMA_SetConfigDirectXferBurst()

part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()

part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()

part1->part3 : HAL_DMA_SetConfigDirectXferRepeatBlock()

part1->part3 : HAL_DMA_SetConfigAccessAttributes()

end

end



group #Green Process

    group #Salmon Start

        part1->part3 : HAL_DMA_StartDirectXfer_IT()

        note right : Or HAL_DMA_StartDirectXfer_IT_Opt()

    end



    group #LightYellow Optional

        group #Salmon Abort

            part1->part3 : HAL_DMA_Abort_IT()

        end

        group #Salmon Suspend

            part1->part3 : HAL_DMA_Suspend_IT()

        end

    end



    group #Salmon Interrupt

        part4<-part5 : Interrupt

        part4->part3 : HAL_DMA_IRQHandler()

        part3->part1 : User callback()

    end

    group #LightYellow Optional

        group #Salmon Resume

            part1->part3 : HAL_DMA_Resume()

            note right

                In case of suspended

                DMA channel xfer

            end note

        end

    end

end



group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions:

Linked List Mode Transfer: Polling

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "DMA Driver"       as part3

participant "Q Driver"         as part4



group #GreenYellow System initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

end



group #LimeGreen Q Building

    group #FFB133 Fill Node

        group #lightblue Mandatory

            part1->part3 : HAL_DMA_FillNodeConfig()

            note right : Or HAL_DMA_FillNodeDirectXfer()

        end

        group #LightYellow Optional

            part1->part3 : HAL_DMA_FillNodeHardwareRequestMode()

            part1->part3 : HAL_DMA_FillNodePort()

            part1->part3 : HAL_DMA_FillNodeBurst()

            part1->part3 : HAL_DMA_FillNodeXferEventMode()

            part1->part3 : HAL_DMA_FillNodeTrigger()

            part1->part3 : HAL_DMA_FillNodeDataHandling()

            part1->part3 : HAL_DMA_FillNodeRepeatBlock()

            part1->part3 : HAL_DMA_FillNodeAccessAttributes()

            part1->part3 : HAL_DMA_FillNodeData()

        end

    end



    group #FFB133 Q Services

        group #lightblue Mandatory

            part1->part4 : HAL_Q_Init(..., <color:FF33F7><b>&HAL_DMA_2DAddressing_Desc_Ops)

            note right

            Q initialization according to DMA

            descriptor operation constant

            end note

            part1->part4 : HAL_Q_InsertNode()

            note right : Insert node to Q

        end

        group #LightYellow Optional

            part1->part4 : HAL_Q_InsertNode_Head()

            part1->part4 : HAL_Q_InsertNode_Tail()

            part1->part4 : HAL_Q_RemoveNode()

            part1->part4 : HAL_Q_RemoveNode_Head()

            part1->part4 : HAL_Q_RemoveNode_Tail()

            part1->part4 : HAL_Q_ReplaceNode()

            part1->part4 : HAL_Q_ReplaceNode_Head()

            part1->part4 : HAL_Q_ReplaceNode_Tail()

            part1->part4 : HAL_Q_InsertQ()

            part1->part4 : HAL_Q_InsertQ_Head()

            part1->part4 : HAL_Q_InsertQ_Tail()

        end

    end

end



group #LimeGreen DMA

    group #FFB133 Configuration

        group #lightblue Mandatory

        part1->part3 : HAL_DMA_Init()

        part1->part3 : HAL_DMA_SetConfigLinkedListXfer()

        end



        group #LightYellow Optional

        part1->part3 : HAL_DMA_SetLinkedListXferEventMode()

        part1->part3 : HAL_DMA_SetLinkedListXferFetchNodePort()

        part1->part3 : HAL_DMA_SetLinkedListXferPriority()

        part1->part3 : HAL_DMA_SetLinkedListXferExecutionMode()

        end

    end



    group #FFB133 Process

        group #Salmon Start

            part1->part3 : HAL_DMA_StartLinkedListXfer(..., <b>&p_q)

        end

        group #LightYellow Optional

            group #Salmon Abort

                part1->part3 : HAL_DMA_Abort()

            end

            group #Salmon Suspend

                part1->part3 : HAL_DMA_Suspend()

                part1->part3 : HAL_DMA_Resume()

            end

        end

        group #Salmon Polling for transfer

            part1->part3 : HAL_DMA_PollForXfer()

        end

    end

end



group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions:

Linked List Mode Transfer: Interrupt

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "DMA Driver"       as part3

participant "Q Driver"         as part6

participant "NVIC"             as part4

participant "HW"               as part5



group #GreenYellow System initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

end



group #LimeGreen Q Building

    group #FFB133 Fill Node

        group #lightblue Mandatory

            part1->part3 : HAL_DMA_FillNodeConfig()

            note right : Or HAL_DMA_FillNodeDirectXfer()

        end

        group #LightYellow Optional

            part1->part3 : HAL_DMA_FillNodeHardwareRequestMode()

            part1->part3 : HAL_DMA_FillNodePort()

            part1->part3 : HAL_DMA_FillNodeBurst()

            part1->part3 : HAL_DMA_FillNodeXferEventMode()

            part1->part3 : HAL_DMA_FillNodeTrigger()

            part1->part3 : HAL_DMA_FillNodeDataHandling()

            part1->part3 : HAL_DMA_FillNodeRepeatBlock()

            part1->part3 : HAL_DMA_FillNodeAccessAttributes()

            part1->part3 : HAL_DMA_FillNodeData()

        end

    end



    group #FFB133 Q Services

        group #lightblue Mandatory

            part1->part6 : HAL_Q_Init(..., <color:FF33F7><b> &HAL_DMA_2DAddressing_Desc_Ops)

            note right

            Q initialization according to DMA

            descriptor operation constant

            end note

            part1->part6 : HAL_Q_InsertNode()

            note right : Insert node to Q

        end

        group #LightYellow Optional

            part1->part6 : HAL_Q_InsertNode_Head()

            part1->part6 : HAL_Q_InsertNode_Tail()

            part1->part6 : HAL_Q_RemoveNode()

            part1->part6 : HAL_Q_RemoveNode_Head()

            part1->part6 : HAL_Q_RemoveNode_Tail()

            part1->part6 : HAL_Q_ReplaceNode()

            part1->part6 : HAL_Q_ReplaceNode_Head()

            part1->part6 : HAL_Q_ReplaceNode_Tail()

            part1->part6 : HAL_Q_InsertQ()

            part1->part6 : HAL_Q_InsertQ_Head()

            part1->part6 : HAL_Q_InsertQ_Tail()

        end

    end

end



group #LimeGreen DMA

    group #FFB133 Configuration

        group #lightblue Mandatory

        part1->part3 : HAL_DMA_Init()

        part1->part3 : HAL_DMA_SetConfigLinkedListXfer()

        end



        group #LightYellow Optional

        part1->part3 : HAL_DMA_SetLinkedListXferEventMode()

        part1->part3 : HAL_DMA_SetLinkedListXferFetchNodePort()

        part1->part3 : HAL_DMA_SetLinkedListXferPriority()

        part1->part3 : HAL_DMA_SetLinkedListXferExecutionMode()

        end

    end



    group #FFB133 Process

        group #Salmon Start

            part1->part3 : HAL_DMA_StartLinkedListXfer_IT(..., <b>&p_q)

            note right : Or HAL_DMA_StartLinkedListXfer_IT_Opt(..., <b>&p_q,<b> interrupts)

        end

        group #LightYellow Optional

            group #Salmon Abort

                part1->part3 : HAL_DMA_Abort_IT()

            end

            group #Salmon Suspend

                part1->part3 : HAL_DMA_Suspend_IT()

            end

        end

        group #Salmon Interrupt

        part4<-part5 : Interrupt

        part4->part3 : HAL_DMA_IRQHandler()

        part3->part1 : User callback()

        end

        group #LightYellow Optional

            group #Salmon Resume

                part1->part3 : HAL_DMA_Resume()

                note right

                In case of suspended

                DMA channel xfer

                end note

            end

        end

    end

end



group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions:

Peripheral Transfer: Linear Mode

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "PPP Driver"       as part4

participant "DMA Driver"       as part3

participant "NVIC"             as part5

participant "HW"               as part6



group #GreenYellow Initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

part1->part3 : HAL_DMA_Init()

end



group #LimeGreen Configuration

group #lightblue Mandatory

part1->part3 : HAL_DMA_SetConfigPeriphDirectXfer()

end



group #LightYellow Optional

part1->part3 : HAL_DMA_SetConfigDirectXferHardwareRequestMode()

part1->part3 : HAL_DMA_SetConfigDirectXferPort()

part1->part3 : HAL_DMA_SetConfigDirectXferBurst()

part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()

part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()

part1->part3 : HAL_DMA_SetConfigDirectXferRepeatBlock()

part1->part3 : HAL_DMA_SetConfigAccessAttributes()

end

end



group #Green Process

    group #Salmon Start

        part1->part3 : <b>HAL_DMA_StartDirectXfer_IT()

        note right : Or <b>HAL_DMA_StartDirectXfer_IT_Opt()

    end



    group #LightYellow Optional

        group #Salmon Abort

            part1->part3 :<b> HAL_DMA_Abort_IT()

        end

    end



    group #Salmon Interrupt

        part4<-part5 : <b>Interrupt

        part4->part3 : <b>HAL_DMA_IRQHandler()

        part3->part1 : <b>User callback()

    end

end



group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions:

Peripheral Transfer: Circular Mode

@startuml

hide footbox

participant "User Application" as part1

participant "System"           as part2

participant "PPP Driver"       as part4

participant "DMA Driver"       as part3

participant "NVIC"             as part5

participant "HW"               as part6



group #GreenYellow Initialization

part1->part2 : HAL_Init()

part1->part2 : Configure system clock

part1->part3 : HAL_DMA_Init()

end



group #LimeGreen Configuration

group #lightblue Mandatory

part1->part3 : HAL_DMA_SetConfigPeriphLinkedListCircularXfer()

end



group #LightYellow Optional

part1->part3 : HAL_DMA_SetLinkedListXferEventMode()

part1->part3 : HAL_DMA_SetLinkedListXferFetchNodePort()

part1->part3 : HAL_DMA_SetLinkedListXferPriority()

end

end



group #Green Process

group #Salmon PPP driver

part1->part4 : <b>HAL_PPP_Start_DMA()

group #LightYellow Repeated until PPP stop DMA

        part4->part3 : <b>HAL_DMA_StartPeriphXfer_IT_Opt()



    group #FF33F7 DMA driver

        part5<-part6 : <b>Interrupt

        part5->part3 : <b>HAL_DMA_IRQHandler()

    end



    group #Salmon PPP driver

        part3->part4 : <b>PPP DMA transfer callback

        part4->part1 : <b>User PPP process callback

    end

end

    part1->part4 : <b>HAL_PPP_Stop_DMA()

    part4->part3 : <b>HAL_DMA_Abort_IT()

    part3->part4 : \n<b>PPP DMA abort callback

    part4->part1 : <b>User PPP stop callback

end

end

group #OrangeRed De-initialization

part1->part3 : HAL_DMA_DeInit()

end

@enduml

Called functions: