Configure DMA

  1. 1.
    Create a DMA resource configuration structure, which can be filled out to adjust the configuration of a single DMA transfer.
    struct dma_resource_config config;
    
  2. 2.
    Initialize the DMA resource configuration struct with the module's default values.
    dma_get_config_defaults(&config);
    config.peripheral_trigger = M2M_DMAC_TRIGGER_ID;
    
    Note: This should always be performed before using the configuration struct to ensure that all values are initialized to known default settings.
  3. 3.
    Allocate a DMA resource with the configurations.
    dma_allocate(resource, &config);
    
  4. 4.
    Create a DMA transfer descriptor configuration structure, which can be filled out to adjust the configuration of a single DMA transfer.
    struct dma_descriptor_config descriptor_config;
    
  5. 5.
    Initialize the DMA transfer descriptor configuration struct with the module's default values.
    dma_descriptor_get_config_defaults(&descriptor_config);
    
    Note: This should always be performed before using the configuration struct to ensure that all values are initialized to known default settings.
  6. 6.
    Set the specific parameters for a DMA transfer with transfer size, source address, and destination address.
    descriptor_config.block_transfer_count = TRANSFER_SIZE;
    descriptor_config.source_address = (uint32_t)source_memory + TRANSFER_SIZE;
    descriptor_config.destination_address =
            (uint32_t)destination_memory + TRANSFER_SIZE;
    
  7. 7.
    Create the DMA transfer descriptor.
    dma_descriptor_create(descriptor, &descriptor_config);
    
  8. 8.
    Add the DMA transfer descriptor to the allocated DMA resource.
    dma_add_descriptor(&example_resource, &example_descriptor);
    
  9. 9.
    Register a callback to indicate transfer status.
    dma_register_callback(&example_resource, transfer_done,
            DMA_CALLBACK_TRANSFER_DONE);
    
  10. 10.
    The transfer done flag is set in the registered callback function.
    void transfer_done(struct dma_resource* const resource )
    {
        UNUSED(resource);
    
        transfer_is_done = true;
    }