Revision ded1ded7 modules/NUCLEO-L476RG/module.h
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