Direct Memory Access (DMA)
8 - 8 TMS320F2837xD Microcontroller Workshop - Direct Memory Access
Ping-Pong Buffer Example
ADCA Result Register
50 word
‘Ping’ buffer
50 word
‘Pong’ buffer
GS0 RAM
0x0B00
DMA
Interrupt
DMA
Interrupt
0xC140
Objective: Buffer ADC ch. 0 ping-pong style, 50 samples per buffer
ADCRESULT0
SOC0 configured to ADCINA0
with 1 conversion per trigger
DMA configured to re-init after transfer (CONTINUOUS = 1)
Ping-Pong Example Register Setup
SRC_BURST_STEP
SRC_TRANSFER_STEP
0x0000
DST_BURST_STEP
DST_TRANSFER_STEP
0x0001
SRC_ADDR_SHADOW
DST_ADDR_SHADOW
BURST_SIZE*
TRANSFER_SIZE*
0x0000
1 word/burst
0x0031
50 bursts/transfer
* Size registers are N-1
Objective: Buffer ADC ch. 0 ping-pong style, 50 samples per buffer
don’t care
since BURST_SIZE = 0
don’t care
since BURST_SIZE = 0
0x00000B00
starting address
0x0000C140
starting address**
Read/Write Data
Add Burst Step
to Address
Pointer
End Transfer
Add Transfer Step
to Address Pointer
Moved
“Burst Size”
Words?
Moved
“Transfer Size”
Bursts?
Y
Y
N
N
Wait for event to
start/continue transfer
Start Transfer
Convert ADCA Channel ADCINA0 – 1 conversion per trigger (i.e. ePWM2SOCA)
DMA Registers:
ADC Registers:
Other:
** DST_ADDR_SHADOW must be changed between ping and pong buffer address in
the DMA ISR. Typically use a relocatable symbol in your code, not a hard value.