aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/platforms/STM32/stm32_dma.h
blob: 3c4e6985c8b6ab04d0d1bdb45d2f97cf4ad55493 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
    ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010 Giovanni Di Sirio.

    This file is part of ChibiOS/RT.

    ChibiOS/RT is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    ChibiOS/RT is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/**
 * @file    stm32_dma.h
 * @brief   STM32 DMA helper driver header.
 * @note    This file requires definitions from the ST STM32 header file
 *          stm3232f10x.h.
 *
 * @addtogroup STM32_DMA
 * @{
 */

#ifndef _STM32_DMA_H_
#define _STM32_DMA_H_

/*===========================================================================*/
/* Driver constants.                                                         */
/*===========================================================================*/

/** @brief DMA1 identifier.*/
#define DMA1_ID 0

/** @brief DMA2 identifier.*/
#if defined(STM32F10X_HD) || defined (STM32F10X_CL) || defined(__DOXYGEN__)
#define DMA2_ID 1
#endif

/*===========================================================================*/
/* Driver pre-compile time settings.                                         */
/*===========================================================================*/

/*===========================================================================*/
/* Derived constants and error checks.                                       */
/*===========================================================================*/

/*===========================================================================*/
/* Driver data structures and types.                                         */
/*===========================================================================*/

/**
 * @brief   STM32 DMA channel memory structure.
 */
typedef struct {
  volatile uint32_t     CCR;
  volatile uint32_t     CNDTR;
  volatile uint32_t     CPAR;
  volatile uint32_t     CMAR;
  volatile uint32_t     dummy;
} stm32_dma_channel_t;

/**
 * @brief   STM32 DMA subsystem memory structure.
 * @note    This structure has been redefined here because it is convenient to
 *          have the channels organized as an array, the ST header does not
 *          do that.
 */
typedef struct {
  volatile uint32_t     ISR;
  volatile uint32_t     IFCR;
  stm32_dma_channel_t   channels[7];
} stm32_dma_t;

/*===========================================================================*/
/* Driver macros.                                                            */
/*===========================================================================*/

#define STM32_DMA1_BASE         (AHBPERIPH_BASE + 0x0000)
#define STM32_DMA1              ((stm32_dma_t *)STM32_DMA1_BASE)
#define STM32_DMA1_CH1          (STM32_DMA1->channels[0])
#define STM32_DMA1_CH2          (STM32_DMA1->channels[1])
#define STM32_DMA1_CH3          (STM32_DMA1->channels[2])
#define STM32_DMA1_CH4          (STM32_DMA1->channels[3])
#define STM32_DMA1_CH5          (STM32_DMA1->channels[4])
#define STM32_DMA1_CH6          (STM32_DMA1->channels[5])
#define STM32_DMA1_CH7          (STM32_DMA1->channels[6])

#if defined(STM32F10X_HD) || defined (STM32F10X_CL) || defined(__DOXYGEN__)
#define STM32_DMA2_BASE         (AHBPERIPH_BASE + 0x0400)
#define STM32_DMA2              ((stm32_dma_t *)STM32_DMA2_BASE)
#define STM32_DMA2_CH1          (STM32_DMA2->channels[0])
#define STM32_DMA2_CH2          (STM32_DMA2->channels[1])
#define STM32_DMA2_CH3          (STM32_DMA2->channels[2])
#define STM32_DMA2_CH4          (STM32_DMA2->channels[3])
#define STM32_DMA2_CH5          (STM32_DMA2->channels[4])
#endif

#define STM32_DMA_CHANNEL_1     0
#define STM32_DMA_CHANNEL_2     1
#define STM32_DMA_CHANNEL_3     2
#define STM32_DMA_CHANNEL_4     3
#define STM32_DMA_CHANNEL_5     4
#define STM32_DMA_CHANNEL_6     5
#define STM32_DMA_CHANNEL_7     6

/**
 * @brief   DMA channel setup.
 * @note    This macro does not change the CPAR register because that register
 *          value does not change frequently, it usually points to a peripheral
 *          data register.
 * @note    Channels are numbered from 0 to 6, use the appropriate macro
 *          as parameter.
 */
#define dmaSetupChannel(dmap, ch, cndtr, cmar, ccr) {                       \
  stm32_dma_channel_t *dmachp = &dmap->channels[ch];                        \
  (dmachp)->CNDTR = (uint32_t)(cndtr);                                      \
  (dmachp)->CMAR  = (uint32_t)(cmar);                                       \
  (dmachp)->CCR   = (uint32_t)(ccr);                                        \
}

/**
 * @brief   DMA channel disable.
 * @note    Channel's pending interrupt are cleared.
 */
#define dmaDisableChannel(dmap, ch) {                                       \
  (dmap)->channels[ch].CCR = 0;                                             \
  (dmap)->IFCR = 0xF << (ch);                                               \
}

/*===========================================================================*/
/* External declarations.                                                    */
/*===========================================================================*/

#ifdef __cplusplus
extern "C" {
#endif
  void dmaInit(void);
  void dmaEnable(uint32_t dma);
  void dmaDisable(uint32_t dma);
#ifdef __cplusplus
}
#endif

#endif /* _STM32_DMA_H_ */

/** @} */