17. General purpose direct memory access controller (GPDMA)
17.1 GPDMA introduction
The general purpose direct memory access (GPDMA) controller is a bus master and system peripheral.
The GPDMA is used to perform programmable data transfers between memory-mapped peripherals and/or memories via linked-lists, upon the control of an off-loaded CPU.
17.2 GPDMA main features
- • Dual bidirectional AHB master
- • Memory-mapped data transfers from a source to a destination:
- – Peripheral-to-memory
- – Memory-to-peripheral
- – Memory-to-memory
- – Peripheral-to-peripheral
- • Autonomous data transfers during Stop mode (see
Section 17.3.2
)
Transfer arbitration based on a 4-grade programmed priority at channel level:- – One high-priority traffic class, for time-sensitive channels (queue 3)
- – Three low-priority traffic classes, with a weighted round-robin allocation for non time-sensitive channels (queues 0, 1, 2)
- • Per channel event generation, on any of the following events: transfer complete, half transfer complete, data transfer error, user setting error, link transfer error, completed suspension, and trigger overrun
- • Per channel interrupt generation, with separately programmed interrupt enable per event
- • 8 concurrent GPDMA channels:
- – Per channel FIFO for queuing source and destination transfers (see Section 17.3.1 )
- – Intra-channel GPDMA transfers chaining via programmable linked-list into memory, supporting two execution modes: run-to-completion and link step mode
- – Intra-channel and inter-channel GPDMA transfers chaining via programmable GPDMA input triggers connection to GPDMA task completion events
- • Per linked-list item within a channel:
- – Separately programmed source and destination transfers
- – Programmable data handling between source and destination: byte-based reordering, packing or unpacking, padding or truncation, sign extension and left/right realignment
- – Programmable number of data bytes to be transferred from the source, defining the block level
- – Linear source and destination addressing: either fixed or contiguously incremented addressing, programmed at a block level, between successive burst transfers
- – Programmable GPDMA request and trigger selection
- – Programmable GPDMA half transfer and transfer complete events generation
- – Pointer to the next linked-list item and its data structure in memory, with automatic update of the GPDMA linked-list control registers
- – Channel abort and restart
- • Debug:
- – Channel suspend and resume support
- – Channel status reporting, including FIFO level, and event flags
- • TrustZone support:
- – Support for secure and nonsecure GPDMA transfers, independently at a first channel level, and independently at a source/destination and link sublevels
- – Secure and nonsecure interrupts reporting, resulting from any of the respectively secure and nonsecure channels
- – TrustZone-aware AHB slave port, protecting any GPDMA secure resource (register, register field) from a nonsecure access
- • Privileged/unprivileged support:
- – Support for privileged and unprivileged GPDMA transfers, independently at a channel level
- – Privileged-aware AHB slave port
17.3 GPDMA implementation
Table 124. GPDMA1 implementation
| Feature | GPDMA1 |
|---|---|
| Number of channels | 8 |
| Number of requests | 52 |
| Number of triggers | 30 |
| Block request | X |
| TrustZone security | X |
17.3.1 GPDMA channels
A given GPDMA channel x is implemented with the following features and intended usage. To make the best use of the GPDMA performances, the table below lists some general recommendations, allowing the user to select and allocate a channel, given its implemented FIFO size and the requested GPDMA transfer.
Table 125. GPDMA1 channel implementation
| Channel x | Hardware parameters | Features | |
|---|---|---|---|
| dma_fifo_size[x] | dma_addressing[x] | ||
| x = 0 to 5 | 2 | 0 | Channel x (x = 0 to 3) is implemented with: – a FIFO of 8 bytes, 2 words – fixed/contiguously incremented addressing These channels must be typically allocated for GPDMA transfers between an APB or AHB peripheral and SRAM. |
| x = 6 to 7 | 4 | 0 | Channel x (x = 4 to 7) is implemented with: – a FIFO of 32 bytes, 8 words – fixed/contiguously incremented addressing These channels may be used for GPDMA transfers between a demanding AHB peripheral and SRAM, or for transfers from/to external memories. |
17.3.2 GPDMA autonomous mode in low-power modes
The GPDMA autonomous mode and wake-up features are implemented in the device low-power modes as per the table below.
Table 126. GPDMA1 autonomous mode and wake-up in low-power modes
| Feature | Low-power modes |
|---|---|
| Autonomous mode and wake-up | GPDMA1 in Sleep, Stop 0, and Stop 1 modes |
17.3.3 GPDMA requests
A GPDMA request from a peripheral can be assigned to a GPDMA channel x, via REQSEL[5:0] in GPDMA_CxTR2, provided that SWREQ = 0.
The GPDMA requests mapping is specified in the table below.
Table 127. Programmed GPDMA1 request
| GPDMA_CxTR2.REQSEL[5:0] | Selected GPDMA request |
|---|---|
| 0 | adc4_dma |
| 1 | spi1_rx_dma (1) |
| 2 | spi1_tx_dma (1) |
| 3 | spi3_rx_dma |
| 4 | spi3_tx_dma |
| 5 | i2c1_rx_dma (1) |
| 6 | i2c1_tx_dma (1) |
| 7 | i2c1_evc_dma (1) |
| 8 | i2c3_rx_dma |
Table 127. Programmed GPDMA1 request (continued)
| GPDMA_CxTR2.REQSEL[5:0] | Selected GPDMA request |
|---|---|
| 9 | i2c3_tx_dma |
| 10 | i2c3_evc_dma |
| 11 | usart1_rx_dma |
| 12 | usart1_tx_dma |
| 13 | usart2_rx_dma (1) |
| 14 | usart2_tx_dma (1) |
| 15 | lpuart1_rx_dma |
| 16 | lpuart1_tx_dma |
| 17 | sai_a_dma (2) |
| 18 | sai_b_dma (2) |
| 19 | tim1_cc1_dma |
| 20 | tim1_cc2_dma |
| 21 | tim1_cc3_dma |
| 22 | tim1_cc4_dma |
| 23 | tim1_upd_dma |
| 24 | tim1_trg_dma |
| 25 | tim1_com_dma |
| 26 | tim2_cc1_dma |
| 27 | tim2_cc2_dma |
| 28 | tim2_cc3_dma |
| 29 | tim2_cc4_dma |
| 30 | tim2_upd_dma |
| 31 | tim3_cc1_dma (1) |
| 32 | tim3_cc2_dma (1) |
| 33 | tim3_cc3_dma (1) |
| 34 | tim3_cc4_dma (1) |
| 35 | tim3_upd_dma (1) |
| 36 | tim3_trg_dma (1) |
| 37 | tim16_cc1_dma |
| 38 | tim16_upd_dma |
| 39 | tim17_cc1_dma (1) |
| 40 | tim17_upd_dma (1) |
| 41 | aes_in_dma |
| 42 | aes_out_dma |
| 43 | hash_in_dma |
Table 127. Programmed GPDMA1 request (continued)
| GPDMA_CxTR2.REQSEL[5:0] | Selected GPDMA request |
|---|---|
| 44 | saes_in_dma (1) |
| 45 | saes_out_dma (1) |
| 46 | lptim1_ic1_dma |
| 47 | lptim1_ic2_dma |
| 48 | lptim1_ue_dma |
| 49 | lptim2_ic1_dma (1) |
| 50 | lptim2_ic2_dma (1) |
| 51 | lptim2_ue_dma (1) |
1. Only available on STM32WBA52/54/55xx devices.
2. Only available on STM32WBA54/55xx devices.
17.3.4 GPDMA block requests
Some GPDMA requests must be programmed as a block request, and not as a burst request. Then BREQ in GPDMA_CxTR2 must be set for a correct GPDMA execution of the requested peripheral transfer at the hardware level.
Table 128. Programmed GPDMA1 request as a block request
| GPDMA block requests |
|---|
| lptim1_ue_dma |
| lptim2_ue_dma (1) |
1. Only available on STM32WBA52/54/55xx devices.
17.3.5 GPDMA triggers
A GPDMA trigger can be assigned to a GPDMA channel x, via TRIGSEL[4:0] in GPDMA_CxTR2, provided that TRIGPOL[1:0] defines a rising or a falling edge of the selected trigger (TRIGPOL[1:0] = 01 or TRIGPOL[1:0] = 10).
Table 129. Programmed GPDMA1 trigger
| GPDMA_CxTR2.TRIGSEL[4:0] | Selected GPDMA trigger |
|---|---|
| 0 | exti0 |
| 1 | exti1 |
| 2 | exti2 |
| 3 | exti3 |
| 4 | exti4 |
| 5 | exti5 |
| 6 | exti6 |
Table 129. Programmed GPDMA1 trigger (continued)
| GPDMA_CxTR2.TRIGSEL[4:0] | Selected GPDMA trigger |
|---|---|
| 7 | exti7 |
| 8 | tamp_trg1 |
| 9 | tamp_trg2 |
| 10 | tamp_trg3 |
| 11 | lptim1_ch1 |
| 12 | lptim1_ch2 |
| 13 | lptim2_ch1 (1) |
| 14 | lptim2_ch2 (1) |
| 15 | comp1_out (2) |
| 16 | comp2_out (2) |
| 17 | rtc_alra_trg |
| 18 | rtc_alrb_trg |
| 19 | rtc_wut_trg |
| 20 | gpdma1_ch0_tc |
| 21 | gpdma1_ch1_tc |
| 22 | gpdma1_ch2_tc |
| 23 | gpdma1_ch3_tc |
| 24 | gpdma1_ch4_tc |
| 25 | gpdma1_ch5_tc |
| 26 | gpdma1_ch6_tc |
| 27 | gpdma1_ch7_tc |
| 28 | tim2_trgo |
| 29 | adc4_awd1 |
1. Only available on STM32WBA52/54/55xx devices.
2. Only available on STM32WBA54xx and STM32WBA55xx devices.
17.4 GPDMA functional description
17.4.1 GPDMA block diagram
Figure 49. GPDMA block diagram

The diagram illustrates the internal architecture of the GPDMA controller. On the left, external inputs include DMA requests, DMA triggers, DMA clock, and a stop DMA channel in debug mode. The central GPDMA block contains several functional units: Channel datapath and transfer input control (with multiple channels, 0 to x (1) ), Arbitration, Transfer output control (Data transfer generation and Link transfer generation), AHB master port 0 interface, AHB master port 1 interface, DMA channel registers (0 to x (1) ), DMA global registers, AHB slave interface, Interrupt generation, Events generation, Channel state management, Security and privilege management, and Clock management. On the right, the controller interfaces with two 32-bit AHB buses and produces several outputs: DMA channel interrupt, DMA channel transfer complete (gpdma_chx_tc), DMA channel state (vs privilege and security), DMA illegal event (vs security), and DMA clock request. At the bottom, a 32-bit AHB bus interface is shown. A note indicates that the number of channels (x) refers to the device implementation table.
(1) Refer to the device implementation table for the number of channels.
MSv63644V2
17.4.2 GPDMA channel state and direct programming without any linked-list
After a GPDMA reset, a GPDMA channel x is in idle state. When the software writes 1 in GPDMA_CxCR.EN, the channel takes into account the value of the different channel configuration registers (GPDMA_CxXXX), switches to the active/non-idle state and starts to execute the corresponding requested data transfers.
After enabling/starting a GPDMA channel transfer by writing 1 in GPDMA_CxCR.EN, a GPDMA channel interrupt on a complete transfer notifies the software that the GPDMA channel is back in idle state (EN is then deasserted by hardware) and that the channel is ready to be reconfigured then enabled again.
Figure 50 illustrates this GPDMA direct programming without any linked-list (GPDMA_CxLLR = 0).
Figure 50. GPDMA channel direct programming without linked-list (GPDMA_CxLLR = 0)

graph TD; subgraph Idle [Channel state = Idle]; Init[Initialize DMA channel
(keeping DMA_CxLLR[31:0] = 0)]; Reconf[Reconfigure DMA channel
(keeping DMA_CxLLR[31:0] = 0)]; Enable[Enable DMA channel]; Init --> Enable; Reconf --> Enable; end; Enable --> Active; subgraph Active [Channel state = Active]; Valid{Valid user setting?}; Valid -- N --> Usef[Setting USEF = 1
Disabling DMA channel]; Valid -- Y --> Transfer[Executing the data transfer
from the register file]; Transfer --> NoError{No transfer error?}; NoError -- N --> Dtef[Setting DTEF = 1
Disabling DMA channel]; NoError -- Y --> Tcf[Setting TCF = 1
Disabling DMA channel]; Usef --> End; Dtef --> End; Tcf --> End; end; End;
MSv62626V1
17.4.3 GPDMA channel suspend and resume
The software can suspend on its own a channel still active, with the following sequence:
- 1. The software writes 1 into the GPDMA_CxCR.SUSP bit.
- 2. The software polls the suspended flag GPDMA_CxSR.SUSPF until SUSPF = 1, or waits for an interrupt previously enabled by writing 1 to GPDMA_CxCR.SUSPIE. Wait for the channel to be effectively in suspended state means wait for the completion of any ongoing GPDMA transfer over its master ports. Then the software can observe, in a steady state, any read register or register field that is hardware modifiable.
Note: An ongoing GPDMA transfer can be a data transfer (a source/destination burst transfer) or a link transfer for the internal update of the linked-list register file from the next linked-list item.
- 3. The software safely resumes the suspended channel by writing 0 to GPDMA_CxCR.SUSP.
Figure 51. GPDMA channel suspend and resume sequence

graph TD; A[Channel state = Active] --> B[Suspend the DMA channel<br/>(write 1 to CxCR.SUSP)]; A --> C[Receiving suspended interrupt]; B --> D{SUSPF=1?}; C --> D; D -- N --> B; D -- Y --> E[Channel state = Suspended and Idle]; E --> F[Resume the DMA channel<br/>(write 0 to CxCR.SUSP)]; F --> G[Channel state = Active];MSv62627V1
Note: A suspend and resume sequence does not impact the GPDMA_CxCR.EN bit. Suspending a channel (transfer) does not suspend a started trigger detection.
17.4.4 GPDMA channel abort and restart
Alternatively, like for aborting a continuous GPDMA transfer with a circular buffering or a double buffering, the software can abort, on its own, a still active channel with the following sequence:
- 1. The software writes 1 into the GPDMA_CxCR.SUSP bit.
- 2. The software polls suspended flag GPDMA_CxSR.SUSPF until SUSPF = 1, or waits for an interrupt previously enabled by writing 1 to GPDMA_CxCR.SUSPIE. Wait for the channel to be effectively in suspended state means wait for the completion of any ongoing GPDMA transfer over its master port.
- 3. The software resets the channel by writing 1 to GPDMA_CxCR.RESET. This causes the reset of the FIFO, the reset of the channel internal state, the reset of the GPDMA_CxCR.EN bit, and the reset of the GPDMA_CxCR.SUSP bit.
- 4. The software safely reconfigures the channel. The software must reprogram the hardware-modified GPDMA_CxBR1, GPDMA_CxSAR, and GPDMA_CxDAR registers.
- 5. In order to restart the aborted then reprogrammed channel, the software enables it again by writing 1 to the GPDMA_CxCR.EN bit.
Figure 52. GPDMA channel abort and restart sequence

graph TD
Start(( )) --> Active1
subgraph Active1 [Channel state = Active]
Suspend[Suspend the DMA channel
(write 1 to CxCR.SUSP)]
or[or]
SUSPF{SUSPF=1?}
Suspend --> or
or --> SUSPF
SUSPF -- N --> SUSPF
end
SUSPF -- Y --> Suspended
subgraph Suspended [Channel state = Suspended
(and Idle)]
Interrupt[Receiving suspended interrupt]
Reset[Reset the DMA channel
(write 1 to CxCR.RESET)]
Interrupt --> Reset
end
Reset --> Idle
subgraph Idle [Channel state = Idle]
Reconfigure[Reconfigure the DMA channel]
Enable[Enable the DMA channel]
Reconfigure --> Enable
end
Enable --> Active2
subgraph Active2 [Channel state = Active]
End(( ))
end
The flowchart illustrates the sequence for aborting and restarting a GPDMA channel. It begins with the channel in an 'Active' state. The first step is to suspend the DMA channel by writing 1 to the CxCR.SUSP register. A loop exists to wait for the SUSPF flag to be set (SUSPF=1). Once suspended, the channel enters a 'Suspended (and Idle)' state where a suspended interrupt is received. The next step is to reset the DMA channel by writing 1 to the CxCR.RESET register. This leads to an 'Idle' state where the DMA channel is reconfigured and then enabled. Finally, the channel returns to an 'Active' state.
MSV62628V1
17.4.5 GPDMA linked-list data structure
Alternatively to the direct programming mode, a channel can be programmed by a list of transfers, known as a list of linked-list items (LLI). Each LLI is defined by its data structure.
The base address in memory of the data structure of a next \( LLI_{n+1} \) of a channel x is the sum of the following:
- • the link base address of the channel x (in GPDMA_CxLBAR)
- • the link address offset (LA[15:2] field in GPDMA_CxLLR). The linked-list register GPDMA_CxLLR is the updated result from the data structure of the previous \( LLI_n \) of the channel x.
The data structure for each LLI may be specific.
A linked-list data structure is addressed following the value of the UT1, UT2, UB1, USA, UDA and ULL bits in GPDMA_CxLLR.
In linked-list mode, each GPDMA linked-list register (GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR or GPDMA_CxLLR) is conditionally and automatically updated from the next linked-list data structure in the memory, following
the current value of the GPDMA_CxLLR register that was conditionally updated from the linked-list data structure of the previous LLI.
Static linked-list data structure
For example, when the update bits (UT1, UT2, UB1, USA, UDA and ULL) in GPDMA_CxLLR are all asserted, the linked-list data structure in the memory is maximal with:
- channel x (x = 0 to 7) contiguous 32-bit locations, including GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR and GPDMA_CxLLR (see Figure 53) and including the first linked-list register file (LLI 0 ) and the next LLIs (such as LLI 1 , LLI 2 ) in the memory
Figure 53. Static linked-list data structure (all Uxx = 1) of a linear addressing channel x

The diagram illustrates the static linked-list data structure for a linear addressing channel x. On the left, the DMA register file is shown, containing the Channel x linked-list register file (LLI 0 ) with registers DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. Below this are Channel x other registers, Other channels registers, and Global registers. On the right, the memory from link base address DMA_CxLBAR is shown, containing the first LLI (LLI 1 ) and the next LLI (LLI 2 ). Each LLI contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR register in LLI 0 points to LLI 1 , and the DMA_CxLLR register in LLI 1 points to LLI 2 . The condition 'All Uxx=1' is indicated for the DMA_CxLLR registers in LLI 1 and LLI 2 . The diagram is labeled MSv62629V1.
Dynamic linked-list data structure
Alternatively, the memory organization for the full list of LLIs can be compacted with specific data structure for each LLI.
If UT1 = 0 and UT2 = 1, the link address offset of the register GPDMA_CxLLR is pointing to the updated value of the GPDMA_CxTR2 instead of the GPDMA_CxTR1 which is not to be modified (see Figure 54).
Figure 54. GPDMA dynamic linked-list data structure of a linear addressing channel x

The user must program GPDMA_CxLLR for each LLI n to be 32-bit aligned and not to exceed the 64-Kbyte addressable space pointed by GPDMA_CxLBAR.
17.4.6 Linked-list item transfer execution
A LLI n transfer is the sequence of:
- 1. a data transfer: GPDMA executes the data transfer as described by the GPDMA internal register file (this data transfer can be void/null for LLI 0 )
- 2. a conditional link transfer: GPDMA automatically and conditionally updates its internal register file by the data structure of the next LLI n+1 , as defined by the GPDMA_CxLLR value of the LLI n .
Note: The initial data transfer as defined by the internal register file (LLI 0 ) can be null (GPDMA_CxBR1.BNDT[15:0] = 0) provided that the conditional update bit UB1 in GPDMA_CxLLR is set (meaning there is a non-null data transfer described by the next LLI 1 in the memory to be executed).
Depending on the intended GPDMA usage, a GPDMA channel x can be executed as described by the full linked-list (run-to-completion mode, GPDMA_CxCR.LSM = 0) or a GPDMA channel x can be programmed for a single execution of a LLI (link step mode, GPDMA_CxCR.LSM = 1), as described in the next sections.
17.4.7 GPDMA channel state and linked-list programming in run-to-completion mode
When GPDMA_CxCR.LSM = 0 (in full list execution mode, execution of the full sequence of LLIs, named run-to-completion mode), a GPDMA channel x is initially programmed, started by writing 1 to GPDMA_CxCR.EN, and after completed at channel level. The channel transfer is:
- • configured with at least the following:
- – the first LLI 0 , internal linked-list register file: GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR, and GPDMA_CxLLR
- – the last LLI N , described by the linked-list data structure in memory, as defined by the GPDMA_CxLLR reflecting the before last LLI N-1
- • completed when GPDMA_CxLLR[31:0] = 0 and GPDMA_CxBR1.BNDT[15:0] = 0, at the end of the last LLI N-1 transfer
GPDMA_CxLLR[31:0] = 0 is the condition of a linked-list based channel completion and means the following:
- • The 16 low significant bits GPDMA_CxLLR.LA[15:0] of the next link address are null.
- • All the update bits GPDMA_CxLLR.Uxx are null (UT1, UT2, UB1, USA, UDA and ULL).
The channel may never be completed when GPDMA_CxLLR.LSM = 0:
- • If the last LLI
N
is recursive, pointing to itself as a next LLI:
- – either GPDMA_CxLLR.ULL = 1 and GPDMA_CxLLR.LA[15:2] is updated by the same value
- – or GPDMA_CxLLR.ULL = 0
- • If LLI N is pointing to a previous LLI
In the typical run-to-completion mode, the allocation of a GPDMA channel, including its fine programming, is done once during the GPDMA initialization. In order to have a reserved data communication link and GPDMA service during run-time, for continuously repeated transfers (from/to a peripheral respectively to/from memory or for memory-to-memory transfers). This reserved data communication link can consist of a channel, or the channel can be shared and a repeated transfer consists of a sequence of LLIs.
Figure 55 depicts the GPDMA channel execution and its registers programming in run-to-completion mode.
Note:
Figure 55 is not intended to illustrate how often a TCEF can be raised, depending on the programmed value of TCEM[1:0] in GPDMA_CxTR2. It can be raised at (each) block completion, at (each) 2D block completion, at (each) LLI completion, or only at channel completion. In run-to-completion mode, whatever is the value of TCEM[1:0], at the channel completion, the hardware always set TCEF = 1 and disables the channel.
Figure 55. GPDMA channel execution and linked-list programming in run-to-completion mode (GPDMA_CxCR.LSM = 0)

graph TD
subgraph Idle
Start([Channel state = Idle]) --> Init[Initialize DMA channel]
Init --> Enable[Enable DMA channel]
end
Enable --> Active
subgraph Active
ActiveState([Channel state = Active]) --> V1{Valid user setting?}
V1 -- N --> USEF1[Setting USEF = 1
Disabling DMA channel]
V1 -- Y --> BNDT{BNDT ≠ 0?}
BNDT -- N --> USEF2[Setting USEF = 1
Disabling DMA channel]
BNDT -- Y --> Exec[Executing once the data transfer from the register file]
Exec --> NoErr1{No transfer error?}
NoErr1 -- N --> DTEF[Setting DTEF = 1
Disabling DMA channel]
NoErr1 -- Y --> LLR{LLR ≠ 0?}
LLR -- N --> TCF[Setting TCF = 1
Disabling DMA channel]
LLR -- Y --> LoadLLI[Loading next LLI into the register file]
LoadLLI --> NoErr2{No transfer error?}
NoErr2 -- N --> ULEF[Setting ULEF = 1
Disabling DMA channel]
NoErr2 -- Y --> V2{Valid user setting?}
V2 -- N --> USEF3[Setting USEF = 1
Disabling DMA channel]
V2 -- Y --> TCF
end
USEF1 --> End([End])
USEF2 --> End
DTEF --> End
ULEF --> End
TCF --> End
End --> Reconfig[Reconfigure DMA channel]
Reconfig --> Init
MSv62631V1
Run-time inserting a \( LLI_n \) via an auxiliary channel, in run-to-completion mode
The start of the link transfer of the \( LLI_{n-1} \) (start of the \( LLI_n \) loading) can be conditioned by the occurrence of a trigger, when programming the following fields of the GPDMA_CxTR2 in the data structure of the \( LLI_{n-1} \) :
- • TRIGM[1:0] = 10 (link transfer triggering mode)
- • TRIGPOL[1:0] = 01 or 10 (rising or falling edge)
- • TRIGSEL[4:0] (see Section 17.3.5 for the trigger selection details)
Another auxiliary channel y can be used to store the channel x \( LLI_n \) in the memory and to generate a transfer complete event gpdma_chy_tc. By selecting this event as the input trigger of the link transfer of the \( LLI_{n-1} \) of the channel x, the software can pause the primary channel x after its \( LLI_{n-1} \) data transfer, until it is indeed written the \( LLI_n \) .
Figure 56 depicts such a dynamic elaboration of a linked-list of a primary channel x, via another auxiliary channel y.
Caution: This use case is restricted to an application with a \( LLI_{n-1} \) data transfer that does not need a trigger. The triggering mode of this \( LLI_{n-1} \) is used to load the next \( LLI_n \) .
Figure 56. Inserting a LLI n with an auxiliary GPDMA channel y
sequenceDiagram
participant DMA as DMA primary channel x
participant CPU as CPU
participant Aux as DMA auxiliary channel y
Note left of DMA: LLI_{n-2} transfer
DMA->>DMA: Executing LLI_{n-2} data transfer
Note left of DMA: LLI_{n-1} transfer
DMA->>DMA: Loading LLI_{n-1} (with DMA_CxTR2: TRIGM[1:0] = 10, TRIGPOL[1:0] = 01, TRIGSEL = dma_chy_tc and TCEM[1:0] = 01)
Note left of DMA: LLI_n transfer
DMA->>DMA: Executing LLI_{n-1} data transfer
DMA->>CPU: Transfer complete interrupt
Note right of CPU: Build new LLI_n, Configure channel Y
Note left of Aux: Executing data transfer (Memcopy of new LLI_n)
Aux->>DMA: dma_chy_tc
Note left of DMA: LLI_{n+1} transfer
DMA->>DMA: Loading new LLI_n
DMA->>DMA: Executing LLI_n data transfer
DMA->>DMA: Loading LLI_{n+1}
MSv62632V2
17.4.8 GPDMA channel state and linked-list programming in link step mode
When GPDMA_CxCR.LSM = 1 (in link step execution mode, single execution of one LLI), a channel transfer is executed and completed after each single execution of a LLI, including its (conditional) data transfer and its (conditional) link transfer.
A GPDMA channel transfer can be programmed at LLI level, started by writing 1 into GPDMA_CxCR.EN, and after completed at LLI level:
- • The current LLI
n
transfer is described with:
- – GPDMA_CxTR1 defines the source/destination elementary single/burst transfers.
- – GPDMA_CxBR1 defines the number of bytes at a block level (BNDT[15:0]).
- – GPDMA_CxTR2 defines the input control (request, trigger) and the output control (transfer complete event) of the transfer.
- – GPDMA_CxSAR/GPDMA_CxDAR define the source/destination transfer start address.
- – GPDMA_CxLLR defines the data structure and the address offset of the next \( LLI_{n+1} \) in the memory.
- • The current
\(
LLI_n
\)
transfer is completed after the single execution of the current
\(
LLI_n
\)
:
- – after the (conditional) data transfer completion (when \( GPDMA\_CxBR1.BNDT[15:0] = 0 \) )
- – after the (conditional) update of the GPDMA link register file from the data structure of the next \( LLI_{n+1} \) in memory
Note: If a LLI is recursive (pointing to itself as a next LLI, either \( GPDMA\_CxLLR.ULL = 1 \) and \( GPDMA\_CxLLR.LA[15:2] \) is updated by the same value, or \( GPDMA\_CxLLR.ULL = 0 \) ), a channel in link step mode is completed after each repeated single execution of this LLI.
The link step mode can be used to elaborate dynamically LLIs in memory during run-time. The software can be facilitated by using a static data structure for any \( LLI_n \) (all update bits of \( GPDMA\_CxLLR \) have a static value, \( LLI_n.LLR.LA = LLI_{n-1}.LLR.LA + \text{constant} \) ).
Figure 57 depicts the GPDMA channel execution mode, and its programming in link step mode.
Note: Figure 57 is not intended to illustrate how often a TCEF can be raised, depending on the programmed value of \( TCEM[1:0] \) in \( GPDMA\_CxTR2 \) . It can be raised at (each) block completion, at (each) 2D block completion, at (each) LLI completion, or only at the last LLI data transfer completion. In link step mode, the channel is disabled after each single execution of a LLI, and depending on the value of \( TCEM[1:0] \) a TCEF is raised or not.
Figure 57. GPDMA channel execution and linked-list programming in link step mode (GPDMA_CxCR.LSM = 1)

graph TD; subgraph Idle; A[Initialize DMA channel] --> B[Enable DMA channel]; end; B --> subgraph Active; C{Valid user setting?}; B --> C; C -- N --> D[Setting USEF = 1
Disabling DMA channel]; C -- Y --> E{BNDT ≠ 0?}; E -- N --> F[Executing once the data transfer from the register file]; E -- Y --> F; F --> G{No transfer error?}; G -- N --> H[Setting DTEF = 1
Disabling DMA channel]; G -- Y --> I{LLR ≠ 0?}; I -- N --> J[Setting TCF = 1
Disabling DMA channel]; I -- Y --> K[Loading next LLI into the register file]; K --> L{No transfer error?}; L -- N --> M[Setting ULEF = 1
Disabling DMA channel]; L -- Y --> N1{Valid user setting?}; N1 -- N --> O[Setting USEF = 1
Disabling DMA channel]; N1 -- Y --> J; J --> P[End]; H --> P; M --> P; O --> P; P --> subgraph Idle; Q[Reconfigure DMA channel]; end;MSv62633V1
Run-time adding a \( LLI_{n+1} \) in link step mode
During run-time, the software can defer the elaboration of the \( LLI_{n+1} \) (and next LLIs), until/after GPDMA executed the transfer from the \( LLI_{n-1} \) and loaded the \( LLI_n \) from the memory, as shown in Figure 58.
Figure 58. Building \( LLI_{n+1} \) : GPDMA dynamic linked-lists in link step mode

LSM = 1 with 2-stage linked-list programming:
DMA executes
\(
LLI_{n-1}
\)
and loads
\(
LLI_n
\)
while CPU builds
\(
LLI_{n+1}
\)
sequenceDiagram
participant DMA Channel
participant CPU
Note right of DMA Channel: LSM = 1 with 2-stage linked-list programming:
DMA executes LLI_{n-1} and loads LLI_n while CPU builds LLI_{n+1}
DMA Channel->>DMA Channel: LLI_{n-2} transfer
DMA Channel->>CPU: Transfer complete interrupt
CPU->>DMA Channel: Enable DMA channel
DMA Channel->>DMA Channel: LLI_{n-1} transfer (Executing LLI_{n-1} data transfer, Loading LLI_n)
DMA Channel->>CPU: Transfer complete interrupt
CPU->>CPU: Build and store LLI_{n+1}
CPU->>DMA Channel: Enable DMA channel
DMA Channel->>DMA Channel: LLI_n transferMSv62634V1
Run-time replacing a \( LLI_n \) with a new \( LLI_{n'} \) in link step mode (in linked-list register file)
In this link step mode, during run-time, the software can build and insert a new \( LLI_{n'} \) , after GPDMA executed the transfer from the \( LLI_{n-1} \) and loaded a formerly elaborated \( LLI_n \) from the memory by overwriting directly the linked-list register file with the new \( LLI_{n'} \) , as shown in Figure 59.
Figure 59. Replace with a new LLI n' in register file in link step mode
LSM = 1 with 1-stage linked-list programming:
Overwriting the (pre)loaded LLI
n
linked-list register file with a new LLI
n'
directly in linked-list register file.
DMA executes LLI
n-1
and load LLI
n
, then CPU builds and overwrites LLI
n'
sequenceDiagram
participant DMA as DMA channel
participant CPU as CPU
Note over DMA: LLIn-1 transfer
rect rgb(255, 255, 255)
DMA->>DMA: Executing LLIn-1 data transfer
DMA->>DMA: Loading LLIn
end
DMA->>CPU: Transfer complete interrupt
CPU->>CPU: Build LLIn' and overwrite
linked-list register file
CPU->>CPU: Enable DMA channel
Note over DMA: LLIn' transfer
rect rgb(255, 255, 255)
DMA->>DMA: Executing LLIn' data transfer
DMA->>DMA: Loading LLIn+1'
end
DMA->>CPU: Transfer complete interrupt
CPU->>CPU: Build LLIn+1'' and overwrite
linked-list register file
CPU->>CPU: Enable DMA channel
Note over DMA: LLIn+1'' transfer
rect rgb(255, 255, 255)
DMA->>DMA: LLIn+1'' transfer
end
DMA->>CPU: Transfer complete interrupt
MSV62635V1
Run-time replacing a LLI n with a new LLI n' in link step mode (in the memory)
The software can build and insert a new LLI n' and LLI n+1' in the memory, after GPDMA executed the transfer from the LLI n-1 and loaded a formerly elaborated LLI n from the memory, by overwriting partly the linked-list register file (GPDMA_CxBR1.BNDT[15:0] to be null and GPDMA_CxLLR to point to new LLI n' ) as shown in Figure 60.
Figure 60. Replace with a new \( LLI_{n'} \) and \( LLI_{n+1'} \) in memory in link step mode (option 1)

LSM = 1 with 1-stage linked-list programming:
Overwriting the (pre)loaded
\(
LLI_n
\)
linked-list register file with a new
\(
LLI_{n'}
\)
and
\(
LLI_{n+1'}
\)
in memory and overwrite partly linked-list register file
(DMA_CxBR1.BNDT = 0 and DMA_CxLLR to point to new
\(
LLI_{n'}
\)
)
DMA executes
\(
LLI_{n-1}
\)
and load
\(
LLI_n
\)
then CPU builds (
\(
LLI_{n'}
\)
and
\(
LLI_{n+1'}
\)
) and overwrite (BR1 and LLR)
sequenceDiagram
participant DMA Channel
participant CPU
Note over DMA Channel, CPU: LSM = 1 with 1-stage linked-list programming
rect rgb(240, 240, 240)
Note left of DMA Channel: LLI_{n-1} transfer
DMA Channel->>DMA Channel: Executing LLI_{n-1} data transfer
DMA Channel->>DMA Channel: Loading LLI_n
end
DMA Channel->>CPU: Transfer complete interrupt
Note right of CPU: Build LLI_{n'} and LLI_{n+1'} in memory
Note right of CPU: Write DMA_CxBR1.BNDT = 0
Write DMA_CxLLR to point to new LLI_{n'}
Note right of CPU: Enable DMA channel
rect rgb(240, 240, 240)
Note left of DMA Channel: LLI_{n'} transfer
DMA Channel->>DMA Channel: Loading LLI_{n'}
end
DMA Channel->>CPU: Transfer complete interrupt
Note right of CPU: Enable DMA channel
rect rgb(240, 240, 240)
Note left of DMA Channel: LLI_{n+1'} transfer
DMA Channel->>DMA Channel: Executing LLI_{n+1'} data transfer
DMA Channel->>DMA Channel: Loading LLI_{n+1'}
end
DMA Channel->>CPU: Transfer complete interrupt
MSV62636V1
Run-time replacing a \( LLI_n \) with a new \( LLI_{n'} \) in link step mode
Other software implementations exist. Meanwhile GPDMA executes the transfer from the \( LLI_{n-1} \) and loads a formerly elaborated \( LLI_n \) from the memory (or even earlier), the software can do the following:
- 1. Disable the NVIC for not being interrupted by the interrupt handling.
- 2. Build a new \( LLI_{n'} \) and a new \( LLI_{n+1'} \) .
- 3. Enable again the NVIC for the channel interrupt (transfer complete) notification.
The software in the interrupt handler for \( LLI_{n-1} \) is then restricted to overwrite GPDMA_CxBR1.BNDT[15:0] to be null and GPDMA_CxLLR to point to new \( LLI_{n'} \) , as shown in Figure 61.
Figure 61. Replace with a new \( LLI_{n'} \) and \( LLI_{n+1'} \) in memory in link step mode (option 2)

LSM = 1 with 1-stage linked-list programming:
Overwriting the (pre)loaded
\(
LLI_n
\)
linked-list register file by building new
\(
LLI_{n'}
\)
and
\(
LLI_{n+1'}
\)
in memory while disabling (temporary) channel interrupt at NVIC level, and overwriting DMA_CxBR1.BNDT = 0 and DMA_CxLLR to point to new
\(
LLI_{n'}
\)
DMA executes
\(
LLI_{n-1}
\)
and loading
\(
LLI_n
\)
while CPU builds (
\(
LLI_{n'}
\)
and
\(
LLI_{n+1'}
\)
), then CPU overwrites (BR1 and LLR)
sequenceDiagram
participant DMA as DMA channel
participant CPU as CPU
Note right of DMA: LSM = 1 with 1-stage linked-list programming:
Overwriting the (pre)loaded LLI_n linked-list register file by building new LLI_{n'} and LLI_{n+1'} in memory while disabling (temporary) channel interrupt at NVIC level, and overwriting DMA_CxBR1.BNDT = 0 and DMA_CxLLR to point to new LLI_{n'}
DMA executes LLI_{n-1} and loading LLI_n while CPU builds (LLI_{n'} and LLI_{n+1'}), then CPU overwrites (BR1 and LLR)
DMA->>DMA: Executing LLI_{n-1} data transfer
DMA->>DMA: Loading LLI_n
DMA->>CPU: Transfer complete interrupt
CPU->>CPU: Disable NVIC DMA irq channel
CPU->>CPU: Build LLI_{n'} & LLI_{n+1'} in memory
CPU->>CPU: Enable NVIC DMA irq channel
CPU->>CPU: Write DMA_CxBR1.BNDT = 0
Write DMA_CxLLR to point to new LLI_{n'}
CPU->>CPU: Enable DMA channel
DMA->>DMA: Loading LLI_{n'}
DMA->>CPU: Transfer complete interrupt
CPU->>CPU: Enable DMA channel
DMA->>DMA: Executing LLI_{n+1'} data transfer
DMA->>DMA: Loading LLI_{n+1'}
DMA->>CPU: Transfer complete interrupt
MSv62637V1
17.4.9 GPDMA channel state and linked-list programming
The software can reconfigure a channel when the channel is disabled (GPDMA_CxCR.EN = 0) and update the execution mode (GPDMA_CxCR.LSM) to change from/to run-to-completion mode to/from link step mode.
In any execution mode, the software can:
- • reprogram \( LLI_{n+1} \) in the memory to finally complete the channel by this \( LLI_{n+1} \) (clear the GPDMA_CxLLR of this \( LLI_{n+1} \) ), before that this \( LLI_{n+1} \) is loaded/used by the GPDMA channel
- • abort and reconfigure the channel with a LSM update (see Section 17.4.4. )
In link step mode, the software can clear LSM after each a single execution of any LLI, during \( LLI_{n-1} \) .
Figure 62 shows the overall and unified GPDMA linked-list programming, whatever is the execution mode.
Note: Figure 62 is not intended to illustrate how often a TCEF can be raised, depending on the programmed value of TCEM[1:0] in GPDMA_CxTR2. It can be raised at (each) block completion, at (each) 2D block completion, at (each) LLI completion, or only at the last LLI data transfer completion. In run-to-completion mode, whatever is the value of TCEM[1:0], at the channel completion the hardware always set TCEF = 1 and disables the channel. In link step mode, the channel is disabled after each single execution of a LLI, and depending on the value of TCEM[1:0] a TCEF is raised or not.
Figure 62. GPDMA channel execution and linked-list programming

graph TD
subgraph Idle [Channel state = Idle]
Init[Initialize DMA channel] --> Enable[Enable DMA channel]
end
Enable --> Active
subgraph Active [Channel state = Active]
Valid1{Valid user setting?} -- N --> Disable1[Setting USEF = 1
Disabling DMA channel]
Valid1 -- Y --> BNDT{BNDT ≠ 0?}
BNDT -- N --> Disable1
BNDT -- Y --> Exec[Executing once the data transfer from the register file]
Exec --> NoError1{No transfer error?}
NoError1 -- N --> Disable2[Setting DTEF = 1
Disabling DMA channel]
NoError1 -- Y --> LLR{LLR ≠ 0?}
LLR -- N --> End
LLR -- Y --> LoadLLI[Loading next LLI into the register file]
LoadLLI --> NoError2{No transfer error?}
NoError2 -- N --> Disable3[Setting ULEF = 1
Disabling DMA channel]
NoError2 -- Y --> Valid2{Valid user setting?}
Valid2 -- N --> Disable4[Setting USEF = 1
Disabling DMA channel]
Valid2 -- Y --> LSM{LSM = 1?}
LSM -- N --> End
LSM -- Y --> Disable5[Setting TCF = 1
Disabling DMA channel]
end
Disable1 --> End
Disable2 --> End
Disable3 --> End
Disable4 --> End
Disable5 --> End
Reconfig[Reconfigure DMA channel] --> Enable
MSv62638V1
17.4.10 GPDMA FIFO-based transfers
There is a single transfer operation mode: the FIFO mode. There are FIFO-based transfers. Any channel x is implemented with a dedicated FIFO whose size is defined by
dma_fifo_size[x]
(see
Section 17.3.1
for more details).
GPDMA burst
A programmed transfer at the lowest level is a GPDMA burst.
A GPDMA burst is a burst of data received from the source, or a burst of data sent to the destination. A source (and destination) burst is programmed with a burst length by the field
SBL_1[5:0]
(respectively
DBL_1[5:0]
), and with a data width defined by the field
SDW_LOG2[1:0]
(respectively
DDW_LOG2[1:0]
) in the
GPDMA_CxTR1
register.
The addressing mode after each data (named beat) of a GPDMA burst is defined by
SINC
and
DINC
in
GPDMA_CxTR1
, for source and destination respectively: either a fixed addressing or an incremented addressing with contiguous data.
The start and next addresses of a GPDMA source/destination burst (defined by
GPDMA_CxSAR
and
GPDMA_CxDAR
) must be aligned with the respective data width.
The table below lists the main characteristics of a GPDMA burst.
Table 130. Programmed GPDMA source/destination burst
SDW_LOG2[1:0]DDW_LOG2[1:0] | Data width (bytes) | SINC/DINC | SBL_1[5:0]DBL_1[5:0] | Burst length (data/beats) | Next data/beat address | Next burst address | Burst address alignment |
|---|---|---|---|---|---|---|---|
| 00 | 1 | 0 (fixed) | n = 0 to 63
(1) | n+1 | + 0 | + 0 | 1 |
| 01 | 2 | 2 | |||||
| 10 | 4 | 4 | |||||
| 00 | 1 | 1 (contiguously incremented) | + 1 | + (n + 1) | 1 | ||
| 01 | 2 | + 2 | + 2 * (n + 1) | 2 | |||
| 10 | 4 | + 4 | + 4 * (n + 1) | 4 | |||
| 11 | forbidden user setting, causing USEF generation and none burst to be issued. | ||||||
1. When
S/DBL_1[5:0] = 0
, burst is of length 1. Then burst can be also named as single.
The next burst address in the above table is the next source/destination default address pointed by
GPDMA_CxSAR
or
GPDMA_CxDAR
, once the programmed source/destination burst is completed. This default value refers to the fixed/contiguously incremented address.
GPDMA FIFO-based burst
In FIFO-mode, a transfer generally consists of two pipelined and separated burst transfers:
- • one burst from the source to the FIFO over the allocated source master port, as defined by
GPDMA_CxTR1.SAP - • one burst from the FIFO to the destination over the allocated destination master port, as defined by
GPDMA_CxTR1.DAP
GPDMA source burst
The requested source burst transfer to the FIFO can be scheduled as early as possible over the allocated port, depending on the current FIFO level versus the programmed burst size (when the FIFO is ready to get one new burst from the source):
where:
- • FIFO level is the current filling level of the FIFO, in bytes.
- •
\(
2^{\text{dma\_fifo\_size}[x]}
\)
is the half of the FIFO size of the channel x, in bytes (see
Section 17.3.1
for the implementation details and
dma_fifo_size[x]value). - • \( (\text{SBL\_1}[5:0]+1) * 2^{\text{SDW\_LOG2}[1:0]} \) is the size of the programmed source burst transfer, in bytes.
Based on the channel priority (
GPDMA_CxCR.PRIO[1:0]
), this ready FIFO-based source transfer is internally arbitrated versus the other requested and active channels.
GPDMA destination burst
The requested destination burst transfer from the FIFO can be scheduled as early as possible over the allocated port, depending on the current FIFO level versus the programmed burst size (when the FIFO is ready to push one new burst to the destination):
where:
- • FIFO level is the current filling level of the FIFO, in bytes.
- • \( (\text{DBL\_1}[5:0]+1) * 2^{\text{DDW\_LOG2}[1:0]} \) is the size of the programmed destination burst transfer, in bytes.
Based on the channel priority, this ready FIFO-based destination transfer is internally arbitrated versus the other requested and active channels.
GPDMA burst vs source block size, 1-Kbyte address boundary and FIFO size
The programmed source/destination GPDMA burst is implemented with an AHB burst as is, unless one of the following conditions is met:
- • When half of the FIFO size of the channel x is lower than the programmed source/destination burst size, the programmed source/destination GPDMA burst is implemented with a series of singles or bursts of a lower size, each transfer being of a size that is lower or equal than half of the FIFO size, without any user constraint.
- • if the source block size (
GPDMA_CxBR1.BNDT[15:0]) is not a multiple of the source burst size but is a multiple of the data width of the source burst (GPDMA_CxTR1.SDW_LOG2[1:0]), the GPDMA modifies and shortens bursts into singles or bursts of lower length, in order to transfer exactly the source block size, without any user constraint. - • if the source/destination burst transfer have crossed the 1-Kbyte address boundary on a AHB transfer, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the AHB protocol, without any user constraint.
- • If the source/destination burst length exceeds 16 on a AHB transfer, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the AHB protocol, without any user constraint.
In any case, the GPDMA keeps ensuring source/destination data (and address) integrity without any user constraint. The current FIFO level (software readable in GPDMA_CxSR) is compared to and updated with the effective transfer size, and the GPDMA re-arbitrates between each AHB single or burst transfer, possibly modified.
Based on the channel priority, each single or burst of a lower burst size versus the programmed burst, is internally arbitrated versus the other requested and active channels.
Note: In linked-list mode, the GPDMA read transfers related to the update of the linked-list parameters from the memory to the internal GPDMA registers, are scheduled over the link allocated port, as programmed by GPDMA_CxCR.LAP.
GPDMA data handling: byte-based reordering, packing/unpacking, padding/truncation, sign extension and left/right alignment
The data handling is controlled by GPDMA_CxTR1. The source/destination data width of the programmed burst is byte, half-word or word, as per the SDW_LOG2[1:0] and DDW_LOG2[1:0] fields (see Table 131 ).
The user can configure the data handling between transferred data from the source and transfer to the destination. More specifically, programmed data handling is orderly performed with:
- 1. Byte-based source reordering
- – If SBX = 1 and if source data width is a word, the two bytes of the unaligned half-word at the middle of each source data word are exchanged.
- 2. Data width conversion by packing, unpacking, padding or truncation, if destination data width is different than the source data width, depending on PAM[1:0]:
- – If destination data width > source data width, the post SBX source data is either right-aligned and padded with 0 s, or sign extended up to the destination data width, or is FIFO queued and packed up to the destination data width.
- – If destination data width < source data width, the post SBX data is either right-aligned and left-truncated down to the destination data width, or is FIFO queued and unpacked and streamed down to the destination data width.
- 3. Byte-based destination re-ordering:
- – If DBX = 1 and if the destination data width is not a byte, the two bytes are exchanged within the aligned post PAM[1:0] half-words.
- – If DHX = 1 and if the destination data width is neither a byte nor a half-word, the two aligned half-words are exchanged within the aligned post PAM[1:0] words.
Note: Left-alignment with 0s-padding can be achieved by programming both a right-alignment with a 0s-padding and a destination byte-based re-ordering.
The table below lists the possible data handling from the source to the destination.
Table 131. Programmed data handling
| SDW_LOG2 [1:0] | Source data | Source data stream (1) | SB X | DDW_LOG2 [1:0] | Destination data | PAM[1:0] (2) | DB X | DH X | Destination data stream (1) |
|---|---|---|---|---|---|---|---|---|---|
| 00 | Byte | B 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0 | x | 00 | Byte | xx | x | B 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0 | |
| 01 | Half-word | 00 (RA, 0P) | 0 | x | 0B 3 ,0B 2 ,0B 1 ,0B 0 | ||||
| 1 | B 3 0,B 2 0,B 1 0,B 0 0 | ||||||||
| 01 | Half-word | 01 (RA, SE) | 0 | x | SB 3 ,SB 2 ,SB 1 ,SB 0 | ||||
| 1 | B 3 S,B 2 S,B 1 S,B 0 S | ||||||||
| 01 | Half-word | 1x (PACK) | 0 | x | B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0 | ||||
| 1 | B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1 | ||||||||
| 10 | Word | 00 (RA, 0P) | 0 | 0 | 000B 1 ,000B 0 | ||||
| 1 | 00B 1 0,00B 0 0 | ||||||||
| 10 | Word | 01 (RA, SE) | 0 | 1 | 0B 1 00,0B 0 00 | ||||
| 1 | B 1 000,B 0 000 | ||||||||
| 10 | Word | 1x (PACK) | 0 | 0 | SSSB 1 ,SSSB 0 | ||||
| 1 | SSB 1 S,SSB 0 S | ||||||||
| 10 | Word | 1x (PACK) | 0 | 1 | SB 1 SS,SB 0 SS | ||||
| 1 | B 1 SSS,B 0 SSS | ||||||||
| 10 | Word | 1x (PACK) | 0 | 0 | B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0 | ||||
| 1 | B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1 | ||||||||
| 01 | Half-word | B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0 | 00 | Byte | 00 (RA, LT) | B 6 ,B 4 ,B 2 ,B 0 | |||
| 01 (LA, RT) | x | x | B 7 ,B 5 ,B 3 ,B 1 | ||||||
| 1x (UNPACK) | B 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0 |
Table 131. Programmed data handling (continued)
| SDW_LOG2 [1:0] | Source data | Source data stream (1) | SB X | DDW_LOG2 [1:0] | Destination data | PAM[1:0] (2) | DB X | DH X | Destination data stream (1) |
|---|---|---|---|---|---|---|---|---|---|
| 01 | Half-word | B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0 | x | 01 | Half-word | xx | 0 | x | B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0 |
| 1 | B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1 | ||||||||
| 10 | Word | 00 (RA, 0P) | 0 | 0 | 00B 3 B 2 ,00B 1 B 0 | ||||
| 1 | 00B 2 B 3 ,00B 0 B 1 | ||||||||
| 0 | 1 | B 3 B 2 00,B 1 B 0 00 | |||||||
| 1 | B 2 B 3 00,B 0 B 1 00 | ||||||||
| 01 (RA, SE) | 0 | 0 | SSB 3 B 2 ,SSB 1 B 0 | ||||||
| 1 | SSB 2 B 3 ,SSB 0 B 1 | ||||||||
| 0 | 1 | B 3 B 2 SS,B 1 B 0 SS | |||||||
| 1 | B 2 B 3 SS,B 0 B 1 SS | ||||||||
| 1x (PACK) | 0 | 0 | B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0 | ||||||
| 1 | B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1 | ||||||||
| 0 | 1 | B 5 B 4 B 7 B 6 ,B 1 B 0 B 3 B 2 | |||||||
| 1 | B 4 B 5 B 6 B 7 ,B 0 B 1 B 2 B 3 | ||||||||
| 10 | Word | B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0 | 0 | 00 | Byte | 00 (RA, LT) | x | B 12 ,B 8 ,B 4 ,B 0 | |
| 01 (LA, RT) | B 15 ,B 11 ,B 7 ,B 3 | ||||||||
| 10 (UNPACK) | B 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0 | ||||||||
| 01 | Half-word | 00 (RA, LT) | 0 | x | B 5 B 4 ,B 1 B 0 | ||||
| 1 | B 4 B 5 ,B 0 B 1 | ||||||||
| 01 (LA, RT) | 0 | B 7 B 6 ,B 3 B 2 | |||||||
| 1 | B 6 B 7 ,B 2 B 3 | ||||||||
| 1x (UNPACK) | 0 | B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0 | |||||||
| 1 | B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1 |
Table 131. Programmed data handling (continued)
| SDW_LOG2 [1:0] | Source data | Source data stream (1) | SB X | DDW_LOG2 [1:0] | Destination data | PAM[1:0] (2) | DB X | DH X | Destination data stream (1) |
|---|---|---|---|---|---|---|---|---|---|
| 10 | Word | B
7
B
6
B
5
B
4
, B 3 B 2 B 1 B 0 | 0 | 10 | Word | xx | 0 | 0 | B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0 |
| 1 | B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1 | ||||||||
| 0 | 1 | B 5 B 4 B 7 B 6 ,B 1 B 0 B 3 B 2 | |||||||
| 1 | B 4 B 5 B 6 B 7 ,B 0 B 1 B 2 B 3 | ||||||||
| 1 | 00 | Byte | 00 (RA, LT) | x | x | B 12 ,B 8 ,B 4 ,B 0 | |||
| 01 (LA, RT) | B 15 ,B 11 ,B 7 ,B 3 | ||||||||
| 1x (UNPACK) | B 7 ,B 5 ,B 6 ,B 4 ,B 3 ,B 1 ,B 2 ,B 0 | ||||||||
| 01 | Half-word | 00 (RA, LT) | 0 | B 6 B 4 ,B 2 B 0 | |||||
| 1 | B 4 B 6 ,B 0 B 2 | ||||||||
| 01 (LA, RT) | 0 | B 7 B 5 ,B 3 B 1 | |||||||
| 1 | B 5 B 7 ,B 1 B 3 | ||||||||
| 1x (UNPACK) | 0 | B 7 B 5 ,B 6 B 4 ,B 3 B 1 ,B 2 B 0 | |||||||
| 1 | B 5 B 7 ,B 4 B 6 ,B 1 B 3 ,B 0 B 2 | ||||||||
| 10 | Word | xx | 0 | 0 | B 7 B 5 B 6 B 4 ,B 3 B 1 B 2 B 0 | ||||
| 1 | B 5 B 7 B 4 B 6 ,B 1 B 3 B 0 B 2 | ||||||||
| 0 | 1 | B 6 B 4 B 7 B 5 ,B 2 B 0 B 3 B 1 | |||||||
| 1 | B 4 B 6 B 5 B 7 ,B 0 B 2 B 1 B 3 |
1. Data stream is timely ordered starting from the byte with the lowest index (B 0 ).
2. RA= right aligned, LA = left aligned, RT = right truncated, LT = left truncated, 0P = zero bit padding up to the destination data width, SE = sign bit extended up to the destination data width.
17.4.11 GPDMA transfer request and arbitration
GPDMA transfer request
As defined by GPDMA_CxTR2, a programmed GPDMA data transfer is requested with one of the following:
- • a software request if the control bit SWREQ = 1: This is used typically by the CPU for a data transfer from a memory-mapped address to another memory mapped address (memory-to-memory, GPIO to/from memory)
- • an input hardware request coming from a peripheral if SWREQ = 0: The selection of the GPDMA hardware peripheral request is driven by the REQSEL[5:0] field (see
Section 17.3.3
). The selected hardware request can be one of the following:
- – an hardware request from a peripheral configured in GPDMA mode (for a transfer from/to the peripheral data register respectively to/from the memory)
- – an hardware request from a peripheral for its control registers update from the memory
- – an hardware request from a peripheral for a read of its status registers transferred to the memory
Caution: The user must not assign a same input hardware peripheral GPDMA request via GPDMA_CxTR.REQSEL[5:0] to two different channels, if at a given time this request is asserted by the peripheral and each channel is ready to execute this requested data transfer. There is no user setting error reporting.
GPDMA transfer request for arbitration
A ready FIFO-based GPDMA source single/burst transfer (from the source address to the FIFO) to be scheduled over the allocated master port (GPDMA_CxTR1.SAP) is arbitrated based on the channel priority (GPDMA_CxCR.PRIO[1:0]) versus the other simultaneous requested GPDMA transfers to the same master port.
A ready FIFO-based GPDMA destination single/burst transfer (from the FIFO to the destination address) to be scheduled over the allocated master port (GPDMA_CxTR1.DAP) is arbitrated based on the channel priority (GPDMA_CxCR.PRIO[1:0]) versus the other simultaneous requested GPDMA transfers to the same master port.
An arbitrated GPDMA requested link transfer consists of one 32-bit read from the linked-list data structure in memory to one of the linked-list registers (GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR or GPDMA_CxLLR). Each 32-bit read from memory is arbitrated with the same channel priority as for data transfers, in order to be scheduled over the allocated master port (GPDMA_CxCR.LAP).
Whatever the requested data transfer is programmed with a software request for a memory-to-memory transfer (GPDMA_CxTR2.SWREQ = 1), or with a hardware request (GPDMA_CxTR2.SWREQ = 0) for a memory-to-peripheral transfer or a peripheral-to-memory transfer and whatever is the hardware request type, re-arbitration occurs after each granted single/burst transfer.
When an hardware request is programmed from a destination peripheral (GPDMA_CxTR2.SWREQ = 0 and GPDMA_CxTR2.DREQ = 1), the first memory read of a block (the first ready FIFO-based source burst request), is gated by the occurrence of the corresponding and selected hardware request. This first read request to memory is not taken into account earlier by the arbiter (not as soon as the block transfer is enabled and executable).
GPDMA arbitration
The GPDMA arbitration is directed from the 4-grade assigned channel priority (GPDMA_CxCR.PRIO[1:0]). The arbitration policy, as illustrated in Figure 63 , is defined by:
- • one high-priority traffic class (queue 3), dedicated to the assigned channels with priority 3, for time-sensitive channels
This traffic class is granted via a fixed-priority arbitration against any other low-priority traffic class. Within this class, requested single/burst transfers are round-robin arbitrated.
- • three low-priority traffic classes (queues 0, 1, or 2) for non time-sensitive channels with priority 0, 1, or 2
Each requested single/burst transfer within this class is round-robin arbitrated, with a weight that is monotonically driven from the programmed priority:
- – Requests with priority 0 are allocated to the queue 0.
- – Requests with priority 1 are allocated and replicated to the queue 0 and queue 1.
- – Requests with priority 2 are allocated and replicated to the queue 0, queue 1, and queue 2.
- – Any queue 0, 1, or 2 equally grants any of its active input requests in a round-robin manner, provided there are simultaneous requests.
- – Additionally, there is a second stage for the low-traffic with a round-robin arbiter that fairly alternates between simultaneous selected requests from queue 0, queue 1, and queue 2.
Figure 63. GPDMA arbitration policy

Request from any channel x being assigned with GPDMA_CxCR.PRIO = 0
Request from any channel x being assigned with GPDMA_CxCR.PRIO = 1
Request from any channel x being assigned with GPDMA_CxCR.PRIO = 2
Request from any channel x being assigned with GPDMA_CxCR.PRIO = 3
Queue 0 RRA
Queue 1 RRA
Queue 2 RRA
Queue 3 RRA
RRA
Low
High
FPA
Granted request
GPDMA arbitration
RRA = round-robin arbitration, FPA = fixed-priority arbitration
MSv63647V1
GPDMA arbitration and bandwidth
With this arbitration policy, the following is guaranteed:
- • Equal maximum bandwidth between requests with same priority
- • Reserved bandwidth (noted as \( B_{Q3} \) ) to the time-sensitive requests (with priority 3)
- • Residual weighted bandwidth between different low-priority requests (priority 0 versus priority 1 versus priority 2).
The two following examples highlight that the weighted round-robin arbitration is driven by the programmed priorities:
- •
Example 1:
basic application with two non time-sensitive GPDMA requests: req0 and req1. There are the following programming possibilities:
- – If they are assigned with same priority, the allocated bandwidth by the arbiter to req0 (
\(
B_{req0}
\)
) is
equal
to the allocated bandwidth to req1 (
\(
B_{req1}
\)
).\[ B_{req0} = B_{req1} = 1/2 * (1 - B_{Q3}) \]
- – If req0 is assigned to priority 0 and req1 to priority 1, the allocated bandwidth to req0 (
\(
B_{P0}
\)
) is
3 times less
than the allocated bandwidth to req1 (
\(
B_{P1}
\)
).\[ B_{req0} = B_{P0} = 1/2 * 1/2 * (1 - B_{Q3}) = 1/4 * (1 - B_{Q3}) \]\[ B_{req1} = B_{P1} = (1/2 + 1) * 1/2 * (1 - B_{Q3}) = 3/4 * (1 - B_{Q3}) \]
- – If req0 is assigned to priority 0 and req1 to priority 2, the allocated bandwidth to req0 (
\(
B_{P0}
\)
) is
5 times less
than the allocated bandwidth to req1 (
\(
B_{P2}
\)
).\[ B_{req0} = B_{P0} = 1/2 * 1/3 * (1 - B_{Q3}) = 1/6 * (1 - B_{Q3}) \]\[ B_{req1} = B_{P2} = (1/2 + 1 + 1) * 1/3 * (1 - B_{Q3}) = 5/6 * (1 - B_{Q3}) \]
- – If they are assigned with same priority, the allocated bandwidth by the arbiter to req0 (
\(
B_{req0}
\)
) is
equal
to the allocated bandwidth to req1 (
\(
B_{req1}
\)
).
The above computed bandwidth calculation is based on a theoretical input request, always active for any GPDMA clock cycle. This computed bandwidth from the arbiter must be weighted by the frequency of the request given by the application, that cannot be always active and may be quite much variable from one GPDMA client (example I2C at 400 kHz) to another one (PWM at 1 kHz) than the above x3 and x5 ratios.
- Example 2:
application where the user distributes a same non-null N number of GPDMA requests to every non time-sensitive priority 0, 1 and 2. The bandwidth calculation is then the following:
- – The allocated bandwidth to the set of requests of priority 0 (
\(
B_{P0}
\)
) is\[ B_{P0} = 1/3 * 1/3 * (1 - B_{Q3}) = 1/9 * (1 - B_{Q3}) \]
- – The allocated bandwidth to the set of requests of priority 1 (
\(
B_{P1}
\)
) is\[ B_{P1} = (1/3 + 1/2) * 1/3 * (1 - B_{Q3}) = 5/18 * (1 - B_{Q3}) \]
- – The allocated bandwidth to the set of requests of priority 2 (
\(
B_{P2}
\)
) is\[ B_{P2} = (1/3 + 1/2 + 1) * 1/3 * (1 - B_{Q3}) = 11/18 * (1 - B_{Q3}) \]
- – The allocated bandwidth to any request n ( \( B_n \) ) among the N requests of that priority \( P_i \) ( \( i = 0 \) to \( 2 \) ) is \( B_n = 1/N * B_{P_i} \)
- – The allocated bandwidth to any request n of priority
\(
0_i
\)
(
\(
B_{n, P_i}
\)
) is\[ B_{n, P0} = 1/N * 1/9 * (1 - B_{Q3}) \]\[ B_{n, P1} = 1/N * 5/18 * (1 - B_{Q3}) \]\[ B_{n, P2} = 1/N * 11/18 * (1 - B_{Q3}) \]
- – The allocated bandwidth to the set of requests of priority 0 (
\(
B_{P0}
\)
) is
In this example, when the master port bus bandwidth is not totally consumed by the time-sensitive queue 3, the residual bandwidth is such that 2.5 times less bandwidth is allocated to any request of priority 0 versus priority 1, and 5.5 times less bandwidth is allocated to any request of priority 0 versus priority 2.
More generally, assume that the following requests are present:
- • I requests (
\(
I \geq 0
\)
) assigned to priority 0
If \( I > 0 \) , these requests are noted from \( i = 0 \) to \( I-1 \) . - • J requests (
\(
J \geq 0
\)
) assigned to priority 1
If \( J > 0 \) , these requests are noted from \( j = 0 \) to \( J-1 \) . - • K requests (
\(
K > 0
\)
) assigned to priority 2
These requests are noted from \( k = 0 \) to \( K-1 \) - • L requests (
\(
L \geq 0
\)
) assigned to priority 3
If \( L > 0 \) , these requests are noted from \( l = 0 \) to \( L-1 \) .
As \( B_{Q3} \) is the reserved bandwidth to time-sensitive requests, the bandwidth for each request L with priority 3 is:
- • \( B_l = B_{Q3} / L \) for \( L > 0 \) (else: \( B_l = 0 \) )
The bandwidth for each non-time sensitive queue is:
- • \( B_{Q0} = 1/3 * (1 - B_{Q3}) \)
- • \( B_{Q1} = 1/3 * (1 - B_{Q3}) \)
- • \( B_{Q2} = 1/3 * (1 - B_{Q3}) \)
The bandwidth for the set of requests with priority 0 is:
- • \( B_{P0} = I / (I + J + K) * B_{Q0} \)
The bandwidth for each request i with priority 0 is:
- • \( B_i = B_{P0} / I \) for \( L > 0 \) (else \( B_{P0} = 0 \) )
The bandwidth for the set of requests with priority 1 and routed to queue 0 is:
- • \( B_{P1,Q0} = J / (I + J + K) * B_{Q0} \)
The bandwidth for the set of requests with priority 1 and routed to queue 1 is:
- \( B_{P1,Q1} = J / (J + K) * B_{Q1} \)
The total bandwidth for the set of requests with priority 1 is:
- \( B_{P1} = B_{P1,Q0} + B_{P1,Q1} \)
The bandwidth for each request j with priority 1 is:
- \( B_j = B_{P1} / J \) for \( J > 0 \) (else \( B_j = 0 \) )
The bandwidth for the set of requests with priority 2 and routed to queue 0 is:
- \( B_{P2,Q0} = K / (I + J + K) * B_{Q0} \)
The bandwidth for the set of requests with priority 2 and routed to queue 1 is:
- \( B_{P2,Q1} = K / (J + K) * B_{Q1} \)
The bandwidth for the set of requests with priority 2 and routed to queue 2 is:
- \( B_{P2,Q2} = B_{Q2} \)
The total bandwidth for the set of requests with priority 2 is:
- \( B_{P2} = B_{P2,Q0} + B_{P2,Q1} + B_{P2,Q2} \)
The bandwidth for each request k with priority 2 is:
- \( B_k = B_{P2} / K \) ( \( K > 0 \) in the general case)
Thus finally the maximum allocated residual bandwidths for any i, j, k non-time sensitive request are:
- in the general case (when there is at least one request k with a priority 2 (
\(
K > 0
\)
)):
- \( B_i = 1/I * 1/3 * I/(I + J + K) * (1 - B_{Q3}) \)
- \( B_j = 1/J * 1/3 * [J/(I + J + K) + J/(J + K)] * (1 - B_{Q3}) \)
- \( B_k = 1/K * 1/3 * [K/(I + J + K) + K/(J + K) + 1] * (1 - B_{Q3}) \)
- in the specific case (when there is no request k with a priority 2 (
\(
K = 0
\)
)):
- \( B_i = 1/I * 1/2 * I/(I + J) * (1 - B_{Q3}) \)
- \( B_j = 1/J * 1/2 * [J/(I + J) + 1] * (1 - B_{Q3}) \)
Consequently, the GPDMA arbiter can be used as a programmable weighted bandwidth limiter, for each queue and more generally for each request/channel. The different weights are monotonically resulting from the programmed channel priorities.
17.4.12 GPDMA triggered transfer
A programmed GPDMA transfer can be triggered by a rising/falling edge of a selected input trigger event, as defined by GPDMA_CxTR2.TRIGPOL[1:0] and GPDMA_CxTR2.TRIGSEL[4:0] (see Section 17.3.5 for the trigger selection).
The triggered transfer, as defined by the trigger mode in GPDMA_CxTR2.TRIGM[1:0], can be at LLI data transfer level, to condition the first burst read of a block or each programmed single read. The trigger mode can also be programmed to condition the LLI link transfer (see TRIGM[1:0] in GPDMA_CxTR2 for more details).
Trigger hit memorization and trigger overrun flag generation
The GPDMA monitoring of a trigger for a channel x is started when the channel is enabled/loading with a new active trigger configuration: rising or falling edge on a selected trigger (respectively TRIGPOL[1:0] = 01 or TRIGPOL[1:0] = 10).
The monitoring of this trigger is kept active during the triggered and uncompleted (data or link) transfer. If a new trigger is detected, this hit is internally memorized to grant the next transfer, as long as the defined rising/falling edge and TRIGSEL[4:0] are not modified, and the channel is enabled.
Transferring a next \( LLI_{n+1} \) , that updates the GPDMA_CxTR2 with a new value for any of TRIGSEL[4:0] or TRIGPOL[1:0], resets the monitoring, trashing the possible memorized hit of the formerly defined \( LLI_n \) trigger.
Caution: After a first new trigger \( hit_{n+1} \) is memorized, if another trigger \( hit_{n+2} \) is detected and if the \( hit_n \) triggered transfer is still not completed, \( hit_{n+2} \) is lost and not memorized. A trigger overrun flag is reported (GPDMA_CxSR.TOF = 1) and an interrupt is generated if enabled (if GPDMA_CxCR.TOIE = 1). The channel is not automatically disabled by hardware due to a trigger overrun.
Figure 64 illustrates the trigger hit, memorization and overrun in the configuration example with a block-level trigger mode and a rising edge trigger polarity.
Figure 64. Trigger hit, memorization, and overrun waveform

The waveform illustrates the following sequence of events:
- Channel state: Starts in IDLE. It transitions to ACTIVE upon the first valid trigger (rising edge).
- Trigger: Shows four rising edges. The first three occur while the channel is in ACTIVE state, and the fourth occurs while the channel is still ACTIVE from the third trigger, causing an overrun.
- Peripheral request: A periodic signal that is active during the DMA transfer periods.
- DMA transfer: Consists of three 'block transfer' periods. Each block transfer starts when the channel becomes ACTIVE and ends when the peripheral request is no longer active.
- Trigger monitoring state:
- Idle: Initial state.
- Active (monitoring): State entered after the first trigger.
- Active: State entered after subsequent valid triggers while the channel is still active.
- Trigger monitoring action:
- Hit and fire: Action taken on the first trigger.
- Hit and memorize: Action taken on the second trigger.
- Hit and trash: Action taken on the third trigger (since the second was already memorized).
- Fire: Action taken on the fourth trigger (overrun).
- Trigger overrun: A pulse generated when a new trigger is detected while the channel is still active from a previous trigger (between the third and fourth triggers).
Legend:
- Hit and trash (magenta)
- Hit and fire (or fire alone) (green)
- Hit and memorize (yellow)
MSv66923V1
Note: The user can assign the same input trigger event to different channels. This can be used to trigger different channels on a broadcast trigger event.
17.4.13 GPDMA circular buffering with linked-list programming
GPDMA circular buffering for memory-to-peripheral and peripheral-to-memory transfers, with a linear addressing channel
For a circular buffering, with a continuous memory-to-peripheral (or peripheral-to-memory) transfer, the software must set up a channel with half transfer and complete transfer events/interrupts generation (GPDMA_CxCR.HTIE = 1 and GPDMA_CxCR.TCIE = 1), in order to enable a concurrent buffer software processing.
\( LLI_0 \) is configured for the first block transfer with the linear addressing channel. A continuously-executed \( LLI_1 \) is needed to restore the memory source (or destination) start address, for the memory-to-peripheral transfer (respectively the peripheral-to-memory
transfer). GPDMA automatically reloads the initially programmed GPDMA_CxBR1.BNDT[15:0] when a block transfer is completed, and there is no need to restore GPDMA_CxBR1.
Figure 65 illustrates this programming with a linear addressing GPDMA channel and a source circular buffer.
Figure 65. GPDMA circular buffer programming: update of the memory start address with a linear addressing channel

If circular buffering must be executed after some other transfers over the shared GPDMA channel x, the before-last \( LLI_{N-1} \) in memory is needed to configure the first block transfer. And the last \( LLI_N \) restores the memory source (or destination) start address in memory-to-peripheral transfer (respectively in peripheral-to-memory transfer).
Figure 66 illustrates this programming with a linear addressing shared GPDMA channel, and a source circular buffer.
Figure 66. Shared GPDMA channel with circular buffering: update of the memory start address with a linear addressing channel

17.4.14 GPDMA secure/nonsecure channel
The GPDMA controller is compliant with the TrustZone hardware architecture at channel level, partitioning all its resources so that they exist in one of the secure and nonsecure worlds at any given time.
Any channel x is a secure or a nonsecure hardware resource, as configured by GPDMA_SECCFGR.SECx.
When a channel x is configured in secure state by a secure and privileged agent, the following access control rules are applied:
- • A nonsecure read access to a register field of this channel is forced to return 0, except for GPDMA_SECCFGR, GPDMA_PRIVCFGR and GPDMA_RCFGLOCKR that are readable by a nonsecure agent.
- • A nonsecure write access to a register field of this channel has no impact.
When a channel x is configured in secure state, a secure agent can configure separately as secure or nonsecure the GPDMA data transfer from the source (GPDMA_CxTR1.SSEC) and the GPDMA data transfer to the destination (GPDMA_CxTR1.DSEC).
When a channel x is configured in secure state and in linked-list mode, the loading of the next linked-list data structure from the GPDMA memory into its register file, is automatically performed with secure transfers via the GPDMA_CxCR.LAP allocated master port.
The GPDMA generates a secure bus that reflects GPDMA_SECCFGR, to keep the other peripherals informed of the secure/nonsecure state of each GPDMA channel x.
The GPDMA also generates a security illegal access pulse signal on an illegal nonsecure access to a secure GPDMA register. This signal is routed to the TrustZone interrupt controller.
When the secure software must switch a channel from a secure state to a nonsecure state, the secure software must abort the channel or wait until the secure channel is completed before switching. This is needed to dynamically re-allocate a channel to a next nonsecure transfer as a nonsecure software is not allowed to do so and must have GPDMA_CxCR.EN = 0 before the nonsecure software can reprogram the GPDMA_CxCR for a next transfer. The secure software may reset not only the channel x (GPDMA_CxCR.RESET = 1) but also the full channel x register file to its reset value.
17.4.15 GPDMA privileged/unprivileged channel
Any channel x is a privileged or unprivileged hardware resource, as configured by a privileged agent via GPDMA_PRIVCFGR.PRIVx.
When a channel x is configured in a privileged state by a privileged agent, the following access control rules are applied:
- • An unprivileged read access to a register field of this channel is forced to return 0, except for GPDMA_PRIVCFGR, GPDMA_SECCFGR, and GPDMA_RCFGLOCKR that are readable by an unprivileged agent.
- • An unprivileged write access to a register field of this channel has no impact.
When a channel is configured in a privileged (or unprivileged) state, the source and destination data transfers are privileged (respectively unprivileged) transfers over the AHB master port.
When a channel is configured in a privileged (or unprivileged) state and in linked-list mode, the loading of the next linked-list data structure from the GPDMA memory into its register file, is automatically performed with privileged (respectively unprivileged) transfers, via the GPDMA_CxCR.LAP allocated master port.
The GPDMA generates a privileged bus that reflects GPDMA_PRIVCFGR, to keep the other peripherals informed of the privileged/unprivileged state of each GPDMA channel x.
When the privileged software must switch a channel from a privileged state to an unprivileged state, the privileged software must abort the channel or wait until that the privileged channel is completed before switching. This is needed to dynamically re-allocate a channel to a next unprivileged transfer as an unprivileged software is not allowed to do so, and must have GPDMA_CxCR.EN = 0 before the unprivileged software can reprogram the GPDMA_CxCR for a next transfer. The privileged software may reset not only the channel x (GPDMA_CxCR.RESET = 1) but also the full channel x register file to its reset value.
17.4.16 GPDMA error management
The GPDMA is able to manage and report to the user a transfer error, as follows, depending on the root cause.
Data transfer error
On a bus access (as a AHB single or a burst) to the source or the destination:
- • The source or destination target reports an AHB error.
- • The programmed channel transfer is stopped (GPDMA_CxCR.EN cleared by the GPDMA hardware). The channel status register reports an idle state (GPDMA_CxSR.IDLEF = 1) and the data error (GPDMA_CxSR.DTEF = 1).
- • After a GPDMA data transfer error, the user must perform a debug session, taking care of the product-defined memory mapping of the source and destination, including the protection attributes.
- • After a GPDMA data transfer error, the user must issue a channel reset (set GPDMA_CxCR.RESET) to reset the hardware GPDMA channel data path and the content of the FIFO, before the user enables again the same channel for a next transfer.
Link transfer error
On a tentative update of a GPDMA channel register from the programmed LLI in the memory:
- • The linked-list memory reports an AHB error.
- • The programmed channel transfer is stopped (GPDMA_CxCR.EN cleared by the GPDMA hardware), the channel status register reports an idle state (GPDMA_CxSR.IDLEF = 1) and the link error (GPDMA_CxSR.ULEF = 1).
- • After a GPDMA link error, the user must perform a debug session, taking care of the product-defined memory mapping of the linked-list data structure (GPDMA_CxLBAR and GPDMA_CxLLR), including the protection attributes.
- • After a GPDMA link error, the user must explicitly write the linked-list register file (GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR and GPDMA_CxLLR), before the user enables again the same channel for a next transfer.
User setting error
On a tentative execution of a GPDMA transfer with an unauthorized user setting:
- • The programmed channel transfer is disabled (GPDMA_CxCR.EN forced and cleared by the GPDMA hardware) preventing the next unauthorized programmed data transfer from being executed. The channel status register reports an idle state (GPDMA_CxSR.IDLEF = 1) and a user setting error (GPDMA_CxSR.USEF = 1).
- • After a GPDMA user setting error, the user must perform a debug session, taking care of the GPDMA channel programming. A user setting error can be caused by one of the following:
- – a programmed null source block size without a programmed update of this value from the next LLI i (GPDMA_CxBR1.BNDT[15:0] = 0 and GPDMA_CxLLR.UB1 = 0)
- – a programmed non-null source block size being not a multiple of the programmed data width of a source burst transfer (GPDMA_CxBR1.BNDT[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0])
- – when in packing/unpacking mode (if PAM[1] = 1), a programmed non-null source block size being not a multiple of the programmed data width of a destination burst transfer (GPDMA_CxBR1.BNDT[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0])
- – a programmed unaligned source start address, being not a multiple of the programmed data width of a source burst transfer (GPDMA_CxSAR[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0])
- – a programmed unaligned destination start address, being not a multiple of the programmed data width of a destination burst transfer (GPDMA_CxDAR[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0])
- – a programmed double-word source data width (GPDMA_CxTR1.SDW_LOG2[1:0] = 11)
- – a programmed double-word destination data width (GPDMA_CxTR1.DDW_LOG2[1:0] = 11)
- – a programmed linked-list item \( LLI_{n+1} \) with a null data transfer (GPDMA_CxLLR.UB1 = 1 and GPDMA_CxBR1.BNDT = 0)
17.4.17 GPDMA autonomous mode
To save dynamic power consumption while the GPDMA executes the programmed linked-list transfers, the GPDMA hardware automatically manages its own clock gating and generates a clock request output signal to the RCC, whenever the device is in Run or low-power modes, provided that the RCC is programmed with the corresponding GPDMA enable control bits.
For more details about the RCC programming, refer to the RCC section of the reference manual.
For mode details about the availability of the GPDMA autonomous feature vs the device low-power modes, refer to Section 17.3.2 .
Note: Design/firmware: In low-power modes, DMA clock request is asserted upon a DMA request/trigger from an autonomous peripheral or upon a DMA trigger from an EXTI line.
The user can program and schedule the execution of a given GPDMA transfer at a \( LLI_n \) level of a GPDMA channel x, with GPDMA_CxTR2 as follows:
- • The software controls and conditions the input of a transfer with TRIGM[1:0], TRIGPOL[1:0], TRIGSEL[y (a) :0], SWREQ, and REQSEL[z (a) :0] for the input trigger and request.
- • The software controls and signals the output of a transfer with TCEM[1:0] for generating or not a transfer complete event, and generating or not an associated half data transfer event).
See GPDMA channel x transfer register 2 (GPDMA_CxTR2) for more details.
When used in low-power modes, this functionality enables a CPU wake-up on a specific transfer completion by the enabled GPDMA transfer complete interrupt (GPDMA_CxCR.TCIE = 1) or/and enables to continue with the autonomous GPDMA for operating another \( LLI_{n+1} \) transfer over the same channel.
The output channel x transfer complete event, gpdma_chx_tc, can be programmed as a selected input trigger for a channel if this event is looped-back and connected at the GPDMA level (see Section 17.3.5 ), allowing autonomous and fine GPDMA inter-channel transfer scheduling, without needing a cleared transfer complete flag (TCF).
A given GPDMA channel x asserts its clock request in one of the following conditions:
- • if the next transfer to be executed is programmed as conditioned by a trigger (GPDMA_CxTR2.TRIGPOL[1:0] and GPDMA_CxTR2.TRIGM[1:0]), only when the trigger hit occurs.
a. Refer to GPDMA channel x transfer register 2 (GPDMA_CxTR2) for y and z values.
- • if the next transfer to be executed is not conditioned by a trigger:
- – if GPDMA_CxTR2.SWREQ = 0, only when the hardware request is asserted by the selected peripheral
- – if GPDMA_CxTR2.SWREQ = 1 (memory-to-memory, GPIO to/from memory), as soon as the GPDMA is enabled
The GPDMA channel x releases its clock request as soon as all the following conditions are met:
- • The transfer to be executed is completed.
- • The GPDMA channel x is not immediately ready and requested to execute the next transfer.
- • If a channel x interrupt was raised, all the flags of the status register that can cause this interrupt, are cleared by a software agent.
When one channel asserts its clock request, the GPDMA asserts its clock request to the RCC. When none channel asserts its clock request, the GPDMA releases its clock request to the RCC.
17.5 GPDMA in debug mode
When the microcontroller enters debug mode (core halted), any channel x can be individually either continued (default) or suspended, depending on the programmable control bit in the DBGMCU module.
Note: In debug mode, GPDMA_CxSR.SUSPF is not altered by a suspension from the programmable control bit in the DBGMCU module. In this case, GPDMA_CxSR.IDLEF can be checked to know the completion status of the channel suspension.
17.6 GPDMA in low-power modes
Table 132. Effect of low-power modes on GPDMA
| Mode | Description |
|---|---|
| Sleep | No effect. GPDMA interrupts cause the device to exit Sleep mode. |
| Stop (1) | The content of the GPDMA registers is kept when entering Stop mode. The content of the GPDMA registers can be autonomously updated by a next linked-list item from memory, to perform autonomous data transfers. GPDMA interrupts can cause the device to exit Stop 0 and 1 modes (1) . |
| Standby | The GPDMA is powered down and must be reinitialized after exiting Standby mode. |
- 1. Refer to Section 17.3.2 to know if any Stop mode is supported.
17.7 GPDMA interrupts
There is one GPDMA interrupt line for each channel, and separately for each CPU (if several ones in the devices).
Table 133. GPDMA interrupt requests
| Interrupt acronym | Interrupt event | Interrupt enable | Event flag | Event clear method |
|---|---|---|---|---|
| GPDMA_CHx | Transfer complete | GPDMA_CxCR.TCIE | GPDMA_CxSR.TCF | Write 1 to GPDMA_CxFCR.TCF |
| Half transfer | GPDMA_CxCR.HTIE | GPDMA_CxSR.HTF | Write 1 to GPDMA_CxFCR.HTF | |
| Data transfer error | GPDMA_CxCR.DTEIE | GPDMA_CxSR.DTEF | Write 1 to GPDMA_CxFCR.DTEF | |
| Update link error | GPDMA_CxCR.ULEIE | GPDMA_CxSR.ULEF | Write 1 to GPDMA_CxFCR.ULEF | |
| User setting error | GPDMA_CxCR.USEIE | GPDMA_CxSR.USEF | Write 1 to GPDMA_CxFCR.USEF | |
| Suspended | GPDMA_CxCR.SUSPIE | GPDMA_CxSR.SUSPF | Write 1 to GPDMA_CxFCR.SUSPF | |
| Trigger overrun | GPDMA_CxCR.TOFIE | GPDMA_CxSR.TOF | Write 1 to GPDMA_CxFCR.TOF |
A GPDMA channel x event may be:
- • a transfer complete
- • a half-transfer complete
- • a transfer error, due to either:
- – a data transfer error
- – an update link error
- – a user setting error completed suspension
- • a trigger overrun
Note: When a channel x transfer complete event occurs, the output signal gpdma_chx_tc is generated as a high pulse of one clock cycle.
An interrupt is generated following any xx event, provided that both:
- • the corresponding interrupt event xx is enabled (GPDMA_CxCR.xxIE = 1)
- • the corresponding event flag is cleared (GPDMA_CxSR.xxF = 0). This means that, after a previous same xx event occurrence, a software agent must have written 1 into the corresponding xx flag clear control bit (write 1 into GPDMA_CxFCR.xxF).
TCF (transfer complete) and HTF (half transfer) events generation is controlled by GPDMA_CxTR2.TCEM[1:0] as follows:
- • A transfer complete event is a block transfer complete, or a LLI transfer complete including the upload of the next LLI if any, or the full linked-list completion, depending on the transfer complete event mode GPDMA_CxTR2.TCEM[1:0].
- • A half transfer event is an half block transfer.
A half-block transfer occurs when half of the source block size bytes (rounded-up integer of GPDMA_CxBR1.BNDT[15:0] / 2) is transferred to the destination.
See GPDMA channel x transfer register 2 (GPDMA_CxTR2) for more details.
A transfer error rises in one of the following situations:
- • during a single/burst data transfer from the source or to the destination (DTEF)
- • during an update of a GPDMA channel register from the programmed LLI in memory (ULEF)
- • during a tentative execution of a GPDMA channel with an unauthorized setting (USEF)
- The user must perform a debug session to correct the GPDMA channel programming versus the USEF root causes list (see Section 17.4.16 ).
A trigger overrun is described in Trigger hit memorization and trigger overrun flag generation .
17.8 GPDMA registers
The GPDMA registers must be accessed with an aligned 32-bit word data access.
17.8.1 GPDMA secure configuration register (GPDMA_SECCFGR)
Address offset: 0x00
Reset value: 0x0000 0000
A write access to this register must be secure and privileged. A read access is secure or nonsecure, privileged or unprivileged.
A write access is ignored at bit level if the corresponding channel x is locked (GPDMA_RCFGLOCKR.LOCKx = 1).
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be programmed at a bit level, at the initialization/closure of a GPDMA channel (when GPDMA_CxCR.EN = 0), to securely allocate individually any channel x to the secure or nonsecure world.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | SEC7 | SEC6 | SEC5 | SEC4 | SEC3 | SEC2 | SEC1 | SEC0 |
| rw | rw | rw | rw | rw | rw | rw | rw |
Bits 31:8 Reserved, must be kept at reset value.
Bits 7:0 SECx : secure state of channel x (x = 7 to 0)
0: Nonsecure
1: Secure
17.8.2 GPDMA privileged configuration register (GPDMA_PRIVCFGR)
Address offset: 0x04
Reset value: 0x0000 0000
A write access to this register must be privileged. A read access can be privileged or unprivileged, secure or nonsecure.
This register can mix secure and nonsecure information. If a channel x is configured as secure (GPDMA_SECCFGR.SECx = 1), the PRIVx bit can be written only by a secure (and privileged) agent.
A write access is ignored at bit level if the corresponding channel x is locked (GPDMA_RCFGLOCKR.LOCKx = 1).
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be programmed at a bit level, at the initialization/closure of a GPDMA channel (GPDMA_CxCR.EN = 0), to individually allocate any channel x to the privileged or unprivileged world.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | PRIV7 | PRIV6 | PRIV5 | PRIV4 | PRIV3 | PRIV2 | PRIV1 | PRIV0 |
| rw | rw | rw | rw | rw | rw | rw | rw |
Bits 31:8 Reserved, must be kept at reset value.
Bits 7:0 PRIVx : privileged state of channel x (x = 7 to 0)
0: unprivileged
1: privileged
17.8.3 GPDMA configuration lock register (GPDMA_RCFGLOCKR)
Address offset: 0x08
Reset value: 0x0000 0000
This register can be written by a software agent with secure privileged attributes in order to individually lock, for example at boot time, the secure privileged attributes of any GPDMA
channel/resource (to lock the setting of GPDMA_CxSECCFGR and GPDMA_CxPRIVCFGR for any channel x, for example at boot time).
A read access may be privileged or unprivileged, secure or nonsecure.
Note: If TZEN = 0, this register cannot be written.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | LOCK7 | LOCK6 | LOCK5 | LOCK4 | LOCK3 | LOCK2 | LOCK1 | LOCK0 |
| rs | rs | rs | rs | rs | rs | rs | rs |
Bits 31:8 Reserved, must be kept at reset value.
Bits 7:0 LOCKx : lock the configuration of GPDMA_SECCFGR.SECx and GPDMA_PRIVCFGR.PRIVx, until a global GPDMA reset (x = 7 to 0)
This bit is cleared after reset and, once set, it cannot be reset until a global GPDMA reset.
0: secure privilege configuration of the channel x is writable.
1: secure privilege configuration of the channel x is not writable.
17.8.4 GPDMA nonsecure masked interrupt status register (GPDMA_MISR)
Address offset: 0x0C
Reset value: 0x0000 0000
This register is a read register.
This is a nonsecure register, containing the masked interrupt status bit MISx for each nonsecure channel x (channel x configured with GPDMA_SECCFGR.SECx = 0). It is a logical OR of all the flags of GPDMA_CxSR, each source flag being enabled by the corresponding interrupt enable bit of GPDMA_CxCR.
Every bit is deasserted by hardware when writing 1 to the corresponding flag clear bit in GPDMA_CxFCR.
If a channel x is in secure state (GPDMA_SECCFGR.SECx = 1), a read access to the masked interrupt status bit MISx of this channel x returns zero.
This register may mix privileged and unprivileged information, depending on the privileged state of each channel GPDMA_PRIVCFGR.PRIVx. A privileged software can read the full nonsecure interrupt status. An unprivileged software is restricted to read the status of unprivileged (and nonsecure) channels, other privileged bit fields returning zero.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | MIS7 | MIS6 | MIS5 | MIS4 | MIS3 | MIS2 | MIS1 | MIS0 |
| r | r | r | r | r | r | r | r |
Bits 31:8 Reserved, must be kept at reset value.
Bits 7:0 MISx : masked interrupt status of channel x (x = 7 to 0)
0: no interrupt occurred on channel x
1: an interrupt occurred on channel x
17.8.5 GPDMA secure masked interrupt status register (GPDMA_SMISR)
Address offset: 0x10
Reset value: 0x0000 0000
This is a secure read register, containing the masked interrupt status bit MISx for each secure channel x (GPDMA_SECCFGR.SECx = 1). It is a logical OR of all the GPDMA_CxSR flags, each source flag being enabled by the corresponding GPDMA_CxCR interrupt enable bit.
Every bit is deasserted by hardware when securely writing 1 to the corresponding GPDMA_CxFCR flag clear bit.
This register does not contain any information about a nonsecure channel.
This register can mix privileged and unprivileged information, depending on the privileged state of each channel GPDMA_PRIVCFGR.PRIVx. A privileged software can read the full secure interrupt status. An unprivileged software is restricted to read the status of unprivileged and secure channels, other privileged bit fields returning zero.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | MIS7 | MIS6 | MIS5 | MIS4 | MIS3 | MIS2 | MIS1 | MIS0 |
| r | r | r | r | r | r | r | r |
Bits 31:8 Reserved, must be kept at reset value.
Bits 7:0 MISx : masked interrupt status of the secure channel x (x = 7 to 0)
0: no interrupt occurred on the secure channel x
1: an interrupt occurred on the secure channel x
17.8.6 GPDMA channel x linked-list base address register (GPDMA_CxLBAR)
Address offset: 0x50 + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This register must be written by a privileged software. It is either privileged readable or not, depending on the privileged state of the channel x GPDMA_PRIVCFGR.PRIVx.
This register is either secure or nonsecure depending on the secure state of the channel x (GPDMA_SECCFGR.SECx).
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This channel-based register is the linked-list base address of the memory region, for a given channel x, from which the LLIs describing the programmed sequence of the GPDMA transfers, are conditionally and automatically updated.
This 64-Kbyte aligned channel x linked-list base address is offset by the 16-bit GPDMA_CxLLR register that defines the word-aligned address offset for each LLI.

| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| LBA[31:16] | |||||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
Bits 31:16 LBA[31:16] : linked-list base address of GPDMA channel x
Bits 15:0 Reserved, must be kept at reset value.
17.8.7 GPDMA channel x flag clear register (GPDMA_CxFCR)
Address offset: 0x5C+ 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This is a write register, secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx) and privileged or unprivileged, depending on the privileged state of the channel x (GPDMA_PRIVCFGR.PRIVx).

| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | TOF | SUSPF | USEF | ULEF | DTEF | HTF | TCF | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| w | w | w | w | w | w | w |
Bits 31:15 Reserved, must be kept at reset value.
Bit 14 TOF : trigger overrun flag clear
0: no effect
1: corresponding TOF flag cleared
Bit 13 SUSPF : completed suspension flag clear
0: no effect
1: corresponding SUSPF flag cleared
Bit 12 USEF : user setting error flag clear
0: no effect
1: corresponding USEF flag cleared
Bit 11 ULEF : update link transfer error flag clear
0: no effect
1: corresponding ULEF flag cleared
Bit 10 DTEF : data transfer error flag clear
0: no effect
1: corresponding DTEF flag cleared
Bit 9 HTF : half transfer flag clear
0: no effect
1: corresponding HTF flag cleared
Bit 8 TCF : transfer complete flag clear
0: no effect
1: corresponding TCF flag cleared
Bits 7:0 Reserved, must be kept at reset value.
17.8.8 GPDMA channel x status register (GPDMA_CxSR)
Address offset: 0x60 + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0001
This is a read register, reporting the channel status.
This register is secure or nonsecure, depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or non-privileged, depending on the privileged state of the channel (GPDMA_PRIVCFGR.PRIVx).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | FIFOL[7:0] | |||||||
| r | r | r | r | r | r | r | r | ||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | TOF | SUSPF | USEF | ULEF | DTEF | HTF | TCF | Res. | Res. | Res. | Res. | Res. | Res. | Res. | IDLEF |
| r | r | r | r | r | r | r | r | ||||||||
Bits 31:24 Reserved, must be kept at reset value.
Bits 23:16 FIFOL[7:0] : monitored FIFO level
Number of available write beats in the FIFO, in units of the programmed destination data width (see GPDMA_CxTR1.DDW_LOG2[1:0], in units of bytes, half-words, or words).
Note: After having suspended an active transfer, the user may need to read FIFOL[7:0], additionally to GPDMA_CxBR1.BDNT[15:0] and GPDMA_CxBR1.BRC[10:0], to know how many data have been transferred to the destination. Before reading, the user may wait for the transfer to be suspended (GPDMA_CxSR.SUSPF = 1).
Bit 15 Reserved, must be kept at reset value.
Bit 14 TOF : trigger overrun flag
0: no trigger overrun event
1: a trigger overrun event occurred
Bit 13 SUSPF : completed suspension flag
0: no completed suspension event
1: a completed suspension event occurred
Bit 12 USEF : user setting error flag
0: no user setting error event
1: a user setting error event occurred
Bit 11 ULEF : update link transfer error flag
0: no update link transfer error event
1: a master bus error event occurred while updating a linked-list register from memory
Bit 10 DTEF : data transfer error flag
0: no data transfer error event
1: a master bus error event occurred on a data transfer
Bit 9 HTF : half transfer flag
0: no half transfer event
1: a half transfer event occurred
A half block transfer occurs when half of the bytes of the source block size (rounded up integer of \( GPDMA\_CxBR1.BNDT[15:0]/2 \) ) has been transferred to the destination.
Bit 8 TCF : transfer complete flag
0: no transfer complete event
1: a transfer complete event occurred
A transfer complete event is either a block transfer complete, or a LLI transfer complete including the upload of the next LLI if any, or the full linked-list completion, depending on the transfer complete event mode ( \( GPDMA\_CxTR2.TCEM[1:0] \) ).
Bits 7:1 Reserved, must be kept at reset value.
Bit 0 IDLEF : idle flag
0: channel not in idle state
1: channel in idle state
This idle flag is deasserted by hardware when the channel is enabled ( \( GPDMA\_CxCR.EN = 1 \) ) with a valid channel configuration (no USEF to be immediately reported).
This idle flag is asserted after hard reset or by hardware when the channel is back in idle state (in suspended or disabled state).
17.8.9 GPDMA channel x control register (GPDMA_CxCR)
Address offset: \( 0x64 + 0x80 * x \) ( \( x = 0 \) to 7)
Reset value: 0x0000 0000
This register is secure or nonsecure depending on the secure state of channel x ( \( GPDMA\_SECCFGR.SECx \) ), and privileged or unprivileged, depending on the privileged state of the channel x ( \( GPDMA\_PRIVCFGR.PRIVx \) ).
This register is used to control a channel (activate, suspend, abort or disable it).
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | PRIO[1:0] | Res. | Res. | Res. | Res. | LAP | LSM | |
| rw | rw | rw | rw | ||||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| Res. | TOIE | SUSPI E | USEIE | ULEIE | DTEIE | HTIE | TCIE | Res. | Res. | Res. | Res. | Res. | SUSP | RESET | EN |
| rw | rw | rw | rw | rw | rw | rw | rw | w | rw | ||||||
Bits 31:24 Reserved, must be kept at reset value.
Bits 23:22 PRIO[1:0] : priority level of the channel x GPDMA transfer versus others
- 00: low priority, low weight
- 01: low priority, mid weight
- 10: low priority, high weight
- 11: high priority
Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.
Bits 21:18 Reserved, must be kept at reset value.
Bit 17 LAP : linked-list allocated port
This bit is used to allocate the master port for the update of the GPDMA linked-list registers from the memory.
- 0: port 0 (AHB) allocated
- 1: port 1 (AHB) allocated
Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.
Bit 16 LSM : Link step mode
- 0: channel executed for the full linked-list and completed at the end of the last LLI (GPDMA_CxLLR = 0). The 16 low-significant bits of the link address are null (LA[15:0] = 0) and all the update bits are null (UT1 = UB1 = UT2 = USA = UDA = ULL = 0). Then GPDMA_CxBR1.BNDT[15:0] = 0.
1: channel executed once for the current LLI
First the (possible 1D/repeated) block transfer is executed as defined by the current internal register file until GPDMA_CxBR1.BNDT[15:0] = 0. Secondly the next linked-list data structure is conditionally uploaded from memory as defined by GPDMA_CxLLR. Then channel execution is completed.
Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.
Bit 15 Reserved, must be kept at reset value.
Bit 14 TOIE : trigger overrun interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 13 SUSPIE : completed suspension interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 12 USEIE : user setting error interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 11 ULEIE : update link transfer error interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 10 DTEIE : data transfer error interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 9 HTIE : half transfer complete interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bit 8 TCIE : transfer complete interrupt enable
- 0: interrupt disabled
- 1: interrupt enabled
Bits 7:3 Reserved, must be kept at reset value.
Bit 2 SUSP : suspend
Writing 1 into the field RESET (bit 1) causes the hardware to de-assert this bit, whatever is written into this bit 2. Else:
Software must write 1 in order to suspend an active channel (channel with an ongoing GPDMA transfer over its master ports).
The software must write 0 in order to resume a suspended channel, following the programming sequence detailed in Figure 51 .
0: write: resume channel, read: channel not suspended
1: write: suspend channel, read: channel suspended.
Bit 1 RESET : reset
This bit is write only. Writing 0 has no impact. Writing 1 implies the reset of the following: the FIFO, the channel internal state, SUSP and EN bits (whatever is written receptively in bit 2 and bit 0).
The reset is effective when the channel is in steady state, meaning one of the following:
- active channel in suspended state (GPDMA_CxSR.SUSPF = 1 and
GPDMA_CxSR.IDLEF = GPDMA_CxCR.EN = 1)
- channel in disabled state (GPDMA_CxSR.IDLEF = 1 and GPDMA_CxCR.EN = 0).
After writing a RESET, to continue using this channel, the user must explicitly reconfigure the channel including the hardware-modified configuration registers (GPDMA_CxBR1, GPDMA_CxSAR, and GPDMA_CxDAR) before enabling again the channel (see the programming sequence in Figure 52 ).
0: no channel reset
1: channel reset
Bit 0 EN : enable
Writing 1 into the field RESET (bit 1) causes the hardware to de-assert this bit, whatever is written into this bit 0. Else:
this bit is deasserted by hardware when there is a transfer error (master bus error or user setting error) or when there is a channel transfer complete (channel ready to be configured, for example if LSM = 1 at the end of a single execution of the LLI).
Else, this bit can be asserted by software.
Writing 0 into this EN bit is ignored.
0: write: ignored, read: channel disabled
1: write: enable channel, read: channel enabled
17.8.10 GPDMA channel x transfer register 1 (GPDMA_CxTR1)
Address offset: 0x90 + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx) except for secure DSEC and SSEC, privileged or non-privileged, depending on the privileged state of the channel x in GPDMA_PRIVCFGR.PRIVx.
This register controls the transfer of a channel x.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be written when the channel is completed. Then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: LLI or full linked-list.
In linked-list mode, during the link transfer, this register is automatically updated by GPDMA from the memory if GPDMA_CxLLR.UT1 = 1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DSEC | DAP | Res. | Res. | DHX | DBX | DBL_1[5:0] | DINC | Res. | DDW_LOG2[1:0] | ||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | |||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SSEC | SAP | SBX | PAM[1:0] | Res. | SBL_1[5:0] | SINC | Res. | SDW_LOG2[1:0] | |||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | ||
Bit 31 DSEC : security attribute of the GPDMA transfer to the destination
If GPDMA_SECCFGR.SECx = 1 and the access is secure:
0: GPDMA transfer nonsecure
1: GPDMA transfer secure
This is a secure register bit. This bit can only be read by a secure software. This bit must be written by a secure software when GPDMA_SECCFGR.SECx = 1. A secure write is ignored when GPDMA_SECCFGR.SECx = 0.
When GPDMA_SECCFGR.SECx is deasserted, this DSEC bit is also deasserted by hardware (on a secure reconfiguration of the channel as nonsecure), and the GPDMA transfer to the destination is nonsecure.
Bit 30 DAP : destination allocated port
This bit is used to allocate the master port for the destination transfer
0: port 0 (AHB) allocated
1: port 1 (AHB) allocated
Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.
Bits 29:28 Reserved, must be kept at reset value.
Bit 27 DHX : destination half-word exchange
If the destination data size is shorter than a word, this bit is ignored.
If the destination data size is a word:
0: no halfword-based exchanged within word
1: the two consecutive (post PAM) half-words are exchanged in each destination word.
Bit 26 DBX : destination byte exchange
If the destination data size is a byte, this bit is ignored.
If the destination data size is not a byte:
0: no byte-based exchange within half-word
1: the two consecutive (post PAM) bytes are exchanged in each destination half-word.
Bits 25:20 DBL_1[5:0] : destination burst length minus 1, between 0 and 63
The burst length unit is one data named beat within a burst. If DBL_1[5:0] = 0, the burst can be named as single. Each data/beat has a width defined by the destination data width DDW_LOG2[1:0].
Note: If a burst transfer crossed a 1-Kbyte address boundary on a AHB transfer, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the AHB protocol.
If a burst transfer is of length greater than the FIFO size of the channel x, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the FIFO size. Transfer performance is lower, with GPDMA re-arbitration between effective and lower singles/bursts, but the data integrity is guaranteed.
Bit 19 DINC : destination incrementing burst
0: fixed burst
1: contiguously incremented burst
The destination address, pointed by GPDMA_CxDAR, is kept constant after a burst beat/single transfer, or is incremented by the offset value corresponding to a contiguous data after a burst beat/single transfer.
Bit 18 Reserved, must be kept at reset value.
Bits 17:16 DDW_LOG2[1:0] : binary logarithm of the destination data width of a burst, in bytes
00: byte
01: half-word (2 bytes)
10: word (4 bytes)
11: user setting error reported and no transfer issued
Note: A destination burst transfer must have an aligned address with its data width (start address GPDMA_CxDAR[2:0] and if present address offset GPDMA_CxTR3.DAO[2:0], versus DDW_LOG2[1:0]). Otherwise a user setting error is reported and no transfer is issued.
When configured in packing mode (PAM[1] = 1 and destination data width different from source data width), a source block size must be a multiple of the destination data width (see GPDMA_CxBR1.BNDT[2:0] versus DDW_LOG2[1:0]). Else a user setting error is reported and none transfer is issued.
Setting a 8-byte data width causes a user setting error to be reported and none transfer is issued.
Bit 15 SSEC : security attribute of the GPDMA transfer from the source
If GPDMA_SECCFGR.SECx = 1 and the access is secure:
0: GPDMA transfer nonsecure
1: GPDMA transfer secure
This is a secure register bit. This bit can only be read by a secure software. This bit must be written by a secure software when GPDMA_SECCFGR.SECx = 1. A secure write is ignored when GPDMA_SECCFGR.SECx = 0.
When GPDMA_SECCFGR.SECx is deasserted, this SSEC bit is also deasserted by hardware (on a secure reconfiguration of the channel as nonsecure), and the GPDMA transfer from the source is nonsecure.
Bit 14 SAP : source allocated port
This bit is used to allocate the master port for the source transfer
0: port 0 (AHB) allocated
1: port 1 (AHB) allocated
Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.
Bit 13 SBX : source byte exchange within the unaligned half-word of each source word
If the source data width is shorter than a word, this bit is ignored.
If the source data width is a word:
0: no byte-based exchange within the unaligned half-word of each source word
1: the two consecutive bytes within the unaligned half-word of each source word are exchanged.
Bits 12:11 PAM[1:0] : padding/alignment mode
If \( DDW\_LOG2[1:0] = SDW\_LOG2[1:0] \) : if the data width of a burst destination transfer is equal to the data width of a burst source transfer, these bits are ignored.
Else, in the following enumerated values, the condition \( PAM\_1 \) is when destination data width is higher than source data width, and the condition \( PAM\_2 \) is when source data width is higher than destination data width.
Condition: \( PAM\_1 \)
00: source data is transferred as right aligned, padded with 0s up to the destination data width
01: source data is transferred as right aligned, sign extended up to the destination data width
10-11: successive source data are FIFO queued and packed at the destination data width, in a left (LSB) to right (MSB) order (named little endian), before a destination transfer
Condition: \( PAM\_2 \)
00: source data is transferred as right aligned, left-truncated down to the destination data width
01: source data is transferred as left-aligned, right-truncated down to the destination data width
Note: 10-11: source data is FIFO queued and unpacked at the destination data width, to be transferred in a left (LSB) to right (MSB) order (named little endian) to the destination
Bit 10 Reserved, must be kept at reset value.
Bits 9:4 SBL_1[5:0] : source burst length minus 1, between 0 and 63
The burst length unit is one data named beat within a burst. If \( SBL\_1[5:0] = 0 \) , the burst can be named as single. Each data/beat has a width defined by the destination data width \( SDW\_LOG2[1:0] \) .
Note: If a burst transfer crossed a 1-Kbyte address boundary on a AHB transfer, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the AHB protocol.
If a burst transfer is of length greater than the FIFO size of the channel x, the GPDMA modifies and shortens the programmed burst into singles or bursts of lower length, to be compliant with the FIFO size. Transfer performance is lower, with GPDMA re-arbitration between effective and lower singles/bursts, but the data integrity is guaranteed.
Bit 3 SINC : source incrementing burst
0: fixed burst
1: contiguously incremented burst
The source address, pointed by \( GPDMA\_CxSAR \) , is kept constant after a burst beat/single transfer or is incremented by the offset value corresponding to a contiguous data after a burst beat/single transfer.
Bit 2 Reserved, must be kept at reset value.
Bits 1:0 SDW_LOG2[1:0] : binary logarithm of the source data width of a burst in bytes
00: byte
01: half-word (2 bytes)
10: word (4 bytes)
11: user setting error reported and no transfer issued
Note: A source block size must be a multiple of the source data width (GPDMA_CxBR1.BNDT[2:0] versus SDW_LOG2[1:0]). Otherwise, a user setting error is reported and no transfer is issued.
A source burst transfer must have an aligned address with its data width (start address GPDMA_CxSAR[2:0] versus SDW_LOG2[1:0]). Otherwise, a user setting error is reported and none transfer is issued.
Setting a 8-byte data width causes a user setting error to be reported and no transfer is issued.
17.8.11 GPDMA channel x transfer register 2 (GPDMA_CxTR2)
Address offset: 0x94 + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or unprivileged, depending on the privileged state of channel x (GPDMA_PRIVCFGR.PRIVx).
This register controls the transfer of a channel x.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be written when the channel is completed (the hardware deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: block or LLI or full linked-list.
In linked-list mode, during the link transfer, this register is automatically updated by GPDMA from the memory, if GPDMA_CxLLR.UT2 = 1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| TCEM[1:0] | Res. | Res. | Res. | Res. | TRIGPOL[1:0] | Res. | Res. | Res. | TRIGSEL[4:0] | ||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | ||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| TRIGM[1:0] | Res. | Res. | BREQ | DREQ | SWREQ | Res. | Res. | Res. | REQSEL[5:0] | ||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | |||||
These bits define the transfer granularity for the transfer complete and half transfer complete events generation.
00: at block level (when GPDMA_CxBR1.BNDT[15:0] = 0): the complete (and the half) transfer event is generated at the (respectively half of the) end of a block.
Note: If the initial LLI 0 data transfer is null/void (directly programmed by the internal register file with GPDMA_CxBR1.BNDT[15:0] = 0), then neither the complete transfer event nor the half transfer event is generated.
01: channel x (x = 0 to 7), same as 00
Note: If the initial LLI 0 data transfer is null/void (directly programmed by the internal register file with GPDMA_CxBR1.BNDT[15:0] = 0), then neither the complete transfer event nor the half transfer event is generated.
10: at LLI level: the complete transfer event is generated at the end of the LLI transfer, including the update of the LLI if any. The half transfer event is generated at the half of the LLI data transfer.
Note: If the initial LLI 0 data transfer is null/void (directly programmed by the internal register file with GPDMA_CxBR1.BNDT[15:0] = 0), then the half transfer event is not generated, and the transfer complete event is generated when is completed the loading of the LLI 1 .
11: at channel level: the complete transfer event is generated at the end of the last LLI transfer. The half transfer event is generated at the half of the data transfer of the last LLI. The last LLI updates the link address GPDMA_CxLLR.LA[15:2] to zero and clears all the GPDMA_CxLLR update bits (UT1, UT2, UB1, USA, UDA and ULL). If the channel transfer is continuous/infinite, no event is generated.
Bits 29:26 Reserved, must be kept at reset value.
Bits 25:24 TRIGPOL[1:0] : trigger event polarityThese bits define the polarity of the selected trigger event input defined by TRIGSEL[4:0].
00: no trigger (masked trigger event)
01: trigger on the rising edge
10: trigger on the falling edge
11: same as 00
Bits 23:21 Reserved, must be kept at reset value.
Bits 20:16 TRIGSEL[4:0] : trigger event input selectionThese bits select the trigger event input of the GPDMA transfer (as per Section 17.3.5 ), with an active trigger event if TRIGPOL[1:0] ≠ 00.
Bits 15:14 TRIGM[1:0] : trigger mode
These bits define the transfer granularity for its conditioning by the trigger.
If the channel x is enabled (GPDMA_CxCR.EN asserted) with TRIGPOL[1:0] = 00 or 11, these TRIGM[1:0] bits are ignored.
Else, a GPDMA transfer is conditioned by at least one trigger hit:
00: at block level: the first burst read of each block transfer is conditioned by one hit trigger.
01: channel x (x = 0 to 7), same as 0010: at link level: a LLI link transfer is conditioned by one hit trigger. The LLI data transfer
(if any) is not conditioned.
11: at programmed burst level: If SWREQ = 1, each programmed burst read is conditioned by one hit trigger. If SWREQ = 0, each programmed burst that is requested by the selected peripheral, is conditioned by one hit trigger.
- – If the peripheral is programmed as a source (DREQ = 0) of the LLI data transfer, each programmed burst read is conditioned.
- – If the peripheral is programmed as a destination (DREQ = 1) of the LLI data transfer, each programmed burst write is conditioned. The first memory burst read of a block, also named as the first ready FIFO-based source burst, is gated by the occurrence of both the hardware request and the first trigger hit.
The GPDMA monitoring of a trigger for channel x is started when the channel is enabled/loading with a new active trigger configuration: rising or falling edge on a selected trigger (TRIGPOL[1:0] = 01 or respectively TRIGPOL[1:0] = 10).
The monitoring of this trigger is kept active during the triggered and uncompleted (data or link) transfer; and if a new trigger is detected then, this hit is internally memorized to grant the next transfer, as long as the defined rising or falling edge is not modified, and the TRIGSEL[4:0] is not modified, and the channel is enabled.
Transferring a next LLI n+1 that updates the GPDMA_CxTR2 with a new value for any of TRIGSEL[4:0] or TRIGPOL[1:0], resets the monitoring, trashing the memorized hit of the formerly defined LLI n trigger.
After a first new trigger hit n+1 is memorized, if another second trigger hit n+2 is detected and if the hit n triggered transfer is still not completed, hit n+2 is lost and not memorized. A trigger overrun flag is reported (GPDMA_CxSR.TOF = 1), and an interrupt is generated if enabled (GPDMA_CxCR.TOIE = 1). The channel is not automatically disabled by hardware due to a trigger overrun.
Note: When the source block size is not a multiple of the source burst size and is a multiple of the source data width, then the last programmed source burst is not completed and is internally shorten to match the block size. In this case, if TRIGM[1:0] = 11 and (SWREQ = 1 or (SWREQ = 0 and DREQ = 0)), the shortened burst transfer (by singles or/and by bursts of lower length) is conditioned once by the trigger.
When the programmed destination burst is internally shortened by singles or/and by bursts of lower length (versus FIFO size, versus block size, 1-Kbyte boundary address crossing): if the trigger is conditioning the programmed destination burst (if TRIGM[1:0] = 11 and SWREQ = 0 and DREQ = 1), this shortened destination burst transfer is conditioned once by the trigger.
Bits 13:12 Reserved, must be kept at reset value.
Bit 11 BREQ : Block hardware request
If the channel x is activated (GPDMA_CxCR.EN asserted) with SWREQ = 1 (software request for a memory-to-memory transfer), this bit is ignored. Else:
0: the selected hardware request is driven by a peripheral with a hardware request/acknowledge protocol at a burst level.
1: the selected hardware request is driven by a peripheral with a hardware request/acknowledge protocol at a block level (see Section 17.3.3 ).
Bit 10 DREQ : destination hardware request
This bit is ignored if channel x is activated (GPDMA_CxCR.EN asserted) with SWREQ = 1 (software request for a memory-to-memory transfer). Else:
0: selected hardware request driven by a source peripheral (request signal taken into account by the GPDMA transfer scheduler over the source/read port)
1: selected hardware request driven by a destination peripheral (request signal taken into account by the GPDMA transfer scheduler over the destination/write port)
Note:
Bit 9 SWREQ : software request
This bit is internally taken into account when GPDMA_CxCR.EN is asserted.
0: no software request. The selected hardware request REQSEL[5:0] is taken into account.
1: software request for a memory-to-memory transfer. The default selected hardware request as per REQSEL[5:0] is ignored.
Bits 8:6 Reserved, must be kept at reset value.
Bits 5:0 REQSEL[5:0] : GPDMA hardware request selection
These bits are ignored if channel x is activated (GPDMA_CxCR.EN asserted) with SWREQ = 1 (software request for a memory-to-memory transfer). Else, the selected hardware request is internally taken into account as per Section 17.3.3 .
Caution: The user must not assign a same input hardware request (same REQSEL[5:0] value) to different active GPDMA channels (GPDMA_CxCR.EN = 1 and GPDMA_CxTR2.SWREQ = 0 for these channels). GPDMA is not intended to hardware support the case of simultaneous enabled channels incorrectly configured with a same hardware peripheral request signal, and there is no user setting error reporting.
17.8.12 GPDMA channel x block register 1 (GPDMA_CxBR1)
Address offset: 0x98 + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or non-privileged, depending on the privileged state of channel x (GPDMA_PRIVCFGR.PRIVx).
This register controls the transfer of a channel x at a block level.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be written when channel x is completed (then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: block, or LLI or full linked-list.
In linked-list mode, during the link transfer:
- • if GPDMA_CxLLR.UB1 = 1, this register is automatically updated by the GPDMA from the next LLI in memory.
- • If GPDMA_CxLLR.UB1 = 0 and if there is at least one linked-list register to be updated from the next LLI in memory, this register is automatically and internally restored with the programmed value for the field BNDT[15:0].
- • If all the update bits GPDMA_CxLLR.Uxx are null and if GPDMA_CxLLR.LA[15:0] ≠ 0, the current LLI is the last one and is continuously executed: this register is
automatically and internally restored with the programmed value for BNDT[15:0] after each execution of this final LLI
- • If GPDMA_CxLLR = 0, this register and BNDT[15:0] are kept as null, channel x is completed.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| BNDT[15:0] | rw | ||||||||||||||
Bits 31:16 Reserved, must be kept at reset value.
Bits 15:0 BNDT[15:0] : block number of data bytes to transfer from the source
Block size transferred from the source. When the channel is enabled, this field becomes read-only and is decremented, indicating the remaining number of data items in the current source block to be transferred. BNDT[15:0] is programmed in number of bytes, maximum source block size is 64 Kbytes - 1.
Once the last data transfer is completed (BNDT[15:0] = 0):
- - if GPDMA_CxLLR.UB1 = 1, this field is updated by the LLI in the memory.
- - if GPDMA_CxLLR.UB1 = 0 and if there is at least one non null Uxx update bit, this field is internally restored to the programmed value.
- - if all GPDMA_CxLLR.Uxx = 0 and if GPDMA_CxLLR.LA[15:0] = 0, this field is internally restored to the programmed value (infinite/continuous last LLI).
- - if GPDMA_CxLLR = 0, this field is kept as zero following the last LLI data transfer.
Note: A non-null source block size must be a multiple of the source data width (BNDT[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0]). Else a user setting error is reported and no transfer is issued.
When configured in packing mode (GPDMA_CxTR1.PAM[1] = 1 and destination data width different from source data width), a non-null source block size must be a multiple of the destination data width (BNDT[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0]). Else a user setting error is reported and no transfer is issued.
17.8.13 GPDMA channel x source address register (GPDMA_CxSAR)
Address offset: \( 0x9C + 0x80 * x \) ( \( x = 0 \) to \( 7 \) )
Reset value: \( 0x0000\ 0000 \)
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or unprivileged, depending on the privileged state of channel x (GPDMA_PRIVCFGR.PRIVx).
This register configures the source start address of a transfer.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1, and continuously updated by hardware, in order to reflect the address of the next burst transfer from the source.
This register must be written when the channel is completed (then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: LLI or full linked-list.
In linked-list mode, during the link transfer, this register is automatically updated by the GPDMA from the memory if GPDMA_CxLLR.USA = 1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SA[31:16] | |||||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| SA[15:0] | |||||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
Bits 31:0 SA[31:0] : source address
This field is the pointer to the address from which the next data is read.
During the channel activity, depending on the source addressing mode (GPDMA_CxTR1.SINC), this field is kept fixed or incremented by the data width (GPDMA_CxTR1.SDW_LOG2[1:0]) after each burst source data, reflecting the next address from which data is read.
During the channel activity, this address is updated after each completed source burst, consequently to:
- – the programmed source burst; either in fixed addressing mode or in contiguous-data incremented mode. If contiguously incremented (GPDMA_CxTR1.SINC = 1), then the additional address offset value is the programmed burst size, as defined by GPDMA_CxTR1.SBL_1[5:0] and GPDMA_CxTR1.SDW_LOG2[1:0]
- – the additional source incremented/decremented offset value as programmed by GPDMA_CxBR1.SDEC
In linked-list mode, after a LLI data transfer is completed, this register is automatically updated by GPDMA from the memory, provided the LLI is set with GPDMA_CxLLR.USA = 1.
A source address must be aligned with the programmed data width of a source burst (SA[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0]). Else, a user setting error is reported and no transfer is issued.
17.8.14 GPDMA channel x destination address register (GPDMA_CxDAR)
Address offset: \( 0xA0 + 0x80 \cdot x \) ( \( x = 0 \) to \( 7 \) )
Reset value: \( 0x0000\ 0000 \)
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or unprivileged, depending on the privileged state of channel x (GPDMA_PRIVCFGR.PRIVx).
This register configures the destination start address of a transfer.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1, and continuously updated by hardware, in order to reflect the address of the next burst transfer to the destination.
This register must be written when the channel is completed (then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: LLI or full linked-list.
In linked-list mode, during the link transfer, this register is automatically updated by GPDMA from the memory if GPDMA_CxLLR.UDA = 1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DA[31:16] | |||||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| DA[15:0] | |||||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw |
Bits 31:0 DA[31:0] : destination address
This field is the pointer to the address from which the next data is written.
During the channel activity, depending on the destination addressing mode (GPDMA_CxTR1.DINC), this field is kept fixed or incremented by the data width (GPDMA_CxTR1.DDW_LOG2[1:0]) after each burst destination data, reflecting the next address from which data is written.
During the channel activity, this address is updated after each completed destination burst, consequently to:
- – the programmed destination burst; either in fixed addressing mode or in contiguous-data incremented mode. If contiguously incremented (GPDMA_CxTR1.DINC = 1), then the additional address offset value is the programmed burst size, as defined by GPDMA_CxTR1.DBLE_1[5:0] and GPDMA_CxTR1.DDW_LOG2[1:0]
- – the additional destination incremented/decremented offset value as programmed by GPDMA_CxBR1.DDEC.
In linked-list mode, after a LLI data transfer is completed, this register is automatically updated by the GPDMA from the memory, provided the LLI is set with GPDMA_CxLLR.UDA = 1.
Note: A destination address must be aligned with the programmed data width of a destination burst (DA[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0]). Else, a user setting error is reported and no transfer is issued.
17.8.15 GPDMA channel x linked-list address register (GPDMA_CxLLR)
Address offset: 0xCC + 0x80 * x (x = 0 to 7)
Reset value: 0x0000 0000
This register is secure or nonsecure depending on the secure state of channel x (GPDMA_SECCFGR.SECx), and privileged or unprivileged, depending on the privileged state of channel x (GPDMA_PRIVCFGR.PRIVx).
This register configures the data structure of the next LLI in the memory and its address pointer. A channel transfer is completed when this register is null.
This register must be written when GPDMA_CxCR.EN = 0.
This register is read-only when GPDMA_CxCR.EN = 1.
This register must be written when the channel is completed (then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: block or LLI or full linked-list.
In linked-list mode, during the link transfer, this register is automatically updated by the GPDMA from the memory if GPDMA_CxLLR.ULL = 1.
| 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| UT1 | UT2 | UB1 | USA | UDA | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | ULL |
| rw | rw | rw | rw | rw | rw | ||||||||||
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| LA[15:2] | Res. | Res. | |||||||||||||
| rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | rw | ||
Bit 31 UT1 : Update GPDMA_CxTR1 from memory
This bit controls the update of GPDMA_CxTR1 from the memory during the link transfer.
0: no GPDMA_CxTR1 update
1: GPDMA_CxTR1 update
Bit 30 UT2 : Update GPDMA_CxTR2 from memory
This bit controls the update of GPDMA_CxTR2 from the memory during the link transfer.
0: no GPDMA_CxTR2 update
1: GPDMA_CxTR2 update
Bit 29 UB1 : Update GPDMA_CxBR1 from memory
This bit controls the update of GPDMA_CxBR1 from the memory during the link transfer.
If UB1 = 0 and if GPDMA_CxLLR ≠ 0, the linked-list is not completed.
GPDMA_CxBR1.BNDT[15:0] is then restored to the programmed value after data transfer is completed and before the link transfer.
0: no GPDMA_CxBR1 update from memory (GPDMA_CxBR1.BNDT[15:0] restored if any link transfer)
1: GPDMA_CxBR1 update
Bit 28 USA : update GPDMA_CxSAR from memory
This bit controls the update of GPDMA_CxSAR from the memory during the link transfer.
0: no GPDMA_CxSAR update
1: GPDMA_CxSAR update
Bit 27 UDA : Update GPDMA_CxDAR register from memory
This bit is used to control the update of GPDMA_CxDAR from the memory during the link transfer.
0: no GPDMA_CxDAR update
1: GPDMA_CxDAR update
Bits 26:17 Reserved, must be kept at reset value.
Bit 16 ULL : Update GPDMA_CxLLR register from memory
This bit is used to control the update of GPDMA_CxLLR from the memory during the link transfer.
0: no GPDMA_CxLLR update
1: GPDMA_CxLLR update
Bits 15:2 LA[15:2] : pointer (16-bit low-significant address) to the next linked-list data structure
If UT1 = UT2 = UB1 = USA = UDA = ULL = 0 and if LA[15:2] = 0, the current LLI is the last one. The channel transfer is completed without any update of the linked-list GPDMA register file.
Else, this field is the pointer to the memory address offset from which the next linked-list data structure is automatically fetched from, once the data transfer is completed, in order to conditionally update the linked-list GPDMA internal register file (GPDMA_CxTR1, GPDMA_CxTR2, GPDMA_CxBR1, GPDMA_CxSAR, GPDMA_CxDAR, and GPDMA_CxLLR).
Note: The user must program the pointer to be 32-bit aligned. The two low-significant bits are write ignored.
Bits 1:0 Reserved, must be kept at reset value.
17.8.16 GPDMA register map
Table 134. GPDMA register map and reset values
| Offset | Register name | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | GPDMA_SECCFGR | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | SEC7 | SEC6 | SEC5 | SEC4 | SEC3 | SEC2 | SEC1 | SEC0 |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||||||||
| 0x04 | GPDMA_PRIVCFGR | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | PRIV7 | PRIV6 | PRIV5 | PRIV4 | PRIV3 | PRIV2 | PRIV1 | PRIV0 |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||||||||
| 0x08 | GPDMA_RCFGLOCKR | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | LOCK7 | LOCK6 | LOCK5 | LOCK4 | LOCK3 | LOCK2 | LOCK1 | LOCK0 |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||||||||
| 0x0C | GPDMA_MISR | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | MIS7 | MIS6 | MIS5 | MIS4 | MIS3 | MIS2 | MIS1 | MIS0 |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||||||||
| 0x10 | GPDMA_SMISR | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | MIS7 | MIS6 | MIS5 | MIS4 | MIS3 | MIS2 | MIS1 | MIS0 |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||||||||
| 0x14 - 0x4C | Reserved | Reserved | |||||||||||||||||||||||||||||||
| 0x50+0x80 * x (x=0 to 7) | GPDMA_CxLBAR | LBA[31:16] | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | Res | |||||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||
| 0x54 to 0x58+0x80*x (x=0 to 7) | Reserved | Reserved | |||||||||||||||||||||||||||||||
Table 134. GPDMA register map and reset values (continued)
| Offset | Register name | 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x5C+0x80 * x (x=0 to 7) | GPDMA_CxFCR | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | TOF | SUSPF | USEF | ULEF | DTEF | HTF | TCF | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||||
| 0x60+0x80 * x (x=0 to 7) | GPDMA_CxSR | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | TOF | SUSPF | USEF | ULEF | DTEF | HTF | TCF | Res. | Res. | Res. | Res. | Res. | Res. | Res. | IDLEF |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | |||||||||||||||||||||||||
| 0x64+0x80 * x (x=0 to 7) | GPDMA_CxCR | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | TOIE | SUSPIE | USEIE | ULEIE | DTEIE | HTIE | TCIE | Res. | Res. | Res. | Res. | Res. | Res. | SUSP | EN |
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||||||||||||||||||||
| 0x68 to 0x8C+0x80 * x (x=0 to 7) | Reserved | Reserved | |||||||||||||||||||||||||||||||
| 0x90+0x80 * x (x=0 to 7) | GPDMA_CxTR1 | DSEC | DAP | Res. | Res. | DHX | DBX | DBL_1[5:0] | DINC | Res. | DDW_LOG2 [1:0] | Res. | SSEC | SAP | SBX | PAM[1:0] | Res. | SBL_1[5:0] | SINC | Res. | SDW_LOG2 [1:0] | ||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||||||
| 0x94+0x80 * x (x=0 to 7) | GPDMA_CxTR2 | TCEM[1:0] | Res. | Res. | Res. | Res. | Res. | TRIGPOL[1:0] | Res. | Res. | Res. | Res. | Res. | TRIGSEL [4:0] | TRIGM[1:0] | Res. | Res. | BREQ | DREQ | SWREQ | Res. | Res. | Res. | REQSEL[5:0] | |||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||
| 0x98+0x80 * x (x=0 to 7) | GPDMA_CxBR1 | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | BNDT[15:0] | |||||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||||||||
| 0x9C+0x80 * x (x=0 to 7) | GPDMA_CxSAR | SA[31:0] | |||||||||||||||||||||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0xA0+0x80 * x (x=0 to 7) | GPDMA_CxDAR | DA[31:0] | |||||||||||||||||||||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 0xA4 to 0xC8+0x80 * x (x=0 to 7) | Reserved | Reserved | |||||||||||||||||||||||||||||||
| 0xCC+0x80 * x (x=0 to 7) | GPDMA_CxLLR | UT1 | UT2 | UB1 | USA | UDA | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | Res. | ULL | LA[15:2] | Res. | Res. | ||||||||||||
| Reset value | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |||||||||||||