The supported board list:
- SAM D21 Xplained Pro
- SAM R21 Xplained Pro
- SAM D11 Xplained Pro
- SAM L21 Xplained Pro
- SAM L22 Xplained Pro
- SAM DA1 Xplained Pro
- SAM HA1G16A Xplained Pro
In this use case, the DMAC is configured for:
- Moving data from memory to memory
- Using software trigger
- Using DMA priority level 0
- Transaction as DMA trigger action
- No action on input events
- Output event not enabled
Setup
Prerequisites
There are no special setup requirements for this use-case.
Code
Copy-paste the following setup code to your user application:
#define DATA_LENGTH (512)
static volatile bool transfer_is_done = false;
DmacDescriptor example_descriptor SECTION_DMAC_DESCRIPTOR;
{
transfer_is_done = true;
}
{
}
{
descriptor_config.source_address = (uint32_t)source_memory +
sizeof(source_memory);
descriptor_config.destination_address = (uint32_t)destination_memory +
sizeof(source_memory);
}
Add the below section to user application initialization (typically the start of main()
):
Workflow
- Create a DMA resource configuration structure, which can be filled out to adjust the configuration of a single DMA transfer.
- Initialize the DMA resource configuration struct with the module's default values.
- Note
- This should always be performed before using the configuration struct to ensure that all values are initialized to known default settings.
- Allocate a DMA resource with the configurations.
- Declare a DMA transfer descriptor configuration structure, which can be filled out to adjust the configuration of a single DMA transfer.
- Initialize the DMA transfer descriptor configuration struct with the module's default values.
- Note
- This should always be performed before using the configuration struct to ensure that all values are initialized to known default settings.
Set the specific parameters for a DMA transfer with transfer size, source address, and destination address. In this example, we have enabled the source and destination address increment. The source and destination addresses to be stored into descriptor_config must correspond to the end of the transfer.
descriptor_config.source_address = (uint32_t)source_memory +
sizeof(source_memory);
descriptor_config.destination_address = (uint32_t)destination_memory +
sizeof(source_memory);
- Create the DMA transfer descriptor.
- Add the DMA transfer descriptor to the allocated DMA resource.
- Register a callback to indicate transfer status.
- Set the transfer done flag in the registered callback function.
{
transfer_is_done = true;
}
- Enable the registered callbacks.
Use Case
Code
Add the following code at the start of main()
:
Copy the following code to your user application:
while (!transfer_is_done) {
}
while (true) {
}
Workflow
- Start the DMA transfer job with the allocated DMA resource and transfer descriptor.
- Set the software trigger for the DMA channel. This can be done before or after the DMA job is started. Note that all transfers needs a trigger to start.
- Waiting for the setting of the transfer done flag.
while (!transfer_is_done) {
}