Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft - Dma Handlers in Arduino core #825

Draft
wants to merge 18 commits into
base: main
Choose a base branch
from
Draft
Prev Previous commit
Next Next commit
Minor fix.
  • Loading branch information
xC0000005 committed Mar 26, 2020
commit 01ee2d4459e513da13696ed80bddadedcbb62f0d
39 changes: 36 additions & 3 deletions libraries/DMA/src/DMATransfer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,12 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
{
if (!_prepared) {
// TODO - figure out which DMA to enable the clock for.
__HAL_RCC_DMA1_CLK_ENABLE();

#ifdef DMA1_BASE
__HAL_RCC_DMA1_CLK_ENABLE();
#endif
#ifdef DMA2_BASE
__HAL_RCC_DMA2_CLK_ENABLE();
#endif
memcpy(&_dma, settings, sizeof(DMA_HandleTypeDef));
/*
_transfer_settings.dma_settings.Init.Direction = _transfer_settings.transfer_direction;
Expand Down Expand Up @@ -46,16 +50,45 @@ void DMATransferClass::prepare(DMA_HandleTypeDef *settings)
*/
void DMATransferClass::begin(uint32_t source, uint32_t destination, int bytes_to_transfer, bool use_interrupt)
{
// Make sure we're set to initialize
this->end();

if (!_prepared) {
// call dma prepare
prepare_dma(&_dma);
}

/**
* @brief Clear the DMA Stream pending flags.
* @param __HANDLE__: DMA handle
* @param __FLAG__: specifies the flag to clear.
* This parameter can be any combination of the following values:
* @arg DMA_FLAG_TCIFx: Transfer complete flag.
* @arg DMA_FLAG_HTIFx: Half transfer complete flag.
* @arg DMA_FLAG_TEIFx: Transfer error flag.
* @arg DMA_FLAG_DMEIFx: Direct mode error flag.
* @arg DMA_FLAG_FEIFx: FIFO error flag.
* Where x can be 0_4, 1_5, 2_6 or 3_7 to select the DMA Stream flag.
* @retval None
*/

// Reset flags so it starts over
__HAL_DMA_CLEAR_FLAG(&_dma, DMA_FLAG_TC2 | DMA_FLAG_HT2 | DMA_FLAG_TE2);
__HAL_DMA_CLEAR_FLAG(&_dma, __HAL_DMA_GET_TC_FLAG_INDEX(&_dma));
__HAL_DMA_CLEAR_FLAG(&_dma, __HAL_DMA_GET_HT_FLAG_INDEX(&_dma));
__HAL_DMA_CLEAR_FLAG(&_dma, __HAL_DMA_GET_TE_FLAG_INDEX(&_dma));

#if defined(STM32F2xx) || #defined(STM32F4xx) || #defined(STM32F7xx)
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_DME_FLAG_INDEX(hdma));
__HAL_DMA_CLEAR_FLAG(hdma, __HAL_DMA_GET_FE_FLAG_INDEX(hdma));
#endif

// Set size to transfer

#if defined(__HAL_DMA_SET_COUNTER)
__HAL_DMA_SET_COUNTER(&_dma, bytes_to_transfer);
#else
_dma.Instance->CNDTR = bytes_to_transfer;
#endif

// and enable it
__HAL_DMA_ENABLE(&_dma);
Expand Down