From 9ac42f8cd7a7613827ddd78209d9ad02112714f2 Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Mon, 12 Mar 2018 21:37:27 +0000 Subject: Updated LSM6DS0 driver git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11710 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- testex/STM32/STM32F4xx/I2C-LPS25H/main.c | 2 +- testex/STM32/STM32F4xx/I2C-LSM6DS0/Makefile | 32 ++-- testex/STM32/STM32F4xx/I2C-LSM6DS0/main.c | 277 +++++----------------------- 3 files changed, 62 insertions(+), 249 deletions(-) (limited to 'testex') diff --git a/testex/STM32/STM32F4xx/I2C-LPS25H/main.c b/testex/STM32/STM32F4xx/I2C-LPS25H/main.c index 640a82c91..014af067e 100644 --- a/testex/STM32/STM32F4xx/I2C-LPS25H/main.c +++ b/testex/STM32/STM32F4xx/I2C-LPS25H/main.c @@ -97,7 +97,7 @@ int main(void) { palSetLineMode(LINE_ARD_D14, PAL_MODE_ALTERNATE(4) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_OTYPE_OPENDRAIN); - /* Activates the serial driver 1 using the driver default configuration.*/ + /* Activates the serial driver 2 using the driver default configuration.*/ sdStart(&SD2, NULL); /* Creates the blinker thread.*/ diff --git a/testex/STM32/STM32F4xx/I2C-LSM6DS0/Makefile b/testex/STM32/STM32F4xx/I2C-LSM6DS0/Makefile index f205016a5..b404ccd51 100644 --- a/testex/STM32/STM32F4xx/I2C-LSM6DS0/Makefile +++ b/testex/STM32/STM32F4xx/I2C-LSM6DS0/Makefile @@ -87,6 +87,9 @@ PROJECT = ch # Imported source files and paths CHIBIOS = ../../../.. + +# Licensing files. +include $(CHIBIOS)/os/license/license.mk # Startup files. include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f4xx.mk # HAL-OSAL files (optional). @@ -97,31 +100,23 @@ include $(CHIBIOS)/os/hal/osal/rt/osal.mk # RTOS files (optional). include $(CHIBIOS)/os/rt/rt.mk include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk -# Other files (optional). +# EX files (optional). include $(CHIBIOS)/os/ex/ST/lsm6ds0.mk +# Other files (optional). include $(CHIBIOS)/os/hal/lib/streams/streams.mk -include $(CHIBIOS)/os/various/shell/shell.mk # Define linker script file here LDSCRIPT= $(STARTUPLD)/STM32F401xE.ld # C sources that can be compiled in ARM or THUMB mode depending on the global # setting. -CSRC = $(STARTUPSRC) \ - $(KERNSRC) \ - $(PORTSRC) \ - $(OSALSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) \ - $(LSM6DS0SRC) \ - $(STREAMSSRC) \ - $(SHELLSRC) \ +CSRC = $(ALLCSRC) \ + $(TESTSRC) \ main.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. -CPPSRC = +CPPSRC = $(ALLCPPSRC) # C sources to be compiled in ARM mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler @@ -144,13 +139,10 @@ TCSRC = TCPPSRC = # List ASM source files here -ASMSRC = -ASMXSRC = $(STARTUPASM) $(PORTASM) $(OSALASM) +ASMSRC = $(ALLASMSRC) +ASMXSRC = $(ALLXASMSRC) -INCDIR = $(CHIBIOS)/os/license \ - $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LSM6DS0INC) \ - $(STREAMSINC) $(SHELLINC) +INCDIR = $(ALLINC) $(TESTINC) # # Project, sources and paths @@ -200,7 +192,7 @@ CPPWARN = -Wall -Wextra -Wundef # # List all user C define here, like -D_DEBUG=1 -UDEFS = -DCHPRINTF_USE_FLOAT=1 -DSHELL_CMD_TEST_ENABLED=0 \ +UDEFS = -DCHPRINTF_USE_FLOAT=1 \ -DLSM6DS0_USE_ADVANCED=0 -DLSM6DS0_GYRO_USE_ADVANCED=0 \ -DLSM6DS0_ACC_USE_ADVANCED=0 -DLSM6DS0_SHARED_I2C=0 diff --git a/testex/STM32/STM32F4xx/I2C-LSM6DS0/main.c b/testex/STM32/STM32F4xx/I2C-LSM6DS0/main.c index 73cd07b3f..bd1bd5d6a 100644 --- a/testex/STM32/STM32F4xx/I2C-LSM6DS0/main.c +++ b/testex/STM32/STM32F4xx/I2C-LSM6DS0/main.c @@ -2,7 +2,7 @@ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. + you may not use this file except in gyroliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 @@ -17,22 +17,23 @@ #include "ch.h" #include "hal.h" -#include "string.h" -#include "shell.h" #include "chprintf.h" - #include "lsm6ds0.h" +#define cls(chp) chprintf(chp, "\033[2J\033[1;1H") + /*===========================================================================*/ /* LSM6DS0 related. */ /*===========================================================================*/ + /* LSM6DS0 Driver: This object represent an LSM6DS0 instance */ static LSM6DS0Driver LSM6DS0D1; -static int32_t rawdata[LSM6DS0_ACC_NUMBER_OF_AXES + - LSM6DS0_GYRO_NUMBER_OF_AXES]; -static float cookeddata[LSM6DS0_ACC_NUMBER_OF_AXES + - LSM6DS0_GYRO_NUMBER_OF_AXES]; +static int32_t accraw[LSM6DS0_ACC_NUMBER_OF_AXES]; +static int32_t gyroraw[LSM6DS0_GYRO_NUMBER_OF_AXES]; + +static float acccooked[LSM6DS0_ACC_NUMBER_OF_AXES]; +static float gyrocooked[LSM6DS0_GYRO_NUMBER_OF_AXES]; static char axisID[LSM6DS0_ACC_NUMBER_OF_AXES] = {'X', 'Y', 'Z'}; static uint32_t i; @@ -43,7 +44,10 @@ static const I2CConfig i2ccfg = { FAST_DUTY_CYCLE_2, }; -static const LSM6DS0AccConfig lsm6ds0acccfg = { +static const LSM6DS0Config lsm6ds0cfg = { + &I2CD1, + &i2ccfg, + LSM6DS0_SAD_VCC, NULL, NULL, LSM6DS0_ACC_FS_2G, @@ -51,9 +55,6 @@ static const LSM6DS0AccConfig lsm6ds0acccfg = { #if LSM6DS0_ACC_USE_ADVANCED LSM6DS0_ACC_DEC_X4, #endif -}; - -static const LSM6DS0GyroConfig lsm6ds0gyrocfg = { NULL, NULL, LSM6DS0_GYRO_FS_245DPS, @@ -64,14 +65,6 @@ static const LSM6DS0GyroConfig lsm6ds0gyrocfg = { LSM6DS0_GYRO_HP_DISABLED, LSM6DS0_GYRO_HPCF_0 #endif -}; - -static const LSM6DS0Config lsm6ds0cfg = { - &I2CD1, - &i2ccfg, - &lsm6ds0acccfg, - &lsm6ds0gyrocfg, - LSM6DS0_SAD_VCC, #if LSM6DS0_USE_ADVANCED || defined(__DOXYGEN__) LSM6DS0_BDU_BLOCKED, LSM6DS0_END_LITTLE @@ -79,190 +72,10 @@ static const LSM6DS0Config lsm6ds0cfg = { }; /*===========================================================================*/ -/* Command line related. */ -/*===========================================================================*/ - -/* Enable use of special ANSI escape sequences */ -#define CHPRINTF_USE_ANSI_CODE TRUE -#define SHELL_WA_SIZE THD_WORKING_AREA_SIZE(2048) - -static void cmd_read(BaseSequentialStream *chp, int argc, char *argv[]) { - (void)argv; - if (argc != 2) { - chprintf(chp, "Usage: read [acc|gyro|both] [raw|cooked]\r\n"); - return; - } - - while (chnGetTimeout((BaseChannel *)chp, 150) == Q_TIMEOUT) { - if (!strcmp (argv[0], "acc")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - accelerometerReadRaw(&LSM6DS0D1, rawdata); - chprintf(chp, "LSM6DS0 Accelerometer raw data...\r\n"); - for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - accelerometerReadCooked(&LSM6DS0D1, cookeddata); - chprintf(chp, "LSM6DS0 Accelerometer cooked data...\r\n"); - for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f mG\r\n", axisID[i], cookeddata[i]); - } - } - else { - chprintf(chp, "Usage: read [acc|gyro|both] [raw|cooked]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "gyro")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - gyroscopeReadRaw(&LSM6DS0D1, rawdata); - chprintf(chp, "LSM6DS0 Gyroscope raw data...\r\n"); - for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - gyroscopeReadCooked(&LSM6DS0D1, cookeddata); - chprintf(chp, "LSM6DS0 Gyroscope cooked data...\r\n"); - for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f DPS\r\n", axisID[i], cookeddata[i]); - } - } - else { - chprintf(chp, "Usage: read [acc|gyro|both] [raw|cooked]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "both")) { - if (!strcmp (argv[1], "raw")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - sensorReadRaw(&LSM6DS0D1, rawdata); - chprintf(chp, "LSM6DS0 Accelerometer raw data...\r\n"); - for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); - } - chprintf(chp, "LSM6DS0 Gyroscope raw data...\r\n"); - for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %d\r\n", axisID[i], - rawdata[i + LSM6DS0_ACC_NUMBER_OF_AXES]); - } - } - else if (!strcmp (argv[1], "cooked")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - sensorReadCooked(&LSM6DS0D1, cookeddata); - chprintf(chp, "LSM6DS0 Accelerometer cooked data...\r\n"); - for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f mG\r\n", axisID[i], cookeddata[i]); - } - chprintf(chp, "LSM6DS0 Gyroscope cooked data...\r\n"); - for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { - chprintf(chp, "%c-axis: %.4f DPS\r\n", axisID[i], - cookeddata[i + LSM6DS0_ACC_NUMBER_OF_AXES]); - } - } - else { - chprintf(chp, "Usage: read [acc|gyro|both] [raw|cooked]\r\n"); - return; - } - } - else { - chprintf(chp, "Usage: read [acc|gyro|both] [raw|cooked]\r\n"); - return; - } - } - chprintf(chp, "Stopped\r\n"); -} - -static void cmd_fullscale(BaseSequentialStream *chp, int argc, char *argv[]) { - (void)argv; - if (argc < 1) { - chprintf(chp, "Usage: fullscale [acc|gyro] [value]\r\n"); - return; - } - if (!strcmp (argv[0], "acc")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - if(!strcmp (argv[1], "2G")) { - accelerometerSetFullScale(&LSM6DS0D1, LSM6DS0_ACC_FS_2G); - chprintf(chp, "LSM6DS0 Accelerometer full scale set to 2G...\r\n"); - } - else if(!strcmp (argv[1], "4G")) { - accelerometerSetFullScale(&LSM6DS0D1, LSM6DS0_ACC_FS_4G); - chprintf(chp, "LSM6DS0 Accelerometer full scale set to 4G...\r\n"); - } - else if(!strcmp (argv[1], "8G")) { - accelerometerSetFullScale(&LSM6DS0D1, LSM6DS0_ACC_FS_8G); - chprintf(chp, "LSM6DS0 Accelerometer full scale set to 8G...\r\n"); - } - else if(!strcmp (argv[1], "16G")) { - accelerometerSetFullScale(&LSM6DS0D1, LSM6DS0_ACC_FS_16G); - chprintf(chp, "LSM6DS0 Accelerometer full scale set to 16G...\r\n"); - } - else { - chprintf(chp, "Usage: fullscale acc [2G|4G|8G|16G]\r\n"); - return; - } - } - else if (!strcmp (argv[0], "gyro")) { -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - if(!strcmp (argv[1], "245")) { - gyroscopeSetFullScale(&LSM6DS0D1, LSM6DS0_GYRO_FS_245DPS); - chprintf(chp, "LSM6DS0 Gyroscope full scale set to 245 DPS...\r\n"); - } - else if(!strcmp (argv[1], "500")) { - gyroscopeSetFullScale(&LSM6DS0D1, LSM6DS0_GYRO_FS_500DPS); - chprintf(chp, "LSM6DS0 Gyroscope full scale set to 500 DPS...\r\n"); - } - else if(!strcmp (argv[1], "2000")) { - gyroscopeSetFullScale(&LSM6DS0D1, LSM6DS0_GYRO_FS_2000DPS); - chprintf(chp, "LSM6DS0 Gyroscope full scale set to 2000 DPS...\r\n"); - } - else { - chprintf(chp, "Usage: fullscale gyro [245|500|2000]\r\n"); - return; - } - } - else { - chprintf(chp, "Usage: fullscale [acc|gyro] [value]\r\n"); - return; - } -} - -static const ShellCommand commands[] = { - {"read", cmd_read}, - {"fullscale", cmd_fullscale}, - {NULL, NULL} -}; - -static const ShellConfig shell_cfg1 = { - (BaseSequentialStream *)&SD2, - commands -}; - -/*===========================================================================*/ -/* Main code. */ +/* Generic code. */ /*===========================================================================*/ +static BaseSequentialStream* chp = (BaseSequentialStream*)&SD2; /* * LED blinker thread, times are in milliseconds. */ @@ -272,13 +85,12 @@ static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("blinker"); while (true) { - palClearLine(LINE_LED_GREEN); - chThdSleepMilliseconds(500); - palSetLine(LINE_LED_GREEN); + palToggleLine(LINE_LED_GREEN); chThdSleepMilliseconds(500); } } + /* * Application entry point. */ @@ -294,44 +106,53 @@ int main(void) { halInit(); chSysInit(); + /* Configuring I2C SCK and I2C SDA related GPIOs .*/ palSetLineMode(LINE_ARD_D15, PAL_MODE_ALTERNATE(4) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_OTYPE_OPENDRAIN); palSetLineMode(LINE_ARD_D14, PAL_MODE_ALTERNATE(4) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_OTYPE_OPENDRAIN); - /* - * Activates the serial driver 2 using the driver default configuration. - */ + /* Activates the serial driver 2 using the driver default configuration.*/ sdStart(&SD2, NULL); - /* - * Creates the blinker thread. - */ + /* Creates the blinker thread.*/ chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL); - /* - * LSM6DS0 Object Initialization - */ + /* LSM6DS0 Object Initialization.*/ lsm6ds0ObjectInit(&LSM6DS0D1); - /* - * Activates the LSM6DS0 driver. - */ + /* Activates the LSM6DS0 driver.*/ lsm6ds0Start(&LSM6DS0D1, &lsm6ds0cfg); - /* - * Shell manager initialization. - */ - shellInit(); + lsm6ds0GyroscopeSampleBias(&LSM6DS0D1); + + /* Normal main() thread activity, printing MEMS data on the SDU1.*/ + while (true) { + lsm6ds0AccelerometerReadRaw(&LSM6DS0D1, accraw); + chprintf(chp, "LSM6DS0 Accelerometer raw data...\r\n"); + for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %d\r\n", axisID[i], accraw[i]); + } - while(TRUE) { + lsm6ds0GyroscopeReadRaw(&LSM6DS0D1, gyroraw); + chprintf(chp, "LSM6DS0 Gyroscope raw data...\r\n"); + for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %d\r\n", axisID[i], gyroraw[i]); + } + + lsm6ds0AccelerometerReadCooked(&LSM6DS0D1, acccooked); + chprintf(chp, "LSM6DS0 Accelerometer cooked data...\r\n"); + for(i = 0; i < LSM6DS0_ACC_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], acccooked[i]); + } - thread_t *shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, - "shell", NORMALPRIO + 1, - shellThread, (void *)&shell_cfg1); - chThdWait(shelltp); /* Waiting termination. */ - chThdSleepMilliseconds(1000); + lsm6ds0GyroscopeReadCooked(&LSM6DS0D1, gyrocooked); + chprintf(chp, "LSM6DS0 Gyroscope cooked data...\r\n"); + for(i = 0; i < LSM6DS0_GYRO_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %.3f\r\n", axisID[i], gyrocooked[i]); + } + chThdSleepMilliseconds(100); + cls(chp); } lsm6ds0Stop(&LSM6DS0D1); - return 0; } -- cgit v1.2.3