Statistics
| Branch: | Tag: | Revision:

amiro-os / hal / platforms / STM32 / qei_lld.c @ 58fe0e0b

History | View | Annotate | Download (6.61 KB)

1
#include "ch.h"
2
#include "hal.h"
3

    
4
#include "qei.h"
5

    
6
#if HAL_USE_QEI || defined(__DOXYGEN__)
7

    
8
/*===========================================================================*/
9
/* Driver exported variables.                                                */
10
/*===========================================================================*/
11

    
12
/**
13
 * @brief   QEID1 driver identifier.
14
 * @note    The driver QEID1 allocates the complex timer TIM1 when enabled.
15
 */
16
#if STM32_QEI_USE_TIM1 || defined(__DOXYGEN__)
17
QEIDriver QEID1;
18
#endif
19

    
20
/**
21
 * @brief   QEID2 driver identifier.
22
 * @note    The driver QEID1 allocates the timer TIM2 when enabled.
23
 */
24
#if STM32_QEI_USE_TIM2 || defined(__DOXYGEN__)
25
QEIDriver QEID2;
26
#endif
27

    
28
/**
29
 * @brief   QEID3 driver identifier.
30
 * @note    The driver QEID1 allocates the timer TIM3 when enabled.
31
 */
32
#if STM32_QEI_USE_TIM3 || defined(__DOXYGEN__)
33
QEIDriver QEID3;
34
#endif
35

    
36
/**
37
 * @brief   QEID4 driver identifier.
38
 * @note    The driver QEID4 allocates the timer TIM4 when enabled.
39
 */
40
#if STM32_QEI_USE_TIM4 || defined(__DOXYGEN__)
41
QEIDriver QEID4;
42
#endif
43

    
44
/**
45
 * @brief   QEID5 driver identifier.
46
 * @note    The driver QEID5 allocates the timer TIM5 when enabled.
47
 */
48
#if STM32_QEI_USE_TIM5 || defined(__DOXYGEN__)
49
QEIDriver QEID5;
50
#endif
51

    
52
/**
53
 * @brief   QEID8 driver identifier.
54
 * @note    The driver QEID8 allocates the timer TIM8 when enabled.
55
 */
56
#if STM32_QEI_USE_TIM8 || defined(__DOXYGEN__)
57
QEIDriver QEID8;
58
#endif
59

    
60
/*===========================================================================*/
61
/* Driver local variables.                                                   */
62
/*===========================================================================*/
63

    
64
/*===========================================================================*/
65
/* Driver local functions.                                                   */
66
/*===========================================================================*/
67

    
68
/*===========================================================================*/
69
/* Driver interrupt handlers.                                                */
70
/*===========================================================================*/
71

    
72
/*===========================================================================*/
73
/* Driver exported functions.                                                */
74
/*===========================================================================*/
75

    
76
/**
77
 * @brief   Low level QEI driver initialization.
78
 *
79
 * @notapi
80
 */
81
void qei_lld_init(void) {
82

    
83
#if STM32_QEI_USE_TIM1
84
  /* Driver initialization.*/
85
  qeiObjectInit(&QEID1);
86
  QEID1.tim = STM32_TIM1;
87
#endif
88

    
89
#if STM32_QEI_USE_TIM2
90
  /* Driver initialization.*/
91
  qeiObjectInit(&QEID2);
92
  QEID2.tim = STM32_TIM2;
93
#endif
94

    
95
#if STM32_QEI_USE_TIM3
96
  /* Driver initialization.*/
97
  qeiObjectInit(&QEID3);
98
  QEID3.tim = STM32_TIM3;
99
#endif
100

    
101
#if STM32_QEI_USE_TIM4
102
  /* Driver initialization.*/
103
  qeiObjectInit(&QEID4);
104
  QEID4.tim = STM32_TIM4;
105
#endif
106

    
107
#if STM32_QEI_USE_TIM5
108
  /* Driver initialization.*/
109
  qeiObjectInit(&QEID5);
110
  QEID5.tim = STM32_TIM5;
111
#endif
112

    
113
#if STM32_QEI_USE_TIM8
114
  /* Driver initialization.*/
115
  qeiObjectInit(&QEID8);
116
  QEID8.tim = STM32_TIM8;
117
#endif
118
}
119

    
120
/**
121
 * @brief   Configures and activates the QEI peripheral.
122
 *
123
 * @param[in] qeip      pointer to the @p QEIDriver object
124
 *
125
 * @notapi
126
 */
127
void qei_lld_start(QEIDriver *qeip) {
128
  uint32_t arr, ccer;
129

    
130
  if (qeip->state == QEI_STOP) {
131
    /* Clock activation and timer reset.*/
132
#if STM32_QEI_USE_TIM1
133
    if (&QEID1 == qeip) {
134
      rccEnableTIM1(FALSE);
135
      rccResetTIM1();
136
    }
137
#endif
138
#if STM32_QEI_USE_TIM2
139
    if (&QEID2 == qeip) {
140
      rccEnableTIM2(FALSE);
141
      rccResetTIM2();
142
    }
143
#endif
144
#if STM32_QEI_USE_TIM3
145
    if (&QEID3 == qeip) {
146
      rccEnableTIM3(FALSE);
147
      rccResetTIM3();
148
    }
149
#endif
150
#if STM32_QEI_USE_TIM4
151
    if (&QEID4 == qeip) {
152
      rccEnableTIM4(FALSE);
153
      rccResetTIM4();
154
    }
155
#endif
156

    
157
#if STM32_QEI_USE_TIM5
158
    if (&QEID5 == qeip) {
159
      rccEnableTIM5(FALSE);
160
      rccResetTIM5();
161
    }
162
#endif
163
#if STM32_QEI_USE_TIM8
164
    if (&QEID8 == qeip) {
165
      rccEnableTIM8(FALSE);
166
      rccResetTIM8();
167
    }
168
#endif
169
  }
170
  else {
171
    /* Driver re-configuration scenario, it must be stopped first.*/
172
    qeip->tim->CR1    = 0;                  /* Timer disabled.              */
173
    qeip->tim->DIER   = 0;                  /* All IRQs disabled.           */
174
    qeip->tim->SR     = 0;                  /* Clear eventual pending IRQs. */
175
    qeip->tim->CCR[0] = 0;                  /* Comparator 1 disabled.       */
176
    qeip->tim->CCR[1] = 0;                  /* Comparator 2 disabled.       */
177
    qeip->tim->CNT    = 0;                  /* Counter reset to zero.       */
178
  }
179

    
180
  /* Timer configuration.*/
181
  qeip->tim->PSC  = 0;
182
  arr = qeip->config->range - 1;
183
  chDbgAssert((arr <= 0xFFFF), "qei_lld_start(), #1", "invalid range");
184
  qeip->tim->ARR  = arr & 0xFFFF;
185

    
186
  /* CCMR1_CC1S = 01 - CH1 Input on TI1.
187
     CCMR1_CC2S = 01 - CH2 Input on TI2.*/
188
  qeip->tim->CCMR1 = TIM_CCMR1_CC1S_0 | TIM_CCMR1_CC2S_0;
189

    
190
  ccer = 0;
191
  if (qeip->config->channels[0].mode == QEI_INPUT_INVERTED)
192
    ccer |= TIM_CCER_CC1P;
193
  if (qeip->config->channels[1].mode == QEI_INPUT_INVERTED)
194
    ccer |= TIM_CCER_CC2P;
195
  qeip->tim->CCER = ccer;
196

    
197
  if (qeip->config->mode == QEI_COUNT_CH1)
198
    qeip->tim->SMCR  = TIM_SMCR_SMS_1;
199
  else if (qeip->config->mode == QEI_COUNT_CH2)
200
    qeip->tim->SMCR  = TIM_SMCR_SMS_0;
201
  else
202
    qeip->tim->SMCR  = TIM_SMCR_SMS_0 | TIM_SMCR_SMS_1;
203
}
204

    
205
/**
206
 * @brief   Deactivates the QEI peripheral.
207
 *
208
 * @param[in] qeip      pointer to the @p QEIDriver object
209
 *
210
 * @notapi
211
 */
212
void qei_lld_stop(QEIDriver *qeip) {
213

    
214
  if (qeip->state == QEI_READY) {
215
    /* Clock deactivation.*/
216
    qeip->tim->CR1  = 0;                    /* Timer disabled.              */
217

    
218
#if STM32_QEI_USE_TIM1
219
    if (&QEID1 == qeip) {
220
      rccDisableTIM1(FALSE);
221
    }
222
#endif
223
#if STM32_QEI_USE_TIM2
224
    if (&QEID2 == qeip) {
225
      rccDisableTIM2(FALSE);
226
    }
227
#endif
228
#if STM32_QEI_USE_TIM3
229
    if (&QEID3 == qeip) {
230
      rccDisableTIM3(FALSE);
231
    }
232
#endif
233
#if STM32_QEI_USE_TIM4
234
    if (&QEID4 == qeip) {
235
      rccDisableTIM4(FALSE);
236
    }
237
#endif
238
#if STM32_QEI_USE_TIM5
239
    if (&QEID5 == qeip) {
240
      rccDisableTIM5(FALSE);
241
    }
242
#endif
243
  }
244
#if STM32_QEI_USE_TIM8
245
    if (&QEID8 == qeip) {
246
      rccDisableTIM8(FALSE);
247
    }
248
#endif
249
}
250

    
251
/**
252
 * @brief   Enables the quadrature encoder.
253
 *
254
 * @param[in] qeip      pointer to the @p QEIDriver object
255
 *
256
 * @notapi
257
 */
258
void qei_lld_enable(QEIDriver *qeip) {
259

    
260
  qeip->tim->CR1  = TIM_CR1_CEN;
261
}
262

    
263
/**
264
 * @brief   Disables the quadrature encoder.
265
 *
266
 * @param[in] qeip      pointer to the @p QEIDriver object
267
 *
268
 * @notapi
269
 */
270
void qei_lld_disable(QEIDriver *qeip) {
271

    
272
  qeip->tim->CR1  = 0;
273
}
274

    
275
#endif /* HAL_USE_QEI */