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_SetConfigDirectXferFlowControlMode()
part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()
part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()
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_SetConfigDirectXferFlowControlMode()
part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()
part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()
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_FillNodeFlowControlMode()
            part1->part3 : HAL_DMA_FillNodeXferEventMode()
            part1->part3 : HAL_DMA_FillNodeTrigger()
            part1->part3 : HAL_DMA_FillNodeDataHandling()
            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_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_FillNodeFlowControlMode()
            part1->part3 : HAL_DMA_FillNodeXferEventMode()
            part1->part3 : HAL_DMA_FillNodeTrigger()
            part1->part3 : HAL_DMA_FillNodeDataHandling()
            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_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_SetConfigDirectXferFlowControlMode()
part1->part3 : HAL_DMA_SetConfigDirectXferTrigger()
part1->part3 : HAL_DMA_SetConfigDirectXferDataHandling()
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_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: