1use crate::stm32::DMAMUX;
2
3pub trait DmaMuxExt {
5 type Channels;
7
8 fn split(self) -> Self::Channels;
10}
11
12pub enum DmaMuxIndex {
13 dmamux_req_gen0 = 0,
14 dmamux_req_gen1 = 1,
15 dmamux_req_gen2 = 2,
16 dmamux_req_gen3 = 3,
17 ADC = 5,
18
19 #[cfg(any(feature = "stm32g041", feature = "stm32g081"))]
20 AES_IN = 6,
21 #[cfg(any(feature = "stm32g041", feature = "stm32g081"))]
22 AES_OUT = 7,
23 #[cfg(feature = "stm32g0x1")]
24 DAC_Channel1 = 8,
25 #[cfg(feature = "stm32g0x1")]
26 DAC_Channel2 = 9,
27
28 I2C1_RX = 10,
29 I2C1_TX = 11,
30 I2C2_RX = 12,
31 I2C2_TX = 13,
32
33 #[cfg(feature = "stm32g0x1")]
34 LPUART_RX = 14,
35 #[cfg(feature = "stm32g0x1")]
36 LPUART_TX = 15,
37
38 SPI1_RX = 16,
39 SPI1_TX = 17,
40 SPI2_RX = 18,
41 SPI2_TX = 19,
42
43 TIM1_CH1 = 20,
44 TIM1_CH2 = 21,
45 TIM1_CH3 = 22,
46 TIM1_CH4 = 23,
47 TIM1_TRIG_COM = 24,
48 TIM1_UP = 25,
49
50 #[cfg(feature = "stm32g0x1")]
51 TIM2_CH1 = 26,
52 #[cfg(feature = "stm32g0x1")]
53 TIM2_CH2 = 27,
54 #[cfg(feature = "stm32g0x1")]
55 TIM2_CH3 = 28,
56 #[cfg(feature = "stm32g0x1")]
57 TIM2_CH4 = 29,
58 #[cfg(feature = "stm32g0x1")]
59 TIM2_TRIG = 30,
60 #[cfg(feature = "stm32g0x1")]
61 TIM2_UP = 31,
62
63 TIM3_CH1 = 32,
64 TIM3_CH2 = 33,
65 TIM3_CH3 = 34,
66 TIM3_CH4 = 35,
67 TIM3_TRIG = 36,
68 TIM3_UP = 37,
69 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
70 TIM6_UP = 38,
71 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
72 TIM7_UP = 39,
73 TIM15_CH1 = 40,
74 TIM15_CH2 = 41,
75 TIM15_TRIG_COM = 42,
76 TIM15_UP = 43,
77 TIM16_CH1 = 44,
78 TIM16_COM = 45,
79 TIM16_UP = 46,
80 TIM17_CH1 = 47,
81 TIM17_COM = 48,
82 TIM17_UP = 49,
83
84 USART1_RX = 50,
85 USART1_TX = 51,
86 USART2_RX = 52,
87 USART2_TX = 53,
88 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
89 USART3_RX = 54,
90 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
91 USART3_TX = 55,
92 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
93 USART4_RX = 56,
94 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
95 USART4_TX = 57,
96
97 #[cfg(any(feature = "stm32g071", feature = "stm32g081"))]
98 UCPD1_RX = 58,
99 #[cfg(any(feature = "stm32g071", feature = "stm32g081"))]
100 UCPD1_TX = 59,
101 #[cfg(any(feature = "stm32g071", feature = "stm32g081"))]
102 UCPD2_RX = 60,
103 #[cfg(any(feature = "stm32g071", feature = "stm32g081"))]
104 UCPD2_TX = 61,
105}
106
107impl DmaMuxIndex {
108 pub fn val(self) -> u8 {
109 self as u8
110 }
111}
112
113pub enum DmaMuxTriggerSync {
114 EXTI_LINE0 = 0,
115 EXTI_LINE1 = 1,
116 EXTI_LINE2 = 2,
117 EXTI_LINE3 = 3,
118 EXTI_LINE4 = 4,
119 EXTI_LINE5 = 5,
120 EXTI_LINE6 = 6,
121 EXTI_LINE7 = 7,
122 EXTI_LINE8 = 8,
123 EXTI_LINE9 = 9,
124 EXTI_LINE10 = 10,
125 EXTI_LINE11 = 11,
126 EXTI_LINE12 = 12,
127 EXTI_LINE13 = 13,
128 EXTI_LINE14 = 14,
129 EXTI_LINE15 = 15,
130 dmamux_evt0 = 16,
131 dmamux_evt1 = 17,
132 dmamux_evt2 = 18,
133 dmamux_evt3 = 19,
134
135 #[cfg(feature = "stm32g0x1")]
136 LPTIM1_OUT = 20,
137 #[cfg(feature = "stm32g0x1")]
138 LPTIM2_OUT = 21,
139
140 TIM14_OC = 22,
141}
142impl DmaMuxTriggerSync {
143 pub fn val(self) -> u8 {
144 self as u8
145 }
146}
147
148pub trait DmaMuxChannel {
149 fn select_peripheral(&mut self, index: DmaMuxIndex);
150}
151
152macro_rules! dma_mux {
153 (
154 channels: {
155 $( $Ci:ident: ($chi:ident, $cr:ident), )+
156 },
157 ) => {
158
159 pub struct Channels {
161 $( pub $chi: $Ci, )+
162 }
163
164 $(
165 pub struct $Ci {
167 _0: (),
168 }
169
170 impl DmaMuxChannel for $Ci {
171 fn select_peripheral(&mut self, index: DmaMuxIndex) {
172 let reg = unsafe { &(*DMAMUX::ptr()).$cr };
173 reg.write( |w| unsafe {
174 w.dmareq_id().bits(index.val())
175 .ege().set_bit()
176 });
177
178 }
179 }
180 )+
181
182 }
183}
184
185#[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
186dma_mux!(
187 channels: {
188 C0: (ch0, dmamux_c0cr),
189 C1: (ch1, dmamux_c1cr),
190 C2: (ch2, dmamux_c2cr),
191 C3: (ch3, dmamux_c3cr),
192 C4: (ch4, dmamux_c4cr),
193 C5: (ch5, dmamux_c5cr),
194 C6: (ch6, dmamux_c6cr),
195 },
196);
197
198#[cfg(any(feature = "stm32g030", feature = "stm32g031", feature = "stm32g041"))]
199dma_mux!(
200 channels: {
201 C0: (ch0, c0cr),
202 C1: (ch1, c1cr),
203 C2: (ch2, c2cr),
204 C3: (ch3, c3cr),
205 C4: (ch4, c4cr),
206 },
207);
208
209impl DmaMuxExt for DMAMUX {
210 type Channels = Channels;
211
212 fn split(self) -> Self::Channels {
213 Channels {
214 ch0: C0 { _0: () },
215 ch1: C1 { _0: () },
216 ch2: C2 { _0: () },
217 ch3: C3 { _0: () },
218 ch4: C4 { _0: () },
219 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
220 ch5: C5 { _0: () },
221 #[cfg(any(feature = "stm32g070", feature = "stm32g071", feature = "stm32g081"))]
222 ch6: C6 { _0: () },
223 }
224 }
225}