Skip to content

Commit 802236f

Browse files
committed
Save off DMATransfer library work.
1 parent 6dd76d3 commit 802236f

File tree

4 files changed

+128
-0
lines changed

4 files changed

+128
-0
lines changed

libraries/DMA/kewords.txt

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#######################################
2+
# Syntax Coloring Map For DMA
3+
#######################################
4+
5+
#######################################
6+
# Datatypes (KEYWORD1)
7+
#######################################
8+
9+
DMA KEYWORD1
10+
DMA1 KEYWORD1
11+
DMA2 KEYWORD2
12+
13+
#######################################
14+
# Methods and Functions (KEYWORD2)
15+
#######################################
16+
17+
start KEYWORD2
18+
19+
#######################################
20+
# Constants (LITERAL1)
21+
#######################################

libraries/DMA/library.properties

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
name=DMA
2+
version=0.0.1
3+
author=J.C. Nelson
4+
sentence=Enables Direct Memory Access Transfers.
5+
paragraph=This library allows use of Direct Memory Access (DMA) for transfer between memory locations, to and from peripherals.
6+
category=Data Transfers
7+
architectures=stm32

libraries/DMA/src/DMATransfer.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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+
}

libraries/DMA/src/DMATransfer.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#ifndef __DMATRANSFER_H__
2+
#define __DMATRANSFER_H__
3+
4+
#include "Arduino.h"
5+
6+
typedef struct dmatransfer_s dmatransfer_t;
7+
8+
#if defined(STM32F2xx) || defined(STM32F4xx) || defined(STM32F7xx)
9+
typedef DMA_Stream_TypeDef DMA_CS_Selection;
10+
#else
11+
typedef DMA_Channel_TypeDef DMA_CS_Selection;
12+
#endif
13+
14+
15+
struct dmatransfer_s {
16+
/* Keep this the first member so casting back and forth is easy
17+
*/
18+
DMA_HandleTypeDef *dma_settings;
19+
DMA_CS_Selection channel_stream;
20+
boolean circular;
21+
void (*transferComplete)(DMA_HandleTypeDef *);
22+
void (*transferHalfComplete)(DMA_HandleTypeDef *);
23+
void (*transferError)(DMA_HandleTypeDef *);
24+
};
25+
26+
class DMATransferClass {
27+
28+
public:
29+
void prepare(dmatransfer_t *settings);
30+
void begin(int bytes_to_transfer);
31+
void end();
32+
private:
33+
bool _prepared;
34+
dmatransfer_t _transfer_settings;
35+
};
36+
37+
38+
#endif /* __DMATRANSFER_H__ */

0 commit comments

Comments
 (0)