25.5.2.7 Addressing
Each block transfer needs to have both a source address and a destination address defined. The source address is set by writing the Transfer Source Address (SRCADDR) register, the destination address is set by writing the Transfer Destination Address (DSTADDR) register.
The addressing of this DMAC module can be static or incremental, for either source or destination of a block transfer, or both.
Incrementation for the source address of a
block transfer is enabled by writing the Source Address Incrementation Enable bit in the
Block Transfer Control register (BTCTRL.SRCINC=1
). The step
size of the incrementation is configurable and can be chosen by writing the Step Selection
bit in the Block Transfer Control register (BTCTRL.STEPSEL=1
) and
writing the desired step size in the Address Increment Step Size bit group in the Block
Transfer Control register (BTCTRL.STEPSIZE). If BTCTRL.STEPSEL=0
, the step
size for the source incrementation will be the size of one beat.
When source address incrementation is
configured (BTCTRL.SRCINC=1
), SRCADDR is calculated as follows:
If BTCTRL.STEPSEL=1
:
If BTCTRL.STEPSEL=0
:
- SRCADDRSTART is the source address of the first beat transfer in the block transfer
- BTCNT is the initial number of beats remaining in the block transfer
- BEATSIZE is the configured number of bytes in a beat
- STEPSIZE is the configured number of beats for each incrementation
The following figure shows an example where
DMA channel 0 is configured to increment the source address by one beat after each beat
transfer (BTCTRL.SRCINC=1
), and DMA
channel 1 is configured to increment the source address by two beats (BTCTRL.SRCINC=1
, BTCTRL.STEPSEL=1
, and BTCTRL.STEPSIZE=0x1
). As the
destination address for both channels are peripherals, destination incrementation is
disabled (BTCTRL.DSTINC=0
).
Incrementation for the destination address
of a block transfer is enabled by setting the Destination Address Incrementation Enable bit
in the Block Transfer Control register (BTCTRL.DSTINC=1
). The step
size of the incrementation is configurable by clearing BTCTRL.STEPSEL=0
and writing
BTCTRL.STEPSIZE to the desired step size. If BTCTRL.STEPSEL=1
, the step
size for the destination incrementation will be the size of one beat.
When the destination address incrementation
is configured (BTCTRL.DSTINC=1
), DSTADDR
must be set and calculated as follows:
- DSTADDRSTART is the destination address of the first beat transfer in the block transfer
- BTCNT is the initial number of beats remaining in the block transfer
- BEATSIZE is the configured number of bytes in a beat
- STEPSIZE is the configured number of beats for each incrementation
The following figure shows an example where
DMA channel 0 is configured to increment destination address by one beat (BTCTRL.DSTINC=1
) and DMA
channel 1 is configured to increment destination address by two beats (BTCTRL.DSTINC=1
, BTCTRL.STEPSEL=0
, and BTCTRL.STEPSIZE=0x1
). As the
source address for both channels are peripherals, source incrementation is disabled (BTCTRL.SRCINC=0
).