@@ -11,8 +11,12 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
11
11
{
12
12
if (!_prepared) {
13
13
// TODO - figure out which DMA to enable the clock for.
14
- __HAL_RCC_DMA1_CLK_ENABLE ();
15
-
14
+ #ifdef DMA1_BASE
15
+ __HAL_RCC_DMA1_CLK_ENABLE ();
16
+ #endif
17
+ #ifdef DMA2_BASE
18
+ __HAL_RCC_DMA2_CLK_ENABLE ();
19
+ #endif
16
20
memcpy (&_dma, settings, sizeof (DMA_HandleTypeDef));
17
21
/*
18
22
_transfer_settings.dma_settings.Init.Direction = _transfer_settings.transfer_direction;
@@ -46,16 +50,45 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
46
50
*/
47
51
void DMATransferClass::begin (uint32_t source, uint32_t destination, int bytes_to_transfer, bool use_interrupt)
48
52
{
53
+ // Make sure we're set to initialize
54
+ this ->end ();
55
+
49
56
if (!_prepared) {
50
57
// call dma prepare
51
58
prepare_dma (&_dma);
52
59
}
53
60
61
+ /* *
62
+ * @brief Clear the DMA Stream pending flags.
63
+ * @param __HANDLE__: DMA handle
64
+ * @param __FLAG__: specifies the flag to clear.
65
+ * This parameter can be any combination of the following values:
66
+ * @arg DMA_FLAG_TCIFx: Transfer complete flag.
67
+ * @arg DMA_FLAG_HTIFx: Half transfer complete flag.
68
+ * @arg DMA_FLAG_TEIFx: Transfer error flag.
69
+ * @arg DMA_FLAG_DMEIFx: Direct mode error flag.
70
+ * @arg DMA_FLAG_FEIFx: FIFO error flag.
71
+ * Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag.
72
+ * @retval None
73
+ */
74
+
54
75
// Reset flags so it starts over
55
- __HAL_DMA_CLEAR_FLAG (&_dma, DMA_FLAG_TC2 | DMA_FLAG_HT2 | DMA_FLAG_TE2);
76
+ __HAL_DMA_CLEAR_FLAG (&_dma, __HAL_DMA_GET_TC_FLAG_INDEX (&_dma));
77
+ __HAL_DMA_CLEAR_FLAG (&_dma, __HAL_DMA_GET_HT_FLAG_INDEX (&_dma));
78
+ __HAL_DMA_CLEAR_FLAG (&_dma, __HAL_DMA_GET_TE_FLAG_INDEX (&_dma));
79
+
80
+ #if defined(STM32F2xx) || #defined(STM32F4xx) || #defined(STM32F7xx)
81
+ __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_DME_FLAG_INDEX (hdma));
82
+ __HAL_DMA_CLEAR_FLAG (hdma, __HAL_DMA_GET_FE_FLAG_INDEX (hdma));
83
+ #endif
56
84
57
85
// Set size to transfer
86
+
87
+ #if defined(__HAL_DMA_SET_COUNTER)
88
+ __HAL_DMA_SET_COUNTER (&_dma, bytes_to_transfer);
89
+ #else
58
90
_dma.Instance ->CNDTR = bytes_to_transfer;
91
+ #endif
59
92
60
93
// and enable it
61
94
__HAL_DMA_ENABLE (&_dma);
0 commit comments