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 uint8_t source_memory[DATA_LENGTH];
static uint8_t destination_memory[DATA_LENGTH];
static volatile bool transfer_is_done = false;
static
void transfer_done(struct
dma_resource* const resource )
{
transfer_is_done = true;
}
static void configure_dma_resource(
struct dma_resource *resource)
{
}
static void setup_transfer_descriptor(DmacDescriptor *descriptor )
{
descriptor_config.block_transfer_count = sizeof(source_memory);
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()
):
configure_dma_resource(&example_resource);
setup_transfer_descriptor(&example_descriptor);
for (uint32_t i = 0; i < DATA_LENGTH; i++) {
source_memory[i] = i;
}
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.block_transfer_count = sizeof(source_memory);
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.
static void transfer_done(
struct dma_resource*
const resource )
{
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) {
}