Use the official C driver of LSM6DSO
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/
The project is generated using CubeMX
The sensor outputs "Inactivity Detected" when it is stationary
Output "Activity Detected" when active
/* STMicroelectronics evaluation boards definition
*
* Please uncomment ONLY the evaluation boards in use.
* If a different hardware is used please comment all
* following target board and redefine yours.
*/
//#define STEVAL_MKI109V3
#define NUCLEO_G474RE_X_NUCLEO_IKS01A2
#if defined(STEVAL_MKI109V3)
/* MKI109V3: Define communication interface */
#define SENSOR_BUS hspi2
/* MKI109V3: Vdd and Vddio power supply values */
#define PWM_3V3 915
#elif defined(NUCLEO_G474RE_X_NUCLEO_IKS01A2)
/* NUCLEO_G474RE_X_NUCLEO_IKS01A2: Define communication interface */
#define SENSOR_BUS hi2c1
#endif
/* Includes ------------------------------------------------------------------*/
#include <string.h>
#include <stdio.h>
#include "main.h"
#include "lsm6dso_reg.h"
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static uint8_t whoamI, rst;
extern uint8_t tx_buffer[1000];
/* Extern variables ----------------------------------------------------------*/
extern I2C_HandleTypeDef hi2c1;
extern UART_HandleTypeDef hlpuart1;
/* Private functions ---------------------------------------------------------*/
/*
* WARNING:
* Functions declare in this section are defined at the end of this file
* and are strictly related to the hardware platform used.
*
*/
static int32_t platform_write(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len);
static void tx_com( uint8_t *tx_buffer, uint16_t len );
static void platform_init(void);
/* Main Example --------------------------------------------------------------*/
void example_main_activity_lsm6dso(void)
{
lsm6dso_ctx_t dev_ctx;
lsm6dso_pin_int1_route_t int1_route;
/*
* Initialize mems driver interface
*/
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.handle = &hi2c1;
/*
* Init test platform
*/
platform_init();
/*
* Check device ID
*/
lsm6dso_device_id_get(&dev_ctx, &whoamI);
if (whoamI != LSM6DSO_ID)
while(1);
/*
* Restore default configuration
*/
lsm6dso_reset_set(&dev_ctx, PROPERTY_ENABLE);
do {
lsm6dso_reset_get(&dev_ctx, &rst);
} while (rst);
/*
* Disable I3C interface
*/
lsm6dso_i3c_disable_set(&dev_ctx, LSM6DSO_I3C_DISABLE);
/*
* Set XL and Gyro Output Data Rate
*/
lsm6dso_xl_data_rate_set(&dev_ctx, LSM6DSO_XL_ODR_208Hz);
lsm6dso_gy_data_rate_set(&dev_ctx, LSM6DSO_GY_ODR_104Hz);
/*
* Set 2g full XL scale and 250 dps full Gyro
*/
lsm6dso_xl_full_scale_set(&dev_ctx, LSM6DSO_2g);
lsm6dso_gy_full_scale_set(&dev_ctx, LSM6DSO_250dps);
/*
* Set duration for Activity detection to 9.62 ms (= 2 * 1 / ODR_XL)
*/
lsm6dso_wkup_dur_set(&dev_ctx, 0x02);
/*
* Set duration for Inactivity detection to 4.92 s (= 2 * 512 / ODR_XL)
*/
lsm6dso_act_sleep_dur_set(&dev_ctx, 0x02);
/*
* Set Activity/Inactivity threshold to 62.5 mg
*/
lsm6dso_wkup_threshold_set(&dev_ctx, 0x02);
/*
* Inactivity configuration: XL to 12.5 in LP, gyro to Power-Down
*/
lsm6dso_act_mode_set(&dev_ctx, LSM6DSO_XL_12Hz5_GY_PD);
/*
* Enable interrupt generation on Inactivity INT1 pin
*/
lsm6dso_pin_int1_route_get(&dev_ctx, &int1_route);
int1_route.md1_cfg.int1_sleep_change = PROPERTY_ENABLE;
lsm6dso_pin_int1_route_set(&dev_ctx, &int1_route);
/*
* Wait Events
*/
while(1)
{
lsm6dso_all_sources_t all_source;
/*
* Check if Activity/Inactivity events
*/
lsm6dso_all_sources_get(&dev_ctx, &all_source);
if (all_source.wake_up_src.sleep_state)
{
sprintf((char*)tx_buffer, "Inactivity Detected\r\n");
tx_com(tx_buffer, strlen((char const*)tx_buffer));
}
if (all_source.wake_up_src.wu_ia)
{
sprintf((char*)tx_buffer, "Activity Detected\r\n");
tx_com(tx_buffer, strlen((char const*)tx_buffer));
}
}
}
/*
* [url=home.php?mod=space&uid=159083]@brief[/url] Write generic device register (platform dependent)
*
* @param handle customizable argument. In this examples is used in
* order to select the correct sensor bus handler.
* @param reg register to write
* @param bufp pointer to data to write in register reg
* @param len number of consecutive register to write
*
*/
static int32_t platform_write(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len)
{
if (handle == &hi2c1)
{
HAL_I2C_Mem_Write(handle, LSM6DSO_I2C_ADD_H, reg,
I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
}
#ifdef STEVAL_MKI109V3
else if (handle == &hspi2)
{
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Transmit(handle, bufp, len, 1000);
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET);
}
#endif
return 0;
}
/*
* @brief Read generic device register (platform dependent)
*
* @param handle customizable argument. In this examples is used in
* order to select the correct sensor bus handler.
* @param reg register to read
* @param bufp pointer to buffer that store the data read
* @param len number of consecutive register to read
*
*/
static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
uint16_t len)
{
if (handle == &hi2c1)
{
HAL_I2C_Mem_Read(handle, LSM6DSO_I2C_ADD_H, reg,
I2C_MEMADD_SIZE_8BIT, bufp, len, 1000);
}
#ifdef STEVAL_MKI109V3
else if (handle == &hspi2)
{
/* Read command */
reg |= 0x80;
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(handle, ®, 1, 1000);
HAL_SPI_Receive(handle, bufp, len, 1000);
HAL_GPIO_WritePin(CS_up_GPIO_Port, CS_up_Pin, GPIO_PIN_SET);
}
#endif
return 0;
}
/*
* @brief Write generic device register (platform dependent)
*
* @param tx_buffer buffer to trasmit
* @param len number of byte to send
*
*/
void tx_com(uint8_t *tx_buffer, uint16_t len)
{
#ifdef NUCLEO_G474RE_X_NUCLEO_IKS01A2
HAL_UART_Transmit(&hlpuart1, tx_buffer, len, 1000);
#endif
#ifdef STEVAL_MKI109V3
CDC_Transmit_FS(tx_buffer, len);
#endif
}
/*
* @brief platform specific initialization (platform dependent)
*/
static void platform_init(void)
{
#ifdef STEVAL_MKI109V3
TIM3->CCR1 = PWM_3V3;
TIM3->CCR2 = PWM_3V3;
HAL_Delay(1000);
#endif
}
Project Files:
stm32g474.rar
(2.88 MB, downloads: 30)