|
| 1 | +#include <dma.h> |
| 2 | + |
| 3 | +/** |
| 4 | + * @brief Prepares for DMA Transfer by enabling clocks |
| 5 | + * and storing the settings in the slots |
| 6 | + * @param settings : dma transfer settings |
| 7 | + * @retval None |
| 8 | + */ |
| 9 | +void DMATransferClass::prepare(dmatransfer_t *settings) { |
| 10 | + if (!_prepared) { |
| 11 | + __HAL_RCC_DMA1_CLK_ENABLE(); |
| 12 | + |
| 13 | + _transfer_settings.dma_settings.Init.Direction = DMA_MEMORY_TO_PERIPH; |
| 14 | + _transfer_settings.dma_settings.Init.PeriphInc = DMA_PINC_DISABLE; |
| 15 | + _transfer_settings.dma_settings.Init.MemInc = DMA_MINC_DISABLE; |
| 16 | + _transfer_settings.dma_settings.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; |
| 17 | + _transfer_settings.dma_settings.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; |
| 18 | + _transfer_settings.dma_settings.Init.Mode = settings.circular ? DMA_CIRCULAR : DMA_NORMAL; |
| 19 | + _transfer_settings.dma_settings.Init.Priority = DMA_PRIORITY_VERY_HIGH; |
| 20 | + _transfer_settings.dma_settings.Instance = settings.channel_stream; |
| 21 | + |
| 22 | + // Perform HAL Initialization first. |
| 23 | + HAL_DMA_Init(&dmaUpdate); |
| 24 | + |
| 25 | + // Call dma prepare |
| 26 | + prepare_dma(&_transfer_settings); |
| 27 | + } |
| 28 | +} |
| 29 | + |
| 30 | +/** |
| 31 | + * @brief Begin the DMA transfer |
| 32 | + * @retval None |
| 33 | + */ |
| 34 | +void DMATransferClass::begin(int bytes_to_transfer) { |
| 35 | + if (!prepared) { |
| 36 | + // call dma prepare |
| 37 | + prepare_dma(&_transfer_settings); |
| 38 | + } |
| 39 | + |
| 40 | + // Reset flags so it starts over |
| 41 | + __HAL_DMA_CLEAR_FLAG(&_transfer_settings, DMA_FLAG_TC2 | DMA_FLAG_HT2 | DMA_FLAG_TE2); |
| 42 | + |
| 43 | + // Set size to transfer |
| 44 | + _transfer_settings.dma_settings.Instance->CNDTR = bytes_to_transfer; |
| 45 | + |
| 46 | + // and enable it |
| 47 | + __HAL_DMA_ENABLE(&_transfer_settings.dma_settings); |
| 48 | +} |
| 49 | + |
| 50 | +/** |
| 51 | + * @brief End the DMA transfer |
| 52 | + * @retval None |
| 53 | + */ |
| 54 | +void DMATransferClass::end() { |
| 55 | + |
| 56 | + __HAL_DMA_DISABLE(&_transfer_settings); |
| 57 | + |
| 58 | + if (_prepared) { |
| 59 | + end_dma(&_transfer_settings); |
| 60 | + _prepared = false; |
| 61 | + } |
| 62 | +} |
0 commit comments