Statistics
| Branch: | Tag: | Revision:

amiro-os / os / hal / ports / STM32 / LLD / QEIv1 / hal_qei_lld.h @ e545e620

History | View | Annotate | Download (8.15 KB)

1
/*
2
AMiRo-OS is an operating system designed for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2018  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU General Public License for more details.
14

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

    
19
/**
20
 * @file    STM32/hal_qei_lld.h
21
 * @brief   STM32 QEI subsystem low level driver header.
22
 *
23
 * @addtogroup QEI
24
 * @{
25
 */
26

    
27
#ifndef _HAL_QEI_LLD_H_
28
#define _HAL_QEI_LLD_H_
29

    
30
#include "stm32_tim.h"
31

    
32
#if HAL_USE_QEI || defined(__DOXYGEN__)
33

    
34
/*===========================================================================*/
35
/* Driver constants.                                                         */
36
/*===========================================================================*/
37

    
38
/**
39
 * @brief   Number of input channels per QEI driver.
40
 */
41
#define QEI_CHANNELS                            2
42

    
43
/*===========================================================================*/
44
/* Driver pre-compile time settings.                                         */
45
/*===========================================================================*/
46

    
47
/**
48
 * @name    Configuration options
49
 * @{
50
 */
51
/**
52
 * @brief   QEID1 driver enable switch.
53
 * @details If set to @p TRUE the support for QEID1 is included.
54
 * @note    The default is @p TRUE.
55
 */
56
#if !defined(STM32_QEI_USE_TIM1) || defined(__DOXYGEN__)
57
#define STM32_QEI_USE_TIM1                  TRUE
58
#endif
59

    
60
/**
61
 * @brief   QEID2 driver enable switch.
62
 * @details If set to @p TRUE the support for QEID2 is included.
63
 * @note    The default is @p TRUE.
64
 */
65
#if !defined(STM32_QEI_USE_TIM2) || defined(__DOXYGEN__)
66
#define STM32_QEI_USE_TIM2                  TRUE
67
#endif
68

    
69
/**
70
 * @brief   QEID3 driver enable switch.
71
 * @details If set to @p TRUE the support for QEID3 is included.
72
 * @note    The default is @p TRUE.
73
 */
74
#if !defined(STM32_QEI_USE_TIM3) || defined(__DOXYGEN__)
75
#define STM32_QEI_USE_TIM3                  TRUE
76
#endif
77

    
78
/**
79
 * @brief   QEID4 driver enable switch.
80
 * @details If set to @p TRUE the support for QEID4 is included.
81
 * @note    The default is @p TRUE.
82
 */
83
#if !defined(STM32_QEI_USE_TIM4) || defined(__DOXYGEN__)
84
#define STM32_QEI_USE_TIM4                  TRUE
85
#endif
86

    
87
/**
88
 * @brief   QEID5 driver enable switch.
89
 * @details If set to @p TRUE the support for QEID5 is included.
90
 * @note    The default is @p TRUE.
91
 */
92
#if !defined(STM32_QEI_USE_TIM5) || defined(__DOXYGEN__)
93
#define STM32_QEI_USE_TIM5                  TRUE
94
#endif
95

    
96
/**
97
 * @brief   QEID8 driver enable switch.
98
 * @details If set to @p TRUE the support for QEID8 is included.
99
 * @note    The default is @p TRUE.
100
 */
101
#if !defined(STM32_QEI_USE_TIM8) || defined(__DOXYGEN__)
102
#define STM32_QEI_USE_TIM8                  TRUE
103
#endif
104
/** @} */
105

    
106
/*===========================================================================*/
107
/* Derived constants and error checks.                                       */
108
/*===========================================================================*/
109

    
110
#if STM32_QEI_USE_TIM1 && !STM32_HAS_TIM1
111
#error "TIM1 not present in the selected device"
112
#endif
113

    
114
#if STM32_QEI_USE_TIM2 && !STM32_HAS_TIM2
115
#error "TIM2 not present in the selected device"
116
#endif
117

    
118
#if STM32_QEI_USE_TIM3 && !STM32_HAS_TIM3
119
#error "TIM3 not present in the selected device"
120
#endif
121

    
122
#if STM32_QEI_USE_TIM4 && !STM32_HAS_TIM4
123
#error "TIM4 not present in the selected device"
124
#endif
125

    
126
#if STM32_QEI_USE_TIM5 && !STM32_HAS_TIM5
127
#error "TIM5 not present in the selected device"
128
#endif
129

    
130
#if STM32_QEI_USE_TIM8 && !STM32_HAS_TIM8
131
#error "TIM8 not present in the selected device"
132
#endif
133

    
134
#if !STM32_QEI_USE_TIM1 && !STM32_QEI_USE_TIM2 &&                           \
135
    !STM32_QEI_USE_TIM3 && !STM32_QEI_USE_TIM4 &&                           \
136
    !STM32_QEI_USE_TIM5 && !STM32_QEI_USE_TIM8
137
#error "QEI driver activated but no TIM peripheral assigned"
138
#endif
139

    
140
/*===========================================================================*/
141
/* Driver data structures and types.                                         */
142
/*===========================================================================*/
143

    
144
/**
145
 * @brief QEI driver mode.
146
 */
147
typedef enum {
148
  QEI_COUNT_BOTH = 0,
149
  QEI_COUNT_CH1 = 1,
150
  QEI_COUNT_CH2 = 2,
151
} qeimode_t;
152

    
153
/**
154
 * @brief QEI input mode.
155
 */
156
typedef enum {
157
  QEI_INPUT_NONINVERTED = 0, /**< Input channel noninverted.*/
158
  QEI_INPUT_INVERTED = 1, /**< Input channel inverted.*/
159
} qeiinputmode_t;
160

    
161
/**
162
 * @brief   QEI count type.
163
 */
164
typedef uint32_t qeicnt_t;
165

    
166
/**
167
 * @brief   Driver channel configuration structure.
168
 */
169
typedef struct {
170
  /**
171
   * @brief Channel input logic.
172
   */
173
  qeiinputmode_t                 mode;
174
  /* End of the mandatory fields.*/
175
} QEIChannelConfig;
176

    
177
/**
178
 * @brief   Driver configuration structure.
179
 */
180
typedef struct {
181
  /**
182
   * @brief   Driver mode.
183
   */
184
  qeimode_t                 mode;
185
  /**
186
   * @brief   Channels configurations.
187
   */
188
  QEIChannelConfig          channels[QEI_CHANNELS];
189
  /**
190
   * @brief   Range in pulses.
191
   */
192
  qeicnt_t                  range;
193
  /* End of the mandatory fields.*/
194
} QEIConfig;
195

    
196
/**
197
 * @brief   Structure representing an QEI driver.
198
 */
199
struct QEIDriver {
200
  /**
201
   * @brief Driver state.
202
   */
203
  qeistate_t                state;
204
  /**
205
   * @brief Current configuration data.
206
   */
207
  const QEIConfig           *config;
208
#if defined(QEI_DRIVER_EXT_FIELDS)
209
  QEI_DRIVER_EXT_FIELDS
210
#endif
211
  /* End of the mandatory fields.*/
212
  /**
213
   * @brief Pointer to the TIMx registers block.
214
   */
215
  stm32_tim_t               *tim;
216
};
217

    
218
/*===========================================================================*/
219
/* Driver macros.                                                            */
220
/*===========================================================================*/
221

    
222
/**
223
 * @brief   Returns the direction of the last transition.
224
 * @details The direction is defined as boolean and is
225
 *          calculated at each transition on any input.
226
 *
227
 * @param[in] qeip      pointer to the @p QEIDriver object
228
 * @return              The request direction.
229
 * @retval FALSE        Position counted up.
230
 * @retval TRUE         Position counted down.
231
 *
232
 * @iclass
233
 */
234
#define qei_lld_get_direction(qeip) !!((qeip)->tim->CR1 & TIM_CR1_DIR)
235

    
236
/**
237
 * @brief   Returns the position of the encoder.
238
 * @details The position is defined as number of pulses since last reset.
239
 *
240
 * @param[in] qeip      pointer to the @p QEIDriver object
241
 * @return              The number of pulses.
242
 *
243
 * @iclass
244
 */
245
#define qei_lld_get_position(qeip) ((qeip)->tim->CNT)
246

    
247
/**
248
 * @brief   Returns the range of the encoder.
249
 * @details The range is defined as number of maximum pulse count.
250
 *
251
 * @param[in] qeip      pointer to the @p QEIDriver object
252
 * @return              The number of pulses.
253
 *
254
 * @iclass
255
 */
256
#define qei_lld_get_range(qeip) ((qeip)->tim->ARR + 1)
257

    
258
/*===========================================================================*/
259
/* External declarations.                                                    */
260
/*===========================================================================*/
261

    
262
#if STM32_QEI_USE_TIM1 && !defined(__DOXYGEN__)
263
extern QEIDriver QEID1;
264
#endif
265

    
266
#if STM32_QEI_USE_TIM2 && !defined(__DOXYGEN__)
267
extern QEIDriver QEID2;
268
#endif
269

    
270
#if STM32_QEI_USE_TIM3 && !defined(__DOXYGEN__)
271
extern QEIDriver QEID3;
272
#endif
273

    
274
#if STM32_QEI_USE_TIM4 && !defined(__DOXYGEN__)
275
extern QEIDriver QEID4;
276
#endif
277

    
278
#if STM32_QEI_USE_TIM5 && !defined(__DOXYGEN__)
279
extern QEIDriver QEID5;
280
#endif
281

    
282
#if STM32_QEI_USE_TIM8 && !defined(__DOXYGEN__)
283
extern QEIDriver QEID8;
284
#endif
285

    
286
#ifdef __cplusplus
287
extern "C" {
288
#endif
289
  void qei_lld_init(void);
290
  void qei_lld_start(QEIDriver *qeip);
291
  void qei_lld_stop(QEIDriver *qeip);
292
  void qei_lld_enable(QEIDriver *qeip);
293
  void qei_lld_disable(QEIDriver *qeip);
294
#ifdef __cplusplus
295
}
296
#endif
297

    
298
#endif /* HAL_USE_QEI */
299

    
300
#endif /* _HAL_QEI_LLD_H_ */
301

    
302
/** @} */