1.2.5.3 DMA_ChannelTransfer Function
C
bool DMA_ChannelTransfer( DMA_CHANNEL channel, const void *srcAddr, const void *destAddr, size_t blockSize )
Summary
Schedules a DMA transfer on the specified DMA channel.
Description
This function schedules a DMA transfer on the specified DMA channel and starts the transfer when the configured trigger is received. The transfer is processed based on the channel configuration performed in the DMA manager. The channel parameter specifies the channel to be used for the transfer.
The srcAddr parameter specifies the source address from where data will be transferred.
The destAddr parameter specifies the address location where the data will be stored.
If the channel is configured for software trigger, calling the channel transfer function will set the source and destination address and will also start the transfer. If the channel was configured for a peripheral trigger, the channel transfer function will set the source and destination address and will transfer data when a trigger has occurred.
If the requesting client registered an event callback function before calling the channel transfer function, this function will be called when the transfer completes. The callback function will be called with a DMA_TRANSFER EVENT_BLOCK_TRANSFER_COMPLETE event if the transfer was processed successfully and a DMA_TRANSFER_EVENT_ERROR event if the transfer was not processed successfully.
When already a transfer is in progress, this API will return false indicating that transfer request is not accepted.
Precondition
DMA should have been initialized by calling the DMA_Initialize. The required channel transfer parameters such as beat size, source and destination address increment should have been configured in MHC.
Parameters
Param | Description |
---|---|
channel | The DMA channel that should be used for the transfer. |
srcAddr | Source address of the DMA transfer |
destAddr | Destination address of the DMA transfer |
blockSize | Size of the transfer block in bytes. |
Returns
True - If transfer request is accepted.
False - If previous transfer is in progress and the request is rejected.
Example
// Transfer 10 bytes of data to UART TX using DMA channel 1 MY_APP_OBJ myAppObj; uint8_t buf[10] = {0,1,2,3,4,5,6,7,8,9}; void *srcAddr = (uint8_t *) buf; void *destAddr = (uin8_t*) &SERCOM1_REGS->USART_INT.SERCOM_DATA; size_t size = 10; // User registers an event handler with PLIB. This is done once. DMA_ChannelCallbackRegister(DMA_CHANNEL_1, APP_DMATransferEventHandler, (uintptr_t)&myAppObj); if(DMA_ChannelTransfer(DMA_CHANNEL_1, srcAddr, destAddr, size) == true) { // do something else } else { // try again? }
Remarks
None.