From 74881fe821cccd5040ef1ec5f48a14d3ddf8ce98 Mon Sep 17 00:00:00 2001 From: Rocco Marco Guglielmi Date: Sat, 20 Aug 2016 13:27:26 +0000 Subject: Updated EX: LIS3MDL driver updated to v1.0.0 git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9736 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32/STM32L4xx/I2C-LIS3MLD/Makefile | 7 +- ...4xx-I2C-LIS3MDL (OpenOCD, Flash and Run).launch | 2 +- testhal/STM32/STM32L4xx/I2C-LIS3MLD/main.c | 196 ++++++++++++++++----- 3 files changed, 158 insertions(+), 47 deletions(-) (limited to 'testhal/STM32/STM32L4xx/I2C-LIS3MLD') diff --git a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/Makefile b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/Makefile index 526ff2310..9365e8a52 100644 --- a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/Makefile +++ b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/Makefile @@ -100,6 +100,7 @@ include $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v7m.mk # Other files (optional). include $(CHIBIOS)/os/ex/ST/lis3mdl.mk include $(CHIBIOS)/os/hal/lib/streams/streams.mk +include $(CHIBIOS)/os/various/shell/shell.mk # Define linker script file here LDSCRIPT= $(STARTUPLD)/STM32L476xG.ld @@ -115,6 +116,7 @@ CSRC = $(STARTUPSRC) \ $(BOARDSRC) \ $(LIS3MDLSRC) \ $(STREAMSSRC) \ + $(SHELLSRC) \ main.c # C++ sources that can be compiled in ARM or THUMB mode depending on the global @@ -148,7 +150,7 @@ ASMXSRC = $(STARTUPASM) $(PORTASM) $(OSALASM) INCDIR = $(CHIBIOS)/os/license \ $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) $(LIS3MDLINC) \ - $(STREAMSINC) $(CHIBIOS)/os/various + $(STREAMSINC) $(SHELLINC) # # Project, sources and paths @@ -198,7 +200,8 @@ CPPWARN = -Wall -Wextra -Wundef # # List all user C define here, like -D_DEBUG=1 -UDEFS = -DCHPRINTF_USE_FLOAT=1 +UDEFS = -DCHPRINTF_USE_FLOAT=1 -DSHELL_CMD_TEST_ENABLED=0 \ + -DLIS3MDL_USE_ADVANCED=0 # Define ASM defines here UADEFS = diff --git a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/debug/STM32L4xx-I2C-LIS3MDL (OpenOCD, Flash and Run).launch b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/debug/STM32L4xx-I2C-LIS3MDL (OpenOCD, Flash and Run).launch index a943e81e9..32e90c197 100644 --- a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/debug/STM32L4xx-I2C-LIS3MDL (OpenOCD, Flash and Run).launch +++ b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/debug/STM32L4xx-I2C-LIS3MDL (OpenOCD, Flash and Run).launch @@ -33,7 +33,7 @@ - + diff --git a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/main.c b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/main.c index f2cabe576..4b21c6e36 100644 --- a/testhal/STM32/STM32L4xx/I2C-LIS3MLD/main.c +++ b/testhal/STM32/STM32L4xx/I2C-LIS3MLD/main.c @@ -13,50 +13,160 @@ See the License for the specific language governing permissions and limitations under the License. */ - #include "ch.h" #include "hal.h" +#include "string.h" +#include "shell.h" #include "chprintf.h" -#include "lis3mdl.h" -/* Enable use of special ANSI escape sequences */ -#define CHPRINTF_USE_ANSI_CODE TRUE +#include "lis3mdl.h" -static BaseSequentialStream * chp = (BaseSequentialStream*) &SD2; +/*===========================================================================*/ +/* LIS3MDL related. */ +/*===========================================================================*/ -/* LIS3MDL Driver: This object represent an LIS3MDL instance */ +/* LIS3MDL Driver: This object represent an LIS3MDL instance.*/ static LIS3MDLDriver LIS3MDLD1; static int32_t rawdata[LIS3MDL_NUMBER_OF_AXES]; static float cookeddata[LIS3MDL_NUMBER_OF_AXES]; -static char axesID[LIS3MDL_NUMBER_OF_AXES] = {'X', 'Y', 'Z'}; +static char axisID[LIS3MDL_NUMBER_OF_AXES] = {'X', 'Y', 'Z'}; static uint32_t i; static const I2CConfig i2ccfg = { - STM32_TIMINGR_PRESC(15U) | - STM32_TIMINGR_SCLDEL(4U) | STM32_TIMINGR_SDADEL(2U) | - STM32_TIMINGR_SCLH(15U) | STM32_TIMINGR_SCLL(21U), - 0, - 0 + STM32_TIMINGR_PRESC(15U) | + STM32_TIMINGR_SCLDEL(4U) | STM32_TIMINGR_SDADEL(2U) | + STM32_TIMINGR_SCLH(15U) | STM32_TIMINGR_SCLL(21U), + 0, + 0 +}; + +static LIS3MDLConfig LIS3MDLcfg = { + &I2CD1, /* Pointer to I2C Driver.*/ + &i2ccfg, /* Pointer to I2C Configuration.*/ + {0, 0, 0}, /* Use default sensitivity.*/ + {0, 0, 0}, /* Use default bias.*/ + LIS3MDL_SAD_VCC, /* Slave address.*/ + LIS3MDL_FS_4GA, /* Full scale value.*/ + LIS3MDL_ODR_40HZ, /* Output data rate.*/ +#if LIS3MDL_USE_ADVANCED || defined(__DOXYGEN__) + LIS3MDL_LP_T, + LIS3MDL_MD_T, + LIS3MDL_OMXY_T, + LIS3MDL_OMZ_T, + LIS3MDL_BDU_T, + LIS3MDL_END_T +#endif +}; + +/*===========================================================================*/ +/* 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 != 1) { + chprintf(chp, "Usage: read [raw|cooked]\r\n"); + return; + } + + while (chnGetTimeout((BaseChannel *)chp, 150) == Q_TIMEOUT) { + if (!strcmp (argv[0], "raw")) { +#if CHPRINTF_USE_ANSI_CODE + chprintf(chp, "\033[2J\033[1;1H"); +#endif + compassReadRaw(&LIS3MDLD1, rawdata); + chprintf(chp, "LIS3MDL compass raw data...\r\n"); + for(i = 0; i < LIS3MDL_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %d\r\n", axisID[i], rawdata[i]); + } + } + else if (!strcmp (argv[0], "cooked")) { +#if CHPRINTF_USE_ANSI_CODE + chprintf(chp, "\033[2J\033[1;1H"); +#endif + compassReadCooked(&LIS3MDLD1, cookeddata); + chprintf(chp, "LIS3MDL compass cooked data...\r\n"); + for(i = 0; i < LIS3MDL_NUMBER_OF_AXES; i++) { + chprintf(chp, "%c-axis: %.3f Gauss\r\n", axisID[i], cookeddata[i]); + } + } + else { + chprintf(chp, "Usage: read [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 [4|8|12|16]\r\n"); + return; + } +#if CHPRINTF_USE_ANSI_CODE + chprintf(chp, "\033[2J\033[1;1H"); +#endif + if(!strcmp (argv[0], "4")) { + compassSetFullScale(&LIS3MDLD1, LIS3MDL_FS_4GA); + chprintf(chp, "LIS3MDL compass full scale set to 4 Gauss...\r\n"); + } + else if(!strcmp (argv[0], "8")) { + compassSetFullScale(&LIS3MDLD1, LIS3MDL_FS_8GA); + chprintf(chp, "LIS3MDL compass full scale set to 8 Gauss...\r\n"); + } + else if(!strcmp (argv[0], "12")) { + compassSetFullScale(&LIS3MDLD1, LIS3MDL_FS_12GA); + chprintf(chp, "LIS3MDL compass full scale set to 12 Gauss...\r\n"); + } + else if(!strcmp (argv[0], "16")) { + compassSetFullScale(&LIS3MDLD1, LIS3MDL_FS_16GA); + chprintf(chp, "LIS3MDL compass full scale set to 16 Gauss...\r\n"); + } + else { + chprintf(chp, "Usage: fullscale [4|8|12|16]\r\n"); + return; + } +} + +static const ShellCommand commands[] = { + {"read", cmd_read}, + {"fullscale", cmd_fullscale}, + {NULL, NULL} }; -static const LIS3MDLConfig lis3mdlcfg = { - &I2CD1, - &i2ccfg, - LIS3MDL_SAD_VCC, - LIS3MDL_FS_4GA, - LIS3MDL_ODR_40HZ, - LIS3MDL_LP_DISABLED, - LIS3MDL_MD_CONTINUOUS, - LIS3MDL_OMXY_ULTRA, - LIS3MDL_OMZ_ULTRA, - LIS3MDL_TEMP_ENABLED, - LIS3MDL_BDU_BLOCKED, - LIS3MDL_END_LITTLE +static const ShellConfig shell_cfg1 = { + (BaseSequentialStream *)&SD2, + commands }; +/*===========================================================================*/ +/* Main code. */ +/*===========================================================================*/ + +/* + * LED blinker thread, times are in milliseconds. + */ +static THD_WORKING_AREA(waThread1, 128); +static THD_FUNCTION(Thread1, arg) { + + (void)arg; + chRegSetThreadName("blinker"); + while (true) { + palClearLine(LINE_LED_GREEN); + chThdSleepMilliseconds(250); + palSetLine(LINE_LED_GREEN); + chThdSleepMilliseconds(250); + } +} + /* * Application entry point. */ @@ -80,27 +190,25 @@ int main(void) { */ sdStart(&SD2, NULL); - /* - * LIS3MDL Object Initialization - */ + + /* Creates the blinker thread.*/ + chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO + 1, Thread1, NULL); + + /* LIS3MDL Object Initialization.*/ lis3mdlObjectInit(&LIS3MDLD1); - lis3mdlStart(&LIS3MDLD1, &lis3mdlcfg); + /* Activates the LIS3MDL driver.*/ + lis3mdlStart(&LIS3MDLD1, &LIS3MDLcfg); - while (TRUE) { - palToggleLine(LINE_LED_GREEN); - compassReadRaw(&LIS3MDLD1, rawdata); - compassReadCooked(&LIS3MDLD1, cookeddata); -#if CHPRINTF_USE_ANSI_CODE - chprintf(chp, "\033[2J\033[1;1H"); -#endif - chprintf(chp, "COMPASS DATA\r\n"); - for(i = 0; i < LIS3MDL_NUMBER_OF_AXES; i++) - chprintf(chp, "RAW-%c:%d\t\t", axesID[i], rawdata[i]); - chprintf(chp, "\r\n"); - for(i = 0; i < LIS3MDL_NUMBER_OF_AXES; i++) - chprintf(chp, "COOKED-%c:%.3f Gauss\t", axesID[i], cookeddata[i]); - chprintf(chp, "\r\n"); - chThdSleepMilliseconds(100); + /* Shell manager initialization.*/ + shellInit(); + + while(TRUE) { + thread_t *shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, + "shell", NORMALPRIO + 1, + shellThread, (void *)&shell_cfg1); + chThdWait(shelltp); /* Waiting termination. */ } + lis3mdlStop(&LIS3MDLD1); + return 0; } -- cgit v1.2.3