@@ -11,8 +11,12 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
1111{
1212 if (!_prepared) {
1313 // 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
1620 memcpy (&_dma, settings, sizeof (DMA_HandleTypeDef));
1721 /*
1822 _transfer_settings.dma_settings.Init.Direction = _transfer_settings.transfer_direction;
@@ -46,16 +50,45 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
4650 */
4751void DMATransferClass::begin (uint32_t source, uint32_t destination, int bytes_to_transfer, bool use_interrupt)
4852{
53+ // Make sure we're set to initialize
54+ this ->end ();
55+
4956 if (!_prepared) {
5057 // call dma prepare
5158 prepare_dma (&_dma);
5259 }
5360
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+
5475 // 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
5684
5785 // Set size to transfer
86+
87+ #if defined(__HAL_DMA_SET_COUNTER)
88+ __HAL_DMA_SET_COUNTER (&_dma, bytes_to_transfer);
89+ #else
5890 _dma.Instance ->CNDTR = bytes_to_transfer;
91+ #endif
5992
6093 // and enable it
6194 __HAL_DMA_ENABLE (&_dma);
0 commit comments