25
25
#include <modm/architecture/interface/interrupt.hpp>
26
26
#include <modm/architecture/interface/register.hpp>
27
27
28
- %% if target["family"] == "f4"
28
+ %% if dmaType in ["stm32-stream-channel"]
29
29
%% set reg_prefix = "DMA_SxCR"
30
30
%% elif dmaType in ["stm32-channel-request", "stm32-channel", "stm32-mux"]
31
31
%% set reg_prefix = "DMA_CCR"
@@ -47,44 +47,47 @@ class DmaBase
47
47
{
48
48
public:
49
49
// Enums
50
- %% if target["family"] == "f4"
50
+ %% if dmaType in ["stm32-stream-channel"]
51
51
enum class
52
- Channel : uint32_t
52
+ Channel
53
53
{
54
- Channel0 = 0,
55
- Channel1 = DMA_SxCR_CHSEL_0,
56
- Channel2 = DMA_SxCR_CHSEL_1,
57
- Channel3 = DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0,
58
- Channel4 = DMA_SxCR_CHSEL_2,
59
- Channel5 = DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_0,
60
- Channel6 = DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1,
61
- Channel7 = DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0,
54
+ Stream0 = 0,
55
+ Stream1,
56
+ Stream2,
57
+ Stream3,
58
+ Stream4,
59
+ Stream5,
60
+ Stream6,
61
+ Stream7,
62
+ Channel0 = Stream0,
63
+ Channel1 = Stream1,
64
+ Channel2 = Stream2,
65
+ Channel3 = Stream3,
66
+ Channel4 = Stream4,
67
+ Channel5 = Stream5,
68
+ Channel6 = Stream6,
69
+ Channel7 = Stream7,
62
70
};
63
71
64
- enum class
65
- MemoryBurstTransfer : uint32_t
66
- {
67
- Single = 0,
68
- Increment4 = DMA_SxCR_MBURST_0,
69
- Increment8 = DMA_SxCR_MBURST_1,
70
- Increment16 = DMA_SxCR_MBURST_1 | DMA_SxCR_MBURST_0,
71
- };
72
+ %% set request_count = namespace(max_requests = 0)
73
+ %% for streams in dma["channels"]
74
+ %% for stream in streams.stream
75
+ %% for channel in stream.channel
76
+ %% if request_count.max_requests < channel.position | int
77
+ %% set request_count.max_requests = channel.position | int
78
+ %% endif
79
+ %% endfor
80
+ %% endfor
81
+ %% endfor
72
82
73
83
enum class
74
- PeripheralBurstTransfer : uint32_t
84
+ Request : uint32_t
75
85
{
76
- Single = 0,
77
- Increment4 = DMA_SxCR_PBURST_0,
78
- Increment8 = DMA_SxCR_PBURST_1,
79
- Increment16 = DMA_SxCR_PBURST_1 | DMA_SxCR_PBURST_0,
86
+ %% for i in range(0, request_count.max_requests + 1)
87
+ Channel{{ i }} = ({{ i }} << DMA_SxCR_CHSEL_Pos),
88
+ %% endfor
80
89
};
81
90
82
- enum class
83
- FlowControl : uint32_t
84
- {
85
- Dma = 0,
86
- Peripheral = DMA_SxCR_PFCTRL, ///< the peripheral is the flow controller
87
- };
88
91
%% elif dmaType in ["stm32-channel-request", "stm32-channel", "stm32-mux"]
89
92
enum class
90
93
Channel
@@ -189,7 +192,7 @@ public:
189
192
enum class
190
193
DataTransferDirection : uint32_t
191
194
{
192
- %% if target["family"] == "f4"
195
+ %% if dmaType in ["stm32-stream-channel"]
193
196
/// Source: DMA_SxPAR; Sink: DMA_SxM0AR
194
197
PeripheralToMemory = 0,
195
198
/// Source: DMA_SxM0AR; Sink: DMA_SxPAR
@@ -217,34 +220,62 @@ public:
217
220
%% endfor
218
221
};
219
222
220
- enum class Interrupt {
221
- Global = 0x01,
222
- TransferComplete = 0x02,
223
- HalfTransferComplete = 0x04,
224
- Error = 0x08,
225
- All = 0x0f,
223
+ %% if dmaType in ["stm32-stream-channel"]
224
+ enum class InterruptEnable {
225
+ DirectModeError = DMA_SxCR_DMEIE,
226
+ TransferError = DMA_SxCR_TEIE,
227
+ HalfTransfer = DMA_SxCR_HTIE,
228
+ TransferComplete = DMA_SxCR_TCIE,
229
+ };
230
+ MODM_FLAGS32(InterruptEnable);
231
+
232
+ enum class InterruptFlags {
233
+ FifoError = 0b00'0001,
234
+ DirectModeError = 0b00'0100,
235
+ Error = 0b00'1000,
236
+ HalfTransferComplete = 0b01'0000,
237
+ TransferComplete = 0b10'0000,
238
+ All = 0b11'1101,
239
+ Global = All,
226
240
};
227
- MODM_FLAGS32(Interrupt);
241
+ MODM_FLAGS32(InterruptFlags);
242
+ %% elif dmaType in ["stm32-channel-request", "stm32-channel", "stm32-mux"]
243
+ enum class InterruptEnable {
244
+ TransferComplete = DMA_CCR_TCIE,
245
+ HalfTransfer = DMA_CCR_HTIE,
246
+ TransferError = DMA_CCR_TEIE,
247
+ };
248
+ MODM_FLAGS32(InterruptEnable);
249
+
250
+ enum class InterruptFlags {
251
+ Global = 0b0001,
252
+ TransferComplete = 0b0010,
253
+ HalfTransferComplete = 0b0100,
254
+ Error = 0b1000,
255
+ All = 0b1111,
256
+ };
257
+ MODM_FLAGS32(InterruptFlags);
258
+ %% endif
228
259
229
260
using IrqHandler = void (*)(void);
230
261
231
262
protected:
232
- %% if target["family"] == "f4"
263
+ %% if dmaType in ["stm32-stream-channel"]
233
264
static constexpr uint32_t memoryMask =
234
- DMA_SxCR_MBURST_1 | DMA_SxCR_MBURST_0 | // MemoryBurstTransfer
235
- DMA_SxCR_MSIZE_0 | DMA_SxCR_MSIZE_1 | // MemoryDataSize
236
- DMA_SxCR_MINC | // MemoryIncrementMode
237
- DMA_SxCR_DIR_0 | DMA_SxCR_DIR_1 ; // DataTransferDirection
265
+ DMA_SxCR_MBURST_Msk | // MemoryBurstTransfer
266
+ DMA_SxCR_MSIZE_Msk | // MemoryDataSize
267
+ DMA_SxCR_MINC | // MemoryIncrementMode
268
+ DMA_SxCR_DIR_Msk ; // DataTransferDirection
238
269
static constexpr uint32_t peripheralMask =
239
- DMA_SxCR_PBURST_1 | DMA_SxCR_PBURST_0 | // PeripheralBurstTransfer
240
- DMA_SxCR_PSIZE_0 | DMA_SxCR_PSIZE_1 | // PeripheralDataSize
241
- DMA_SxCR_PINC | // PeripheralIncrementMode
242
- DMA_SxCR_DIR_0 | DMA_SxCR_DIR_1; // DataTransferDirection
270
+ DMA_SxCR_PBURST_Msk | // PeripheralBurstTransfer
271
+ DMA_SxCR_PSIZE_Msk | // PeripheralDataSize
272
+ DMA_SxCR_PINC_Msk | // PeripheralIncrementMode
273
+ DMA_SxCR_DIR_Msk; // DataTransferDirection
243
274
static constexpr uint32_t configmask =
244
- DMA_SxCR_CHSEL_2 | DMA_SxCR_CHSEL_1 | DMA_SxCR_CHSEL_0 | // Channel
245
- DMA_SxCR_PL_1 | DMA_SxCR_PL_0 | // Priority
246
- DMA_SxCR_CIRC | // CircularMode
247
- DMA_SxCR_PFCTRL; // FlowControl
275
+ DMA_SxCR_CHSEL_Msk | // Channel
276
+ DMA_SxCR_PL_Msk | // Priority
277
+ DMA_SxCR_CIRC_Msk | // CircularMode
278
+ DMA_SxCR_PFCTRL_Msk; // FlowControl
248
279
%% elif dmaType in ["stm32-channel-request", "stm32-channel", "stm32-mux"]
249
280
static constexpr uint32_t memoryMask =
250
281
DMA_CCR_MSIZE_0 | DMA_CCR_MSIZE_1 | // MemoryDataSize
0 commit comments