/** ****************************************************************************** * @file : app_tof.c * @author : IMG SW Application Team * @brief : This file provides code for the configuration * of the STMicroelectronics.X-CUBE-TOF1.3.4.2 instances. ****************************************************************************** * * @attention * * Copyright (c) 2023 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "app_tof.h" #include "main.h" #include #include "usart.h" #include "53l8a1_ranging_sensor.h" #include "app_tof_pin_conf.h" #include "stm32wlxx_nucleo.h" /* * The purpose of this sample application is to showcase the threshold detection * functionality of this device. * * When the device detects a target that match the configuration an IT is generated * and the host will start printing the measurement information on the serial connection (UART). * * Here is the default configuration: * * ITConfig.Criteria = RS_IT_IN_WINDOW; * ITConfig.LowThreshold = 200; // distance in mm * ITConfig.HighThreshold = 600; // distance in mm * * Other availables interrupt generation criteria for this device are: * * - RS_IT_DEFAULT // IT if new measurement is ready (no thresholds) * - RS_IT_IN_WINDOW // IT if distance > thresh_high * - RS_IT_OUT_OF_WINDOW // IT if distance < LowThreshold OR distance > HighThreshold * - RS_IT_BELOW_LOW // IT if distance <= LowThreshold * - RS_IT_ABOVE_HIGH // IT if distance > HighThreshold * - RS_IT_EQUAL_LOW // IT if distance == LowThreshold * - RS_IT_NOT_EQUAL_LOW // IT if distance != LowThreshold */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #define TIMING_BUDGET (30U) /* 5 ms < TimingBudget < 100 ms */ #define RANGING_FREQUENCY (10U) /* Ranging frequency Hz (shall be consistent with TimingBudget value) */ #define LOW_THRESHOLD (200U) #define HIGH_THRESHOLD (600U) /* Private variables ---------------------------------------------------------*/ static RANGING_SENSOR_Capabilities_t Cap; static RANGING_SENSOR_ProfileConfig_t Profile; static RANGING_SENSOR_Result_t Result; static int32_t status = 0; volatile uint8_t ToF_EventDetected = 0; /* Private function prototypes -----------------------------------------------*/ static void MX_53L8A1_ThresholdDetection_Init(void); static void MX_53L8A1_ThresholdDetection_Process(void); static void print_result(RANGING_SENSOR_Result_t *Result); void MX_TOF_Init(void) { /* USER CODE BEGIN SV */ /* USER CODE END SV */ /* USER CODE BEGIN TOF_Init_PreTreatment */ /* USER CODE END TOF_Init_PreTreatment */ /* Initialize the peripherals and the TOF components */ MX_53L8A1_ThresholdDetection_Init(); /* USER CODE BEGIN TOF_Init_PostTreatment */ /* USER CODE END TOF_Init_PostTreatment */ } /* * LM background task */ void MX_TOF_Process(void) { /* USER CODE BEGIN TOF_Process_PreTreatment */ /* USER CODE END TOF_Process_PreTreatment */ MX_53L8A1_ThresholdDetection_Process(); /* USER CODE BEGIN TOF_Process_PostTreatment */ /* USER CODE END TOF_Process_PostTreatment */ } static void MX_53L8A1_ThresholdDetection_Init(void) { /* Initialize Virtual COM Port */ //BSP_COM_Init(COM1); MX_USART2_UART_Init(); /* Sensor reset */ HAL_GPIO_WritePin(VL53L8A1_PWR_EN_C_PORT, VL53L8A1_PWR_EN_C_PIN, GPIO_PIN_RESET); HAL_Delay(2); HAL_GPIO_WritePin(VL53L8A1_PWR_EN_C_PORT, VL53L8A1_PWR_EN_C_PIN, GPIO_PIN_SET); HAL_Delay(2); HAL_GPIO_WritePin(VL53L8A1_LPn_C_PORT, VL53L8A1_LPn_C_PIN, GPIO_PIN_RESET); HAL_Delay(2); HAL_GPIO_WritePin(VL53L8A1_LPn_C_PORT, VL53L8A1_LPn_C_PIN, GPIO_PIN_SET); HAL_Delay(2); status = VL53L8A1_RANGING_SENSOR_Init(VL53L8A1_DEV_CENTER); if (status != BSP_ERROR_NONE) { printf("VL53L8A1_RANGING_SENSOR_Init failed\n"); while (1); } printf("\r\nVL53L8A1_RANGING_SENSOR_Init Success\r\n"); } static void MX_53L8A1_ThresholdDetection_Process(void) { uint32_t Id; RANGING_SENSOR_ITConfig_t ITConfig; VL53L8A1_RANGING_SENSOR_ReadID(VL53L8A1_DEV_CENTER, &Id); VL53L8A1_RANGING_SENSOR_GetCapabilities(VL53L8A1_DEV_CENTER, &Cap); Profile.RangingProfile = RS_PROFILE_8x8_AUTONOMOUS; Profile.TimingBudget = TIMING_BUDGET; Profile.Frequency = RANGING_FREQUENCY; /* Ranging frequency Hz (shall be consistent with TimingBudget value) */ Profile.EnableAmbient = 0; /* Enable: 1, Disable: 0 */ Profile.EnableSignal = 0; /* Enable: 1, Disable: 0 */ /* set the profile if different from default one */ VL53L8A1_RANGING_SENSOR_ConfigProfile(VL53L8A1_DEV_CENTER, &Profile); /* threshold parameters */ ITConfig.Criteria = RS_IT_IN_WINDOW; ITConfig.LowThreshold = LOW_THRESHOLD; /* mm */ ITConfig.HighThreshold = HIGH_THRESHOLD; /* mm */ VL53L8A1_RANGING_SENSOR_ConfigIT(VL53L8A1_DEV_CENTER, &ITConfig); status = VL53L8A1_RANGING_SENSOR_Start(VL53L8A1_DEV_CENTER, RS_MODE_ASYNC_CONTINUOUS); if (status != BSP_ERROR_NONE) { printf("VL53L8A1_RANGING_SENSOR_Start failed\n"); while (1); } printf("\033[2H\033[2J"); printf("53L8A1 Threshold Detection demo application\n\r"); printf("-------------------------------------------\n\r"); printf("please put a target between %d and %d millimeters from the sensor\n\r", LOW_THRESHOLD, HIGH_THRESHOLD); while (1) { /* interrupt mode */ if (ToF_EventDetected != 0) { ToF_EventDetected = 0; status = VL53L8A1_RANGING_SENSOR_GetDistance(VL53L8A1_DEV_CENTER, &Result); if (status == BSP_ERROR_NONE) { print_result(&Result); } } } } static void print_result(RANGING_SENSOR_Result_t *Result) { int8_t i; int8_t j; int8_t k; int8_t l; uint8_t zones_per_line; zones_per_line = ((Profile.RangingProfile == RS_PROFILE_8x8_AUTONOMOUS) || (Profile.RangingProfile == RS_PROFILE_8x8_CONTINUOUS)) ? 8 : 4; printf("%c[2H", 27); /* clear screen */ printf("53L8A1 Threshold Detection demo application\n\r"); printf("-------------------------------------------\n\n\r"); printf("Cell Format :\n\n\r"); for (l = 0; l < RANGING_SENSOR_NB_TARGET_PER_ZONE; l++) { printf(" \033[38;5;10m%20s\033[0m : %20s\n", "Distance [mm]", "Status\r"); if ((Profile.EnableAmbient != 0) || (Profile.EnableSignal != 0)) { printf(" %20s : %20s\n", "Signal [kcps/spad]", "Ambient [kcps/spad]"); } } printf("\n\n"); for (j = 0; j < Result->NumberOfZones; j += zones_per_line) { for (i = 0; i < zones_per_line; i++) /* number of zones per line */ { printf(" -----------------"); } printf("\n"); for (i = 0; i < zones_per_line; i++) { printf("| "); } printf("|\n"); for (l = 0; l < RANGING_SENSOR_NB_TARGET_PER_ZONE; l++) { /* Print distance and status */ for (k = (zones_per_line - 1); k >= 0; k--) { if (Result->ZoneResult[j + k].NumberOfTargets > 0) printf("| \033[38;5;10m%5ld\033[0m : %5ld ", (long)Result->ZoneResult[j + k].Distance[l], (long)Result->ZoneResult[j + k].Status[l]); else printf("| %5s : %5s ", "X", "X"); } printf("|\n"); if ((Profile.EnableAmbient != 0) || (Profile.EnableSignal != 0)) { /* Print Signal and Ambient */ for (k = (zones_per_line - 1); k >= 0; k--) { if (Result->ZoneResult[j + k].NumberOfTargets > 0) { if (Profile.EnableSignal != 0) { printf("| %5ld : ", (long)Result->ZoneResult[j + k].Signal[l]); } else printf("| %5s : ", "X"); if (Profile.EnableAmbient != 0) { printf("%5ld ", (long)Result->ZoneResult[j + k].Ambient[l]); } else printf("%5s ", "X"); } else printf("| %5s : %5s ", "X", "X"); } printf("|\n"); } } } for (i = 0; i < zones_per_line; i++) { printf(" -----------------"); } printf("\n"); } #ifdef __cplusplus } #endif