Revision ded1ded7 modules/NUCLEO-L476RG/module.h

View differences:

modules/NUCLEO-L476RG/module.h
29 29

  
30 30
#include <amiroos.h>
31 31

  
32
#if (BOARD_MPU6050_CONNECTED == true)
33
#include <math.h>
34
#endif /* BOARD_MPU6050_CONNECTED == true */
35

  
32 36
/*===========================================================================*/
33 37
/**
34 38
 * @name Module specific functions
......
60 64
 */
61 65
#define MODULE_HAL_RTC                          RTCD1
62 66

  
63
#if (BOARD_MPU6050_CONNECTED == true || BOARD_VL53L1X_CONNECTED == true) || defined(__DOXYGEN__)
64

  
65 67
/**
66
 * @brief   I2C driver to access multiplexer, proximity sensors 5 to 8, power monitors for VSYS4.2, VIO 5.0 and VDD, EEPROM, touch sensor, and fuel gauge (front battery).
68
 * @brief   Default I2C interface for the NUCLEO I/O.
67 69
 */
68
#define MODULE_HAL_I2C3                         I2CD3
70
#define MODULE_HAL_I2C                          I2CD1
69 71

  
70 72
/**
71
 * @brief   Configuration for the I2C driver #3.
73
 * @brief   Configuration for the I2C driver #1.
72 74
 */
73
extern I2CConfig moduleHalI2c3Config;
74

  
75
#endif /* (BOARD_MPU6050_CONNECTED == true || BOARD_VL53L1X_CONNECTED == true) */
75
extern I2CConfig moduleHalI2cConfig;
76 76

  
77 77
/** @} */
78 78

  
......
92 92
 * @brief   User button input signal.
93 93
 */
94 94
extern ROMCONST apalControlGpio_t moduleGpioUserButton;
95

  
96
#if (BOARD_VL53L1X_CONNECTED == true)
97

  
98
/**
99
 * @brief   VL53L1X interrupt signal (GPIO1).
100
 */
95 101
extern ROMCONST apalControlGpio_t moduleGpioVl53l1xINT;
102

  
103
/**
104
 * @brief   VL53L1X XSHUT signal.
105
 */
96 106
extern ROMCONST apalControlGpio_t moduleGpioVl53l1xXSHUT;
97 107

  
108
#endif /* (BOARD_VL53L1X_CONNECTED == true) */
109

  
98 110
/** @} */
99 111

  
100 112
/*===========================================================================*/
......
104 116
 */
105 117
/*===========================================================================*/
106 118

  
107
#include <math.h>
108

  
109 119
/**
110 120
 * @brief   Event flag to be set on a USER_BUTTON interrupt.
111 121
 */
......
160 170
#if (BOARD_VL53L1X_CONNECTED == true)
161 171
  #define MODULE_INIT_TEST_VL53L1X() {                                        \
162 172
    aosShellAddCommand(&aos.shell, &moduleTestVL53L1XShellCmd);               \
163
    aosShellAddCommand(&aos.shell, &moduleTestVL53L1XInitShellCmd);               \
164 173
  }
165 174
#else /* (BOARD_VL53L1X_CONNECTED == true) */
166 175
  #define MODULE_INIT_TEST_VL53L1X() {}
......
172 181
#define MODULE_INIT_PERIPHERY_IF() {                                          \
173 182
  /* serial driver */                                                         \
174 183
  sdStart(&MODULE_HAL_PROGIF, &moduleHalProgIfConfig);                        \
175
  /* MPU6050 demo */                                                          \
176
  MODULE_INIT_PERIPHERY_IF_MPU6050();                                         \
177
  MODULE_INIT_PERIPHERY_IF_VL53L1X();                                         \
184
  /* I2C */                                                                   \
185
  uint32_t i2c_freq = 1000000; /* maximum I2C frequency supported for this MCU */ \
186
  MODULE_INIT_PERIPHERY_IF_MPU6050(i2c_freq);                                 \
187
  MODULE_INIT_PERIPHERY_IF_VL53L1X(i2c_freq);                                 \
188
  if (i2c_freq == 100000) /* standard-mode @ 100 kHz */ {                     \
189
    moduleHalI2cConfig.timingr = 0x10909CEC; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
190
  } else if (i2c_freq == 400000) /* fast-mode @ 400 kHz */ {                  \
191
    moduleHalI2cConfig.timingr = 0x00702991; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
192
  } else if (i2c_freq == 1000000) /* fast-mode-plus @ 10000 kHz */ {          \
193
    moduleHalI2cConfig.timingr = 0x00300F33; /* obtained via STM32CubeMX with STM32_I2CxCLK = 80 MHz */ \
194
  } else {                                                                    \
195
    aosDbgAssertMsg(false, "I2C frequency not supported");                    \
196
  }                                                                           \
197
  i2cStart(&MODULE_HAL_I2C, &moduleHalI2cConfig);                             \
178 198
}
179
#if (BOARD_MPU6050_CONNECTED == true)
180
  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {                                \
181
    /* maximum I2C frequency is 1MHz for this MCU */                          \
182
    uint32_t i2c3_freq = 1000000;                                             \
183
    /* find minimum amon all devices connected to this bus */                 \
184
    i2c3_freq = (MPU6050_LLD_I2C_MAXFREQUENCY < i2c3_freq) ? MPU6050_LLD_I2C_MAXFREQUENCY : i2c3_freq;  \
185
    /* calculate PRESC (prescaler):                                           \
186
     *   target is 1/(I2CXCLK * (PRESC + 1)) = 125ns                          \
187
     */                                                                       \
188
    moduleHalI2c3Config.timingr = ((uint8_t)((0.000000125f * STM32_I2C3CLK) - 1)) << I2C_TIMINGR_PRESC_Pos; \
189
    /* SCL shall be low half of the time. */                                  \
190
    moduleHalI2c3Config.timingr |= ((uint8_t)((1.f / i2c3_freq / 2 / 0.000000125f) - 1)) << I2C_TIMINGR_SCLL_Pos; \
191
    /* SCL shall be high half the time of low or slightly longer. */          \
192
    moduleHalI2c3Config.timingr |= (uint8_t)(ceilf(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) / 2.f)) << I2C_TIMINGR_SCLH_Pos;  \
193
    /* SDA shall be delayed 1/10 of SCL low, or shorter */                    \
194
    moduleHalI2c3Config.timingr |= (uint8_t)(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) * 0.1f) << I2C_TIMINGR_SDADEL_Pos;  \
195
    /* SCL shall be delyed twice as long as SDA, but longer than 0. */        \
196
    moduleHalI2c3Config.timingr |= ((((moduleHalI2c3Config.timingr & I2C_TIMINGR_SDADEL_Msk) >> I2C_TIMINGR_SDADEL_Pos) * 2) + 1) << I2C_TIMINGR_SCLDEL_Pos;  \
197
    /* now we can start the I2C driver */                                     \
198
    chSysLock();                                                              \
199
    palSetLineMode(LINE_ARD_A4, PAL_MODE_ALTERNATE(4));                       \
200
    palSetLineMode(LINE_ARD_A5, PAL_MODE_ALTERNATE(4));                       \
201
    chSysUnlock();                                                            \
202
    i2cStart(&MODULE_HAL_I2C3, &moduleHalI2c3Config);                         \
203
  }
204
#else /* (BOARD_MPU6050_CONNECTED == true) */
205
  #define MODULE_INIT_PERIPHERY_IF_MPU6050() {}
206
#endif /* (BOARD_MPU6050_CONNECTED == true) */
207 199

  
208
#if (BOARD_VL53L1X_CONNECTED == true)
209
  #define MODULE_INIT_PERIPHERY_IF_VL53L1X() {                                \
210
    /* maximum I2C frequency is 1MHz for this MCU */                          \
211
    uint32_t i2c3_freq = 1000000;                                             \
212
    /* find minimum amon all devices connected to this bus */                 \
213
    i2c3_freq = (VL53L1X_LLD_I2C_MAXFREQUENCY < i2c3_freq) ? VL53L1X_LLD_I2C_MAXFREQUENCY : i2c3_freq;  \
214
    /* calculate PRESC (prescaler):                                           \
215
     *   target is 1/(I2CXCLK * (PRESC + 1)) = 125ns                          \
216
     */                                                                       \
217
    moduleHalI2c3Config.timingr = ((uint8_t)((0.000000125f * STM32_I2C3CLK) - 1)) << I2C_TIMINGR_PRESC_Pos; \
218
    /* SCL shall be low half of the time. */                                  \
219
    moduleHalI2c3Config.timingr |= ((uint8_t)((1.f / i2c3_freq / 2 / 0.000000125f) - 1)) << I2C_TIMINGR_SCLL_Pos; \
220
    /* SCL shall be high half the time of low or slightly longer. */          \
221
    moduleHalI2c3Config.timingr |= (uint8_t)(ceilf(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) / 2.f)) << I2C_TIMINGR_SCLH_Pos;  \
222
    /* SDA shall be delayed 1/10 of SCL low, or shorter */                    \
223
    moduleHalI2c3Config.timingr |= (uint8_t)(((moduleHalI2c3Config.timingr & I2C_TIMINGR_SCLL_Msk) >> I2C_TIMINGR_SCLL_Pos) * 0.1f) << I2C_TIMINGR_SDADEL_Pos;  \
224
    /* SCL shall be delyed twice as long as SDA, but longer than 0. */        \
225
    moduleHalI2c3Config.timingr |= ((((moduleHalI2c3Config.timingr & I2C_TIMINGR_SDADEL_Msk) >> I2C_TIMINGR_SDADEL_Pos) * 2) + 1) << I2C_TIMINGR_SCLDEL_Pos;  \
226
    /* setup the GPIO signals */                                              \
227
    moduleHalI2c3Config.timingr = 0x00702991; \
228
    chSysLock();                                \
229
    PAL_PORT(moduleLldVl53l1x.xshut->gpio->line)->PUPDR &= ~(3U << (PAL_PAD(moduleLldVl53l1x.xshut->gpio->line) * 2U)); \
230
    PAL_PORT(moduleLldVl53l1x.xshut->gpio->line)->PUPDR |= PIN_PUPDR_PULLUP(PAL_PAD(moduleLldVl53l1x.xshut->gpio->line)); \
231
    /* palSetLineMode(moduleLldVl53l1x.xshut->gpio->line, PAL_MODE_OUTPUT_OPENDRAIN); \*/ \
232
      palSetLineMode(moduleLldVl53l1x.xshut->gpio->line, PAL_MODE_OUTPUT_PUSHPULL); \
233
palSetLineMode(moduleLldVl53l1x.gpio1->gpio->line, PAL_MODE_INPUT_PULLUP); \
234
    palSetLineMode(LINE_ARD_A4, PAL_MODE_ALTERNATE(4));                       \
235
    palSetLineMode(LINE_ARD_A5, PAL_MODE_ALTERNATE(4));                       \
200

  
201
/**
202
 * @brief   Limits I2C frequency to maximum value supported by MPU6050.
203
 */
204
#if (BOARD_MPU6050_CONNECTED == true) || defined(__DOXYGEN__)
205
  #define MODULE_INIT_PERIPHERY_IF_MPU6050(freq) {freq = (MPU6050_LLD_I2C_MAXFREQUENCY < freq) ? MPU6050_LLD_I2C_MAXFREQUENCY : freq;}
206
#else
207
  #define MODULE_INIT_PERIPHERY_IF_MPU6050(freq) {}
208
#endif
209

  
210
/**
211
 * @brief   Limits I2C frequency to maximum value supported by VL53L1X and configures required GPIOs.
212
 */
213
#if (BOARD_VL53L1X_CONNECTED == true) || defined(__DOXYGEN__)
214
  #define MODULE_INIT_PERIPHERY_IF_VL53L1X(freq) {                            \
215
    freq = (VL53L1X_LLD_I2C_MAXFREQUENCY < freq) ? VL53L1X_LLD_I2C_MAXFREQUENCY : freq; \
216
    chSysLock();                                                              \
217
    /* set XSHUT GPIO as output in open-drain configuration with internal pull-up, but initially pulled-down signal */  \
218
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->OTYPER &= ~(1U << PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line)); \
219
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->OTYPER |= PIN_OTYPE_OPENDRAIN(PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line)); \
220
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->PUPDR &= ~(3U << (PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line) * 2U)); \
221
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->PUPDR |= PIN_PUPDR_PULLUP(PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line)); \
222
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->ODR &= ~(1U << PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line));  \
223
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->ODR |= PIN_ODR_LOW(PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line));  \
224
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->MODER &= ~(3U << (PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line) * 2U)); \
225
    PAL_PORT(moduleLldVl53l1x.Interface.xshut->gpio->line)->MODER |= PIN_MODE_OUTPUT(PAL_PAD(moduleLldVl53l1x.Interface.xshut->gpio->line));  \
226
    /* set GPIO1 (interrupt) GPIO as input with internal pull-up */           \
227
    PAL_PORT(moduleLldVl53l1x.Interface.gpio1->gpio->line)->PUPDR &= ~(3U << (PAL_PAD(moduleLldVl53l1x.Interface.gpio1->gpio->line) * 2U)); \
228
    PAL_PORT(moduleLldVl53l1x.Interface.gpio1->gpio->line)->PUPDR |= PIN_PUPDR_PULLUP(PAL_PAD(moduleLldVl53l1x.Interface.gpio1->gpio->line)); \
229
    PAL_PORT(moduleLldVl53l1x.Interface.gpio1->gpio->line)->MODER &= ~(3U << (PAL_PAD(moduleLldVl53l1x.Interface.gpio1->gpio->line) * 2U)); \
230
    PAL_PORT(moduleLldVl53l1x.Interface.gpio1->gpio->line)->MODER |= PIN_MODE_INPUT(PAL_PAD(moduleLldVl53l1x.Interface.gpio1->gpio->line)); \
236 231
    chSysUnlock();                                                            \
237
    apalControlGpioSet(moduleLldVl53l1x.xshut, APAL_GPIO_OFF);                \
238
    /* now we can start the I2C driver */                                     \
239
    i2cStart(&MODULE_HAL_I2C3, &moduleHalI2c3Config);                         \
240 232
  }
241
#else /* (BOARD_VL53L1X_CONNECTED == true) */
242
  #define MODULE_INIT_PERIPHERY_IF_VL53L1X() {}
243
#endif /* (BOARD_VL53L1X_CONNECTED == true) */
233
#else
234
  #define MODULE_INIT_PERIPHERY_IF_VL53L1X(freq) {}
235
#endif
244 236

  
245 237
/**
246 238
 * @brief   Periphery communication interface deinitialization hook.
247 239
 */
248 240
#define MODULE_SHUTDOWN_PERIPHERY_IF() {                                      \
241
  /* I2C */                                                                   \
242
  i2cStop(&MODULE_HAL_I2C);                                                   \
249 243
  /* don't stop the serial driver so messages can still be printed */         \
250 244
}
251 245

  
......
289 283
 */
290 284
extern LEDDriver moduleLldLed;
291 285

  
292
#if (BOARD_VL53L1X_CONNECTED == true) || defined(__DOXYGEN__)
293

  
294
  #include <alld_VL53L1X.h>
295

  
296
  extern VL53L1XDriver moduleLldVl53l1x;
297

  
298
#endif /* (BOARD_VL53L1X_CONNECTED == true) */
299

  
300 286
/**
301 287
 * @brief   Button driver.
302 288
 */
......
313 299

  
314 300
#endif /* (BOARD_MPU6050_CONNECTED == true) */
315 301

  
302
#if (BOARD_VL53L1X_CONNECTED == true) || defined(__DOXYGEN__)
303

  
304
#include <alld_VL53L1X.h>
305

  
306
/**
307
 * @brief   ToF sensor (VL53L1X) driver.
308
 */
309
extern VL53L1XDriver moduleLldVl53l1x;
310

  
311
#endif /* (BOARD_VL53L1X_CONNECTED == true) */
312

  
316 313
/** @} */
317 314

  
318 315
/*===========================================================================*/
......
329 326
extern aos_shellcommand_t moduleTestLedShellCmd;
330 327

  
331 328
/**
332
 * @brief   VL53L1X test command.
333
 */
334
extern aos_shellcommand_t moduleTestVL53L1XShellCmd;
335
extern aos_shellcommand_t moduleTestVL53L1XInitShellCmd;
336

  
337
/**
338 329
 * @brief   User button test command.
339 330
 */
340 331
extern aos_shellcommand_t moduleTestButtonShellCmd;
......
348 339

  
349 340
#endif /* (BOARD_MPU6050_CONNECTED == true) */
350 341

  
342
#if (BOARD_VL53L1X_CONNECTED == true) || defined(__DOXYGEN__)
343

  
344
/**
345
 * @brief   VL53L1X (ToF sonsor) test command.
346
 */
347
extern aos_shellcommand_t moduleTestVL53L1XShellCmd;
348

  
349
#endif /* (BOARD_VL53L1X_CONNECTED == true) */
350

  
351 351
/**
352 352
 * @brief   Entire module test command.
353 353
 */

Also available in: Unified diff