19. General purpose direct memory access controller (GPDMA)

19.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.

19.2 GPDMA main features

19.3 GPDMA implementation

19.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 96. GPDMA1 channel implementation

Channel xHardware parametersFeatures
dma_fifo_size[x]dma_addressing[x]
x = 0 to 1120Channel x (x = 0 to 11) 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 = 12 to 1541Channel x (x = 12 to 15) is implemented with:
– a FIFO of 32 bytes, 8 words
– 2D addressing
These channels may be also used for GPDMA transfers, between a demanding AHB peripheral and SRAM, or for transfers from/to external memories.

19.3.2 GPDMA in low-power modes

The GPDMA wake-up feature is implemented in the device low-power modes as per the table below.

Table 97. GPDMA1 wake-up in low-power modes

FeatureLow-power modes
Wake-upGPDMA1 in Sleep mode

19.3.3 GPDMA requests

A GPDMA request from a peripheral can be assigned to a GPDMA channel x, via REQSEL[7:0] in GPDMA_CxTR2, provided that SWREQ = 0.

The GPDMA requests mapping is specified in the table below.

Table 98. Programmed GPDMA1 request

GPDMA_CxTR2.REQSEL[7:0]Selected GPDMA request
0jpeg_rx_dma
1jpeg_tx_dma
2xspi1_dma
3xspi2_dma
4xspi3_dma
5fmc_txdm_dma
6fmc_bch_dma
7adc1_dma
8adc2_dma

Table 98. Programmed GPDMA1 request (continued)

GPDMA_CxTR2.REQSEL[7:0]Selected GPDMA request
9cryp_in_dma
10cryp_out_dma
11saes_out_dma
12saes_in_dma
13hash_in_dma
14tim1_cc1_dma
15tim1_cc2_dma
16tim1_cc3_dma
17tim1_cc4_dma
18tim1_upd_dma
19tim1_trg_dma
20tim1_com_dma
21tim2_cc1_dma
22tim2_cc2_dma
23tim2_cc3_dma
24tim2_cc4_dma
25tim2_upd_dma
26tim2_trg_dma
27tim3_cc1_dma
28tim3_cc2_dma
29tim3_cc3_dma
30tim3_cc4_dma
31tim3_upd_dma
32tim3_trg_dma
33tim4_cc1_dma
34tim4_cc2_dma
35tim4_cc3_dma
36tim4_cc4_dma
37tim4_upd_dma
38tim4_trg_dma
39tim5_cc1_dma
40tim5_cc2_dma
41tim5_cc3_dma
42tim5_cc4_dma
43tim5_upd_dma

Table 98. Programmed GPDMA1 request (continued)

GPDMA_CxTR2.REQSEL[7:0]Selected GPDMA request
44tim5_trg_dma
45tim6_upd_dma
46tim7_upd_dma
47tim8_cc1_dma
48tim8_cc2_dma
49tim8_cc3_dma
50tim8_cc4_dma
51tim8_upd_dma
52tim8_trg_dma
53tim8_com_dma
54-
55-
56tim15_cc1_dma
57tim15_cc2_dma
58tim15_upd_dma
59tim15_trg_dma
60tim15_com_dma
61tim16_cc1_dma
62tim16_upd_dma
63tim16_com_dma
64tim17_cc1_dma
65tim17_upd_dma
66tim17_com_dma
67tim18_cc1_dma
68tim18_upd_dma
69tim18_com_dma
70lptim1_ic1_dma
71lptim1_ic2_dma
72lptim1_ue_dma
73lptim2_ic1_dma
74lptim2_ic2_dma
75lptim2_ue_dma
76lptim3_ic1_dma
77lptim3_ic2_dma
78lptim3_ue_dma

Table 98. Programmed GPDMA1 request (continued)

GPDMA_CxTR2.REQSEL[7:0]Selected GPDMA request
79spi1_rx_dma
80spi1_tx_dma
81spi2_rx_dma
82spi2_tx_dma
83spi3_rx_dma
84spi3_tx_dma
85spi4_rx_dma
86spi4_tx_dma
87spi5_rx_dma
88spi5_tx_dma
89spi6_rx_dma
90spi6_tx_dma
91sai1_a_dma
92sai1_b_dma
93sai2_a_dma
94sai2_b_dma
95i2c1_rx_dma
96i2c1_tx_dma
97i2c2_rx_dma
98i2c2_tx_dma
99i2c3_rx_dma
100i2c3_tx_dma
101i2c4_rx_dma
102i2c4_tx_dma
103i3c1_rx_dma
104i3c1_tx_dma
105i3c2_rx_dma
106i3c2_tx_dma
107usart1_rx_dma
108usart1_tx_dma
109usart2_rx_dma
110usart2_tx_dma
111usart3_rx_dma
112usart3_tx_dma
113uart4_rx_dma

Table 98. Programmed GPDMA1 request (continued)

GPDMA_CxTR2.REQSEL[7:0]Selected GPDMA request
114uart4_tx_dma
115uart5_rx_dma
116uart5_tx_dma
117usart6_rx_dma
118usart6_tx_dma
119uart7_rx_dma
120uart7_tx_dma
121uart8_rx_dma
122uart8_tx_dma
123uart9_rx_dma
124uart9_tx_dma
125usart10_rx_dma
126usart10_tx_dma
127lpuart1_rx_dma
128lpuart1_tx_dma
129spdifrx_cs_dma
130spdifrx_dt_dma
131adf1_flt0_dma
132mdf1_flt0_dma
133mdf1_flt1_dma
134mdf1_flt2_dma
135mdf1_flt3_dma
136mdf1_flt4_dma
137mdf1_flt5_dma
138ucpd1_tx_dma
139ucpd1_rx_dma
140dcmi_dma or pssi_dma (1)
141i3c1_tc_dma
142i3c1_rs_dma
143i3c2_tc_dma
144i3c2_rs_dma
  1. 1. Depends on which exclusive function is used.

19.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 99. Programmed GPDMA1 request as a block request

GPDMA block requests
lptim1_ue_dma
lptim2_ue_dma
lptim3_ue_dma

19.3.5 GPDMA channels with peripheral early termination

A GPDMA channel, if implemented with this feature, can support the early termination of the data transfer from the peripheral which does also support this feature.

Table 100. GPDMA1 channel with peripheral early termination

GPDMA channel x with peripheral early termination
x = 0, x = 1, and x = 15

This GPDMA support is activated when the channel x is programmed with GPDMA_CxTR2.PFREQ = 1. Then, the peripheral itself can initiate and request a data transfer completion, before the GPDMA has transferred the whole block (see Section 19.4.14 for more details).

Table 101. Programmed GPDMA1 request with peripheral early termination

Programmed GPDMA channel x request with peripheral early termination
i3c1_rx_dma
i3c2_rx_dma
jpeg_tx_dma

19.3.6 GPDMA triggers

A GPDMA trigger can be assigned to a GPDMA channel x, via TRIGSEL[6: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 102. Programmed GPDMA1 trigger

GPDMA_CxTR2.TRIGSEL[7:0]Selected GPDMA trigger
0dcnipp_p1_frameend_evt
1dcnipp_p1_lineend_evt
2dcnipp_p1_hsync_evt
3dcnipp_p1_vsync_evt

Table 102. Programmed GPDMA1 trigger (continued)

GPDMA_CxTR2.TRIGSEL[7:0]Selected GPDMA trigger
4dcmipp_p1_frameend_evt
5dcmipp_p1_lineend_evt
6dcmipp_p1_hsync_evt
7dcmipp_p1_vsync_evt
8dcmipp_p2_frameend_evt
9dcmipp_p2_lineend_evt
10dcmipp_p2_hsync_evt
11dcmipp_p2_vsync_evt
12dma2d_ctc_flag
13dma2d_tc_flag
14dma2d_tw_flag
15jpeg_eoc_flag
16jpeg_ifnf_flag
17jpeg_ift_flag
18jpeg_ofne_flag
19jpeg_oft_flag
20lcd_li_flag
21gpu2d1_gp_flag[0]
22gpu2d1_gp_flag[1]
23gpu2d1_gp_flag[2]
24gpu2d1_gp_flag[3]
25gfxtim1_0_gfxtim_evt[3]
26gfxtim1_0_gfxtim_evt[2]
27gfxtim1_0_gfxtim_evt[1]
28gfxtim1_0_gfxtim_evt[0]
29-
30lptim1_ch1
31lptim1_ch2
32lptim2_ch1
33lptim2_ch2
34lptim3_ch1
35lptim3_ch2
36lptim4_out
37lptim5_out
38-

Table 102. Programmed GPDMA1 trigger (continued)

GPDMA_CxTR2.TRIGSEL[7:0]Selected GPDMA trigger
39rtc_wkup
40lpuart1_it_r_wup_async
41lpuart1_it_t_wup_async
42spi6_it_or_spi6_ait_sync
43-
44tim1_trgo_cktim
45tim1_trgo2_cktim
46tim2_trgo_cktim
47tim3_trgo_cktim
48tim4_trgo_cktim
49tim5_trgo_cktim
50tim6_trgo_cktim
51tim7_trgo_cktim
52tim8_trgo_cktim
53tim8_trgo2_cktim
54-
55-
56-
57tim12_trgo_cktim
58tim15_trgo_cktim
59-
60hpdma1_ch0_tc
61hpdma1_ch1_tc
62hpdma1_ch2_tc
63hpdma1_ch3_tc
64hpdma1_ch4_tc
65hpdma1_ch5_tc
66hpdma1_ch6_tc
67hpdma1_ch7_tc
68hpdma1_ch8_tc
69hpdma1_ch9_tc
70hpdma1_ch10_tc
71hpdma1_ch11_tc
72hpdma1_ch12_tc
73hpdma1_ch13_tc

Table 102. Programmed GPDMA1 trigger (continued)

GPDMA_CxTR2.TRIGSEL[7:0]Selected GPDMA trigger
74hpdma1_ch14_tc
75hpdma1_ch15_tc
76gpdma1_ch0_tc
77gpdma1_ch1_tc
78gpdma1_ch2_tc
79gpdma1_ch3_tc
80gpdma1_ch4_tc
81gpdma1_ch5_tc
82gpdma1_ch6_tc
83gpdma1_ch7_tc
84gpdma1_ch8_tc
85gpdma1_ch9_tc
86gpdma1_ch10_tc
87gpdma1_ch11_tc
88gpdma1_ch12_tc
89gpdma1_ch13_tc
90gpdma1_ch14_tc
91gpdma1_ch15_tc
92-
93extit0_sync
94extit1_sync
95extit2_sync
96extit3_sync
97extit4_sync
98extit5_sync
99extit6_sync
100extit7_sync
101extit8_sync
102extit9_sync
103extit10_sync
104extit11_sync
105extit12_sync
106extit13_sync
107extit14_sync
108extit15_sync

19.4 GPDMA functional description

19.4.1 GPDMA block diagram

Figure 93. GPDMA block diagram

Figure 93. GPDMA block diagram. The diagram shows 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 labeled Channel 0, Channel 1, ..., Channel x), Arbitration, Transfer output control (with Data transfer generation and Link transfer generation), AHB master port 0 interface, AHB master port 1 interface, Interrupt generation, Events generation, Channel state management, Security and privilege management, and Clock management. Below these is the DMA channel registers and DMA global registers block, which also contains multiple channels. This block connects to an AHB slave interface. At the bottom, a 32-bit AHB bus is shown. On the right, output signals include 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. Two 32-bit AHB buses are shown on the far right, connected to the AHB master ports. A note (1) refers to the device implementation table for the number of channels. The identifier MSv63644V2 is in the bottom right corner.
Figure 93. GPDMA block diagram. The diagram shows 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 labeled Channel 0, Channel 1, ..., Channel x), Arbitration, Transfer output control (with Data transfer generation and Link transfer generation), AHB master port 0 interface, AHB master port 1 interface, Interrupt generation, Events generation, Channel state management, Security and privilege management, and Clock management. Below these is the DMA channel registers and DMA global registers block, which also contains multiple channels. This block connects to an AHB slave interface. At the bottom, a 32-bit AHB bus is shown. On the right, output signals include 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. Two 32-bit AHB buses are shown on the far right, connected to the AHB master ports. A note (1) refers to the device implementation table for the number of channels. The identifier MSv63644V2 is in the bottom right corner.

19.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 deactivated by hardware) and that the channel is ready to be reconfigured then enabled again.

Figure 94 illustrates this GPDMA direct programming without any linked-list (GPDMA_CxLLR = 0).

Figure 94. GPDMA channel direct programming without linked-list (GPDMA_CxLLR = 0)

Flowchart of GPDMA channel direct programming without linked-list. The process starts with 'Channel state = Idle', followed by 'Initialize DMA channel' or 'Reconfigure DMA channel', then 'Enable DMA channel'. It then enters 'Channel state = Active', where it checks for 'Valid user setting?'. If 'No', it sets 'USEF = 1' and disables the channel. If 'Yes', it executes the data transfer. After the transfer, it checks for 'No transfer error?'. If 'No', it sets 'DTEF = 1' and disables the channel. If 'Yes', it sets 'TCF = 1' and disables the channel. All three disable paths lead to 'End'.
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[/End/]; Dtef --> End; Tcf --> End; end;

MSv62626V1

Flowchart of GPDMA channel direct programming without linked-list. The process starts with 'Channel state = Idle', followed by 'Initialize DMA channel' or 'Reconfigure DMA channel', then 'Enable DMA channel'. It then enters 'Channel state = Active', where it checks for 'Valid user setting?'. If 'No', it sets 'USEF = 1' and disables the channel. If 'Yes', it executes the data transfer. After the transfer, it checks for 'No transfer error?'. If 'No', it sets 'DTEF = 1' and disables the channel. If 'Yes', it sets 'TCF = 1' and disables the channel. All three disable paths lead to 'End'.

19.4.3 GPDMA channel suspend and resume

The software can suspend on its own a channel still active, with the following sequence:

  1. 1. The software writes 1 into the GPDMA_CxCR.SUSP bit.
  2. 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.

  1. 3. The software safely resumes the suspended channel by writing 0 to GPDMA_CxCR.SUSP.
Figure 95. GPDMA channel suspend and resume sequence Flowchart illustrating the GPDMA channel suspend and resume sequence. The process starts with 'Channel state = Active'. It branches into two paths: 'Suspend the DMA channel (write 1 to CxCR.SUSP)' and 'or'. The 'Suspend' path leads to a decision 'SUSPF=1?'. If 'N' (No), it loops back to the 'Suspend' path. If 'Y' (Yes), it leads to 'Channel state = Suspended and Idle'. From 'Suspended and Idle', it goes to 'Receiving suspended interrupt', which then leads to 'Resume the DMA channel (write 0 to CxCR.SUSP)'. Finally, it returns to 'Channel state = Active'.
graph TD; A[Channel state = Active] --> B[Suspend the DMA channel
(write 1 to CxCR.SUSP)]; A --> C[or]; B --> D{SUSPF=1?}; D -- N --> B; D -- Y --> E[Channel state = Suspended and Idle]; E --> F[Receiving suspended interrupt]; F --> G[Resume the DMA channel
(write 0 to CxCR.SUSP)]; G --> H[Channel state = Active];

MSv62627V1

Flowchart illustrating the GPDMA channel suspend and resume sequence. The process starts with 'Channel state = Active'. It branches into two paths: 'Suspend the DMA channel (write 1 to CxCR.SUSP)' and 'or'. The 'Suspend' path leads to a decision 'SUSPF=1?'. If 'N' (No), it loops back to the 'Suspend' path. If 'Y' (Yes), it leads to 'Channel state = Suspended and Idle'. From 'Suspended and Idle', it goes to 'Receiving suspended interrupt', which then leads to 'Resume the DMA channel (write 0 to CxCR.SUSP)'. Finally, it returns to 'Channel state = Active'.

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.

19.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. 1. The software writes 1 into the GPDMA_CxCR.SUSP bit.
  2. 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. 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. 4. The software safely reconfigures the channel. The software must reprogram the hardware-modified GPDMA_CxBR1, GPDMA_CxSAR, and GPDMA_CxDAR registers.
  5. 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 96. GPDMA channel abort and restart sequence Flowchart of GPDMA channel abort and restart sequence. The sequence starts with 'Channel state = Active', followed by 'Suspend the DMA channel (write 1 to CxCR.SUSP)'. A decision 'SUSPF=1?' follows. If 'N' (No), it loops back to 'Suspend the DMA channel'. If 'Y' (Yes), it proceeds to 'Channel state = Suspended (and Idle)', which includes 'Receiving suspended interrupt'. Next is 'Reset the DMA channel (write 1 to CxCR.RESET)'. Then 'Channel state = Idle', followed by 'Reconfigure the DMA channel' and 'Enable the DMA channel'. Finally, it returns to 'Channel state = Active'.
graph TD
    Start(( )) --> Active1
    subgraph Active1 [Channel state = Active]
        A1[Suspend the DMA channel
(write 1 to CxCR.SUSP)] end A1 -- or --> D{SUSPF=1?} D -- N --> A1 D -- Y --> Suspended subgraph Suspended [Channel state = Suspended
(and Idle)] S1[Receiving suspended
interrupt] R1[Reset the DMA channel
(write 1 to CxCR.RESET)] end S1 --> R1 R1 --> Idle subgraph Idle [Channel state = Idle] I1[Reconfigure the DMA channel] I2[Enable the DMA channel] end I1 --> I2 I2 --> Active2 [Channel state = Active] Active2 --> End(( ))

MSv62628V1

Flowchart of GPDMA channel abort and restart sequence. The sequence starts with 'Channel state = Active', followed by 'Suspend the DMA channel (write 1 to CxCR.SUSP)'. A decision 'SUSPF=1?' follows. If 'N' (No), it loops back to 'Suspend the DMA channel'. If 'Y' (Yes), it proceeds to 'Channel state = Suspended (and Idle)', which includes 'Receiving suspended interrupt'. Next is 'Reset the DMA channel (write 1 to CxCR.RESET)'. Then 'Channel state = Idle', followed by 'Reconfigure the DMA channel' and 'Enable the DMA channel'. Finally, it returns to 'Channel state = Active'.

19.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 data structure for each LLI may be specific.

A linked-list data structure is addressed following the value of the following UT1, UT2, UB1, USA, UDA, UT3 and UB2 if present, 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, GPDMA_CxTR3 and GPDMA_CxBR2 if present, and 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.

Caution: The user must program the pointer to the next linked-list data structure (GPDMA_CxLLR[15:0]) not to exceed the 64-Kbyte addressable space defined by the link base address register (GPDMA_CxLBAR). The complete linked-list data structure must be included in the 64-Kbyte addressable space.

Static linked-list data structure

For example, when the update bits (UT1, UT2, UB1, USA, UDA, plus UB2 and UT3 if present, and ULL) in GPDMA_CxLLR are all asserted, the linked-list data structure in the memory is maximal with:

Figure 97. Static linked-list data structure (all Uxx = 1)
of a linear addressing channel x

Diagram illustrating the static linked-list data structure for a linear addressing channel x. The diagram shows the DMA register file and the memory from the link base address DMA_CxLBAR. The DMA register file contains the Channel x linked-list register file (LLI0) with registers DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR register in LLI0 points to the next LLI (LLI1) in memory. The memory contains LLI1 and LLI2, each with registers DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR register in LLI1 points to LLI2. The DMA_CxLLR register in LLI2 points to the next LLI. The diagram also shows the Channel x other registers, Other channels registers, and Global registers in the DMA register file. The condition 'All Uxx=1' is indicated for the registers in the LLIs.

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 the link base address DMA_CxLBAR is shown, containing LLI 1 and LLI 2 . Each LLI contains registers 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 DMA_CxLLR register in LLI 2 points to the next LLI. The condition 'All Uxx=1' is indicated for the registers in the LLIs.

Diagram illustrating the static linked-list data structure for a linear addressing channel x. The diagram shows the DMA register file and the memory from the link base address DMA_CxLBAR. The DMA register file contains the Channel x linked-list register file (LLI0) with registers DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR register in LLI0 points to the next LLI (LLI1) in memory. The memory contains LLI1 and LLI2, each with registers DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR register in LLI1 points to LLI2. The DMA_CxLLR register in LLI2 points to the next LLI. The diagram also shows the Channel x other registers, Other channels registers, and Global registers in the DMA register file. The condition 'All Uxx=1' is indicated for the registers in the LLIs.

Figure 98. Static linked-list data structure (all Uxx = 1)
of a 2D addressing channel x

Diagram of static linked-list data structure for a 2D addressing channel x. It shows the DMA register file and memory from link base address DMA_CxLBAR. The DMA register file contains Channel x linked-list register file (LLI0), Channel x other registers, Other channels registers, and Global registers. The linked-list register file contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. The memory from link base address contains LLI1 and LLI2. LLI1 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. LLI2 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. Arrows indicate that the DMA_CxLLR in LLI0 points to LLI1, and the DMA_CxLLR in LLI1 points to LLI2. A label 'All Uxx=1' is present near the DMA_CxLLR in LLI0 and LLI1.

The diagram illustrates the static linked-list data structure for a 2D addressing channel x. On the left, the DMA register file is shown, containing the Channel x linked-list register file (LLI 0 ), Channel x other registers, Other channels registers, and Global registers. The LLI 0 contains the following registers: DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. On the right, the memory from link base address DMA_CxLBAR is shown, containing LLI 1 and LLI 2 . LLI 1 contains the same registers as LLI 0 : DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. LLI 2 also contains the same registers. Arrows indicate that the DMA_CxLLR in LLI 0 points to LLI 1 , and the DMA_CxLLR in LLI 1 points to LLI 2 . A label 'All Uxx=1' is present near the DMA_CxLLR in LLI 0 and LLI 1 . The diagram is labeled MSV63645V1.

Diagram of static linked-list data structure for a 2D addressing channel x. It shows the DMA register file and memory from link base address DMA_CxLBAR. The DMA register file contains Channel x linked-list register file (LLI0), Channel x other registers, Other channels registers, and Global registers. The linked-list register file contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. The memory from link base address contains LLI1 and LLI2. LLI1 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. LLI2 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. Arrows indicate that the DMA_CxLLR in LLI0 points to LLI1, and the DMA_CxLLR in LLI1 points to LLI2. A label 'All Uxx=1' is present near the DMA_CxLLR in LLI0 and LLI1.

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 99 ).

Example: if UT1 = UB1 = USA = 0 and if UT3 = UB2 = 0, when channel x is with 2D addressing, and if UT2 = UDA = ULL = 1, the next LLI does not contain an (updated) value for GPDMA_CxTR1, nor GPDMA_CxBR1, nor GPDMA_CxSAR, nor GPDMA_CxTR3, nor GPDMA_CxBR2 when channel x is with 2D addressing. The next LLI contains an updated value for GPDMA_CxTR2, GPDMA_CxDAR, and GPDMA_CxLLR, as shown in Figure 100 .

Figure 99. GPDMA dynamic linked-list data structure of a linear addressing channel x

Figure 99: GPDMA dynamic linked-list data structure of a linear addressing channel x. The diagram shows two linked-list items, LLI_n and LLI_{n+1}. LLI_n contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. An arrow labeled 'All Uxx = 1' points to LLI_n. An arrow from DMA_CxLLR in LLI_n points to LLI_{n+1} with the condition 'UT1 = UB1 = USA = 0' and 'UT2 = UDA = ULL = 1'. LLI_{n+1} contains DMA_CxTR2, DMA_CxDAR, and DMA_CxLLR. A reference 'MSV62630V1' is shown at the bottom right.
Figure 99: GPDMA dynamic linked-list data structure of a linear addressing channel x. The diagram shows two linked-list items, LLI_n and LLI_{n+1}. LLI_n contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. An arrow labeled 'All Uxx = 1' points to LLI_n. An arrow from DMA_CxLLR in LLI_n points to LLI_{n+1} with the condition 'UT1 = UB1 = USA = 0' and 'UT2 = UDA = ULL = 1'. LLI_{n+1} contains DMA_CxTR2, DMA_CxDAR, and DMA_CxLLR. A reference 'MSV62630V1' is shown at the bottom right.

Figure 100. GPDMA dynamic linked-list data structure of a 2D addressing channel x

Figure 100: GPDMA dynamic linked-list data structure of a 2D addressing channel x. The diagram shows two linked-list items, LLI_n and LLI_{n+1}. LLI_n contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. An arrow labeled 'All Uxx = 1' points to LLI_n. An arrow from DMA_CxLLR in LLI_n points to LLI_{n+1} with the condition 'UT1 = UB1 = USA = 0', 'UT3 = UB2 = 0', and 'UT2 = UDA = ULL = 1'. LLI_{n+1} contains DMA_CxTR2, DMA_CxDAR, and DMA_CxLLR. A reference 'MSV63646V1' is shown at the bottom right.
Figure 100: GPDMA dynamic linked-list data structure of a 2D addressing channel x. The diagram shows two linked-list items, LLI_n and LLI_{n+1}. LLI_n contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, DMA_CxTR3, DMA_CxBR2, and DMA_CxLLR. An arrow labeled 'All Uxx = 1' points to LLI_n. An arrow from DMA_CxLLR in LLI_n points to LLI_{n+1} with the condition 'UT1 = UB1 = USA = 0', 'UT3 = UB2 = 0', and 'UT2 = UDA = ULL = 1'. LLI_{n+1} contains DMA_CxTR2, DMA_CxDAR, and DMA_CxLLR. A reference 'MSV63646V1' is shown at the bottom right.

19.4.6 Linked-list item transfer execution

A \( LLI_n \) transfer is the sequence of:

  1. 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. 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 and GPDMA_CxTR2.PFREQ = 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.

19.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:

GPDMA_CxLLR[31:0] = 0 is the condition of a linked-list based channel completion and means the following:

The channel may never be completed when GPDMA_CxLLR.LSM = 0:

In the regular data transfer completion at a block level, GPDMA_CxBR1.BNDT[15:0] = 0 and GPDMA_CxBR1.BRC[10:0] = 0 (if present). Alternatively, a block transfer may be early completed by a peripheral (such as an I3C in Rx mode), and then BNDT[15:0] is not null (see Section 19.4.14 for more details).

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 101 depicts the GPDMA channel execution and its registers programming in run-to-completion mode.

Note:

Figure 101 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.

In Figure 101 , BNDT ≠ 0 is the typical condition for starting the first data transfer in this figure. This condition becomes (BNDT ≠ 0 and PFREQ = 1) if the peripheral requests a data transfer with early termination (see Section 19.3.5 ).

Figure 101. GPDMA channel execution and linked-list programming in run-to-completion mode (GPDMA_CxCR.LSM = 0)

Flowchart of GPDMA channel execution and linked-list programming in run-to-completion mode. The process starts in 'Channel state = Idle' with 'Initialize DMA channel' and 'Enable DMA channel'. It then enters 'Channel state = Active', checking for 'Valid user setting?' and 'BNDT ≠ 0?'. If 'Valid user setting?' is 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'BNDT ≠ 0?' is 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Executing once the data transfer from the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it checks 'LLR ≠ 0?'. If 'N', it goes to 'Setting TCF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Loading next LLI into the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting ULEF = 1 Disabling DMA channel'. If 'Y', it checks 'Valid user setting?'. If 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it goes to 'Setting TCF = 1 Disabling DMA channel'. All disabling paths lead to 'End' and 'Reconfigure DMA channel'.
graph TD; subgraph Idle [Channel state = Idle]; Init[Initialize DMA channel] --> Enable[Enable DMA channel]; end; Enable --> subgraph Active [Channel state = Active]; Valid1{Valid user setting?}; BNDT{BNDT ≠ 0?}; Exec[Executing once the data transfer from the register file]; NoError1{No transfer error?}; LLR{LLR ≠ 0?}; Load[Loading next LLI into the register file]; NoError2{No transfer error?}; Valid2{Valid user setting?}; TCF[Setting TCF = 1 Disabling DMA channel]; USEF1[Setting USEF = 1 Disabling DMA channel]; DTEF[Setting DTEF = 1 Disabling DMA channel]; ULEF[Setting ULEF = 1 Disabling DMA channel]; USEF2[Setting USEF = 1 Disabling DMA channel]; Valid1 -- N --> USEF1; BNDT -- N --> DTEF; Exec --> NoError1; NoError1 -- N --> DTEF; NoError1 -- Y --> LLR; LLR -- N --> TCF; LLR -- Y --> Load; Load --> NoError2; NoError2 -- N --> ULEF; NoError2 -- Y --> Valid2; Valid2 -- N --> USEF2; Valid2 -- Y --> TCF; end; TCF --> End[/End/]; USEF1 --> End; DTEF --> End; ULEF --> End; USEF2 --> End; End --> Reconfig[Reconfigure DMA channel]; Reconfig --> Init;
Flowchart of GPDMA channel execution and linked-list programming in run-to-completion mode. The process starts in 'Channel state = Idle' with 'Initialize DMA channel' and 'Enable DMA channel'. It then enters 'Channel state = Active', checking for 'Valid user setting?' and 'BNDT ≠ 0?'. If 'Valid user setting?' is 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'BNDT ≠ 0?' is 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Executing once the data transfer from the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it checks 'LLR ≠ 0?'. If 'N', it goes to 'Setting TCF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Loading next LLI into the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting ULEF = 1 Disabling DMA channel'. If 'Y', it checks 'Valid user setting?'. If 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it goes to 'Setting TCF = 1 Disabling DMA channel'. All disabling paths lead to 'End' and 'Reconfigure DMA channel'.

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} \) :

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 102 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 102. Inserting a\( LLI_n \) with an auxiliary GPDMA channel y Sequence diagram showing the interaction between DMA primary channel x, DMA auxiliary channel y, and the CPU to insert a new LLI_n.

The diagram illustrates the process of inserting a new \( LLI_n \) into a linked list using an auxiliary GPDMA channel. The process involves three main actors: DMA primary channel x, DMA auxiliary channel y, and the CPU.

MSv62632V2

Sequence diagram showing the interaction between DMA primary channel x, DMA auxiliary channel y, and the CPU to insert a new LLI_n.

19.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:

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 with the same value, or \( GPDMA\_CxLLR.ULL = 0 \) ), a channel in link step mode is completed after each repeated single execution of this LLI.

In the regular data transfer completion at a block level, \( GPDMA\_CxBR1.BNDT[15:0] = 0 \) and \( GPDMA\_CxBR1.BRC[10:0] = 0 \) . Alternatively, a block transfer may be early completed by a peripheral (such as an I3C in Rx mode), and then \( BNDT[15:0] \) is not null (see Section 19.4.14 for more details).

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 103 depicts the GPDMA channel execution mode, and its programming in link step mode.

Note: Figure 103 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. In Figure 103 , \( BNDT \neq 0 \) is the typical condition for starting the first data transfer. This condition becomes ( \( BNDT \neq 0 \) and \( PFREQ = 1 \) ) if the peripheral requests a data transfer with early termination (see Section 19.3.5 ).

Figure 103. GPDMA channel execution and linked-list programming in link step mode (GPDMA_CxCR.LSM = 1)

Flowchart of GPDMA channel execution and linked-list programming in link step mode. The process starts in 'Channel state = Idle' with 'Initialize DMA channel' and 'Enable DMA channel'. It then enters 'Channel state = Active', checking for 'Valid user setting?' and 'BNDT ≠ 0?'. If 'Valid user setting?' is 'N', it goes to 'Reconfigure DMA channel'. If 'BNDT ≠ 0?' is 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Executing once the data transfer from the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it checks 'LLR ≠ 0?'. If 'N', it goes to 'Setting TCF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Loading next LLI into the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting ULEF = 1 Disabling DMA channel'. If 'Y', it checks 'Valid user setting?'. If 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it goes to 'Setting TCF = 1 Disabling DMA channel'. All 'Disabling DMA channel' paths lead to 'End'.
graph TD
    subgraph Idle [Channel state = Idle]
        Init[Initialize DMA channel] --> Enable[Enable DMA channel]
    end
    Enable --> Active
    subgraph Active [Channel state = Active]
        Active --> VUS1{Valid user setting?}
        VUS1 -- N --> Reconfig[Reconfigure DMA channel]
        Reconfig --> Init
        VUS1 -- Y --> BNDT{BNDT ≠ 0?}
        BNDT -- N --> USEF1[Setting USEF = 1
Disabling DMA channel] BNDT -- Y --> Exec[Executing once the data transfer from the register file] Exec --> NTE1{No transfer error?} NTE1 -- N --> DTEF[Setting DTEF = 1
Disabling DMA channel] NTE1 -- Y --> LLR{LLR ≠ 0?} LLR -- N --> TCF[Setting TCF = 1
Disabling DMA channel] LLR -- Y --> LLI[Loading next LLI into the register file] LLI --> NTE2{No transfer error?} NTE2 -- N --> ULEF[Setting ULEF = 1
Disabling DMA channel] NTE2 -- Y --> VUS2{Valid user setting?} VUS2 -- N --> USEF2[Setting USEF = 1
Disabling DMA channel] VUS2 -- Y --> TCF end USEF1 --> End[/End/] DTEF --> End ULEF --> End TCF --> End USEF2 --> End
Flowchart of GPDMA channel execution and linked-list programming in link step mode. The process starts in 'Channel state = Idle' with 'Initialize DMA channel' and 'Enable DMA channel'. It then enters 'Channel state = Active', checking for 'Valid user setting?' and 'BNDT ≠ 0?'. If 'Valid user setting?' is 'N', it goes to 'Reconfigure DMA channel'. If 'BNDT ≠ 0?' is 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Executing once the data transfer from the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting DTEF = 1 Disabling DMA channel'. If 'Y', it checks 'LLR ≠ 0?'. If 'N', it goes to 'Setting TCF = 1 Disabling DMA channel'. If 'Y', it proceeds to 'Loading next LLI into the register file', then checks 'No transfer error?'. If 'N', it goes to 'Setting ULEF = 1 Disabling DMA channel'. If 'Y', it checks 'Valid user setting?'. If 'N', it goes to 'Setting USEF = 1 Disabling DMA channel'. If 'Y', it goes to 'Setting TCF = 1 Disabling DMA channel'. All 'Disabling DMA channel' paths lead to 'End'.

MSv62633V1

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 104.

Figure 104. Building \( LLI_{n+1} \) : GPDMA dynamic linked-lists in link step mode

Sequence diagram showing the interaction between a DMA Channel and a CPU for dynamic linked-list programming. The DMA Channel executes LLI_{n-2} transfer, then sends a transfer complete interrupt to the CPU. The CPU enables the DMA channel. The DMA Channel then executes LLI_{n-1} data transfer and loads LLI_n. After this, it sends another transfer complete interrupt to the CPU. The CPU builds and stores LLI_{n+1} and enables the DMA channel again. Finally, the DMA Channel executes the LLI_n transfer.

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
    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
    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 transfer
    Note right of DMA Channel: MSv62634V1
Sequence diagram showing the interaction between a DMA Channel and a CPU for dynamic linked-list programming. The DMA Channel executes LLI_{n-2} transfer, then sends a transfer complete interrupt to the CPU. The CPU enables the DMA channel. The DMA Channel then executes LLI_{n-1} data transfer and loads LLI_n. After this, it sends another transfer complete interrupt to the CPU. The CPU builds and stores LLI_{n+1} and enables the DMA channel again. Finally, the DMA Channel executes the LLI_n transfer.

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 105.

Figure 105. Replace with a new\( LLI_n \) in register file in link step mode Sequence diagram showing the interaction between a DMA channel and a CPU for replacing an LLI in link step mode. The DMA channel executes LLI_{n-1} data transfer and loads LLI_n. A transfer complete interrupt is sent to the CPU. The CPU builds LLI_{n'} and overwrites the linked-list register file, then enables the DMA channel. The DMA channel then executes LLI_{n'} data transfer and loads LLI_{n+1'}. Another transfer complete interrupt is sent to the CPU. The CPU builds LLI_{n+1''} and overwrites the linked-list register file, then enables the DMA channel. Finally, the DMA channel executes LLI_{n+1''} transfer.

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 left of DMA: LLI_{n-1} transfer
    rect rgb(255, 255, 255)
    DMA->>DMA: Executing LLI_{n-1} data transfer
    DMA->>DMA: Loading LLI_n
    end
    DMA->>CPU: Transfer complete interrupt
    Note right of CPU: Build LLI_{n'} and overwrite
linked-list register file Note right of CPU: Enable DMA channel CPU-->>DMA: Note left of DMA: LLI_{n'} transfer rect rgb(255, 255, 255) DMA->>DMA: Executing LLI_{n'} data transfer DMA->>DMA: Loading LLI_{n+1'} end DMA->>CPU: Transfer complete interrupt Note right of CPU: Build LLI_{n+1''} and overwrite
linked-list register file Note right of CPU: Enable DMA channel CPU-->>DMA: Note left of DMA: LLI_{n+1''} transfer rect rgb(255, 255, 255) DMA->>DMA: LLI_{n+1''} transfer end DMA->>CPU: Transfer complete interrupt

MSV62635V1

Sequence diagram showing the interaction between a DMA channel and a CPU for replacing an LLI in link step mode. The DMA channel executes LLI_{n-1} data transfer and loads LLI_n. A transfer complete interrupt is sent to the CPU. The CPU builds LLI_{n'} and overwrites the linked-list register file, then enables the DMA channel. The DMA channel then executes LLI_{n'} data transfer and loads LLI_{n+1'}. Another transfer complete interrupt is sent to the CPU. The CPU builds LLI_{n+1''} and overwrites the linked-list register file, then enables the DMA channel. Finally, the DMA channel executes LLI_{n+1''} transfer.

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 106 .

Figure 106. Replace with a new \( LLI_n \) and \( LLI_{n+1'} \) in memory in link step mode (option 1)

Sequence diagram showing the interaction between a DMA Channel and a CPU for replacing linked-list items. The process involves three linked-list transfers. In the first, the DMA executes LLI_{n-1} and loads LLI_n, then sends a transfer complete interrupt. The CPU responds by building new LLI_{n'} and LLI_{n+1'} in memory, updating DMA_CxBR1.BNDT to 0 and DMA_CxLLR to point to the new LLI_{n'}, and enabling the DMA channel. In the second transfer, the DMA loads the new LLI_{n'} and sends another transfer complete interrupt. The CPU enables the DMA channel again. In the third transfer, the DMA executes LLI_{n+1'} and loads LLI_{n+1'}, finally sending a transfer complete interrupt.

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 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
    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
    Note right of CPU: Write DMA_CxLLR to point to new LLI_{n'}
    CPU->>DMA Channel: Enable DMA channel
    Note left of DMA Channel: LLI_{n'} transfer
    DMA Channel->>DMA Channel: Loading LLI_{n'}
    DMA Channel-->>CPU: Transfer complete interrupt
    CPU->>DMA Channel: Enable DMA channel
    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'}
    DMA Channel-->>CPU: Transfer complete interrupt
    

MSV62636V1

Sequence diagram showing the interaction between a DMA Channel and a CPU for replacing linked-list items. The process involves three linked-list transfers. In the first, the DMA executes LLI_{n-1} and loads LLI_n, then sends a transfer complete interrupt. The CPU responds by building new LLI_{n'} and LLI_{n+1'} in memory, updating DMA_CxBR1.BNDT to 0 and DMA_CxLLR to point to the new LLI_{n'}, and enabling the DMA channel. In the second transfer, the DMA loads the new LLI_{n'} and sends another transfer complete interrupt. The CPU enables the DMA channel again. In the third transfer, the DMA executes LLI_{n+1'} and loads LLI_{n+1'}, finally sending a transfer complete interrupt.

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. 1. Disable the NVIC for not being interrupted by the interrupt handling.
  2. 2. Build a new \( LLI_{n'} \) and a new \( LLI_{n+1'} \) .
  3. 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 107.

Figure 107. Replace with a new \( LLI_{n'} \) and \( LLI_{n+1'} \) in memory in link step mode (option 2)

Sequence diagram showing the interaction between a DMA channel and a CPU for replacing linked-list items in link step mode. The diagram is divided into two columns: DMA channel and CPU. The process starts with the DMA channel executing an LLI_{n-1} data transfer and loading LLI_n. A 'Transfer complete interrupt' occurs, triggering the CPU to disable the NVIC DMA irq channel, build new LLI_{n'} and LLI_{n+1'} in memory, and enable the NVIC DMA irq channel. The CPU then writes DMA_CxBR1.BNDT = 0 and DMA_CxLLR to point to the new LLI_{n'}. Next, the DMA channel executes an LLI_{n'} data transfer and loading LLI_{n'}. Another 'Transfer complete interrupt' occurs, and the CPU enables the DMA channel. Finally, the DMA channel executes an LLI_{n+1'} data transfer and loading LLI_{n+1'}. A third 'Transfer complete interrupt' occurs, and the CPU enables the DMA channel again. The diagram is labeled with 'LLI_{n-1} transfer', 'LLI_{n'} transfer', and 'LLI_{n+1'} transfer' on the left side. The source code 'MSv62637V1' is shown in the bottom right corner.

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 over DMA, CPU: 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) Note left of DMA: LLI_{n-1} transfer 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 Note left of DMA: LLI_{n'} transfer DMA->>DMA: Loading LLI_{n'} DMA->>CPU: Transfer complete interrupt CPU->>CPU: Enable DMA channel Note left of DMA: LLI_{n+1'} transfer DMA->>DMA: Executing LLI_{n+1'} data transfer DMA->>DMA: Loading LLI_{n+1'} DMA->>CPU: Transfer complete interrupt CPU->>CPU: Enable DMA channel

MSv62637V1

Sequence diagram showing the interaction between a DMA channel and a CPU for replacing linked-list items in link step mode. The diagram is divided into two columns: DMA channel and CPU. The process starts with the DMA channel executing an LLI_{n-1} data transfer and loading LLI_n. A 'Transfer complete interrupt' occurs, triggering the CPU to disable the NVIC DMA irq channel, build new LLI_{n'} and LLI_{n+1'} in memory, and enable the NVIC DMA irq channel. The CPU then writes DMA_CxBR1.BNDT = 0 and DMA_CxLLR to point to the new LLI_{n'}. Next, the DMA channel executes an LLI_{n'} data transfer and loading LLI_{n'}. Another 'Transfer complete interrupt' occurs, and the CPU enables the DMA channel. Finally, the DMA channel executes an LLI_{n+1'} data transfer and loading LLI_{n+1'}. A third 'Transfer complete interrupt' occurs, and the CPU enables the DMA channel again. The diagram is labeled with 'LLI_{n-1} transfer', 'LLI_{n'} transfer', and 'LLI_{n+1'} transfer' on the left side. The source code 'MSv62637V1' is shown in the bottom right corner.

19.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:

In link step mode, the software can clear LSM after each a single execution of any LLI, during \( LLI_{n-1} \) .

Figure 108 shows the overall and unified GPDMA linked-list programming, whatever is the execution mode.

Note: Figure 108 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.

In Figure 108 , BNDT \( \neq \) 0 is the typical condition for starting the first data transfer. This condition becomes (BNDT \( \neq \) 0 and PFREQ = 1) if the peripheral requests a data transfer with early termination (see Section 19.3.5 ).

Figure 108. GPDMA channel execution and linked-list programming

Flowchart of GPDMA channel execution and linked-list programming. It starts with 'Channel state = Idle', followed by 'Initialize DMA channel' and 'Enable DMA channel'. Then it enters 'Channel state = Active' loop. Decisions include 'Valid user setting?', 'BNDT ≠ 0?', 'No transfer error?', 'LLR ≠ 0?', 'Loading next LLI into the register file', 'No transfer error?', 'Valid user setting?', and 'LSM = 1?'. Disabling actions include 'Setting USEF = 1', 'Setting DTEF = 1', 'Setting ULEF = 1', and 'Setting TCF = 1'. The process ends at 'End'.
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 --> Exec[Executing once the data transfer from the register file] BNDT -- Y --> NoError1{No transfer error?} NoError1 -- N --> Disable2[Setting DTEF = 1
Disabling DMA channel] NoError1 -- Y --> LLR{LLR ≠ 0?} LLR -- N --> End LLR -- Y --> LLI[Loading next LLI into the register file] LLI --> 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 --> Reconfig[Reconfigure DMA channel] Disable2 --> Reconfig Disable3 --> Reconfig Disable4 --> Reconfig Disable5 --> End Reconfig --> Init
Flowchart of GPDMA channel execution and linked-list programming. It starts with 'Channel state = Idle', followed by 'Initialize DMA channel' and 'Enable DMA channel'. Then it enters 'Channel state = Active' loop. Decisions include 'Valid user setting?', 'BNDT ≠ 0?', 'No transfer error?', 'LLR ≠ 0?', 'Loading next LLI into the register file', 'No transfer error?', 'Valid user setting?', and 'LSM = 1?'. Disabling actions include 'Setting USEF = 1', 'Setting DTEF = 1', 'Setting ULEF = 1', and 'Setting TCF = 1'. The process ends at 'End'.

MSv62638V1

19.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 19.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 103. Programmed GPDMA source/destination burst

SDW_LOG2[1:0]
DDW_LOG2[1:0]
Data width (bytes)SINC/DINCSBL_1[5:0]
DBL_1[5:0]
Burst length (data/beats)Next data/beat addressNext burst addressBurst address alignment
0010 (fixed)n = 0 to 63 (1)n+1+ 0+ 01
0122
1044
0011
(contiguously incremented)
+ 1+ (n + 1)1
012+ 2+ 2 * (n + 1)2
104+ 4+ 4 * (n + 1)4
11forbidden 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 burst with 2D addressing (channel x = 12 to 15)

When the channel has additional 2D addressing feature, this default value refers to the value without taking into account the two programmed incremented or decremented offsets. These two additional offsets (with a null default value) are applied:

Then, a 2D/repeated block can be addressed with a first programmed address jump after each completed burst, and with a second programmed address jump after each block, as depicted by Figure 109 with a 2D destination buffer.

Figure 109. Programmed 2D addressing

Diagram of Programmed 2D addressing showing data transfer from a memory-mapped peripheral to memory blocks with programmable address jumps.

Memory-mapped
Peripheral

32b

Cx_SAR → Data Register

(fixed addressing,
SINC=0)

Memory

32b

Cx_DAR → Data 0 , Data 1 , ..., Data I-1 (Burst 0 )

+ DAO → Data 0 , Data 1 , ..., Data I-1 (Burst 1 )

+ DAO → ...

+ DAO → Data 0 , Data 1 , ..., Data I-1 (Burst J-1 )

+ BRDAO → Next Block (Block 0 )

Restore Cx_DAR (arrow pointing back to start)

Block k (2D/repeated block LLI L )

Block K-1

Programmable address jumps 1) after burst and 2) after
block.
Example:
burst: I * words (DBL_1=I-1; DDW_LOG2='b10)
block: J * bursts (BNDT=J*I*4)
LLI: K * blocks (BRC=K-1)

MSv63674V1

Diagram of Programmed 2D addressing showing data transfer from a memory-mapped peripheral to memory blocks with programmable address jumps.

GPDMA FIFO-based burst

In FIFO-mode, a transfer generally consists of two pipelined and separated burst transfers:

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):

\[ \text{when FIFO level} \leq 2^{\text{dma\_fifo\_size}[x]} - (\text{SBL\_1}[5:0]+1) * 2^{\text{SDW\_LOG2}[1:0]} \]

where:

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):

\[ \text{when FIFO level} \geq (\text{DBL\_1}[5:0]+1) * 2^{\text{DDW\_LOG2}[1:0]} \]

where:

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:

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 104 ).

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. 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. 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. 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 104. Programmed data handling

SDW_LOG2 [1:0]Source dataSource data stream (1)SB XDDW_LOG2 [1:0]Destination dataPAM[1:0] (2)DB XDH XDestination data stream (1)
00ByteB 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0x00BytexxxB 7 ,B 6 ,B 5 ,B 4 ,B 3 ,B 2 ,B 1 ,B 0
01Half-word00 (RA, 0P)0x0B 3 ,0B 2 ,0B 1 ,0B 0
1B 3 0,B 2 0,B 1 0,B 0 0
01 (RA, SE)0SB 3 ,SB 2 ,SB 1 ,SB 0
1B 3 S,B 2 S,B 1 S,B 0 S
1x (PACK)0B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0
1B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1
10Word00 (RA, 0P)00000B 1 ,000B 0
100B 1 0,00B 0 0
010B 1 00,0B 0 00
1B 1 000,B 0 000
01 (RA, SE)00SSSB 1 ,SSSB 0
1SSB 1 S,SSB 0 S
01SB 1 SS,SB 0 SS
1B 1 SSS,B 0 SSS
1x (PACK)00B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0
1B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1
01B 5 B 4 B 7 B 6 ,B 1 B 0 B 3 B 2
1B 4 B 5 B 6 B 7 ,B 0 B 1 B 2 B 3
01Half-wordB 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 000Byte00 (RA, LT)xxB 6 ,B 4 ,B 2 ,B 0
01 (LA, RT)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 104. Programmed data handling (continued)

SDW_LOG2 [1:0]Source dataSource data stream (1)SB XDDW_LOG2 [1:0]Destination dataPAM[1:0] (2)DB XDH XDestination data stream (1)
01Half-wordB 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0x01Half-wordxx0xB 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0
1B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1
10Word00 (RA, 0P)0000B 3 B 2 ,00B 1 B 0
100B 2 B 3 ,00B 0 B 1
01B 3 B 2 00,B 1 B 0 00
1B 2 B 3 00,B 0 B 1 00
01 (RA, SE)00SSB 3 B 2 ,SSB 1 B 0
1SSB 2 B 3 ,SSB 0 B 1
01B 3 B 2 SS,B 1 B 0 SS
1B 2 B 3 SS,B 0 B 1 SS
1x (PACK)00B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0
1B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1
01B 5 B 4 B 7 B 6 ,B 1 B 0 B 3 B 2
1B 4 B 5 B 6 B 7 ,B 0 B 1 B 2 B 3
10WordB 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0000Byte00 (RA, LT)xxB 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
01Half-word00 (RA, LT)0B 5 B 4 ,B 1 B 0
1B 4 B 5 ,B 0 B 1
01 (LA, RT)0B 7 B 6 ,B 3 B 2
1B 6 B 7 ,B 2 B 3
1x (UNPACK)0B 7 B 6 ,B 5 B 4 ,B 3 B 2 ,B 1 B 0
1B 6 B 7 ,B 4 B 5 ,B 2 B 3 ,B 0 B 1

Table 104. Programmed data handling (continued)

SDW_LOG2 [1:0]Source dataSource data stream (1)SB XDDW_LOG2 [1:0]Destination dataPAM[1:0] (2)DB XDH XDestination data stream (1)
10WordB 7 B 6 B 5 B 4 ,
B 3 B 2 B 1 B 0
010Wordxx00B 7 B 6 B 5 B 4 ,B 3 B 2 B 1 B 0
1B 6 B 7 B 4 B 5 ,B 2 B 3 B 0 B 1
01B 5 B 4 B 7 B 6 ,B 1 B 0 B 3 B 2
1B 4 B 5 B 6 B 7 ,B 0 B 1 B 2 B 3
100Byte00 (RA, LT)xxB 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
01Half-word00 (RA, LT)0B 6 B 4 ,B 2 B 0
1B 4 B 6 ,B 0 B 2
01 (LA, RT)0B 7 B 5 ,B 3 B 1
1B 5 B 7 ,B 1 B 3
1x (UNPACK)0B 7 B 5 ,B 6 B 4 ,B 3 B 1 ,B 2 B 0
1B 5 B 7 ,B 4 B 6 ,B 1 B 3 ,B 0 B 2
10Wordxx00B 7 B 5 B 6 B 4 ,B 3 B 1 B 2 B 0
1B 5 B 7 B 4 B 6 ,B 1 B 3 B 0 B 2
01B 6 B 4 B 7 B 5 ,B 2 B 0 B 3 B 1
1B 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.

19.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:

Caution: The user must not assign a same input hardware peripheral GPDMA request via GPDMA_CxTR.REQSEL[7: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, plus GPDMA_CxTR3, GPDMA_CxBR2). 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 (possibly 2D/repeated) 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 110 , is defined by:

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.

Each requested single/burst transfer within this class is round-robin arbitrated, with a weight that is monotonically driven from the programmed priority:

Figure 110. GPDMA arbitration policy

Diagram of GPDMA arbitration policy showing four queues (Queue 0 to Queue 3) receiving requests from channels with different priorities. Queue 0, 1, and 2 are connected to a Round-Robin Arbiter (RRA), which then connects to a Fixed-Priority Arbiter (FPA). Queue 3 is connected directly to the FPA. The FPA outputs the granted request. A legend indicates RRA = round-robin arbitration, FPA = fixed-priority arbitration. The diagram is labeled MSv63647V1.

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

Diagram of GPDMA arbitration policy showing four queues (Queue 0 to Queue 3) receiving requests from channels with different priorities. Queue 0, 1, and 2 are connected to a Round-Robin Arbiter (RRA), which then connects to a Fixed-Priority Arbiter (FPA). Queue 3 is connected directly to the FPA. The FPA outputs the granted request. A legend indicates RRA = round-robin arbitration, FPA = fixed-priority arbitration. The diagram is labeled MSv63647V1.

GPDMA arbitration and bandwidth

With this arbitration policy, the following is guaranteed:

The two following examples highlight that the weighted round-robin arbitration is driven by the programmed priorities:

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.

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:

As \( B_{Q3} \) is the reserved bandwidth to time-sensitive requests, the bandwidth for each request L with priority 3 is:

The bandwidth for each non-time sensitive queue is:

The bandwidth for the set of requests with priority 0 is:

The bandwidth for each request i with priority 0 is:

The bandwidth for the set of requests with priority 1 and routed to queue 0 is:

The bandwidth for the set of requests with priority 1 and routed to queue 1 is:

The total bandwidth for the set of requests with priority 1 is:

The bandwidth for each request j with priority 1 is:

The bandwidth for the set of requests with priority 2 and routed to queue 0 is:

The bandwidth for the set of requests with priority 2 and routed to queue 1 is:

The bandwidth for the set of requests with priority 2 and routed to queue 2 is:

The total bandwidth for the set of requests with priority 2 is:

The bandwidth for each request k with priority 2 is:

Thus finally the maximum allocated residual bandwidths for any i, j, k non-time sensitive request are:

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.

19.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[6:0] (see Section 19.3.6 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, the first burst read of a 2D/repeated block for channel x ( \( x = 12 \) to \( 15 \) ), 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[6: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[6: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 111 illustrates the trigger hit, memorization and overrun in the configuration example with a block-level trigger mode and a rising edge trigger polarity.

Figure 111. Trigger hit, memorization, and overrun waveform

Figure 111. Trigger hit, memorization, and overrun waveform. This timing diagram shows the relationship between Channel state, Trigger, Peripheral request, DMA transfer, Trigger monitoring state, Trigger monitoring action, and Trigger overrun over time. The Channel state starts in IDLE and becomes ACTIVE. The Trigger line shows several rising edges. The Peripheral request line shows a series of pulses. The DMA transfer line shows three block transfers. The Trigger monitoring state starts in Idle, becomes Active (monitoring) after the first trigger, and then transitions between Active and Idle based on trigger events. The Trigger monitoring action shows 'Hit and fire', 'Hit and memorize', 'Fire', 'Hit and trash', and 'Fire' events. The Trigger overrun line shows a pulse when a second trigger hit occurs while the channel is still active.

The waveform illustrates the following sequence of events:

Legend:

MSV66923V1

Figure 111. Trigger hit, memorization, and overrun waveform. This timing diagram shows the relationship between Channel state, Trigger, Peripheral request, DMA transfer, Trigger monitoring state, Trigger monitoring action, and Trigger overrun over time. The Channel state starts in IDLE and becomes ACTIVE. The Trigger line shows several rising edges. The Peripheral request line shows a series of pulses. The DMA transfer line shows three block transfers. The Trigger monitoring state starts in Idle, becomes Active (monitoring) after the first trigger, and then transitions between Active and Idle based on trigger events. The Trigger monitoring action shows 'Hit and fire', 'Hit and memorize', 'Fire', 'Hit and trash', and 'Fire' events. The Trigger overrun line shows a pulse when a second trigger hit occurs while the channel is still active.

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.

19.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 112 illustrates this programming with a linear addressing GPDMA channel and a source circular buffer.

Figure 112. GPDMA circular buffer programming: update of the memory start address with a linear addressing channel

Diagram illustrating GPDMA circular buffer programming with a linear addressing channel. The diagram shows a Channel x with two linked-list items: Init/LLI0 and Restore SAR/LLI1. Init/LLI0 is triggered by a peripheral request (Req=PERIPH_TX) and a reset signal. Restore SAR/LLI1 is triggered by a peripheral request (Req=PERIPH_TX) and a 'Ht+ tcf' signal from Init/LLI0. The Init/LLI0 item points to a 'Linked-list register file' containing DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The Restore SAR/LLI1 item points to a 'Memory' block containing LLI1 and DMA_CxSAR. The DMA_CxSAR register is updated with CxLBA (LA = 0), USA = 1, and others Uxx = 0. The diagram is labeled MSv62640V1.
Diagram illustrating GPDMA circular buffer programming with a linear addressing channel. The diagram shows a Channel x with two linked-list items: Init/LLI0 and Restore SAR/LLI1. Init/LLI0 is triggered by a peripheral request (Req=PERIPH_TX) and a reset signal. Restore SAR/LLI1 is triggered by a peripheral request (Req=PERIPH_TX) and a 'Ht+ tcf' signal from Init/LLI0. The Init/LLI0 item points to a 'Linked-list register file' containing DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The Restore SAR/LLI1 item points to a 'Memory' block containing LLI1 and DMA_CxSAR. The DMA_CxSAR register is updated with CxLBA (LA = 0), USA = 1, and others Uxx = 0. The diagram is labeled MSv62640V1.

Note:

With a 2D addressing channel, the user may use a single LLI with GPDMA_CxBR1.BRC[10:0] = 1, and program a negative memory block address offset with GPDMA_CxBR2 and GPDMA_CxBR1, in order to jump back to the memory source or the destination start address.

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 113 illustrates this programming with a linear addressing shared GPDMA channel, and a source circular buffer.

Figure 113. Shared GPDMA channel with circular buffering: update of the memory start address with a linear addressing channel

Diagram illustrating the shared GPDMA channel with circular buffering. The top part shows Channel X with a sequence of Link Lists (LL) starting from Init/LL0, followed by LL1, ..., LLN-1, and LLN. The LLN-1 and LLN lists are triggered by 'Req=PERIPH_TX' signals. The bottom part shows the Memory structure with two Link List blocks: LLN-2 and LLN-1. LLN-2 contains DMA_Cx... entries and DMA_CxLLR. LLN-1 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR in LLN-2 points to the start of LLN-1. The DMA_CxSAR in LLN-1 points to the start of LLN-2. The diagram also indicates 'All Uxx=1' and 'USA = 1, others Uxx = 0 LA+ = 0xC'. The MSV62641V1 identifier is present in the bottom right corner.
Diagram illustrating the shared GPDMA channel with circular buffering. The top part shows Channel X with a sequence of Link Lists (LL) starting from Init/LL0, followed by LL1, ..., LLN-1, and LLN. The LLN-1 and LLN lists are triggered by 'Req=PERIPH_TX' signals. The bottom part shows the Memory structure with two Link List blocks: LLN-2 and LLN-1. LLN-2 contains DMA_Cx... entries and DMA_CxLLR. LLN-1 contains DMA_CxTR1, DMA_CxTR2, DMA_CxBR1, DMA_CxSAR, DMA_CxDAR, and DMA_CxLLR. The DMA_CxLLR in LLN-2 points to the start of LLN-1. The DMA_CxSAR in LLN-1 points to the start of LLN-2. The diagram also indicates 'All Uxx=1' and 'USA = 1, others Uxx = 0 LA+ = 0xC'. The MSV62641V1 identifier is present in the bottom right corner.

19.4.14 GPDMA transfer in peripheral flow-control mode

A peripheral with the peripheral flow-control mode feature can decide to early terminate a GPDMA block transfer, provided that the allocated channel is implemented with this feature (see Section 19.3.5 ).

If the related GPDMA channel x is also programmed in peripheral flow-control mode (GPDMA_CxTR2.PFREQ = 1):

In peripheral flow-control mode:

19.4.15 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:

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.

19.4.16 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:

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.

19.4.17 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:

On a tentative update of a GPDMA channel register from the programmed LLI in the memory:

User setting error

On a tentative execution of a GPDMA transfer with an unauthorized user setting:

19.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.

19.6 GPDMA in low-power modes

Table 105. Effect of low-power modes on GPDMA

ModeDescription
SleepNo effect. GPDMA interrupts cause the device to exit Sleep mode.
Stop (1)The content of the GPDMA registers is kept when entering Stop mode.
StandbyThe GPDMA is powered down and must be reinitialized after exiting Standby mode.

1. Refer to Section 19.3.2 to know if any Stop mode is supported.

19.7 GPDMA interrupts

There is one GPDMA interrupt line for each channel, and separately for each CPU (if several ones in the devices).

Table 106. GPDMA interrupt requests

Interrupt acronymInterrupt eventInterrupt enableEvent flagEvent clear method
GPDMA_CHxTransfer completeGPDMA_CxCR.TCIEGPDMA_CxSR.TCFWrite 1 to GPDMA_CxFCR.TCF
Half transferGPDMA_CxCR.HTIEGPDMA_CxSR.HTFWrite 1 to GPDMA_CxFCR.HTF
Data transfer errorGPDMA_CxCR.DTEIEGPDMA_CxSR.DTEFWrite 1 to GPDMA_CxFCR.DTEF
Update link errorGPDMA_CxCR.ULEIEGPDMA_CxSR.ULEFWrite 1 to GPDMA_CxFCR.ULEF
User setting errorGPDMA_CxCR.USEIEGPDMA_CxSR.USEFWrite 1 to GPDMA_CxFCR.USEF
SuspendedGPDMA_CxCR.SUSPIEGPDMA_CxSR.SUSPFWrite 1 to GPDMA_CxFCR.SUSPF
Trigger overrunGPDMA_CxCR.TOFIEGPDMA_CxSR.TOFWrite 1 to GPDMA_CxFCR.TOF

A GPDMA channel x event may be:

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:

TCF (transfer complete) and HTF (half transfer) events generation is controlled by GPDMA_CxTR2.TCEM[1:0] as follows:

See GPDMA channel x transfer register 2 (GPDMA_CxTR2) for more details.

A transfer error rises in one of the following situations:

A trigger overrun is described in Trigger hit memorization and trigger overrun flag generation .

19.8 GPDMA registers

The GPDMA registers must be accessed with an aligned 32-bit word data access.

19.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.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
SEC15SEC14SEC13SEC12SEC11SEC10SEC9SEC8SEC7SEC6SEC5SEC4SEC3SEC2SEC1SEC0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 SECx : secure state of channel x (x = 15 to 0)

0: Nonsecure

1: Secure

19.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.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
PRIV15PRIV14PRIV13PRIV12PRIV11PRIV10PRIV9PRIV8PRIV7PRIV6PRIV5PRIV4PRIV3PRIV2PRIV1PRIV0
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 PRIVx : privileged state of channel x (x = 15 to 0)

0: unprivileged

1: privileged

19.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, GPDMA_CxPRIVCFGR for any channel x, for example at boot time).

A read access may be privileged or unprivileged, secure or nonsecure.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
LOCK15LOCK14LOCK13LOCK12LOCK11LOCK10LOCK9LOCK8LOCK7LOCK6LOCK5LOCK4LOCK3LOCK2LOCK1LOCK0
rsrsrsrsrsrsrsrsrsrsrsrsrsrsrsrs

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 LOCKx : lock the configuration of GPDMA_SECCFGR.SECx, GPDMA_PRIVCFGR.PRIVx until a global GPDMA reset (x = 15 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.

19.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.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
MIS15MIS14MIS13MIS12MIS11MIS10MIS9MIS8MIS7MIS6MIS5MIS4MIS3MIS2MIS1MIS0
rrrrrrrrrrrrrrrr

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 MISx : masked interrupt status of channel x (x = 15 to 0)

0: no interrupt occurred on channel x

1: an interrupt occurred on channel x

19.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.

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
MIS15MIS14MIS13MIS12MIS11MIS10MIS9MIS8MIS7MIS6MIS5MIS4MIS3MIS2MIS1MIS0
rrrrrrrrrrrrrrrr

Bits 31:16 Reserved, must be kept at reset value.

Bits 15:0 MISx : masked interrupt status of the secure channel x (x = 15 to 0)

0: no interrupt occurred on the secure channel x

1: an interrupt occurred on the secure channel x

19.8.6 GPDMA channel x linked-list base address register (GPDMA_CxLBAR)

Address offset: 0x50 + 0x80 * x (x = 0 to 15)

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.

31302928272625242322212019181716
LBA[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
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.

19.8.7 GPDMA channel x flag clear register (GPDMA_CxFCR)

Address offset: 0x5C+ 0x80 * x (x = 0 to 15)

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).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
Res.TOFSUSPFUSEFULEFDTEFHTFTCFRes.Res.Res.Res.Res.Res.Res.Res.
wwwwwww

Bits 31:15 Reserved, must be kept at reset value.

Bit 14 TOF : trigger overrun flag clear

Bit 13 SUSPF : completed suspension flag clear

Bit 12 USEF : user setting error flag clear

Bit 11 ULEF : update link transfer error flag clear

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.

19.8.8 GPDMA channel x status register (GPDMA_CxSR)

Address offset: 0x60 + 0x80 * x (x = 0 to 15)

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 unprivileged, depending on the privileged state of the channel (GPDMA_PRIVCFGR.PRIVx).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.FIFOL[7:0]
rrrrrrrr
1514131211109876543210
Res.TOFSUSPFUSEFULEFDTEFHTFTCFRes.Res.Res.Res.Res.Res.Res.IDLEF
rrrrrrrr

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

Bit 10 DTEF : data transfer error flag

Bit 9 HTF : half-transfer flag

A half-transfer event is either a half-block transfer or a half 2D/repeated block transfer, depending on the transfer complete event mode (GPDMA_CxTR2.TCEM[1:0]).

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.

A half 2D/repeated block transfer occurs when half of the repeated blocks (rounded up integer of \( (GPDMA\_CxBR1.BRC[10:0] + 1) / 2 \) ) has been transferred to the destination.

Bit 8 TCF : transfer complete flag

A transfer complete event is either a block transfer complete, a 2D/repeated 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

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).

19.8.9 GPDMA channel x control register (GPDMA_CxCR)

Address offset: 0x64 + 0x80 * x (x = 0 to 15)

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).

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.PRIO[1:0]Res.Res.Res.Res.LAPLSM
rwrwrwrw

1514131211109876543210
Res.TOIESUSPIEUSEIEULEIEDTEIEHTIETCIERes.Res.Res.Res.Res.SUSPRESETEN
rwrwrwrwrwrwrwrwwrw

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

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.

Note: This bit must be written when EN = 0. This bit is read-only when EN = 1.

Bit 16 LSM : Link step mode

First the (possible 1D/repeated) block transfer is executed as defined by the current internal register file until GPDMA_CxBR1.BNDT[15:0] = 0 and GPDMA_CxBR1.BRC[10: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

Bit 13 SUSPIE : completed suspension interrupt enable

Bit 12 USEIE : user setting error interrupt enable

Bit 11 ULEIE : update link transfer error interrupt enable

Bit 10 DTEIE : data transfer error interrupt enable

Bit 9 HTIE : half-transfer complete interrupt enable

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 95 .

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 96 ).

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

19.8.10 GPDMA channel x transfer register 1 (GPDMA_CxTR1)

Address offset: 0x90 + 0x80 * x (x = 0 to 15)

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 unprivileged, 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: block, 2D/repeated block, 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.

31302928272625242322212019181716
DSECDAPRes.Res.DHXDBXDBL_1[5:0]DINCRes.DDW_LOG2[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrw

1514131211109876543210
SSECSAPSBXPAM[1:0]Res.SBL_1[5:0]SINCRes.SDW_LOG2[1:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

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

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

Note: If the transfer from the source peripheral is configured with peripheral flow-control mode ( \( SWREQ = 0 \) and \( PFREQ = 1 \) and \( DREQ = 0 \) ), and if the destination data width > the source data width, packing is not supported.

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

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.

19.8.11 GPDMA channel x transfer register 2 (GPDMA_CxTR2)

Address offset: 0x94 + 0x80 * x (x = 0 to 15)

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.

31302928272625242322212019181716
TCEM[1:0]Res.TRIGPOL[1:0]Res.TRIGSEL[6:0]
rwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
TRIGM[1:0]Res.PFREQBREQDREQSWREQRes.REQSEL[7:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrw
Bits 31:30 TCEM[1:0] : transfer complete event mode

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 11), same as 00, channel x (x = 12 to 15), at 2D/repeated block level (when GPDMA_CxBR1.BRC[10:0] = 0 and GPDMA_CxBR1.BNDT[15:0] = 0). The complete (and the half) transfer event is generated at the end (respectively half of the end) of the 2D/repeated 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.

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. The LLI data transfer is a block transfer or a 2D/repeated block transfer for channel x (x = 12 to 15), if any 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, plus UT3 and UB2). 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 polarity

These bits define the polarity of the selected trigger event input defined by TRIGSEL[6:0].

00: no trigger (masked trigger event)

01: trigger on the rising edge

10: trigger on the falling edge

11: same as 00

Bit 23 Reserved, must be kept at reset value.

Bits 22:16 TRIGSEL[6:0] : trigger event input selection

These bits select the trigger event input of the GPDMA transfer (as per Section 19.3.6 ), 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 one trigger hit:

00: at block level: the first burst read of each block transfer is conditioned by one hit trigger (channel \( x \) ( \( x = 12 \) to \( 15 \) ): same, each block also if a 2D/repeated block is configured with GPDMA_CxBR1.BRC[10:0] \( \neq 0 \) ).

01: channel \( x \) ( \( x = 0 \) to \( 11 \) ): same as 00; channel \( x \) ( \( x = 12 \) to \( 15 \) ): at 2D/repeated block level: the first burst read of the 2D/repeated block transfer is conditioned by one hit trigger.

10: at link level: a LLI link transfer is conditioned by one hit trigger. LLI data transfer 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:

As shown in Figure 111: Trigger hit, memorization, and overrun waveform , 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[6:0] is not modified, and the channel is enabled. 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.

Transferring a next LLI n+1 that updates the GPDMA_CxTR2 with a new value for any of TRIGSEL[6:0] or TRIGPOL[1:0], resets the monitoring, trashing the memorized hit of the formerly defined LLI n trigger.

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.

Bit 13 Reserved, must be kept at reset value.

Bit 12 PFREQ : Hardware request in peripheral flow control mode

Important: If a given channel x is not implemented with this feature, this bit is reserved and PFREQ is not present (see Section 19.3.1 for the list of the implemented channels with this feature).

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 in GPDMA control mode. The GPDMA is programmed with GPDMA_CxTR1.BNDT[15:0] and this is internally used by the hardware for the block transfer completion.

1: the selected hardware request is driven by a peripheral with a hardware request/acknowledge protocol in peripheral control mode. The GPDMA block transfer can be early completed by the peripheral itself (see Section 19.3.5 for more details).

Note: In peripheral flow control mode, there are the following restrictions:

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 19.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: If the channel x is activated (GPDMA_CxCR.EN is asserted) with SWREQ = 0 and PFREQ = 1 (peripheral hardware request with peripheral flow-control mode), any software assertion to this DREQ bit is ignored: in peripheral flow-control mode, only a peripheral-to-memory transfer is supported.

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[7:0] is taken into account.

1: software request for a memory-to-memory transfer. The default selected hardware request as per REQSEL[7:0] is ignored.

Bit 8 Reserved, must be kept at reset value.

Bits 7:0 REQSEL[7: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 19.3.3 .

Caution: The user must not assign a same input hardware request (same REQSEL[7: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.

19.8.12 GPDMA channel x block register 1 (GPDMA_CxBR1)

Address offset: 0x98 + 0x80 * x (x = 0 to 11)

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 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:

31302928272625242322212019181716
Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
1514131211109876543210
BNDT[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

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 with 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.

19.8.13 GPDMA channel x alternate block register 1 (GPDMA_CxBR1)

Address offset: 0x98 + 0x80 * x (x = 12 to 15)

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 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:

automatically and internally restored with the programmed value for the fields BNDT[15:0] and BRC[10:0] after each execution of this final LLI

31302928272625242322212019181716
BRDDEC
C
BRSDC
C
DDECSDECRes.BRC[10:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
BNDT[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bit 31 BRDDEC: Block repeat destination address decrement

0: at the end of a block transfer, the GPDMA_CxDAR register is updated by adding the programmed offset GPDMA_CxBR2.BRDAO to the current GPDMA_CxDAR value (current destination address)

1: at the end of a block transfer, the GPDMA_CxDAR register is updated by subtracting the programmed offset GPDMA_CxBR2.BRDAO from the current GPDMA_CxDAR value (current destination address)

Note: On top of this increment/decrement (depending on BRDDEC), GPDMA_CxDAR is in the same time also updated by the increment/decrement (depending on DDEC) of the GPDMA_CxTR3.DAO value, as it is usually done at the end of each programmed burst transfer.

Bit 30 BRSDC: Block repeat source address decrement

0: at the end of a block transfer, the GPDMA_CxSAR register is updated by adding the programmed offset GPDMA_CxBR2.BRSAO to the current GPDMA_CxSAR value (current source address)

1: at the end of a block transfer, the GPDMA_CxSAR register is updated by subtracting the programmed offset GPDMA_CxBR2.BRSAO from the current GPDMA_CxSAR value (current source address)

Note: On top of this increment/decrement (depending on BRSDC), GPDMA_CxSAR is in the same time also updated by the increment/decrement (depending on SDEC) of the GPDMA_CxTR3.SAO value, as it is done after any programmed burst transfer.

Bit 29 DDEC: destination address decrement

0: At the end of a programmed burst transfer to the destination, the GPDMA_CxDAR register is updated by adding the programmed offset GPDMA_CxTR3.DAO to the current GPDMA_CxDAR value (current destination address)

1: At the end of a programmed burst transfer to the destination, the GPDMA_CxDAR register is updated by subtracting the programmed offset GPDMA_CxTR3.DAO to the current GPDMA_CxDAR value (current destination address)

Bit 28 SDEC: source address decrement

0: At the end of a programmed burst transfer from the source, the GPDMA_CxSAR register is updated by adding the programmed offset GPDMA_CxTR3.SAO to the current GPDMA_CxSAR value (current source address)

1: At the end of a programmed burst transfer from the source, the GPDMA_CxSAR register is updated by subtracting the programmed offset GPDMA_CxTR3.SAO to the current GPDMA_CxSAR value (current source address)

Bit 27 Reserved, must be kept at reset value.

Bits 26:16 BRC[10:0] : Block repeat counter

This field contains the number of repetitions of the current block (0 to 2047).

When the channel is enabled, this field becomes read-only. After decrements, this field indicates the remaining number of blocks, excluding the current one. This counter is hardware decremented for each completed block transfer.

Once the last block transfer is completed ( \( BRC[10:0] = BNDT[15:0] = 0 \) ):

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 \) ):

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.

19.8.14 GPDMA channel x source address register (GPDMA_CxSAR)

Address offset: \( 0x9C + 0x80 \times x \) ( \( x = 0 \) to \( 15 \) )

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: block, 2D/repeated block, 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 \) .

31302928272625242322212019181716
SA[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
SA[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
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:

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.

Note: 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.

When the source block size is not a multiple of the source burst size and is a multiple of the source data width, the last programmed source burst is not completed and is internally shorten to match the block size. In this case, the additional GPDMA_CxTR3.SAO[12:0] is not applied.

19.8.15 GPDMA channel x destination address register (GPDMA_CxDAR)

Address offset: \( 0xA0 + 0x80 \cdot x \) ( \( x = 0 \) to \( 15 \) )

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: block, 2D/repeated block, 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.

31302928272625242322212019181716
DA[31:16]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
DA[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

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:

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.

19.8.16 GPDMA channel x transfer register 3 (GPDMA_CxTR3)

Address offset: 0xA4 + 0x80 * x (x = 12 to 15)

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 (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.UT3 = 1.

31302928272625242322212019181716
Res.Res.Res.DAO[12:0]
rwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
Res.Res.Res.SAO[12:0]
rwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:29 Reserved, must be kept at reset value.

Bits 28:16 DAO[12:0] : destination address offset increment

The destination address, pointed by GPDMA_CxDAR, is incremented or decremented (depending on GPDMA_CxBR1.DDEC) by this offset DAO[12:0] for each programmed destination burst. This offset is not including and is added to the programmed burst size when the completed burst is addressed in incremented mode (GPDMA_CxTR1.DINC = 1).

Note: A destination address offset must be aligned with the programmed data width of a destination burst (DAO[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0]). Else, a user setting error is reported and no transfer is issued.

Bits 15:13 Reserved, must be kept at reset value.

Bits 12:0 SAO[12:0] : source address offset increment

The source address, pointed by GPDMA_CxSAR, is incremented or decremented (depending on GPDMA_CxBR1.SDEC) by this offset SAO[12:0] for each programmed source burst. This offset is not including and is added to the programmed burst size when the completed burst is addressed in incremented mode (GPDMA_CxTR1.SINC = 1).

Note: A source address offset must be aligned with the programmed data width of a source burst (SAO[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0]). Else a user setting error is reported and none transfer is issued.

When the source block size is not a multiple of the destination 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, the additional GPDMA_CxTR3.SAO[12:0] is not applied.

19.8.17 GPDMA channel x block register 2 (GPDMA_CxBR2)

Address offset: \( 0xA8 + 0x80 * x \) ( \( x = 12 \) to \( 15 \) )

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 at a 2D/repeated 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 the channel is completed (then the hardware has deasserted GPDMA_CxCR.EN). A channel transfer can be completed and programmed at different levels: block, 2D/repeated block, 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.UB2 = 1.

31302928272625242322212019181716
BRDAO[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
1514131211109876543210
BRSAO[15:0]
rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw

Bits 31:16 BRDAO[15:0] : Block repeated destination address offset

For a channel with 2D addressing capability, this field is used to update (by addition or subtraction depending on GPDMA_CxBR1.BRDDEC) the current destination address (GPDMA_CxDAR) at the end of a block transfer.

Note: A block repeated destination address offset must be aligned with the programmed data width of a destination burst (BRDAO[2:0] versus GPDMA_CxTR1.DDW_LOG2[1:0]). Else a user setting error is reported and no transfer is issued. BRDAO[15:0] must be set to 0 in peripheral flow-control mode (if GPDMA_CxTR2.PFREQ = 1).

Bits 15:0 BRSAO[15:0] : Block repeated source address offset

For a channel with 2D addressing capability, this field is used to update (by addition or subtraction depending on GPDMA_CxBR1.BRSDEC) the current source address (GPDMA_CxSAR) at the end of a block transfer.

Note: A block repeated source address offset must be aligned with the programmed data width of a source burst (BRSAO[2:0] versus GPDMA_CxTR1.SDW_LOG2[1:0]). Else a user setting error is reported and no transfer is issued. BRSAO[15:0] must be set to 0 in peripheral flow-control mode (if GPDMA_CxTR2.PFREQ = 1).

19.8.18 GPDMA channel x linked-list address register (GPDMA_CxLLR)

Address offset: \( 0xCC + 0x80 * x \) ( \( x = 0 \) to \( 11 \) )

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.

31302928272625242322212019181716
UT1UT2UB1USAUDARes.Res.Res.Res.Res.Res.Res.Res.Res.Res.ULL
rwrwrwrwrwrw
1514131211109876543210
LA[15:2]Res.Res.
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

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).

Caution: The user must program this pointer not to exceed the 64-Kbyte addressable space defined by the link base address register GPDMA_CxLBAR. The complete linked-list data structure must be included in the 64-Kbyte addressable space.

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.

19.8.19 GPDMA channel x alternate linked-list address register (GPDMA_CxLLR)

Address offset: 0xCC + 0x80 * x (x = 12 to 15)

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.

31302928272625242322212019181716
UT1UT2UB1USAUDAUT3UB2Res.Res.Res.Res.Res.Res.Res.Res.ULL
rwrwrwrwrwrwrwrw
1514131211109876543210
LA[15:2]Res.Res.
rwrwrwrwrwrwrwrwrwrwrwrwrwrw

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

Bit 26 UT3 : Update GPDMA_CxTR3 from memory

This bit controls the update of GPDMA_CxTR3 from the memory during the link transfer.
0: no GPDMA_CxTR3 update
1: GPDMA_CxTR3 update

Bit 25 UB2 : Update GPDMA_CxBR2 from memory

This bit controls the update of GPDMA_CxBR2 from the memory during the link transfer.
0: no GPDMA_CxBR2 update
1: GPDMA_CxBR2 update

Bits 24: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).

Caution: The user must program this pointer not to exceed the 64-Kbyte addressable space defined by the link base address register GPDMA_CxLBAR. The complete linked-list data structure must be included in the 64-Kbyte addressable space.

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.

19.8.20 GPDMA register map

Table 107. GPDMA register map and reset values

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x00GPDMA_SECCFGRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.SEC15SEC14SEC13SEC12SEC11SEC10SEC9SEC8SEC7SEC6SEC5SEC4SEC3SEC2SEC1SEC0
Reset value0000000000000000
0x04GPDMA_PRIVCFGRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.PRIV15PRIV14PRIV13PRIV12PRIV11PRIV10PRIV9PRIV8PRIV7PRIV6PRIV5PRIV4PRIV3PRIV2PRIV1PRIV0
Reset value0000000000000000

Table 107. GPDMA register map and reset values (continued)

OffsetRegister name313029282726252423222120191817161514131211109876543210
0x08GPDMA_RCFGLOCKRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.LOCK15LOCK14LOCK13LOCK12LOCK11LOCK10LOCK9LOCK8LOCK7LOCK6LOCK5LOCK4LOCK3LOCK2LOCK1LOCK0
Reset value0000000000000000
0x0CGPDMA_MISRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MIS15MIS14MIS13MIS12MIS11MIS10MIS9MIS8MIS7MIS6MIS5MIS4MIS3MIS2MIS1MIS0
Reset value0000000000000000
0x10GPDMA_SMISRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.MIS15MIS14MIS13MIS12MIS11MIS10MIS9MIS8MIS7MIS6MIS5MIS4MIS3MIS2MIS1MIS0
Reset value0000000000000000
0x14 - 0x4CReservedReserved
0x50+0x80 * x
(x = 0 to 15)
GPDMA_CxLBARLBA[31:16]Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value0000000000000000
0x5C+0x80 * x
(x = 0 to 15)
GPDMA_CxFCRRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.TOFSUSPFUSEFULEFDTEFHTFTCFRes.Res.Res.Res.Res.Res.Res.Res.Res.Res.
Reset value0000000
0x60+0x80 * x
(x = 0 to 15)
GPDMA_CxSRRes.Res.Res.Res.Res.Res.Res.Res.FIFOL[7:0]Res.TOFSUSPFUSEFULEFDTEFHTFTCFRes.Res.Res.Res.Res.Res.Res.Res.IDLEF
Reset value0000000000000001
0x64+0x80 * x
(x = 0 to 15)
GPDMA_CxCRRes.Res.Res.Res.Res.Res.Res.Res.PRIO [1:0]Res.Res.Res.Res.LAPLSMRes.TOIESUSPIEUSEIEULEIEDTEIEHTIETCIERes.Res.Res.Res.Res.Res.SUSPRESETEN
Reset value00000000000000
0x90+0x80 * x
(x = 0 to 15)
GPDMA_CxTR1DSECDAPRes.Res.DHXDBXDBL_1[5:0]DINCDDW_LOG2 [1:0]Res.SSECSAPSBXPAM[1:0]Res.SBL_1[5:0]SINCRes.SDW_LOG2 [1:0]
Reset value000000000000000000000000000
0x94+0x80 * x
(x = 0 to 15)
GPDMA_CxTR2TCEM [1:0]Res.Res.Res.Res.TRIGPOL [1:0]Res.TRIGSEL[6:0]TRIGM [1:0]Res.PFREQBREQDREQSWREQRes.REQSEL[7:0]
Reset value0000000000000000000000000
0x98+0x80 * x
(x = 0 to 11)
GPDMA_CxBR1Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.Res.BNDT[15:0]
Reset value0000000000000000
0x98+0x80 * x
(x = 12 to 15)
GPDMA_CxBR1BRDDECBRSDDECDDECSDECRes.BRC[10:0]BNDT[15:0]
Reset value0000000000000000000000000000000
0x9C+0x80 * x
(x = 0 to 15)
GPDMA_CxSARSA[31:0]
Reset value00000000000000000000000000000000
0xA0+0x80 * x
(x = 0 to 15)
GPDMA_CxDARDA[31:0]
Reset value00000000000000000000000000000000
0xA4+0x80 * x
(x = 12 to 15)
GPDMA_CxTR3Res.Res.Res.DAO[12:0]Res.Res.Res.SAO[12:0]
Reset value00000000000000000000000000
0xA8+0x80 * x
(x = 12 to 15)
GPDMA_CxBR2BRDAO[15:0]BRSAO[15:0]
Reset value00000000000000000000000000000000
0xCC+0x80 * x
(x = 0 to 11)
GPDMA_CxLLRUT1UT2UB1USAUDARes.Res.Res.Res.Res.Res.Res.Res.Res.Res.ULLLA[15:2]Res.Res.
Reset value0000000000000000000
0xCC+0x80 * x
(x = 12 to 15)
GPDMA_CxLLRUT1UT2UB1USAUDAUT3UB2Res.Res.Res.Res.Res.Res.Res.Res.ULLLA[15:2]Res.Res.
Reset value000000000000000000000

Refer to Section 2.3: Memory organization for the register boundary addresses.