22.6.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 (SRCADDR) 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:
where BTCTRL.STEPSEL is zero | |
where BTCTRL.STEPSEL is one |
- 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
).