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