From b1fd0bde589fb09247526440e2e06465349006d1 Mon Sep 17 00:00:00 2001 From: planeflight Date: Mon, 30 Mar 2026 21:13:05 -0700 Subject: [PATCH 001/158] add SAMM code from last year --- SAMM/Core/Extras/CircBuF/circularBuffer.c | 64 ++ SAMM/Core/Extras/CircBuF/circularBuffer.h | 22 + SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c | 699 ++++++++++++++++++ SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h | 405 ++++++++++ .../Extras/VL53L4ED/VL53L4ED_calibration.c | 242 ++++++ .../Extras/VL53L4ED/VL53L4ED_calibration.h | 73 ++ SAMM/Core/Extras/VL53L4ED/platform.c | 113 +++ SAMM/Core/Extras/VL53L4ED/platform.h | 80 ++ SAMM/Core/Extras/extra.c | 58 ++ SAMM/Core/Extras/extra.h | 20 + SAMM/Core/Inc/adc.h | 52 ++ SAMM/Core/Inc/crc.h | 52 ++ SAMM/Core/Inc/dma.h | 52 ++ SAMM/Core/Inc/fdcan.h | 55 ++ SAMM/Core/Inc/gpio.h | 49 ++ SAMM/Core/Inc/i2c.h | 52 ++ SAMM/Core/Inc/main.h | 80 ++ SAMM/Core/Inc/spi.h | 52 ++ SAMM/Core/Inc/stm32_assert.h | 53 ++ SAMM/Core/Inc/stm32g4xx_hal_conf.h | 380 ++++++++++ SAMM/Core/Inc/stm32g4xx_it.h | 67 ++ SAMM/Core/Src/adc.c | 154 ++++ SAMM/Core/Src/crc.c | 90 +++ SAMM/Core/Src/dma.c | 59 ++ SAMM/Core/Src/fdcan.c | 223 ++++++ SAMM/Core/Src/gpio.c | 99 +++ SAMM/Core/Src/i2c.c | 135 ++++ SAMM/Core/Src/main.c | 300 ++++++++ SAMM/Core/Src/spi.c | 121 +++ SAMM/Core/Src/stm32g4xx_hal_msp.c | 86 +++ SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c | 127 ++++ SAMM/Core/Src/stm32g4xx_it.c | 218 ++++++ SAMM/Core/Src/syscalls.c | 176 +++++ SAMM/Core/Src/sysmem.c | 79 ++ SAMM/Core/Src/system_stm32g4xx.c | 285 +++++++ 35 files changed, 4872 insertions(+) create mode 100644 SAMM/Core/Extras/CircBuF/circularBuffer.c create mode 100644 SAMM/Core/Extras/CircBuF/circularBuffer.h create mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c create mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h create mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c create mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h create mode 100644 SAMM/Core/Extras/VL53L4ED/platform.c create mode 100644 SAMM/Core/Extras/VL53L4ED/platform.h create mode 100644 SAMM/Core/Extras/extra.c create mode 100644 SAMM/Core/Extras/extra.h create mode 100644 SAMM/Core/Inc/adc.h create mode 100644 SAMM/Core/Inc/crc.h create mode 100644 SAMM/Core/Inc/dma.h create mode 100644 SAMM/Core/Inc/fdcan.h create mode 100644 SAMM/Core/Inc/gpio.h create mode 100644 SAMM/Core/Inc/i2c.h create mode 100644 SAMM/Core/Inc/main.h create mode 100644 SAMM/Core/Inc/spi.h create mode 100644 SAMM/Core/Inc/stm32_assert.h create mode 100644 SAMM/Core/Inc/stm32g4xx_hal_conf.h create mode 100644 SAMM/Core/Inc/stm32g4xx_it.h create mode 100644 SAMM/Core/Src/adc.c create mode 100644 SAMM/Core/Src/crc.c create mode 100644 SAMM/Core/Src/dma.c create mode 100644 SAMM/Core/Src/fdcan.c create mode 100644 SAMM/Core/Src/gpio.c create mode 100644 SAMM/Core/Src/i2c.c create mode 100644 SAMM/Core/Src/main.c create mode 100644 SAMM/Core/Src/spi.c create mode 100644 SAMM/Core/Src/stm32g4xx_hal_msp.c create mode 100644 SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c create mode 100644 SAMM/Core/Src/stm32g4xx_it.c create mode 100644 SAMM/Core/Src/syscalls.c create mode 100644 SAMM/Core/Src/sysmem.c create mode 100644 SAMM/Core/Src/system_stm32g4xx.c diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.c b/SAMM/Core/Extras/CircBuF/circularBuffer.c new file mode 100644 index 000000000..e7f59de79 --- /dev/null +++ b/SAMM/Core/Extras/CircBuF/circularBuffer.c @@ -0,0 +1,64 @@ +#include "circularBuffer.h" +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) { + CircularBuffer *cb = malloc(sizeof(CircularBuffer)); + if (!cb) { + return NULL; + } + + cb->buffer = malloc(capacity * sizeof(void *)); + if (!cb->buffer) { + free(cb); + return NULL; + } + + for (size_t i = 0; i < capacity; i++) { + cb->buffer[i] = malloc(max_array_size); + if (!cb->buffer[i]) { + for (size_t j = 0; j < i; j++) { + free(cb->buffer[j]); + } + free(cb->buffer); + free(cb); + return NULL; + } + } + cb->capacity = capacity; + cb->max_arr_size = max_array_size; + cb->head = 0; + cb->tail = 0; + cb->size = 0; + return cb; +} + +void circularBufferDestroy(CircularBuffer *cb) { + if (!cb) return; + + for (size_t i = 0; i < cb->capacity; i++) { + free(cb->buffer[i]); + } + free(cb->buffer); + free(cb); +} + +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) { + if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { + return -1; // Buffer is full or array is too large + } + + // Copy the array into the buffer + memcpy(cb->buffer[cb->head], array, array_size); + cb->head = (cb->head + 1) % cb->capacity; + cb->size++; + return 0; +} + +void *circularBufferPop(CircularBuffer *cb) { + if (!cb || cb->size == 0) { + return NULL; // Buffer is empty + } + + void *array = cb->buffer[cb->tail]; + cb->tail = (cb->tail + 1) % cb->capacity; + cb->size--; + return array; +} diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.h b/SAMM/Core/Extras/CircBuF/circularBuffer.h new file mode 100644 index 000000000..ae7ce9220 --- /dev/null +++ b/SAMM/Core/Extras/CircBuF/circularBuffer.h @@ -0,0 +1,22 @@ +#ifndef __circularBuffer_h__ +#define __circularBuffer_h__ + +#include +#include +#include +#include + +typedef struct { + void **buffer; // Array of void pointers + uint8_t capacity; // Maximum number of elements in the buffer + uint8_t head; // Index of the next element to write + uint8_t tail; // Index of the next element to read + uint8_t size; // Current number of elements in the buffer + uint8_t max_arr_size; // Maximum size of the array +} CircularBuffer; + +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); +void circularBufferDestroy(CircularBuffer *cb); +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size); +void *circularBufferPop(CircularBuffer *cb); +#endif \ No newline at end of file diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c new file mode 100644 index 000000000..323148da4 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c @@ -0,0 +1,699 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_api.c + * @brief Functions implementation + */ + +#include +#include +#include "VL53L4ED_api.h" + +static const uint8_t VL53L4ED_DEFAULT_CONFIGURATION[] = { + #ifdef VL53L4ED_I2C_FAST_MODE_PLUS + 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ + #else + 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ + #endif + 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low + (bits 3:0 must be 0x1), use SetInterruptPolarity() */ + 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, + use CheckForDataReady() */ + 0x00, /* 0x32 : not user-modifiable */ + 0x02, /* 0x33 : not user-modifiable */ + 0x08, /* 0x34 : not user-modifiable */ + 0x00, /* 0x35 : not user-modifiable */ + 0x08, /* 0x36 : not user-modifiable */ + 0x10, /* 0x37 : not user-modifiable */ + 0x01, /* 0x38 : not user-modifiable */ + 0x01, /* 0x39 : not user-modifiable */ + 0x00, /* 0x3a : not user-modifiable */ + 0x00, /* 0x3b : not user-modifiable */ + 0x00, /* 0x3c : not user-modifiable */ + 0x00, /* 0x3d : not user-modifiable */ + 0xff, /* 0x3e : not user-modifiable */ + 0x00, /* 0x3f : not user-modifiable */ + 0x0F, /* 0x40 : not user-modifiable */ + 0x00, /* 0x41 : not user-modifiable */ + 0x00, /* 0x42 : not user-modifiable */ + 0x00, /* 0x43 : not user-modifiable */ + 0x00, /* 0x44 : not user-modifiable */ + 0x00, /* 0x45 : not user-modifiable */ + 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, + 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ + 0x0b, /* 0x47 : not user-modifiable */ + 0x00, /* 0x48 : not user-modifiable */ + 0x00, /* 0x49 : not user-modifiable */ + 0x02, /* 0x4a : not user-modifiable */ + 0x14, /* 0x4b : not user-modifiable */ + 0x21, /* 0x4c : not user-modifiable */ + 0x00, /* 0x4d : not user-modifiable */ + 0x00, /* 0x4e : not user-modifiable */ + 0x05, /* 0x4f : not user-modifiable */ + 0x00, /* 0x50 : not user-modifiable */ + 0x00, /* 0x51 : not user-modifiable */ + 0x00, /* 0x52 : not user-modifiable */ + 0x00, /* 0x53 : not user-modifiable */ + 0xc8, /* 0x54 : not user-modifiable */ + 0x00, /* 0x55 : not user-modifiable */ + 0x00, /* 0x56 : not user-modifiable */ + 0x38, /* 0x57 : not user-modifiable */ + 0xff, /* 0x58 : not user-modifiable */ + 0x01, /* 0x59 : not user-modifiable */ + 0x00, /* 0x5a : not user-modifiable */ + 0x08, /* 0x5b : not user-modifiable */ + 0x00, /* 0x5c : not user-modifiable */ + 0x00, /* 0x5d : not user-modifiable */ + 0x01, /* 0x5e : not user-modifiable */ + 0xcc, /* 0x5f : not user-modifiable */ + 0x07, /* 0x60 : not user-modifiable */ + 0x01, /* 0x61 : not user-modifiable */ + 0xf1, /* 0x62 : not user-modifiable */ + 0x05, /* 0x63 : not user-modifiable */ + 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), + use SetSigmaThreshold(), default value 90 mm */ + 0xa0, /* 0x65 : Sigma threshold LSB */ + 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), + use SetSignalThreshold() */ + 0x80, /* 0x67 : Min count Rate LSB */ + 0x08, /* 0x68 : not user-modifiable */ + 0x38, /* 0x69 : not user-modifiable */ + 0x00, /* 0x6a : not user-modifiable */ + 0x00, /* 0x6b : not user-modifiable */ + 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, + use SetIntermeasurementInMs() */ + 0x00, /* 0x6d : Intermeasurement period */ + 0x0f, /* 0x6e : Intermeasurement period */ + 0x89, /* 0x6f : Intermeasurement period LSB */ + 0x00, /* 0x70 : not user-modifiable */ + 0x00, /* 0x71 : not user-modifiable */ + 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x73 : distance threshold high LSB */ + 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x75 : distance threshold low LSB */ + 0x00, /* 0x76 : not user-modifiable */ + 0x01, /* 0x77 : not user-modifiable */ + 0x07, /* 0x78 : not user-modifiable */ + 0x05, /* 0x79 : not user-modifiable */ + 0x06, /* 0x7a : not user-modifiable */ + 0x06, /* 0x7b : not user-modifiable */ + 0x00, /* 0x7c : not user-modifiable */ + 0x00, /* 0x7d : not user-modifiable */ + 0x02, /* 0x7e : not user-modifiable */ + 0xc7, /* 0x7f : not user-modifiable */ + 0xff, /* 0x80 : not user-modifiable */ + 0x9B, /* 0x81 : not user-modifiable */ + 0x00, /* 0x82 : not user-modifiable */ + 0x00, /* 0x83 : not user-modifiable */ + 0x00, /* 0x84 : not user-modifiable */ + 0x01, /* 0x85 : not user-modifiable */ + 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ + 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), + If you want an automatic start after VL53L4ED_init() call, + put 0x40 in location 0x87 */ +}; + +VL53L4ED_Error VL53L4ED_GetSWVersion( + VL53L4ED_Version_t *p_Version) +{ + VL53L4ED_Error Status = VL53L4ED_ERROR_NONE; + + p_Version->major = VL53L4ED_IMPLEMENTATION_VER_MAJOR; + p_Version->minor = VL53L4ED_IMPLEMENTATION_VER_MINOR; + p_Version->build = VL53L4ED_IMPLEMENTATION_VER_BUILD; + p_Version->revision = VL53L4ED_IMPLEMENTATION_VER_REVISION; + return Status; +} + +VL53L4ED_Error VL53L4ED_SetI2CAddress( + Dev_t dev, + uint8_t new_address) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, + (uint8_t)(new_address >> (uint8_t)1)); + return status; +} + +VL53L4ED_Error VL53L4ED_GetSensorId( + Dev_t dev, + uint16_t *p_id) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_IDENTIFICATION__MODEL_ID, p_id); + return status; +} + +VL53L4ED_Error VL53L4ED_SensorInit( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t Addr, tmp; + uint8_t continue_loop = 1; + uint16_t i = 0; + + do{ + status |= VL53L4ED_RdByte(dev, + VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); + + if(tmp == (uint8_t)0x3) /* Sensor booted */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for boot */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + /* Load default configuration */ + for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) + { + status |= VL53L4ED_WrByte(dev, Addr, + VL53L4ED_DEFAULT_CONFIGURATION[ + Addr - (uint8_t)0x2D]); + } + + /* Start VHV */ + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, (uint8_t)0x40); + i = (uint8_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_ClearInterrupt(dev); + status |= VL53L4ED_StopRanging(dev); + status |= VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, + (uint8_t)0x09); + status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0); + status |= VL53L4ED_WrWord(dev, 0x0024, 0x500); + + status |= VL53L4ED_SetRangeTiming(dev, 100, 0); + + return status; +} + +VL53L4ED_Error VL53L4ED_ClearInterrupt( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT_CLEAR, 0x01); + return status; +} + +VL53L4ED_Error VL53L4ED_StartRanging( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint32_t tmp; + + status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); + + /* Sensor runs in continuous mode */ + if(tmp == (uint32_t)0) + { + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x21); + } + /* Sensor runs in autonomous mode */ + else + { + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x40); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_StopRanging( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x80); + return status; +} + +VL53L4ED_Error VL53L4ED_CheckForDataReady( + Dev_t dev, + uint8_t *p_is_data_ready) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t temp; + uint8_t int_pol; + + status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO_HV_MUX__CTRL, &temp); + temp = temp & (uint8_t)0x10; + temp = temp >> 4; + + if (temp == (uint8_t)1) + { + int_pol = (uint8_t)0; + } + else + { + int_pol = (uint8_t)1; + } + + status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO__TIO_HV_STATUS, &temp); + + if ((temp & (uint8_t)1) == int_pol) + { + *p_is_data_ready = (uint8_t)1; + } + else + { + *p_is_data_ready = (uint8_t)0; + } + + return status; +} + +VL53L4ED_Error VL53L4ED_SetRangeTiming( + Dev_t dev, + uint32_t timing_budget_ms, + uint32_t inter_measurement_ms) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t clock_pll, osc_frequency, ms_byte; + uint32_t macro_period_us = 0, timing_budget_us = 0, ls_byte, tmp; + float_t inter_measurement_factor = (float_t)1.055; + + status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); + if(osc_frequency != (uint16_t)0) + { + timing_budget_us = timing_budget_ms*(uint32_t)1000; + macro_period_us = (uint32_t)((uint32_t)2304 * + ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; + } + else + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + + /* Timing budget check validity */ + if ((timing_budget_ms < (uint32_t)10) + || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) + { + status |= VL53L4ED_ERROR_INVALID_ARGUMENT; + } + /* Sensor runs in continuous mode */ + else if(inter_measurement_ms == (uint32_t)0) + { + status |= VL53L4ED_WrDWord(dev,VL53L4ED_INTERMEASUREMENT_MS, 0); + timing_budget_us -= (uint32_t)2500; + } + /* Sensor runs in autonomous low power mode */ + else if(inter_measurement_ms > timing_budget_ms) + { + status |= VL53L4ED_RdWord(dev, + VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + clock_pll = clock_pll & (uint16_t)0x3FF; + inter_measurement_factor = inter_measurement_factor + * (float_t)inter_measurement_ms + * (float_t)clock_pll; + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, + (uint32_t)inter_measurement_factor); + + timing_budget_us -= (uint32_t)4300; + timing_budget_us /= (uint32_t)2; + + } + /* Invalid case */ + else + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + + if(status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) + { + ms_byte = 0; + timing_budget_us = timing_budget_us << 12; + tmp = macro_period_us*(uint32_t)16; + ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) + - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + + (uint16_t) (ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A,ms_byte); + + ms_byte = 0; + tmp = macro_period_us*(uint32_t)12; + ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) + - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + + (uint16_t) (ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B,ms_byte); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_GetRangeTiming( + Dev_t dev, + uint32_t *p_timing_budget_ms, + uint32_t *p_inter_measurement_ms) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t osc_frequency = 1, range_config_macrop_high, clock_pll = 1; + uint32_t tmp, ls_byte, ms_byte, macro_period_us; + float_t clock_pll_factor = (float_t)1.065; + + /* Get InterMeasurement */ + status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); + status |= VL53L4ED_RdWord(dev, + VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + clock_pll = clock_pll & (uint16_t)0x3FF; + clock_pll_factor = clock_pll_factor * (float_t)clock_pll; + clock_pll = (uint16_t)clock_pll_factor; + *p_inter_measurement_ms = (uint16_t)(tmp/(uint32_t)clock_pll); + + /* Get TimingBudget */ + status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, + &range_config_macrop_high); + + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 + / (uint32_t)osc_frequency)) >> 6; + ls_byte = (range_config_macrop_high & (uint32_t)0x00FF) << 4; + ms_byte = (range_config_macrop_high & (uint32_t)0xFF00) >> 8; + ms_byte = (uint32_t)0x04 - (ms_byte - (uint32_t)1) - (uint32_t)1; + + macro_period_us = macro_period_us * (uint32_t)16; + *p_timing_budget_ms = (((ls_byte + (uint32_t)1)*(macro_period_us>> 6)) + - ((macro_period_us>> 6)>>1)) >> 12; + + if(ms_byte < (uint8_t)12) + { + *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms + >> (uint8_t)ms_byte); + } + + /* Mode continuous */ + if(tmp == (uint32_t)0) + { + *p_timing_budget_ms += (uint32_t)2500; + } + /* Mode autonomous */ + else + { + *p_timing_budget_ms *= (uint32_t)2; + *p_timing_budget_ms += (uint32_t)4300; + } + + *p_timing_budget_ms = *p_timing_budget_ms/(uint32_t)1000; + + return status; +} + +VL53L4ED_Error VL53L4ED_GetResult( + Dev_t dev, + VL53L4ED_ResultsData_t *p_result) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp_16; + uint8_t temp_8; + uint8_t status_rtn[24] = { 255, 255, 255, 5, 2, 4, 1, 7, 3, + 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, + 255, 255, 11, 12 }; + + status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, + &temp_8); + temp_8 = temp_8 & (uint8_t)0x1F; + if (temp_8 < (uint8_t)24) + { + temp_8 = status_rtn[temp_8]; + } + p_result->range_status = temp_8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, + &temp_16); + p_result->number_of_spad = temp_16 / (uint16_t) 256; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, + &temp_16); + p_result->signal_rate_kcps = temp_16 * (uint16_t) 8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, + &temp_16); + p_result->ambient_rate_kcps = temp_16 * (uint16_t) 8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, + &temp_16); + p_result->sigma_mm = temp_16 / (uint16_t) 4; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, + &temp_16); + p_result->distance_mm = temp_16; + + p_result->signal_per_spad_kcps = p_result->signal_rate_kcps + /p_result->number_of_spad; + p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps + /p_result->number_of_spad; + + return status; +} + +VL53L4ED_Error VL53L4ED_SetOffset( + Dev_t dev, + int16_t OffsetValueInMm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp; + + temp = (uint16_t)((uint16_t)OffsetValueInMm*(uint16_t)4); + + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, temp); + status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, (uint8_t)0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, (uint8_t)0x0); + return status; +} + +VL53L4ED_Error VL53L4ED_GetOffset( + Dev_t dev, + int16_t *p_offset) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp; + + status |= VL53L4ED_RdWord(dev,VL53L4ED_RANGE_OFFSET_MM, &temp); + + temp = temp<<3; + temp = temp>>5; + *p_offset = (int16_t)(temp); + + if(*p_offset > 1024) + { + *p_offset = *p_offset - 2048; + } + + return status; +} + +VL53L4ED_Error VL53L4ED_SetXtalk( + Dev_t dev, + uint16_t XtalkValueKcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, + (XtalkValueKcps<<9)); + + return status; +} + +VL53L4ED_Error VL53L4ED_GetXtalk( + Dev_t dev, + uint16_t *p_xtalk_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + float_t tmp_xtalk; + + status |= VL53L4ED_RdWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); + + tmp_xtalk = (float_t)*p_xtalk_kcps / (float_t)512.0; + *p_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); + + return status; +} + +VL53L4ED_Error VL53L4ED_SetDetectionThresholds( + Dev_t dev, + uint16_t distance_low_mm, + uint16_t distance_high_mm, + uint8_t window) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT, window); + status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_HIGH, distance_high_mm); + status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_LOW, distance_low_mm); + return status; +} + +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, + uint16_t *p_distance_low_mm, + uint16_t *p_distance_high_mm, + uint8_t *p_window) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH,p_distance_high_mm); + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_LOW, p_distance_low_mm); + status |= VL53L4ED_RdByte(dev, VL53L4ED_SYSTEM__INTERRUPT, p_window); + *p_window = (*p_window & (uint8_t)0x7); + + return status; +} + +VL53L4ED_Error VL53L4ED_SetSignalThreshold( + Dev_t dev, + uint16_t signal_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrWord(dev, + VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS,signal_kcps>>3); + return status; +} + +VL53L4ED_Error VL53L4ED_GetSignalThreshold( + Dev_t dev, + uint16_t *p_signal_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t tmp = 0; + + status |= VL53L4ED_RdWord(dev, + VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); + *p_signal_kcps = tmp <<3; + + return status; +} + +VL53L4ED_Error VL53L4ED_SetSigmaThreshold( + Dev_t dev, + uint16_t sigma_mm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + if(sigma_mm>(uint16_t)((uint16_t)0xFFFF>>2)) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + status |= VL53L4ED_WrWord(dev, + VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm<<2); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_GetSigmaThreshold( + Dev_t dev, + uint16_t *p_sigma_mm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status += VL53L4ED_RdWord(dev, + VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); + *p_sigma_mm = *p_sigma_mm >> 2; + + return status; +} + +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t tmp = 0, continue_loop = 1; + uint16_t i = 0; + + status |= VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); + status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0x92); + status |= VL53L4ED_StartRanging(dev); + + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_ClearInterrupt(dev); + status |= VL53L4ED_StopRanging(dev); + + status += VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); + status += VL53L4ED_WrByte(dev, 0x0B, 0); + return status; +} diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h new file mode 100644 index 000000000..df55ef3d0 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h @@ -0,0 +1,405 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#ifndef VL53L4ED_API_H_ +#define VL53L4ED_API_H_ + +#include "platform.h" + +/** + * @brief Driver version + */ + +#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 +#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 + +/** + * @brief Driver error type + */ + +typedef uint8_t VL53L4ED_Error; + +#define VL53L4ED_ERROR_NONE ((uint8_t)0U) +#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) +#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) +#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) + + +/** + * @brief Inner Macro for API. Not for user, only for development. + */ + +#define VL53L4ED_SOFT_RESET ((uint16_t)0x0000)) +#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) +#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) +#define VL53L4ED_XTALK_PLANE_OFFSET_KCPS ((uint16_t)0x0016) +#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) +#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) +#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) +#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) +#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) +#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) +#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) +#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) +#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) +#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) +#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) +#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) +#define VL53L4ED_INTERMEASUREMENT_MS ((uint16_t)0x006C) +#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) +#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) +#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) +#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) +#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) +#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) +#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) +#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) +#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) +#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) + + +#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) +#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) +#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) + +/** + * @brief defines Software Version + */ + +typedef struct { + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ + uint32_t revision; /*!< revision number */ +} VL53L4ED_Version_t; + +/** + * @brief Packed reading results type + */ + +typedef struct { + + /* Status of measurements. If the status is equal to 0, the data are valid*/ + uint8_t range_status; + /* Measured distance in millimeters */ + uint16_t distance_mm; + /* Ambient noise in kcps */ + uint16_t ambient_rate_kcps; + /* Ambient noise in kcps/SPAD */ + uint16_t ambient_per_spad_kcps; + /* Measured signal of the target in kcps */ + uint16_t signal_rate_kcps; + /* Measured signal of the target in kcps/SPAD */ + uint16_t signal_per_spad_kcps; + /* Number of SPADs enabled */ + uint16_t number_of_spad; + /* Estimated measurements std deviation in mm */ + uint16_t sigma_mm; +} VL53L4ED_ResultsData_t; + +/** + * @brief This function programs the software driver version. + * @param (VL53L4ED_Version_t) pVersion : Pointer of structure, containing the + * software version. + * @return (VL53L4ED_ERROR) status : 0 if SW version is OK. + */ + +VL53L4ED_Error VL53L4ED_GetSWVersion( + VL53L4ED_Version_t *pVersion); + + +/** + * @brief This function sets a new I2C address to a sensor. It can be used for + * example when multiple sensors share the same I2C bus. + * @param (Dev_t) dev : Device instance to update. + * @param (uint8_t) new_address : New I2C address. + * @return (VL53L4ED_ERROR) status : 0 if I2C address has been correctly + * programmed. + */ + +VL53L4ED_Error VL53L4ED_SetI2CAddress( + Dev_t dev, + uint8_t new_address); + +/** + * @brief This function is used to get the sensor id of VL53L4ED. The sensor id + * should be 0xEBAA. + * @param (Dev_t) dev : Device instance. + * @param (uint16_t) *p_id : Sensor id. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetSensorId( + Dev_t dev, + uint16_t *p_id); + +/** + * @brief This function is used to initialize the sensor. + * @param (Dev_t) dev : Device instance to initialize. + * @return (VL53L4ED_ERROR) status : 0 if init is OK. + */ + +VL53L4ED_Error VL53L4ED_SensorInit( + Dev_t dev); + +/** + * @brief This function clears the interrupt. It needs to be called after a + * ranging data reading to arm the interrupt for the next data ready event. + * @param (Dev_t) dev : Device instance. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_ClearInterrupt( + Dev_t dev); + +/** + * @brief This function starts a ranging session. The ranging operation is + * continuous. The clear interrupt has to be done after each get data to allow + * the interrupt to raise when the next data is ready. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_StartRanging( + Dev_t dev); + +/** + * @brief This function stops the ranging in progress. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_StopRanging( + Dev_t dev); + +/** + * @brief This function check if a new data is available by polling a dedicated + * register. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint8_t) *p_is_data_ready : Pointer containing a flag to know if a + * data is ready : 0 = no data ready, 1 = data ready. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_CheckForDataReady( + Dev_t dev, + uint8_t *p_is_data_ready); + +/** + * @brief This function sets new range timing. Timing are composed of + * TimingBudget and InterMeasurement. TimingBudget represents the timing during + * VCSEL enabled, and InterMeasurement the time between two measurements. + * The sensor can have different ranging mode depending of the configuration, + * please refer to the user manual for more information. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint32_t) timing_budget_ms : New timing budget in ms. Value can be + * between 10ms and 200ms. Default is 50ms. + * @param (uint32_t) inter_measurement_ms : New inter-measurement in ms. If the + * value is equal to 0, the ranging period is defined by the timing budget. + * Otherwise, inter-measurement must be > timing budget. When all the timing + * budget is consumed, the device goes in low power mode until inter-measurement + * is done. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetRangeTiming( + Dev_t dev, + uint32_t timing_budget_ms, + uint32_t inter_measurement_ms); + +/** + * @brief This function gets the current range timing. Timing are composed of + * TimingBudget and InterMeasurement. TimingBudget represents the timing during + * VCSEL enabled, and InterMeasurement the time between two measurements. + * The sensor can have different ranging mode depending of the configuration, + * please refer to the user manual for more information. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint32_t) *p_timing_budget_ms : Pointer containing the current + * timing budget in ms. + * @param (uint32_t) *p_inter_measurement_ms : Pointer containing the current + * inter-measurement in ms. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetRangeTiming( + Dev_t dev, + uint32_t *p_timing_budget_ms, + uint32_t *p_inter_measurement_ms); + +/** + * @brief This function gets the results reported by the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (VL53L4ED_ResultsData_t) *pResult : Pointer of structure, filled with the + * ranging results. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *pResult); + +/** + * @brief This function sets a new offset correction in mm. Offset corresponds + * to the difference in millimeters between real distance and measured distance. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum + * value is -1024mm and maximum is 1023mm. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm); + +/** + * @brief This function gets the current offset correction in mm. Offset + * corresponds to the difference in millimeters between real distance and + * measured distance. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum + * value is -1024mm and maximum is 1023mm. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *Offset); + +/** + * @brief This function sets a new Xtalk value in kcps. Xtalk represents the + * correction to apply to the sensor when a protective coverglass is placed + * at the top of the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) XtalkValueKcps : New xtalk value in kcps. The default + * value is 0 kcps (no coverglass). Minimum is 0 kcps , and maximum is 128 + * kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps); + +/** + * @brief This function gets the current Xtalk value in kcps. Xtalk represents + * the correction to apply to the sensor when a protective coverglass is placed + * at the top of the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) p_xtalk_kcps : Pointer of current xtalk value in kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps); + +/** + * @brief This function sets new detection thresholds. The detection + * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only + * when a condition on distance is reach. Example: + * VL53L4ED_SetDistanceThreshold(dev,100,300,0): Below 100 mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,1): Above 300 mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,2): Below 100mm or above 300mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,3): Above 100mm or below 300mm + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) distance_low_mm : Low distance threshold in millimeters. + * @param (uint16_t) distance_high_mm : High distance threshold in millimeters. + * @param (uint8_t) window : Interrupt windows (0=below low threshold; + * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, + uint16_t distance_low_mm, + uint16_t distance_high_mm, + uint8_t window); + + +/** + * @brief This function gets the current detection thresholds. The detection + * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only + * when a condition on distance is reach. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_distance_low_mm : Pointer of low distance threshold in + * millimeters. + * @param (uint16_t) *p_distance_high_mm : Pointer of high distance threshold in + * millimeters. + * @param (uint8_t) *p_window : Interrupt windows (0=below low threshold; + * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, + uint16_t *p_distance_low_mm, + uint16_t *p_distance_high_mm, + uint8_t *p_window); + +/** + * @brief This function sets a new signal threshold in kcps. If a + * target has a lower signal as the programmed value, the result status in + * structure 'VL53L4ED_ResultsData_t' will be equal to 2. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) signal_kcps : New signal threshold in kcps. The default + * value is 1024 kcps. Minimum is 0 kcps (no threshold), and maximum is 16384 + * kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps); + +/** + * @brief This function returns the current signal threshold in kcps. If a + * target has a lower signal as the programmed value, the result status in + * structure 'VL53L4ED_ResultsData_t' will be equal to 2. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_signal_kcps : Pointer of signal threshold in kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, + uint16_t *p_signal_kcps); + +/** + * @brief This function programs a new sigma threshold. The sigma corresponds to + * the standard deviation of the returned pulse. If the computed sigma is above + * the programmed value, the result status in structure 'VL53L4ED_ResultsData_t' + * will be equal to 1. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) sigma_mm : New sigma threshold in mm. The default value is + * 15mm. Minimum is 0mm (not threshold), and maximum is 16383mm. + * @return (VL53L4ED_ERROR) status : 0 if programming is or 255 if value is too + * high. + */ + +VL53L4ED_Error VL53L4ED_SetSigmaThreshold( + Dev_t dev, + uint16_t sigma_mm); + +/** + * @brief This function gets the current sigma threshold. The sigma corresponds + * to the standard deviation of the returned pulse. If the computed sigma is + * above the programmed value, the result status in structure + * 'VL53L4ED_ResultsData_t' will be equal to 1. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_sigma_mm : Current sigma threshold in mm. + * @return (VL53L4ED_ERROR) status : 0 if programming is OK. + */ + +VL53L4ED_Error VL53L4ED_GetSigmaThreshold( + Dev_t dev, + uint16_t *p_sigma_mm); + +/** + * @brief This function can be called when the temperature might have changed by + * more than 8 degrees Celsius. The function can only be used if the sensor is + * not ranging, otherwise, the ranging needs to be stopped using function + * 'VL53L4ED_StopRanging()'. After calling this function, the ranging can + * restart normally. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if update is OK. + */ + +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev); + +#endif //VL53L4ED_API_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c new file mode 100644 index 000000000..e3d95c223 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c @@ -0,0 +1,242 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_calibration.c + * @brief Calibration functions implementation + */ + +#include +#include "VL53L4ED_api.h" +#include "VL53L4ED_calibration.h" + +VL53L4ED_Error VL53L4ED_CalibrateOffset( + Dev_t dev, + int16_t TargetDistInMm, + int16_t *p_measured_offset_mm, + int16_t nb_samples) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t i, tmp, continue_loop; + uint16_t j, tmpOff; + int16_t AvgDistance = 0; + VL53L4ED_ResultsData_t results; + + if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) + || ((TargetDistInMm < (int16_t)10) + || (TargetDistInMm > (int16_t)1000))) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, 0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, 0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, 0x0); + + /* Device heat loop (10 samples) */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)10; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + } + status |= VL53L4ED_StopRanging(dev); + + /* Device ranging */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)nb_samples; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + AvgDistance += (int16_t)results.distance_mm; + } + + status |= VL53L4ED_StopRanging(dev); + AvgDistance = AvgDistance / nb_samples; + *p_measured_offset_mm = (int16_t)TargetDistInMm - AvgDistance; + tmpOff = (uint16_t) *p_measured_offset_mm * (uint16_t)4; + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, tmpOff); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_CalibrateXtalk( + Dev_t dev, + int16_t TargetDistInMm, + uint16_t *p_measured_xtalk_kcps, + int16_t nb_samples) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t i, tmp, continue_loop; + float_t AverageSignal = (float_t)0.0; + float_t AvgDistance = (float_t)0.0; + float_t AverageSpadNb = (float_t)0.0; + float_t TargetDistance = (float_t)TargetDistInMm; + float_t tmp_xtalk, CounterNbSamples = (float_t)0.0; + VL53L4ED_ResultsData_t results; + + uint16_t calXtalk, j; + + *p_measured_xtalk_kcps = 0; + if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) + || ((TargetDistInMm < (int16_t)10) + || (TargetDistInMm > (int16_t)5000))) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + /* Disable Xtalk compensation */ + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); + + /* Device heat loop (10 samples) */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)10; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + } + status |= VL53L4ED_StopRanging(dev); + + /* Device ranging loop */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)nb_samples; i++) + { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + + /* Discard invalid measurements and first frame */ + if (results.range_status == (uint8_t)0 + && i > (uint8_t)0) + { + AvgDistance += (float_t)results.distance_mm; + AverageSpadNb += (float_t)results.number_of_spad; + AverageSignal += (float_t)results.signal_rate_kcps; + CounterNbSamples++; + } + } + status |= VL53L4ED_StopRanging(dev); + + if (CounterNbSamples == 0) + { + status = VL53L4ED_ERROR_XTALK_FAILED; + } + else + { + AvgDistance /= CounterNbSamples; + AverageSpadNb /= CounterNbSamples; + AverageSignal /= CounterNbSamples; + + tmp_xtalk = (float_t)1.0 - (AvgDistance/TargetDistance); + tmp_xtalk *= (AverageSignal/AverageSpadNb); + + /* 127kcps is the max Xtalk value (65536/512) */ + if(tmp_xtalk > (uint16_t)127) + { + status = VL53L4ED_ERROR_XTALK_FAILED; + } + else + { + *p_measured_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); + + /* Send data to firmware */ + calXtalk = (uint16_t)(tmp_xtalk * (float_t)512.0); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); + } + } + } + + return status; +} diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h new file mode 100644 index 000000000..c953d0239 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h @@ -0,0 +1,73 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_calibration.h + * @brief Calibration Functions definition + */ + +#ifndef VL53L4ED_CALIBRATION_H_ +#define VL53L4ED_CALIBRATION_H_ + +#include "platform.h" + +/** + * @brief This function can be used to perform an offset calibration. Offset + * corresponds to the difference in millimeters between real distance and + * measured distance. ST recommend to perform offset at 100m, on a grey17% + * reflective target, but any other distance and reflectance can be used. + * The function returns the offset value found and programs the offset + * compensation into the device. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) TargetDistInMm : Real distance between the sensor and the + * target in millimeters. ST recommend 100mm. Min distance is 10mm and max is + * 1000mm. + * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher + * number of samples increases the accuracy, but it also takes more time. ST + * recommend to use at least 10 samples. + * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g + * invalid nb of samples). + */ + +VL53L4ED_Error VL53L4ED_CalibrateOffset( + Dev_t dev, + int16_t TargetDistInMm, + int16_t *p_measured_offset_mm, + int16_t nb_samples); + + +/** + * @brief This function can be used to perform a Xtalk calibration. Xtalk + * represents the correction to apply to the sensor when a protective coverglass + * is placed at the top of the sensor. The distance for calibration depends of + * the coverglass, it needs to be characterized. Please refer to the User Manual + * for more information. + * The function returns the Xtalk value found and programs the Xtalk + * compensation into the device. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param uint16_t) TargetDistInMm : Real distance between the sensor and the + * target in millimeters. This distance needs to be characterized, as described + * into the User Manual. + * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher + * number of samples increases the accuracy, but it also takes more time. ST + * recommend to use at least 10 samples. + * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g + * invalid nb of samples). + */ + +VL53L4ED_Error VL53L4ED_CalibrateXtalk( + Dev_t dev, + int16_t TargetDistInMm, + uint16_t *p_measured_xtalk_kcps, + int16_t nb_samples); + +#endif //VL53L4ED_CALIBRATION_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/platform.c b/SAMM/Core/Extras/VL53L4ED/platform.c new file mode 100644 index 000000000..ba3d6f1a6 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/platform.c @@ -0,0 +1,113 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#include "platform.h" +#include "main.h" +#include "i2c.h" + +extern I2C_HandleTypeDef hi2c1; + + +/* +Im legit just using the example stm provides but instead of filling everything out im only copying the platform.c implemintation +for the vl53l4ed sensor. + + +*/ + +uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[4]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 4, 100); + *value = ((data_read[0] << 24) | (data_read[1]<<16) | + (data_read[2]<<8)| (data_read[3])); + return status; +} + +uint8_t VL53L4ED_RdWord(uint16_t dev, uint16_t RegisterAdress, uint16_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[2]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 2, 100); + *value = (data_read[0] << 8) | (data_read[1]); + return status; +} + +uint8_t VL53L4ED_RdByte(uint16_t dev, uint16_t RegisterAdress, uint8_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[1]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 1, 100); + *value = data_read[0]; + return status; +} + +uint8_t VL53L4ED_WrByte(uint16_t dev, uint16_t RegisterAdress, uint8_t value) +{ + uint8_t data_write[3]; + uint8_t status = 0; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 3, 100); + return status; +} + +uint8_t VL53L4ED_WrWord(uint16_t dev, uint16_t RegisterAdress, uint16_t value) +{ + uint8_t data_write[4]; + uint8_t status = 0; + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = (value >> 8) & 0xFF; + data_write[3] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 4, 100); + return status; +} + +uint8_t VL53L4ED_WrDWord(uint16_t dev, uint16_t RegisterAdress, uint32_t value) +{ + uint8_t data_write[6]; + uint8_t status = 0; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = (value >> 24) & 0xFF; + data_write[3] = (value >> 16) & 0xFF; + data_write[4] = (value >> 8) & 0xFF; + data_write[5] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 6, 100); + return status; +} + +uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t time_ms) +{ + HAL_Delay(time_ms); + return 0; +} diff --git a/SAMM/Core/Extras/VL53L4ED/platform.h b/SAMM/Core/Extras/VL53L4ED/platform.h new file mode 100644 index 000000000..ee27e91f2 --- /dev/null +++ b/SAMM/Core/Extras/VL53L4ED/platform.h @@ -0,0 +1,80 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#ifndef _PLATFORM_H_ +#define _PLATFORM_H_ +#pragma once + +#include +#include + +/** +* VL53L4ED device instance. +*/ + +typedef uint16_t Dev_t; + +/** + * @brief Error instance. + */ +typedef uint8_t VL53L4ED_Error; + +/** + * @brief If the macro below is defined, the device will be programmed to run + * with I2C Fast Mode Plus (up to 1MHz). Otherwise, default max value is 400kHz. + */ + +//#define VL53L4ED_I2C_FAST_MODE_PLUS + + +/** + * @brief Read 32 bits through I2C. + */ + +uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t registerAddr, uint32_t *value); +/** + * @brief Read 16 bits through I2C. + */ + +uint8_t VL53L4ED_RdWord(Dev_t dev, uint16_t registerAddr, uint16_t *value); + +/** + * @brief Read 8 bits through I2C. + */ + +uint8_t VL53L4ED_RdByte(Dev_t dev, uint16_t registerAddr, uint8_t *value); + +/** + * @brief Write 8 bits through I2C. + */ + +uint8_t VL53L4ED_WrByte(Dev_t dev, uint16_t registerAddr, uint8_t value); + +/** + * @brief Write 16 bits through I2C. + */ + +uint8_t VL53L4ED_WrWord(Dev_t dev, uint16_t RegisterAdress, uint16_t value); + +/** + * @brief Write 32 bits through I2C. + */ + +uint8_t VL53L4ED_WrDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t value); + +/** + * @brief Wait during N milliseconds. + */ + +uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t TimeMs); + +#endif // _PLATFORM_H_ \ No newline at end of file diff --git a/SAMM/Core/Extras/extra.c b/SAMM/Core/Extras/extra.c new file mode 100644 index 000000000..3611c8904 --- /dev/null +++ b/SAMM/Core/Extras/extra.c @@ -0,0 +1,58 @@ +#include "extra.h" +#include "main.h" +#include "i2c.h" +#include + + +void MLX90640_I2CInit(void) +{ + MX_I2C2_Init(); + return; +} + +int MLX90640_I2CGeneralReset(void) +{ + uint8_t data = 0x06; + return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data , 1, 1000); +} + + +int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +{ + //HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); + //HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); + /* + HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t *pData, uint16_t Size) + */ + //return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 10000); +} + +int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) +{ + // union + // { + // uint8_t bytes[2]; + // uint16_t data; + // }extra = {.data = data}; + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); + //return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); +} + +void MLX90640_I2CFreqSet(int freq) +{ + return; +} + +uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +{ + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 500); +} + +uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data) +{ + + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *) &data, 2, 500); +} + diff --git a/SAMM/Core/Extras/extra.h b/SAMM/Core/Extras/extra.h new file mode 100644 index 000000000..2b820f432 --- /dev/null +++ b/SAMM/Core/Extras/extra.h @@ -0,0 +1,20 @@ +#ifndef __EXTRA_H__ +#define __EXTRA_H__ +#include +/* +This is for some xtra fucntions that would be needed later on + + +*/ + +void MLX90640_I2CInit(void); +int MLX90640_I2CGeneralReset(void); +int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +int MLX90640_I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +void MLX90640_I2CFreqSet(int freq); + + +uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); + +#endif /* __EXTRA_H__ */ \ No newline at end of file diff --git a/SAMM/Core/Inc/adc.h b/SAMM/Core/Inc/adc.h new file mode 100644 index 000000000..5692f3846 --- /dev/null +++ b/SAMM/Core/Inc/adc.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.h + * @brief This file contains all the function prototypes for + * the adc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern ADC_HandleTypeDef hadc1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_ADC1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ADC_H__ */ + diff --git a/SAMM/Core/Inc/crc.h b/SAMM/Core/Inc/crc.h new file mode 100644 index 000000000..836835d02 --- /dev/null +++ b/SAMM/Core/Inc/crc.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRC_H__ +#define __CRC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern CRC_HandleTypeDef hcrc; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_CRC_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRC_H__ */ + diff --git a/SAMM/Core/Inc/dma.h b/SAMM/Core/Inc/dma.h new file mode 100644 index 000000000..f3b1a09f9 --- /dev/null +++ b/SAMM/Core/Inc/dma.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ + diff --git a/SAMM/Core/Inc/fdcan.h b/SAMM/Core/Inc/fdcan.h new file mode 100644 index 000000000..9289ea3a6 --- /dev/null +++ b/SAMM/Core/Inc/fdcan.h @@ -0,0 +1,55 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FDCAN_H__ +#define __FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern FDCAN_HandleTypeDef hfdcan1; + +extern FDCAN_HandleTypeDef hfdcan2; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_FDCAN1_Init(void); +void MX_FDCAN2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FDCAN_H__ */ + diff --git a/SAMM/Core/Inc/gpio.h b/SAMM/Core/Inc/gpio.h new file mode 100644 index 000000000..708bac71d --- /dev/null +++ b/SAMM/Core/Inc/gpio.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ + diff --git a/SAMM/Core/Inc/i2c.h b/SAMM/Core/Inc/i2c.h new file mode 100644 index 000000000..84ed75d2e --- /dev/null +++ b/SAMM/Core/Inc/i2c.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern I2C_HandleTypeDef hi2c1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_I2C1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __I2C_H__ */ + diff --git a/SAMM/Core/Inc/main.h b/SAMM/Core/Inc/main.h new file mode 100644 index 000000000..17a2fe760 --- /dev/null +++ b/SAMM/Core/Inc/main.h @@ -0,0 +1,80 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" + +#include "stm32g4xx_ll_rcc.h" +#include "stm32g4xx_ll_bus.h" +#include "stm32g4xx_ll_crs.h" +#include "stm32g4xx_ll_system.h" +#include "stm32g4xx_ll_exti.h" +#include "stm32g4xx_ll_cortex.h" +#include "stm32g4xx_ll_utils.h" +#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_dma.h" +#include "stm32g4xx_ll_gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/SAMM/Core/Inc/spi.h b/SAMM/Core/Inc/spi.h new file mode 100644 index 000000000..bb37a07dc --- /dev/null +++ b/SAMM/Core/Inc/spi.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ + diff --git a/SAMM/Core/Inc/stm32_assert.h b/SAMM/Core/Inc/stm32_assert.h new file mode 100644 index 000000000..61631c41e --- /dev/null +++ b/SAMM/Core/Inc/stm32_assert.h @@ -0,0 +1,53 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32_assert.h + * @author MCD Application Team + * @brief STM32 assert file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ASSERT_H +#define __STM32_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Includes ------------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ASSERT_H */ + diff --git a/SAMM/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/Core/Inc/stm32g4xx_hal_conf.h new file mode 100644 index 000000000..4087e183c --- /dev/null +++ b/SAMM/Core/Inc/stm32g4xx_hal_conf.h @@ -0,0 +1,380 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32G4xx_HAL_CONF_H +#define STM32G4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED + + /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CORDIC_MODULE_ENABLED */ +#define HAL_CRC_MODULE_ENABLED +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED +/*#define HAL_FMAC_MODULE_ENABLED */ +/*#define HAL_HRTIM_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/*#define HAL_SRAM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Register Callbacks selection ############################## */ +/** + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +/*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations in voltage and temperature.*/ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32g4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32g4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32g4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32g4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32g4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32g4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED +#include "stm32g4xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32g4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32g4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32g4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32g4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32g4xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32g4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED +#include "stm32g4xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED +#include "stm32g4xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32g4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32g4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32g4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32g4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32g4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32g4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32g4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32g4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32g4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32g4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32g4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32g4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32g4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32g4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32g4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32g4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32g4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32g4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32g4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32g4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32g4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32g4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32G4xx_HAL_CONF_H */ diff --git a/SAMM/Core/Inc/stm32g4xx_it.h b/SAMM/Core/Inc/stm32g4xx_it.h new file mode 100644 index 000000000..d5d87eab3 --- /dev/null +++ b/SAMM/Core/Inc/stm32g4xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32G4xx_IT_H +#define __STM32G4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void TIM1_UP_TIM16_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32G4xx_IT_H */ diff --git a/SAMM/Core/Src/adc.c b/SAMM/Core/Src/adc.c new file mode 100644 index 000000000..15733df47 --- /dev/null +++ b/SAMM/Core/Src/adc.c @@ -0,0 +1,154 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +ADC_HandleTypeDef hadc1; + +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.GainCompensation = 0; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_7; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + + /* ADC1 clock enable */ + __HAL_RCC_ADC12_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } +} + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) +{ + + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC12_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/crc.c b/SAMM/Core/Src/crc.c new file mode 100644 index 000000000..0a8907607 --- /dev/null +++ b/SAMM/Core/Src/crc.c @@ -0,0 +1,90 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "crc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +CRC_HandleTypeDef hcrc; + +/* CRC init function */ +void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ + +} + +void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) +{ + + if(crcHandle->Instance==CRC) + { + /* USER CODE BEGIN CRC_MspInit 0 */ + + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ + + /* USER CODE END CRC_MspInit 1 */ + } +} + +void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) +{ + + if(crcHandle->Instance==CRC) + { + /* USER CODE BEGIN CRC_MspDeInit 0 */ + + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ + + /* USER CODE END CRC_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/dma.c b/SAMM/Core/Src/dma.c new file mode 100644 index 000000000..372b7e92c --- /dev/null +++ b/SAMM/Core/Src/dma.c @@ -0,0 +1,59 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ + diff --git a/SAMM/Core/Src/fdcan.c b/SAMM/Core/Src/fdcan.c new file mode 100644 index 000000000..59cf13f59 --- /dev/null +++ b/SAMM/Core/Src/fdcan.c @@ -0,0 +1,223 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "fdcan.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +FDCAN_HandleTypeDef hfdcan1; +FDCAN_HandleTypeDef hfdcan2; + +/* FDCAN1 init function */ +void MX_FDCAN1_Init(void) +{ + + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 16; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 1; + hfdcan1.Init.NominalTimeSeg2 = 1; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ + +} +/* FDCAN2 init function */ +void MX_FDCAN2_Init(void) +{ + + /* USER CODE BEGIN FDCAN2_Init 0 */ + + /* USER CODE END FDCAN2_Init 0 */ + + /* USER CODE BEGIN FDCAN2_Init 1 */ + + /* USER CODE END FDCAN2_Init 1 */ + hfdcan2.Instance = FDCAN2; + hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan2.Init.AutoRetransmission = DISABLE; + hfdcan2.Init.TransmitPause = DISABLE; + hfdcan2.Init.ProtocolException = DISABLE; + hfdcan2.Init.NominalPrescaler = 16; + hfdcan2.Init.NominalSyncJumpWidth = 1; + hfdcan2.Init.NominalTimeSeg1 = 1; + hfdcan2.Init.NominalTimeSeg2 = 1; + hfdcan2.Init.DataPrescaler = 1; + hfdcan2.Init.DataSyncJumpWidth = 1; + hfdcan2.Init.DataTimeSeg1 = 1; + hfdcan2.Init.DataTimeSeg2 = 1; + hfdcan2.Init.StdFiltersNbr = 0; + hfdcan2.Init.ExtFiltersNbr = 0; + hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN2_Init 2 */ + + /* USER CODE END FDCAN2_Init 2 */ + +} + +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0; + +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(fdcanHandle->Instance==FDCAN1) + { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if(HAL_RCC_FDCAN_CLK_ENABLED==1){ + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } + else if(fdcanHandle->Instance==FDCAN2) + { + /* USER CODE BEGIN FDCAN2_MspInit 0 */ + + /* USER CODE END FDCAN2_MspInit 0 */ + + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN2 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if(HAL_RCC_FDCAN_CLK_ENABLED==1){ + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN2_MspInit 1 */ + + /* USER CODE END FDCAN2_MspInit 1 */ + } +} + +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) +{ + + if(fdcanHandle->Instance==FDCAN1) + { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if(HAL_RCC_FDCAN_CLK_ENABLED==0){ + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } + else if(fdcanHandle->Instance==FDCAN2) + { + /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + + /* USER CODE END FDCAN2_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if(HAL_RCC_FDCAN_CLK_ENABLED==0){ + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_5); + + /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + + /* USER CODE END FDCAN2_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/gpio.c b/SAMM/Core/Src/gpio.c new file mode 100644 index 000000000..40651b0f5 --- /dev/null +++ b/SAMM/Core/Src/gpio.c @@ -0,0 +1,99 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI + PC8 ------> I2C3_SCL + PC9 ------> I2C3_SDA +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin : PF1 */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /*Configure GPIO pin : PB1 */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pin : PB12 */ + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PC8 PC9 */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pins : PB4 PB6 */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/SAMM/Core/Src/i2c.c b/SAMM/Core/Src/i2c.c new file mode 100644 index 000000000..0cab1143b --- /dev/null +++ b/SAMM/Core/Src/i2c.c @@ -0,0 +1,135 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + +/* USER CODE BEGIN 0 */ +extern uint32_t I2C_Freq; +/* USER CODE END 0 */ + +I2C_HandleTypeDef hi2c1; + +/* I2C1 init function */ +void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x10B30F25; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C1 clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +{ + + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/main.c b/SAMM/Core/Src/main.c new file mode 100644 index 000000000..aec82ca28 --- /dev/null +++ b/SAMM/Core/Src/main.c @@ -0,0 +1,300 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "crc.h" +#include "fdcan.h" +#include "i2c.h" +#include "spi.h" +#include "gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include +#include "VL53L4ED_api.h" +//#include "circularBuffer.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +#ifdef __GNUC__ +#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) +#else +#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) +#endif +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ +PUTCHAR_PROTOTYPE +{ + ITM_SendChar(ch); + return ch; +} +//CircularBuffer *cb; +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +// FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +/* +I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations + - still need to fully test but ideally implmentation is done + + + */ +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + //cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_FDCAN1_Init(); + MX_FDCAN2_Init(); + MX_I2C1_Init(); + MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ + + // HAL_FDCAN_Start(&hfdcan1); + // HAL_FDCAN_Start(&hfdcan2); + // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + + + // static uint16_t eeMLX90640[832]; + // static paramsMLX90640 mlx90640; + // #define MLX90640_ADDRESS 0x33<<1 + // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + + // MLX90640_SynchFrame(MLX90640_ADDRESS); + // MLX90640_SetRefreshRate(0x33, 0x05); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin + HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to reset the device + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin + HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to power up the device + + uint16_t status = 0; + + uint16_t sensor_id = 0; + VL53L4ED_ResultsData_t results; + uint8_t p_data_ready; + + int TOF_ID = 0x52; + HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1); + status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); + status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + + while (1) + { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if(p_data_ready){ + + /* (Mandatory) Clear HW interrupt to restart measurements */ + VL53L4ED_ClearInterrupt(TOF_ID); + + /* Read measured distance. RangeStatus = 0 means valid data */ + VL53L4ED_GetResult(TOF_ID, &results); + printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", + results.range_status, + results.distance_mm- 67, + results.signal_per_spad_kcps); + }else{ + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + + + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) + { + } + LL_PWR_EnableRange1BoostMode(); + LL_RCC_HSE_EnableBypass(); + LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while(LL_RCC_HSE_IsReady() != 1) + { + } + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + /* Wait till PLL is ready */ + while(LL_RCC_PLL_IsReady() != 1) + { + } + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + /* Wait till System clock is ready */ + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + } + + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (170 >> 1); i !=0; i--); + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(160000000); + + /* Update the time base */ + if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) + { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ +// void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) +// { +// uint8_t RxData[64]; +// HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader_FDCAN2, RxData); +// printf("got messgae\n"); +// //circularBufferPush(cb, RxData, sizeof(RxData)); + + +// } +/* USER CODE END 4 */ + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/SAMM/Core/Src/spi.c b/SAMM/Core/Src/spi.c new file mode 100644 index 000000000..22f78c561 --- /dev/null +++ b/SAMM/Core/Src/spi.c @@ -0,0 +1,121 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi3; + +/* SPI3 init function */ +void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* SPI3 clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +{ + + if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/stm32g4xx_hal_msp.c b/SAMM/Core/Src/stm32g4xx_hal_msp.c new file mode 100644 index 000000000..3fc223b63 --- /dev/null +++ b/SAMM/Core/Src/stm32g4xx_hal_msp.c @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c new file mode 100644 index 000000000..7ac4d76ff --- /dev/null +++ b/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c @@ -0,0 +1,127 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_timebase_tim.c + * @brief HAL time base based on the hardware TIM. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" +#include "stm32g4xx_hal_tim.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim1; +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the TIM1 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock = 0; + uint32_t uwPrescalerValue = 0; + uint32_t pFLatency; + + HAL_StatusTypeDef status; + + /* Enable TIM1 clock */ + __HAL_RCC_TIM1_CLK_ENABLE(); + +/* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Compute TIM1 clock */ + uwTimclock = HAL_RCC_GetPCLK2Freq(); + + /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); + + /* Initialize TIM1 */ + htim1.Instance = TIM1; + + /* Initialize TIMx peripheral as follow: + + + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. + + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + + ClockDivision = 0 + + Counter direction = Up + */ + htim1.Init.Period = (1000000U / 1000U) - 1U; + htim1.Init.Prescaler = uwPrescalerValue; + htim1.Init.ClockDivision = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + + status = HAL_TIM_Base_Init(&htim1); + if (status == HAL_OK) + { + /* Start the TIM time Base generation in interrupt mode */ + status = HAL_TIM_Base_Start_IT(&htim1); + if (status == HAL_OK) + { + /* Enable the TIM1 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + /* Configure the TIM IRQ priority */ + HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + status = HAL_ERROR; + } + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable TIM1 update Interrupt */ + __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Enable TIM1 Update interrupt */ + __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); +} + diff --git a/SAMM/Core/Src/stm32g4xx_it.c b/SAMM/Core/Src/stm32g4xx_it.c new file mode 100644 index 000000000..ef94b5f52 --- /dev/null +++ b/SAMM/Core/Src/stm32g4xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32g4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim1; + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32G4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32g4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. + */ +void TIM1_UP_TIM16_IRQHandler(void) +{ + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ + HAL_TIM_IRQHandler(&htim1); + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/syscalls.c b/SAMM/Core/Src/syscalls.c new file mode 100644 index 000000000..e33a8492c --- /dev/null +++ b/SAMM/Core/Src/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeMX + * @brief Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2024 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. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + (void)file; + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + (void)file; + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int _open(char *path, int flags, ...) +{ + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + (void)status; + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + (void)name; + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(char *file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/SAMM/Core/Src/sysmem.c b/SAMM/Core/Src/sysmem.c new file mode 100644 index 000000000..246470ee8 --- /dev/null +++ b/SAMM/Core/Src/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeMX + * @brief System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/SAMM/Core/Src/system_stm32g4xx.c b/SAMM/Core/Src/system_stm32g4xx.c new file mode 100644 index 000000000..8d35a0aa0 --- /dev/null +++ b/SAMM/Core/Src/system_stm32g4xx.c @@ -0,0 +1,285 @@ +/** + ****************************************************************************** + * @file system_stm32g4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 16 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32g4xx_system + * @{ + */ + +/** @addtogroup STM32G4xx_System_Private_Includes + * @{ + */ + +#include "stm32g4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +#define USER_VECT_TAB_ADDRESS + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = HSI_VALUE; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ + #endif + + /* Configure the Vector Table location add offset address ------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 24 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp, pllvco, pllr, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U ; + if (pllsource == 0x02UL) /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } + else /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + From effa315c2ed6151e2e15243614e801ef3e43292f Mon Sep 17 00:00:00 2001 From: planeflight Date: Mon, 30 Mar 2026 21:26:43 -0700 Subject: [PATCH 002/158] change pinouts in main.c --- SAMM/Core/Src/main.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/SAMM/Core/Src/main.c b/SAMM/Core/Src/main.c index aec82ca28..7ca2c8382 100644 --- a/SAMM/Core/Src/main.c +++ b/SAMM/Core/Src/main.c @@ -112,20 +112,20 @@ int main(void) MX_I2C1_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ - + // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - + // static uint16_t eeMLX90640[832]; // static paramsMLX90640 mlx90640; // #define MLX90640_ADDRESS 0x33<<1 // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); - + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); - + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); // MLX90640_SynchFrame(MLX90640_ADDRESS); @@ -134,21 +134,21 @@ int main(void) /* Infinite loop */ /* USER CODE BEGIN WHILE */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin - HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin - HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin HAL_Delay(100); // wait for 5ms to power up the device uint16_t status = 0; - + uint16_t sensor_id = 0; VL53L4ED_ResultsData_t results; uint8_t p_data_ready; int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_1); + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); status = VL53L4ED_StartRanging(TOF_ID); @@ -156,7 +156,7 @@ int main(void) status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) - { + { // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); /* USER CODE END WHILE */ @@ -179,8 +179,6 @@ int main(void) __disable_irq(); __enable_irq(); } - - } /* USER CODE END 3 */ } From 4899164e2ae5c1118fe12fc041c6bbe4b7b2e27c Mon Sep 17 00:00:00 2001 From: planeflight Date: Mon, 30 Mar 2026 21:36:02 -0700 Subject: [PATCH 003/158] changed gpio.c and removed the extra pinouts --- SAMM/Core/Src/gpio.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/SAMM/Core/Src/gpio.c b/SAMM/Core/Src/gpio.c index 40651b0f5..5efdf6ec1 100644 --- a/SAMM/Core/Src/gpio.c +++ b/SAMM/Core/Src/gpio.c @@ -53,41 +53,47 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); + //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); /*Configure GPIO pin : PF1 */ + /* GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + */ /*Configure GPIO pin : PB1 */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pin : PB12 */ + /* corresponds to SPI GPIO_InitStruct.Pin = GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + */ /*Configure GPIO pins : PC8 PC9 */ + /* corresponds to tiretemp i2c GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + */ /*Configure GPIO pins : PB4 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); From f46c2ec093bccf5b5948ca36bd2495cb64b5fd57 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 31 Mar 2026 04:39:45 +0000 Subject: [PATCH 004/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/Core/Extras/CircBuF/circularBuffer.c | 108 +-- SAMM/Core/Extras/CircBuF/circularBuffer.h | 14 +- SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c | 651 +++++++----------- SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h | 164 ++--- .../Extras/VL53L4ED/VL53L4ED_calibration.c | 139 ++-- .../Extras/VL53L4ED/VL53L4ED_calibration.h | 37 +- SAMM/Core/Extras/VL53L4ED/platform.c | 29 +- SAMM/Core/Extras/VL53L4ED/platform.h | 29 +- SAMM/Core/Extras/extra.c | 57 +- SAMM/Core/Extras/extra.h | 9 +- SAMM/Core/Inc/adc.h | 33 +- SAMM/Core/Inc/crc.h | 33 +- SAMM/Core/Inc/dma.h | 33 +- SAMM/Core/Inc/fdcan.h | 33 +- SAMM/Core/Inc/gpio.h | 33 +- SAMM/Core/Inc/i2c.h | 33 +- SAMM/Core/Inc/main.h | 45 +- SAMM/Core/Inc/spi.h | 33 +- SAMM/Core/Inc/stm32_assert.h | 49 +- SAMM/Core/Inc/stm32g4xx_hal_conf.h | 243 +++---- SAMM/Core/Inc/stm32g4xx_it.h | 32 +- SAMM/Core/Src/adc.c | 226 +++--- SAMM/Core/Src/crc.c | 102 ++- SAMM/Core/Src/dma.c | 60 +- SAMM/Core/Src/fdcan.c | 364 +++++----- SAMM/Core/Src/gpio.c | 149 ++-- SAMM/Core/Src/i2c.c | 196 +++--- SAMM/Core/Src/main.c | 336 +++++---- SAMM/Core/Src/spi.c | 172 +++-- SAMM/Core/Src/stm32g4xx_hal_msp.c | 56 +- SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c | 190 +++-- SAMM/Core/Src/stm32g4xx_it.c | 189 +++-- SAMM/Core/Src/syscalls.c | 134 ++-- SAMM/Core/Src/sysmem.c | 38 +- SAMM/Core/Src/system_stm32g4xx.c | 437 ++++++------ 35 files changed, 2110 insertions(+), 2376 deletions(-) diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.c b/SAMM/Core/Extras/CircBuF/circularBuffer.c index e7f59de79..4b0eaeaca 100644 --- a/SAMM/Core/Extras/CircBuF/circularBuffer.c +++ b/SAMM/Core/Extras/CircBuF/circularBuffer.c @@ -1,64 +1,70 @@ #include "circularBuffer.h" -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) { - CircularBuffer *cb = malloc(sizeof(CircularBuffer)); - if (!cb) { - return NULL; - } +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) +{ + CircularBuffer *cb = malloc(sizeof(CircularBuffer)); + if (!cb) { + return NULL; + } - cb->buffer = malloc(capacity * sizeof(void *)); - if (!cb->buffer) { - free(cb); - return NULL; - } + cb->buffer = malloc(capacity * sizeof(void *)); + if (!cb->buffer) { + free(cb); + return NULL; + } - for (size_t i = 0; i < capacity; i++) { - cb->buffer[i] = malloc(max_array_size); - if (!cb->buffer[i]) { - for (size_t j = 0; j < i; j++) { - free(cb->buffer[j]); - } - free(cb->buffer); - free(cb); - return NULL; - } - } - cb->capacity = capacity; - cb->max_arr_size = max_array_size; - cb->head = 0; - cb->tail = 0; - cb->size = 0; - return cb; + for (size_t i = 0; i < capacity; i++) { + cb->buffer[i] = malloc(max_array_size); + if (!cb->buffer[i]) { + for (size_t j = 0; j < i; j++) { + free(cb->buffer[j]); + } + free(cb->buffer); + free(cb); + return NULL; + } + } + cb->capacity = capacity; + cb->max_arr_size = max_array_size; + cb->head = 0; + cb->tail = 0; + cb->size = 0; + return cb; } -void circularBufferDestroy(CircularBuffer *cb) { - if (!cb) return; +void circularBufferDestroy(CircularBuffer *cb) +{ + if (!cb) { + return; + } - for (size_t i = 0; i < cb->capacity; i++) { - free(cb->buffer[i]); - } - free(cb->buffer); - free(cb); + for (size_t i = 0; i < cb->capacity; i++) { + free(cb->buffer[i]); + } + free(cb->buffer); + free(cb); } -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) { - if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { - return -1; // Buffer is full or array is too large - } +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) +{ + if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { + return -1; // Buffer is full or array is too large + } - // Copy the array into the buffer - memcpy(cb->buffer[cb->head], array, array_size); - cb->head = (cb->head + 1) % cb->capacity; - cb->size++; - return 0; + // Copy the array into the buffer + memcpy(cb->buffer[cb->head], array, array_size); + cb->head = (cb->head + 1) % cb->capacity; + cb->size++; + return 0; } -void *circularBufferPop(CircularBuffer *cb) { - if (!cb || cb->size == 0) { - return NULL; // Buffer is empty - } +void *circularBufferPop(CircularBuffer *cb) +{ + if (!cb || cb->size == 0) { + return NULL; // Buffer is empty + } - void *array = cb->buffer[cb->tail]; - cb->tail = (cb->tail + 1) % cb->capacity; - cb->size--; - return array; + void *array = cb->buffer[cb->tail]; + cb->tail = (cb->tail + 1) % cb->capacity; + cb->size--; + return array; } diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.h b/SAMM/Core/Extras/CircBuF/circularBuffer.h index ae7ce9220..861792535 100644 --- a/SAMM/Core/Extras/CircBuF/circularBuffer.h +++ b/SAMM/Core/Extras/CircBuF/circularBuffer.h @@ -1,18 +1,18 @@ #ifndef __circularBuffer_h__ #define __circularBuffer_h__ +#include #include #include -#include #include typedef struct { - void **buffer; // Array of void pointers - uint8_t capacity; // Maximum number of elements in the buffer - uint8_t head; // Index of the next element to write - uint8_t tail; // Index of the next element to read - uint8_t size; // Current number of elements in the buffer - uint8_t max_arr_size; // Maximum size of the array + void **buffer; // Array of void pointers + uint8_t capacity; // Maximum number of elements in the buffer + uint8_t head; // Index of the next element to write + uint8_t tail; // Index of the next element to read + uint8_t size; // Current number of elements in the buffer + uint8_t max_arr_size; // Maximum size of the array } CircularBuffer; CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c index 323148da4..7c844100e 100644 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c @@ -1,138 +1,138 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_api.c * @brief Functions implementation */ -#include -#include #include "VL53L4ED_api.h" +#include +#include + static const uint8_t VL53L4ED_DEFAULT_CONFIGURATION[] = { - #ifdef VL53L4ED_I2C_FAST_MODE_PLUS - 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ - #else - 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ - #endif - 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low - (bits 3:0 must be 0x1), use SetInterruptPolarity() */ - 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, - use CheckForDataReady() */ - 0x00, /* 0x32 : not user-modifiable */ - 0x02, /* 0x33 : not user-modifiable */ - 0x08, /* 0x34 : not user-modifiable */ - 0x00, /* 0x35 : not user-modifiable */ - 0x08, /* 0x36 : not user-modifiable */ - 0x10, /* 0x37 : not user-modifiable */ - 0x01, /* 0x38 : not user-modifiable */ - 0x01, /* 0x39 : not user-modifiable */ - 0x00, /* 0x3a : not user-modifiable */ - 0x00, /* 0x3b : not user-modifiable */ - 0x00, /* 0x3c : not user-modifiable */ - 0x00, /* 0x3d : not user-modifiable */ - 0xff, /* 0x3e : not user-modifiable */ - 0x00, /* 0x3f : not user-modifiable */ - 0x0F, /* 0x40 : not user-modifiable */ - 0x00, /* 0x41 : not user-modifiable */ - 0x00, /* 0x42 : not user-modifiable */ - 0x00, /* 0x43 : not user-modifiable */ - 0x00, /* 0x44 : not user-modifiable */ - 0x00, /* 0x45 : not user-modifiable */ - 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, - 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ - 0x0b, /* 0x47 : not user-modifiable */ - 0x00, /* 0x48 : not user-modifiable */ - 0x00, /* 0x49 : not user-modifiable */ - 0x02, /* 0x4a : not user-modifiable */ - 0x14, /* 0x4b : not user-modifiable */ - 0x21, /* 0x4c : not user-modifiable */ - 0x00, /* 0x4d : not user-modifiable */ - 0x00, /* 0x4e : not user-modifiable */ - 0x05, /* 0x4f : not user-modifiable */ - 0x00, /* 0x50 : not user-modifiable */ - 0x00, /* 0x51 : not user-modifiable */ - 0x00, /* 0x52 : not user-modifiable */ - 0x00, /* 0x53 : not user-modifiable */ - 0xc8, /* 0x54 : not user-modifiable */ - 0x00, /* 0x55 : not user-modifiable */ - 0x00, /* 0x56 : not user-modifiable */ - 0x38, /* 0x57 : not user-modifiable */ - 0xff, /* 0x58 : not user-modifiable */ - 0x01, /* 0x59 : not user-modifiable */ - 0x00, /* 0x5a : not user-modifiable */ - 0x08, /* 0x5b : not user-modifiable */ - 0x00, /* 0x5c : not user-modifiable */ - 0x00, /* 0x5d : not user-modifiable */ - 0x01, /* 0x5e : not user-modifiable */ - 0xcc, /* 0x5f : not user-modifiable */ - 0x07, /* 0x60 : not user-modifiable */ - 0x01, /* 0x61 : not user-modifiable */ - 0xf1, /* 0x62 : not user-modifiable */ - 0x05, /* 0x63 : not user-modifiable */ - 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), - use SetSigmaThreshold(), default value 90 mm */ - 0xa0, /* 0x65 : Sigma threshold LSB */ - 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), - use SetSignalThreshold() */ - 0x80, /* 0x67 : Min count Rate LSB */ - 0x08, /* 0x68 : not user-modifiable */ - 0x38, /* 0x69 : not user-modifiable */ - 0x00, /* 0x6a : not user-modifiable */ - 0x00, /* 0x6b : not user-modifiable */ - 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, - use SetIntermeasurementInMs() */ - 0x00, /* 0x6d : Intermeasurement period */ - 0x0f, /* 0x6e : Intermeasurement period */ - 0x89, /* 0x6f : Intermeasurement period LSB */ - 0x00, /* 0x70 : not user-modifiable */ - 0x00, /* 0x71 : not user-modifiable */ - 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x73 : distance threshold high LSB */ - 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x75 : distance threshold low LSB */ - 0x00, /* 0x76 : not user-modifiable */ - 0x01, /* 0x77 : not user-modifiable */ - 0x07, /* 0x78 : not user-modifiable */ - 0x05, /* 0x79 : not user-modifiable */ - 0x06, /* 0x7a : not user-modifiable */ - 0x06, /* 0x7b : not user-modifiable */ - 0x00, /* 0x7c : not user-modifiable */ - 0x00, /* 0x7d : not user-modifiable */ - 0x02, /* 0x7e : not user-modifiable */ - 0xc7, /* 0x7f : not user-modifiable */ - 0xff, /* 0x80 : not user-modifiable */ - 0x9B, /* 0x81 : not user-modifiable */ - 0x00, /* 0x82 : not user-modifiable */ - 0x00, /* 0x83 : not user-modifiable */ - 0x00, /* 0x84 : not user-modifiable */ - 0x01, /* 0x85 : not user-modifiable */ - 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ - 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), - If you want an automatic start after VL53L4ED_init() call, - put 0x40 in location 0x87 */ +#ifdef VL53L4ED_I2C_FAST_MODE_PLUS + 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ +#else + 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ +#endif + 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low + (bits 3:0 must be 0x1), use SetInterruptPolarity() */ + 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, + use CheckForDataReady() */ + 0x00, /* 0x32 : not user-modifiable */ + 0x02, /* 0x33 : not user-modifiable */ + 0x08, /* 0x34 : not user-modifiable */ + 0x00, /* 0x35 : not user-modifiable */ + 0x08, /* 0x36 : not user-modifiable */ + 0x10, /* 0x37 : not user-modifiable */ + 0x01, /* 0x38 : not user-modifiable */ + 0x01, /* 0x39 : not user-modifiable */ + 0x00, /* 0x3a : not user-modifiable */ + 0x00, /* 0x3b : not user-modifiable */ + 0x00, /* 0x3c : not user-modifiable */ + 0x00, /* 0x3d : not user-modifiable */ + 0xff, /* 0x3e : not user-modifiable */ + 0x00, /* 0x3f : not user-modifiable */ + 0x0F, /* 0x40 : not user-modifiable */ + 0x00, /* 0x41 : not user-modifiable */ + 0x00, /* 0x42 : not user-modifiable */ + 0x00, /* 0x43 : not user-modifiable */ + 0x00, /* 0x44 : not user-modifiable */ + 0x00, /* 0x45 : not user-modifiable */ + 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, + 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ + 0x0b, /* 0x47 : not user-modifiable */ + 0x00, /* 0x48 : not user-modifiable */ + 0x00, /* 0x49 : not user-modifiable */ + 0x02, /* 0x4a : not user-modifiable */ + 0x14, /* 0x4b : not user-modifiable */ + 0x21, /* 0x4c : not user-modifiable */ + 0x00, /* 0x4d : not user-modifiable */ + 0x00, /* 0x4e : not user-modifiable */ + 0x05, /* 0x4f : not user-modifiable */ + 0x00, /* 0x50 : not user-modifiable */ + 0x00, /* 0x51 : not user-modifiable */ + 0x00, /* 0x52 : not user-modifiable */ + 0x00, /* 0x53 : not user-modifiable */ + 0xc8, /* 0x54 : not user-modifiable */ + 0x00, /* 0x55 : not user-modifiable */ + 0x00, /* 0x56 : not user-modifiable */ + 0x38, /* 0x57 : not user-modifiable */ + 0xff, /* 0x58 : not user-modifiable */ + 0x01, /* 0x59 : not user-modifiable */ + 0x00, /* 0x5a : not user-modifiable */ + 0x08, /* 0x5b : not user-modifiable */ + 0x00, /* 0x5c : not user-modifiable */ + 0x00, /* 0x5d : not user-modifiable */ + 0x01, /* 0x5e : not user-modifiable */ + 0xcc, /* 0x5f : not user-modifiable */ + 0x07, /* 0x60 : not user-modifiable */ + 0x01, /* 0x61 : not user-modifiable */ + 0xf1, /* 0x62 : not user-modifiable */ + 0x05, /* 0x63 : not user-modifiable */ + 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), + use SetSigmaThreshold(), default value 90 mm */ + 0xa0, /* 0x65 : Sigma threshold LSB */ + 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), + use SetSignalThreshold() */ + 0x80, /* 0x67 : Min count Rate LSB */ + 0x08, /* 0x68 : not user-modifiable */ + 0x38, /* 0x69 : not user-modifiable */ + 0x00, /* 0x6a : not user-modifiable */ + 0x00, /* 0x6b : not user-modifiable */ + 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, + use SetIntermeasurementInMs() */ + 0x00, /* 0x6d : Intermeasurement period */ + 0x0f, /* 0x6e : Intermeasurement period */ + 0x89, /* 0x6f : Intermeasurement period LSB */ + 0x00, /* 0x70 : not user-modifiable */ + 0x00, /* 0x71 : not user-modifiable */ + 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x73 : distance threshold high LSB */ + 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x75 : distance threshold low LSB */ + 0x00, /* 0x76 : not user-modifiable */ + 0x01, /* 0x77 : not user-modifiable */ + 0x07, /* 0x78 : not user-modifiable */ + 0x05, /* 0x79 : not user-modifiable */ + 0x06, /* 0x7a : not user-modifiable */ + 0x06, /* 0x7b : not user-modifiable */ + 0x00, /* 0x7c : not user-modifiable */ + 0x00, /* 0x7d : not user-modifiable */ + 0x02, /* 0x7e : not user-modifiable */ + 0xc7, /* 0x7f : not user-modifiable */ + 0xff, /* 0x80 : not user-modifiable */ + 0x9B, /* 0x81 : not user-modifiable */ + 0x00, /* 0x82 : not user-modifiable */ + 0x00, /* 0x83 : not user-modifiable */ + 0x00, /* 0x84 : not user-modifiable */ + 0x01, /* 0x85 : not user-modifiable */ + 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ + 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), + If you want an automatic start after VL53L4ED_init() call, + put 0x40 in location 0x87 */ }; -VL53L4ED_Error VL53L4ED_GetSWVersion( - VL53L4ED_Version_t *p_Version) +VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *p_Version) { VL53L4ED_Error Status = VL53L4ED_ERROR_NONE; @@ -143,20 +143,15 @@ VL53L4ED_Error VL53L4ED_GetSWVersion( return Status; } -VL53L4ED_Error VL53L4ED_SetI2CAddress( - Dev_t dev, - uint8_t new_address) +VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, - (uint8_t)(new_address >> (uint8_t)1)); + status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, (uint8_t)(new_address >> (uint8_t)1)); return status; } -VL53L4ED_Error VL53L4ED_GetSensorId( - Dev_t dev, - uint16_t *p_id) +VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -164,69 +159,58 @@ VL53L4ED_Error VL53L4ED_GetSensorId( return status; } -VL53L4ED_Error VL53L4ED_SensorInit( - Dev_t dev) +VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t Addr, tmp; uint8_t continue_loop = 1; uint16_t i = 0; - do{ - status |= VL53L4ED_RdByte(dev, - VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); + do { + status |= VL53L4ED_RdByte(dev, VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); - if(tmp == (uint8_t)0x3) /* Sensor booted */ + if (tmp == (uint8_t)0x3) /* Sensor booted */ { continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for boot */ + } else if (i < (uint16_t)1000) /* Wait for boot */ { i++; - } - else /* Timeout 1000ms reached */ + } else /* Timeout 1000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); /* Load default configuration */ - for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) - { - status |= VL53L4ED_WrByte(dev, Addr, - VL53L4ED_DEFAULT_CONFIGURATION[ - Addr - (uint8_t)0x2D]); + for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) { + status |= VL53L4ED_WrByte(dev, Addr, VL53L4ED_DEFAULT_CONFIGURATION[Addr - (uint8_t)0x2D]); } /* Start VHV */ status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, (uint8_t)0x40); - i = (uint8_t)0; + i = (uint8_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for answer */ + } else if (i < (uint16_t)1000) /* Wait for answer */ { i++; - } - else /* Timeout 1000ms reached */ + } else /* Timeout 1000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_ClearInterrupt(dev); status |= VL53L4ED_StopRanging(dev); - status |= VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, - (uint8_t)0x09); + status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x09); status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0); status |= VL53L4ED_WrWord(dev, 0x0024, 0x500); @@ -235,8 +219,7 @@ VL53L4ED_Error VL53L4ED_SensorInit( return status; } -VL53L4ED_Error VL53L4ED_ClearInterrupt( - Dev_t dev) +VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -244,8 +227,7 @@ VL53L4ED_Error VL53L4ED_ClearInterrupt( return status; } -VL53L4ED_Error VL53L4ED_StartRanging( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint32_t tmp; @@ -253,21 +235,18 @@ VL53L4ED_Error VL53L4ED_StartRanging( status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); /* Sensor runs in continuous mode */ - if(tmp == (uint32_t)0) - { + if (tmp == (uint32_t)0) { status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x21); } /* Sensor runs in autonomous mode */ - else - { + else { status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x40); } return status; } -VL53L4ED_Error VL53L4ED_StopRanging( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -275,9 +254,7 @@ VL53L4ED_Error VL53L4ED_StopRanging( return status; } -VL53L4ED_Error VL53L4ED_CheckForDataReady( - Dev_t dev, - uint8_t *p_is_data_ready) +VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t temp; @@ -287,33 +264,24 @@ VL53L4ED_Error VL53L4ED_CheckForDataReady( temp = temp & (uint8_t)0x10; temp = temp >> 4; - if (temp == (uint8_t)1) - { + if (temp == (uint8_t)1) { int_pol = (uint8_t)0; - } - else - { + } else { int_pol = (uint8_t)1; } status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO__TIO_HV_STATUS, &temp); - if ((temp & (uint8_t)1) == int_pol) - { + if ((temp & (uint8_t)1) == int_pol) { *p_is_data_ready = (uint8_t)1; - } - else - { + } else { *p_is_data_ready = (uint8_t)0; } return status; } -VL53L4ED_Error VL53L4ED_SetRangeTiming( - Dev_t dev, - uint32_t timing_budget_ms, - uint32_t inter_measurement_ms) +VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t clock_pll, osc_frequency, ms_byte; @@ -321,88 +289,67 @@ VL53L4ED_Error VL53L4ED_SetRangeTiming( float_t inter_measurement_factor = (float_t)1.055; status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - if(osc_frequency != (uint16_t)0) - { - timing_budget_us = timing_budget_ms*(uint32_t)1000; - macro_period_us = (uint32_t)((uint32_t)2304 * - ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; - } - else - { + if (osc_frequency != (uint16_t)0) { + timing_budget_us = timing_budget_ms * (uint32_t)1000; + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; + } else { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; } /* Timing budget check validity */ - if ((timing_budget_ms < (uint32_t)10) - || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) - { + if ((timing_budget_ms < (uint32_t)10) || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) { status |= VL53L4ED_ERROR_INVALID_ARGUMENT; } /* Sensor runs in continuous mode */ - else if(inter_measurement_ms == (uint32_t)0) - { - status |= VL53L4ED_WrDWord(dev,VL53L4ED_INTERMEASUREMENT_MS, 0); + else if (inter_measurement_ms == (uint32_t)0) { + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, 0); timing_budget_us -= (uint32_t)2500; } /* Sensor runs in autonomous low power mode */ - else if(inter_measurement_ms > timing_budget_ms) - { - status |= VL53L4ED_RdWord(dev, - VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + else if (inter_measurement_ms > timing_budget_ms) { + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); clock_pll = clock_pll & (uint16_t)0x3FF; - inter_measurement_factor = inter_measurement_factor - * (float_t)inter_measurement_ms - * (float_t)clock_pll; - status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, - (uint32_t)inter_measurement_factor); + inter_measurement_factor = inter_measurement_factor * (float_t)inter_measurement_ms * (float_t)clock_pll; + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, (uint32_t)inter_measurement_factor); timing_budget_us -= (uint32_t)4300; timing_budget_us /= (uint32_t)2; } /* Invalid case */ - else - { + else { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; } - if(status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) - { - ms_byte = 0; - timing_budget_us = timing_budget_us << 12; - tmp = macro_period_us*(uint32_t)16; - ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) - - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) - + (uint16_t) (ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A,ms_byte); - - ms_byte = 0; - tmp = macro_period_us*(uint32_t)12; - ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) - - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) - + (uint16_t) (ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B,ms_byte); + if (status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) { + ms_byte = 0; + timing_budget_us = timing_budget_us << 12; + tmp = macro_period_us * (uint32_t)16; + ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A, ms_byte); + + ms_byte = 0; + tmp = macro_period_us * (uint32_t)12; + ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B, ms_byte); } return status; } -VL53L4ED_Error VL53L4ED_GetRangeTiming( - Dev_t dev, - uint32_t *p_timing_budget_ms, - uint32_t *p_inter_measurement_ms) +VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t osc_frequency = 1, range_config_macrop_high, clock_pll = 1; @@ -411,107 +358,84 @@ VL53L4ED_Error VL53L4ED_GetRangeTiming( /* Get InterMeasurement */ status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); - status |= VL53L4ED_RdWord(dev, - VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); clock_pll = clock_pll & (uint16_t)0x3FF; clock_pll_factor = clock_pll_factor * (float_t)clock_pll; clock_pll = (uint16_t)clock_pll_factor; - *p_inter_measurement_ms = (uint16_t)(tmp/(uint32_t)clock_pll); + *p_inter_measurement_ms = (uint16_t)(tmp / (uint32_t)clock_pll); /* Get TimingBudget */ status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, - &range_config_macrop_high); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, &range_config_macrop_high); - macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 - / (uint32_t)osc_frequency)) >> 6; + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; ls_byte = (range_config_macrop_high & (uint32_t)0x00FF) << 4; ms_byte = (range_config_macrop_high & (uint32_t)0xFF00) >> 8; ms_byte = (uint32_t)0x04 - (ms_byte - (uint32_t)1) - (uint32_t)1; macro_period_us = macro_period_us * (uint32_t)16; - *p_timing_budget_ms = (((ls_byte + (uint32_t)1)*(macro_period_us>> 6)) - - ((macro_period_us>> 6)>>1)) >> 12; + *p_timing_budget_ms = (((ls_byte + (uint32_t)1) * (macro_period_us >> 6)) - ((macro_period_us >> 6) >> 1)) >> 12; - if(ms_byte < (uint8_t)12) - { - *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms - >> (uint8_t)ms_byte); + if (ms_byte < (uint8_t)12) { + *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms >> (uint8_t)ms_byte); } - - /* Mode continuous */ - if(tmp == (uint32_t)0) - { + + /* Mode continuous */ + if (tmp == (uint32_t)0) { *p_timing_budget_ms += (uint32_t)2500; - } - /* Mode autonomous */ - else - { - *p_timing_budget_ms *= (uint32_t)2; - *p_timing_budget_ms += (uint32_t)4300; - } + } + /* Mode autonomous */ + else { + *p_timing_budget_ms *= (uint32_t)2; + *p_timing_budget_ms += (uint32_t)4300; + } - *p_timing_budget_ms = *p_timing_budget_ms/(uint32_t)1000; + *p_timing_budget_ms = *p_timing_budget_ms / (uint32_t)1000; return status; } -VL53L4ED_Error VL53L4ED_GetResult( - Dev_t dev, - VL53L4ED_ResultsData_t *p_result) +VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *p_result) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp_16; uint8_t temp_8; - uint8_t status_rtn[24] = { 255, 255, 255, 5, 2, 4, 1, 7, 3, - 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, - 255, 255, 11, 12 }; + uint8_t status_rtn[24] = {255, 255, 255, 5, 2, 4, 1, 7, 3, 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, 255, 255, 11, 12}; - status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, - &temp_8); + status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, &temp_8); temp_8 = temp_8 & (uint8_t)0x1F; - if (temp_8 < (uint8_t)24) - { + if (temp_8 < (uint8_t)24) { temp_8 = status_rtn[temp_8]; } p_result->range_status = temp_8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, - &temp_16); - p_result->number_of_spad = temp_16 / (uint16_t) 256; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, &temp_16); + p_result->number_of_spad = temp_16 / (uint16_t)256; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, - &temp_16); - p_result->signal_rate_kcps = temp_16 * (uint16_t) 8; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, &temp_16); + p_result->signal_rate_kcps = temp_16 * (uint16_t)8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, - &temp_16); - p_result->ambient_rate_kcps = temp_16 * (uint16_t) 8; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, &temp_16); + p_result->ambient_rate_kcps = temp_16 * (uint16_t)8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, - &temp_16); - p_result->sigma_mm = temp_16 / (uint16_t) 4; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, &temp_16); + p_result->sigma_mm = temp_16 / (uint16_t)4; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, - &temp_16); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, &temp_16); p_result->distance_mm = temp_16; - p_result->signal_per_spad_kcps = p_result->signal_rate_kcps - /p_result->number_of_spad; - p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps - /p_result->number_of_spad; + p_result->signal_per_spad_kcps = p_result->signal_rate_kcps / p_result->number_of_spad; + p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps / p_result->number_of_spad; return status; } -VL53L4ED_Error VL53L4ED_SetOffset( - Dev_t dev, - int16_t OffsetValueInMm) +VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp; - temp = (uint16_t)((uint16_t)OffsetValueInMm*(uint16_t)4); + temp = (uint16_t)((uint16_t)OffsetValueInMm * (uint16_t)4); status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, temp); status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, (uint8_t)0x0); @@ -519,65 +443,49 @@ VL53L4ED_Error VL53L4ED_SetOffset( return status; } -VL53L4ED_Error VL53L4ED_GetOffset( - Dev_t dev, - int16_t *p_offset) +VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *p_offset) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp; - status |= VL53L4ED_RdWord(dev,VL53L4ED_RANGE_OFFSET_MM, &temp); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_OFFSET_MM, &temp); - temp = temp<<3; - temp = temp>>5; + temp = temp << 3; + temp = temp >> 5; *p_offset = (int16_t)(temp); - if(*p_offset > 1024) - { + if (*p_offset > 1024) { *p_offset = *p_offset - 2048; } return status; } -VL53L4ED_Error VL53L4ED_SetXtalk( - Dev_t dev, - uint16_t XtalkValueKcps) +VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, - (XtalkValueKcps<<9)); - + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, (XtalkValueKcps << 9)); + return status; } -VL53L4ED_Error VL53L4ED_GetXtalk( - Dev_t dev, - uint16_t *p_xtalk_kcps) +VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; float_t tmp_xtalk; - status |= VL53L4ED_RdWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); - + status |= VL53L4ED_RdWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); + tmp_xtalk = (float_t)*p_xtalk_kcps / (float_t)512.0; *p_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); return status; } -VL53L4ED_Error VL53L4ED_SetDetectionThresholds( - Dev_t dev, - uint16_t distance_low_mm, - uint16_t distance_high_mm, - uint8_t window) +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -587,14 +495,11 @@ VL53L4ED_Error VL53L4ED_SetDetectionThresholds( return status; } -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, - uint16_t *p_distance_low_mm, - uint16_t *p_distance_high_mm, - uint8_t *p_window) +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH,p_distance_high_mm); + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH, p_distance_high_mm); status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_LOW, p_distance_low_mm); status |= VL53L4ED_RdByte(dev, VL53L4ED_SYSTEM__INTERRUPT, p_window); *p_window = (*p_window & (uint8_t)0x7); @@ -602,98 +507,78 @@ VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, return status; } -VL53L4ED_Error VL53L4ED_SetSignalThreshold( - Dev_t dev, - uint16_t signal_kcps) +VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrWord(dev, - VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS,signal_kcps>>3); + status |= VL53L4ED_WrWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, signal_kcps >> 3); return status; } -VL53L4ED_Error VL53L4ED_GetSignalThreshold( - Dev_t dev, - uint16_t *p_signal_kcps) +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t tmp = 0; - status |= VL53L4ED_RdWord(dev, - VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); - *p_signal_kcps = tmp <<3; + status |= VL53L4ED_RdWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); + *p_signal_kcps = tmp << 3; return status; } -VL53L4ED_Error VL53L4ED_SetSigmaThreshold( - Dev_t dev, - uint16_t sigma_mm) +VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - if(sigma_mm>(uint16_t)((uint16_t)0xFFFF>>2)) - { + if (sigma_mm > (uint16_t)((uint16_t)0xFFFF >> 2)) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { - status |= VL53L4ED_WrWord(dev, - VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm<<2); + } else { + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm << 2); } return status; } -VL53L4ED_Error VL53L4ED_GetSigmaThreshold( - Dev_t dev, - uint16_t *p_sigma_mm) +VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status += VL53L4ED_RdWord(dev, - VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); + status += VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); *p_sigma_mm = *p_sigma_mm >> 2; return status; } -VL53L4ED_Error VL53L4ED_StartTemperatureUpdate( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t tmp = 0, continue_loop = 1; uint16_t i = 0; - status |= VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); + status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0x92); status |= VL53L4ED_StartRanging(dev); - do{ - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for answer */ - { - i++; - } - else /* Timeout 1000ms reached */ - { - continue_loop = (uint8_t)0; - status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + do { + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if (tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } else if (i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_ClearInterrupt(dev); status |= VL53L4ED_StopRanging(dev); - status += VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); + status += VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); status += VL53L4ED_WrByte(dev, 0x0B, 0); return status; } diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h index df55ef3d0..e5d7acf2b 100644 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #ifndef VL53L4ED_API_H_ #define VL53L4ED_API_H_ @@ -19,10 +19,10 @@ * @brief Driver version */ -#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 -#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 +#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 +#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 /** * @brief Driver error type @@ -30,58 +30,56 @@ typedef uint8_t VL53L4ED_Error; -#define VL53L4ED_ERROR_NONE ((uint8_t)0U) -#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) -#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) -#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) - +#define VL53L4ED_ERROR_NONE ((uint8_t)0U) +#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) +#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) +#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) /** * @brief Inner Macro for API. Not for user, only for development. */ #define VL53L4ED_SOFT_RESET ((uint16_t)0x0000)) -#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) -#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) +#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) +#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) #define VL53L4ED_XTALK_PLANE_OFFSET_KCPS ((uint16_t)0x0016) -#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) -#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) -#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) -#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) -#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) -#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) -#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) -#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) -#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) -#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) -#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) -#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) +#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) +#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) +#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) +#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) +#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) +#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) +#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) +#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) +#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) +#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) +#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) +#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) #define VL53L4ED_INTERMEASUREMENT_MS ((uint16_t)0x006C) -#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) -#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) -#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) -#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) -#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) -#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) -#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) -#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) -#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) -#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) - - -#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) -#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) -#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) +#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) +#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) +#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) +#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) +#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) +#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) +#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) +#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) +#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) +#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) + +#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) +#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) +#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) /** * @brief defines Software Version */ typedef struct { - uint8_t major; /*!< major number */ - uint8_t minor; /*!< minor number */ - uint8_t build; /*!< build number */ - uint32_t revision; /*!< revision number */ + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ + uint32_t revision; /*!< revision number */ } VL53L4ED_Version_t; /** @@ -115,9 +113,7 @@ typedef struct { * @return (VL53L4ED_ERROR) status : 0 if SW version is OK. */ -VL53L4ED_Error VL53L4ED_GetSWVersion( - VL53L4ED_Version_t *pVersion); - +VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *pVersion); /** * @brief This function sets a new I2C address to a sensor. It can be used for @@ -128,9 +124,7 @@ VL53L4ED_Error VL53L4ED_GetSWVersion( * programmed. */ -VL53L4ED_Error VL53L4ED_SetI2CAddress( - Dev_t dev, - uint8_t new_address); +VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address); /** * @brief This function is used to get the sensor id of VL53L4ED. The sensor id @@ -140,9 +134,7 @@ VL53L4ED_Error VL53L4ED_SetI2CAddress( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetSensorId( - Dev_t dev, - uint16_t *p_id); +VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id); /** * @brief This function is used to initialize the sensor. @@ -150,8 +142,7 @@ VL53L4ED_Error VL53L4ED_GetSensorId( * @return (VL53L4ED_ERROR) status : 0 if init is OK. */ -VL53L4ED_Error VL53L4ED_SensorInit( - Dev_t dev); +VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev); /** * @brief This function clears the interrupt. It needs to be called after a @@ -160,8 +151,7 @@ VL53L4ED_Error VL53L4ED_SensorInit( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_ClearInterrupt( - Dev_t dev); +VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev); /** * @brief This function starts a ranging session. The ranging operation is @@ -171,8 +161,7 @@ VL53L4ED_Error VL53L4ED_ClearInterrupt( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_StartRanging( - Dev_t dev); +VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev); /** * @brief This function stops the ranging in progress. @@ -180,8 +169,7 @@ VL53L4ED_Error VL53L4ED_StartRanging( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_StopRanging( - Dev_t dev); +VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev); /** * @brief This function check if a new data is available by polling a dedicated @@ -192,9 +180,7 @@ VL53L4ED_Error VL53L4ED_StopRanging( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_CheckForDataReady( - Dev_t dev, - uint8_t *p_is_data_ready); +VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready); /** * @brief This function sets new range timing. Timing are composed of @@ -213,10 +199,7 @@ VL53L4ED_Error VL53L4ED_CheckForDataReady( * @return (uint8_t) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_SetRangeTiming( - Dev_t dev, - uint32_t timing_budget_ms, - uint32_t inter_measurement_ms); +VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms); /** * @brief This function gets the current range timing. Timing are composed of @@ -232,10 +215,7 @@ VL53L4ED_Error VL53L4ED_SetRangeTiming( * @return (uint8_t) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetRangeTiming( - Dev_t dev, - uint32_t *p_timing_budget_ms, - uint32_t *p_inter_measurement_ms); +VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms); /** * @brief This function gets the results reported by the sensor. @@ -310,11 +290,7 @@ VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps); * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, - uint16_t distance_low_mm, - uint16_t distance_high_mm, - uint8_t window); - +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window); /** * @brief This function gets the current detection thresholds. The detection @@ -330,10 +306,7 @@ VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, - uint16_t *p_distance_low_mm, - uint16_t *p_distance_high_mm, - uint8_t *p_window); +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window); /** * @brief This function sets a new signal threshold in kcps. If a @@ -357,8 +330,7 @@ VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps); * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, - uint16_t *p_signal_kcps); +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps); /** * @brief This function programs a new sigma threshold. The sigma corresponds to @@ -372,9 +344,7 @@ VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, * high. */ -VL53L4ED_Error VL53L4ED_SetSigmaThreshold( - Dev_t dev, - uint16_t sigma_mm); +VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm); /** * @brief This function gets the current sigma threshold. The sigma corresponds @@ -386,9 +356,7 @@ VL53L4ED_Error VL53L4ED_SetSigmaThreshold( * @return (VL53L4ED_ERROR) status : 0 if programming is OK. */ -VL53L4ED_Error VL53L4ED_GetSigmaThreshold( - Dev_t dev, - uint16_t *p_sigma_mm); +VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm); /** * @brief This function can be called when the temperature might have changed by @@ -402,4 +370,4 @@ VL53L4ED_Error VL53L4ED_GetSigmaThreshold( VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev); -#endif //VL53L4ED_API_H_ +#endif // VL53L4ED_API_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c index e3d95c223..6a0d96eb1 100644 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c @@ -1,29 +1,27 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_calibration.c * @brief Calibration functions implementation */ +#include "VL53L4ED_calibration.h" + #include + #include "VL53L4ED_api.h" -#include "VL53L4ED_calibration.h" -VL53L4ED_Error VL53L4ED_CalibrateOffset( - Dev_t dev, - int16_t TargetDistInMm, - int16_t *p_measured_offset_mm, - int16_t nb_samples) +VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t i, tmp, continue_loop; @@ -31,14 +29,9 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( int16_t AvgDistance = 0; VL53L4ED_ResultsData_t results; - if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) - || ((TargetDistInMm < (int16_t)10) - || (TargetDistInMm > (int16_t)1000))) - { + if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)1000))) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { + } else { status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, 0x0); status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, 0x0); status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, 0x0); @@ -49,23 +42,21 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); } @@ -77,23 +68,21 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { - continue_loop = (uint8_t)0; + continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); @@ -103,18 +92,14 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( status |= VL53L4ED_StopRanging(dev); AvgDistance = AvgDistance / nb_samples; *p_measured_offset_mm = (int16_t)TargetDistInMm - AvgDistance; - tmpOff = (uint16_t) *p_measured_offset_mm * (uint16_t)4; + tmpOff = (uint16_t)*p_measured_offset_mm * (uint16_t)4; status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, tmpOff); } return status; } -VL53L4ED_Error VL53L4ED_CalibrateXtalk( - Dev_t dev, - int16_t TargetDistInMm, - uint16_t *p_measured_xtalk_kcps, - int16_t nb_samples) +VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t i, tmp, continue_loop; @@ -128,17 +113,11 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( uint16_t calXtalk, j; *p_measured_xtalk_kcps = 0; - if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) - || ((TargetDistInMm < (int16_t)10) - || (TargetDistInMm > (int16_t)5000))) - { + if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)5000))) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { + } else { /* Disable Xtalk compensation */ - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); /* Device heat loop (10 samples) */ status |= VL53L4ED_StartRanging(dev); @@ -146,23 +125,21 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); } @@ -170,36 +147,31 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( /* Device ranging loop */ status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)nb_samples; i++) - { + for (i = 0; i < (uint8_t)nb_samples; i++) { tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { - continue_loop = (uint8_t)0; + continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); /* Discard invalid measurements and first frame */ - if (results.range_status == (uint8_t)0 - && i > (uint8_t)0) - { + if (results.range_status == (uint8_t)0 && i > (uint8_t)0) { AvgDistance += (float_t)results.distance_mm; AverageSpadNb += (float_t)results.number_of_spad; AverageSignal += (float_t)results.signal_rate_kcps; @@ -208,32 +180,25 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( } status |= VL53L4ED_StopRanging(dev); - if (CounterNbSamples == 0) - { + if (CounterNbSamples == 0) { status = VL53L4ED_ERROR_XTALK_FAILED; - } - else - { + } else { AvgDistance /= CounterNbSamples; AverageSpadNb /= CounterNbSamples; AverageSignal /= CounterNbSamples; - tmp_xtalk = (float_t)1.0 - (AvgDistance/TargetDistance); - tmp_xtalk *= (AverageSignal/AverageSpadNb); + tmp_xtalk = (float_t)1.0 - (AvgDistance / TargetDistance); + tmp_xtalk *= (AverageSignal / AverageSpadNb); /* 127kcps is the max Xtalk value (65536/512) */ - if(tmp_xtalk > (uint16_t)127) - { + if (tmp_xtalk > (uint16_t)127) { status = VL53L4ED_ERROR_XTALK_FAILED; - } - else - { + } else { *p_measured_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); /* Send data to firmware */ calXtalk = (uint16_t)(tmp_xtalk * (float_t)512.0); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); } } } diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h index c953d0239..97daa1d3c 100644 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h +++ b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_calibration.h @@ -38,12 +38,7 @@ * invalid nb of samples). */ -VL53L4ED_Error VL53L4ED_CalibrateOffset( - Dev_t dev, - int16_t TargetDistInMm, - int16_t *p_measured_offset_mm, - int16_t nb_samples); - +VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples); /** * @brief This function can be used to perform a Xtalk calibration. Xtalk @@ -63,11 +58,7 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g * invalid nb of samples). */ - -VL53L4ED_Error VL53L4ED_CalibrateXtalk( - Dev_t dev, - int16_t TargetDistInMm, - uint16_t *p_measured_xtalk_kcps, - int16_t nb_samples); -#endif //VL53L4ED_CALIBRATION_H_ +VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples); + +#endif // VL53L4ED_CALIBRATION_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/platform.c b/SAMM/Core/Extras/VL53L4ED/platform.c index ba3d6f1a6..cf09e50e7 100644 --- a/SAMM/Core/Extras/VL53L4ED/platform.c +++ b/SAMM/Core/Extras/VL53L4ED/platform.c @@ -1,25 +1,25 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #include "platform.h" -#include "main.h" + #include "i2c.h" +#include "main.h" extern I2C_HandleTypeDef hi2c1; - /* Im legit just using the example stm provides but instead of filling everything out im only copying the platform.c implemintation -for the vl53l4ed sensor. +for the vl53l4ed sensor. */ @@ -34,8 +34,7 @@ uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t *value) data_write[1] = RegisterAdress & 0xFF; status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 4, 100); - *value = ((data_read[0] << 24) | (data_read[1]<<16) | - (data_read[2]<<8)| (data_read[3])); + *value = ((data_read[0] << 24) | (data_read[1] << 16) | (data_read[2] << 8) | (data_read[3])); return status; } diff --git a/SAMM/Core/Extras/VL53L4ED/platform.h b/SAMM/Core/Extras/VL53L4ED/platform.h index ee27e91f2..9c7754970 100644 --- a/SAMM/Core/Extras/VL53L4ED/platform.h +++ b/SAMM/Core/Extras/VL53L4ED/platform.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #ifndef _PLATFORM_H_ #define _PLATFORM_H_ @@ -18,8 +18,8 @@ #include /** -* VL53L4ED device instance. -*/ + * VL53L4ED device instance. + */ typedef uint16_t Dev_t; @@ -33,8 +33,7 @@ typedef uint8_t VL53L4ED_Error; * with I2C Fast Mode Plus (up to 1MHz). Otherwise, default max value is 400kHz. */ -//#define VL53L4ED_I2C_FAST_MODE_PLUS - +// #define VL53L4ED_I2C_FAST_MODE_PLUS /** * @brief Read 32 bits through I2C. @@ -77,4 +76,4 @@ uint8_t VL53L4ED_WrDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t value); uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t TimeMs); -#endif // _PLATFORM_H_ \ No newline at end of file +#endif // _PLATFORM_H_ \ No newline at end of file diff --git a/SAMM/Core/Extras/extra.c b/SAMM/Core/Extras/extra.c index 3611c8904..25519615c 100644 --- a/SAMM/Core/Extras/extra.c +++ b/SAMM/Core/Extras/extra.c @@ -1,58 +1,57 @@ #include "extra.h" -#include "main.h" -#include "i2c.h" + #include +#include "i2c.h" +#include "main.h" void MLX90640_I2CInit(void) { - MX_I2C2_Init(); - return; + MX_I2C2_Init(); + return; } int MLX90640_I2CGeneralReset(void) { - uint8_t data = 0x06; - return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data , 1, 1000); + uint8_t data = 0x06; + return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data, 1, 1000); } - -int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) { - //HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); - //HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); - /* - HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size) - */ - //return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 10000); + // HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); + // HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); + /* + HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t *pData, uint16_t Size) + */ + // return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 10000); } int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) { - // union - // { - // uint8_t bytes[2]; - // uint16_t data; - // }extra = {.data = data}; - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); - //return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); + // union + // { + // uint8_t bytes[2]; + // uint16_t data; + // }extra = {.data = data}; + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); + // return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); } void MLX90640_I2CFreqSet(int freq) { - return; + return; } -uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) { - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 500); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 500); } -uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data) +uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) { - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *) &data, 2, 500); + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 500); } - diff --git a/SAMM/Core/Extras/extra.h b/SAMM/Core/Extras/extra.h index 2b820f432..f032f86ab 100644 --- a/SAMM/Core/Extras/extra.h +++ b/SAMM/Core/Extras/extra.h @@ -9,12 +9,11 @@ This is for some xtra fucntions that would be needed later on void MLX90640_I2CInit(void); int MLX90640_I2CGeneralReset(void); -int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -int MLX90640_I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); void MLX90640_I2CFreqSet(int freq); - -uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); #endif /* __EXTRA_H__ */ \ No newline at end of file diff --git a/SAMM/Core/Inc/adc.h b/SAMM/Core/Inc/adc.h index 5692f3846..e65b1f6f8 100644 --- a/SAMM/Core/Inc/adc.h +++ b/SAMM/Core/Inc/adc.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file adc.h + * @brief This file contains all the function prototypes for + * the adc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __ADC_H__ @@ -49,4 +49,3 @@ void MX_ADC1_Init(void); #endif #endif /* __ADC_H__ */ - diff --git a/SAMM/Core/Inc/crc.h b/SAMM/Core/Inc/crc.h index 836835d02..133957e92 100644 --- a/SAMM/Core/Inc/crc.h +++ b/SAMM/Core/Inc/crc.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file crc.h - * @brief This file contains all the function prototypes for - * the crc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __CRC_H__ @@ -49,4 +49,3 @@ void MX_CRC_Init(void); #endif #endif /* __CRC_H__ */ - diff --git a/SAMM/Core/Inc/dma.h b/SAMM/Core/Inc/dma.h index f3b1a09f9..7774831e0 100644 --- a/SAMM/Core/Inc/dma.h +++ b/SAMM/Core/Inc/dma.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file dma.h - * @brief This file contains all the function prototypes for - * the dma.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __DMA_H__ @@ -49,4 +49,3 @@ void MX_DMA_Init(void); #endif #endif /* __DMA_H__ */ - diff --git a/SAMM/Core/Inc/fdcan.h b/SAMM/Core/Inc/fdcan.h index 9289ea3a6..a5cc22f04 100644 --- a/SAMM/Core/Inc/fdcan.h +++ b/SAMM/Core/Inc/fdcan.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __FDCAN_H__ @@ -52,4 +52,3 @@ void MX_FDCAN2_Init(void); #endif #endif /* __FDCAN_H__ */ - diff --git a/SAMM/Core/Inc/gpio.h b/SAMM/Core/Inc/gpio.h index 708bac71d..843d4e9e7 100644 --- a/SAMM/Core/Inc/gpio.h +++ b/SAMM/Core/Inc/gpio.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __GPIO_H__ @@ -46,4 +46,3 @@ void MX_GPIO_Init(void); } #endif #endif /*__ GPIO_H__ */ - diff --git a/SAMM/Core/Inc/i2c.h b/SAMM/Core/Inc/i2c.h index 84ed75d2e..64f5543e6 100644 --- a/SAMM/Core/Inc/i2c.h +++ b/SAMM/Core/Inc/i2c.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __I2C_H__ @@ -49,4 +49,3 @@ void MX_I2C1_Init(void); #endif #endif /* __I2C_H__ */ - diff --git a/SAMM/Core/Inc/main.h b/SAMM/Core/Inc/main.h index 17a2fe760..32df0ac37 100644 --- a/SAMM/Core/Inc/main.h +++ b/SAMM/Core/Inc/main.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -28,17 +28,16 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32g4xx_hal.h" - -#include "stm32g4xx_ll_rcc.h" #include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_crs.h" -#include "stm32g4xx_ll_system.h" -#include "stm32g4xx_ll_exti.h" #include "stm32g4xx_ll_cortex.h" -#include "stm32g4xx_ll_utils.h" -#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_crs.h" #include "stm32g4xx_ll_dma.h" +#include "stm32g4xx_ll_exti.h" #include "stm32g4xx_ll_gpio.h" +#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_rcc.h" +#include "stm32g4xx_ll_system.h" +#include "stm32g4xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/Core/Inc/spi.h b/SAMM/Core/Inc/spi.h index bb37a07dc..51a96c6e5 100644 --- a/SAMM/Core/Inc/spi.h +++ b/SAMM/Core/Inc/spi.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __SPI_H__ @@ -49,4 +49,3 @@ void MX_SPI3_Init(void); #endif #endif /* __SPI_H__ */ - diff --git a/SAMM/Core/Inc/stm32_assert.h b/SAMM/Core/Inc/stm32_assert.h index 61631c41e..92460620f 100644 --- a/SAMM/Core/Inc/stm32_assert.h +++ b/SAMM/Core/Inc/stm32_assert.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32_assert.h - * @author MCD Application Team - * @brief STM32 assert file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32_assert.h + * @author MCD Application Team + * @brief STM32 assert file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM32_ASSERT_H @@ -29,15 +29,15 @@ extern "C" { /* Exported constants --------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t *file, uint32_t line); @@ -50,4 +50,3 @@ void assert_failed(uint8_t *file, uint32_t line); #endif #endif /* __STM32_ASSERT_H */ - diff --git a/SAMM/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/Core/Inc/stm32g4xx_hal_conf.h index 4087e183c..af665f477 100644 --- a/SAMM/Core/Inc/stm32g4xx_hal_conf.h +++ b/SAMM/Core/Inc/stm32g4xx_hal_conf.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file - ****************************************************************************** + ****************************************************************************** + * @file stm32g4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -23,7 +23,7 @@ #define STM32G4xx_HAL_CONF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Exported types ------------------------------------------------------------*/ @@ -31,12 +31,12 @@ /* ########################## Module Selection ############################## */ /** - * @brief This is the list of modules to be used in the HAL driver - */ + * @brief This is the list of modules to be used in the HAL driver + */ #define HAL_MODULE_ENABLED - /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_ADC_MODULE_ENABLED */ /*#define HAL_COMP_MODULE_ENABLED */ /*#define HAL_CORDIC_MODULE_ENABLED */ #define HAL_CRC_MODULE_ENABLED @@ -76,122 +76,123 @@ /* ########################## Register Callbacks selection ############################## */ /** - * @brief This is the list of modules where register callback can be used - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U -#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* ########################## Oscillator Values adaptation ####################*/ /** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined(HSE_VALUE) +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined(HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ /** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined(HSI_VALUE) +#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined (HSI48_VALUE) - #define HSI48_VALUE (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined(HSI48_VALUE) +#define HSI48_VALUE \ + (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. \ + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ /** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined(LSI_VALUE) /*!< Value of the Internal Low Speed oscillator in Hz The real value may vary depending on the variations in voltage and temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined(LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ -#if !defined (LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ +#if !defined(LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ /** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined(EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, === you can define the HSE value in your toolchain compiler preprocessor. */ /* ########################### System Configuration ######################### */ /** - * @brief This is the HAL system configuration section - */ + * @brief This is the HAL system configuration section + */ -#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 0U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U /* ########################## Assert Selection ############################## */ /** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ /* #define USE_FULL_ASSERT 1U */ /* ################## SPI peripheral configuration ########################## */ @@ -201,12 +202,12 @@ The real value may vary depending on the variations in voltage and temperature.* * Deactivated: CRC code cleaned from driver */ -#define USE_SPI_CRC 0U +#define USE_SPI_CRC 0U /* Includes ------------------------------------------------------------------*/ /** - * @brief Include module's header file - */ + * @brief Include module's header file + */ #ifdef HAL_RCC_MODULE_ENABLED #include "stm32g4xx_hal_rcc.h" @@ -357,15 +358,15 @@ The real value may vary depending on the variations in voltage and temperature.* #endif /* HAL_WWDG_MODULE_ENABLED */ /* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t *file, uint32_t line); diff --git a/SAMM/Core/Inc/stm32g4xx_it.h b/SAMM/Core/Inc/stm32g4xx_it.h index d5d87eab3..13530cb56 100644 --- a/SAMM/Core/Inc/stm32g4xx_it.h +++ b/SAMM/Core/Inc/stm32g4xx_it.h @@ -1,20 +1,20 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -22,7 +22,7 @@ #define __STM32G4xx_IT_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Private includes ----------------------------------------------------------*/ diff --git a/SAMM/Core/Src/adc.c b/SAMM/Core/Src/adc.c index 15733df47..fbcfbe933 100644 --- a/SAMM/Core/Src/adc.c +++ b/SAMM/Core/Src/adc.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "adc.h" @@ -30,123 +30,117 @@ ADC_HandleTypeDef hadc1; void MX_ADC1_Init(void) { - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.GainCompensation = 0; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DMAContinuousRequests = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = ENABLE; - hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; - hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; - hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; - hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure the ADC multi-mode - */ - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ - + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.GainCompensation = 0; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_7; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ } -void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspInit 0 */ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspInit 0 */ - /* USER CODE END ADC1_MspInit 0 */ - LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + /* USER CODE END ADC1_MspInit 0 */ + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); - /* ADC1 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); + /* ADC1 clock enable */ + __HAL_RCC_ADC12_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN ADC1_MspInit 1 */ + /* USER CODE BEGIN ADC1_MspInit 1 */ - /* USER CODE END ADC1_MspInit 1 */ - } + /* USER CODE END ADC1_MspInit 1 */ + } } -void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) +void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) { - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC12_CLK_DISABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - /* USER CODE BEGIN ADC1_MspDeInit 1 */ + /* USER CODE BEGIN ADC1_MspDeInit 1 */ - /* USER CODE END ADC1_MspDeInit 1 */ - } + /* USER CODE END ADC1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/crc.c b/SAMM/Core/Src/crc.c index 0a8907607..213510a5d 100644 --- a/SAMM/Core/Src/crc.c +++ b/SAMM/Core/Src/crc.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file crc.c - * @brief This file provides code for the configuration - * of the CRC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "crc.h" @@ -30,59 +30,55 @@ CRC_HandleTypeDef hcrc; void MX_CRC_Init(void) { - /* USER CODE BEGIN CRC_Init 0 */ + /* USER CODE BEGIN CRC_Init 0 */ - /* USER CODE END CRC_Init 0 */ + /* USER CODE END CRC_Init 0 */ - /* USER CODE BEGIN CRC_Init 1 */ + /* USER CODE BEGIN CRC_Init 1 */ - /* USER CODE END CRC_Init 1 */ - hcrc.Instance = CRC; - hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; - hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; - hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; - hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; - hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; - if (HAL_CRC_Init(&hcrc) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN CRC_Init 2 */ - - /* USER CODE END CRC_Init 2 */ + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + /* USER CODE END CRC_Init 2 */ } -void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) +void HAL_CRC_MspInit(CRC_HandleTypeDef *crcHandle) { - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspInit 0 */ + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspInit 0 */ - /* USER CODE END CRC_MspInit 0 */ - /* CRC clock enable */ - __HAL_RCC_CRC_CLK_ENABLE(); - /* USER CODE BEGIN CRC_MspInit 1 */ + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ - /* USER CODE END CRC_MspInit 1 */ - } + /* USER CODE END CRC_MspInit 1 */ + } } -void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) +void HAL_CRC_MspDeInit(CRC_HandleTypeDef *crcHandle) { - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspDeInit 0 */ + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspDeInit 0 */ - /* USER CODE END CRC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_CRC_CLK_DISABLE(); - /* USER CODE BEGIN CRC_MspDeInit 1 */ + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ - /* USER CODE END CRC_MspDeInit 1 */ - } + /* USER CODE END CRC_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/dma.c b/SAMM/Core/Src/dma.c index 372b7e92c..0b82d0d7c 100644 --- a/SAMM/Core/Src/dma.c +++ b/SAMM/Core/Src/dma.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file dma.c - * @brief This file provides code for the configuration - * of all the requested memory to memory DMA transfers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -34,26 +34,24 @@ /* USER CODE END 1 */ /** - * Enable DMA controller clock - */ + * Enable DMA controller clock + */ void MX_DMA_Init(void) { - /* DMA controller clock enable */ - __HAL_RCC_DMAMUX1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); - /* DMA1_Channel2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); - + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); } /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ - diff --git a/SAMM/Core/Src/fdcan.c b/SAMM/Core/Src/fdcan.c index 59cf13f59..600df963c 100644 --- a/SAMM/Core/Src/fdcan.c +++ b/SAMM/Core/Src/fdcan.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "fdcan.h" @@ -31,191 +31,181 @@ FDCAN_HandleTypeDef hfdcan2; void MX_FDCAN1_Init(void) { - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 16; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 1; - hfdcan1.Init.NominalTimeSeg2 = 1; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ - + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 16; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 1; + hfdcan1.Init.NominalTimeSeg2 = 1; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ } /* FDCAN2 init function */ void MX_FDCAN2_Init(void) { - /* USER CODE BEGIN FDCAN2_Init 0 */ - - /* USER CODE END FDCAN2_Init 0 */ - - /* USER CODE BEGIN FDCAN2_Init 1 */ - - /* USER CODE END FDCAN2_Init 1 */ - hfdcan2.Instance = FDCAN2; - hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = DISABLE; - hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = DISABLE; - hfdcan2.Init.NominalPrescaler = 16; - hfdcan2.Init.NominalSyncJumpWidth = 1; - hfdcan2.Init.NominalTimeSeg1 = 1; - hfdcan2.Init.NominalTimeSeg2 = 1; - hfdcan2.Init.DataPrescaler = 1; - hfdcan2.Init.DataSyncJumpWidth = 1; - hfdcan2.Init.DataTimeSeg1 = 1; - hfdcan2.Init.DataTimeSeg2 = 1; - hfdcan2.Init.StdFiltersNbr = 0; - hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN2_Init 2 */ - - /* USER CODE END FDCAN2_Init 2 */ - + /* USER CODE BEGIN FDCAN2_Init 0 */ + + /* USER CODE END FDCAN2_Init 0 */ + + /* USER CODE BEGIN FDCAN2_Init 1 */ + + /* USER CODE END FDCAN2_Init 1 */ + hfdcan2.Instance = FDCAN2; + hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan2.Init.AutoRetransmission = DISABLE; + hfdcan2.Init.TransmitPause = DISABLE; + hfdcan2.Init.ProtocolException = DISABLE; + hfdcan2.Init.NominalPrescaler = 16; + hfdcan2.Init.NominalSyncJumpWidth = 1; + hfdcan2.Init.NominalTimeSeg1 = 1; + hfdcan2.Init.NominalTimeSeg2 = 1; + hfdcan2.Init.DataPrescaler = 1; + hfdcan2.Init.DataSyncJumpWidth = 1; + hfdcan2.Init.DataTimeSeg1 = 1; + hfdcan2.Init.DataTimeSeg2 = 1; + hfdcan2.Init.StdFiltersNbr = 0; + hfdcan2.Init.ExtFiltersNbr = 0; + hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN2_Init 2 */ + + /* USER CODE END FDCAN2_Init 2 */ } -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0; +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(fdcanHandle->Instance==FDCAN1) - { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if(HAL_RCC_FDCAN_CLK_ENABLED==1){ - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } - else if(fdcanHandle->Instance==FDCAN2) - { - /* USER CODE BEGIN FDCAN2_MspInit 0 */ - - /* USER CODE END FDCAN2_MspInit 0 */ - - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN2 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if(HAL_RCC_FDCAN_CLK_ENABLED==1){ - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN2_MspInit 1 */ - - /* USER CODE END FDCAN2_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspInit 0 */ + + /* USER CODE END FDCAN2_MspInit 0 */ + + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN2 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN2_MspInit 1 */ + + /* USER CODE END FDCAN2_MspInit 1 */ + } } -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) { - if(fdcanHandle->Instance==FDCAN1) - { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if(HAL_RCC_FDCAN_CLK_ENABLED==0){ - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } - else if(fdcanHandle->Instance==FDCAN2) - { - /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ - - /* USER CODE END FDCAN2_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if(HAL_RCC_FDCAN_CLK_ENABLED==0){ - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_5); - - /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ - - /* USER CODE END FDCAN2_MspDeInit 1 */ - } + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + + /* USER CODE END FDCAN2_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_5); + + /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + + /* USER CODE END FDCAN2_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/gpio.c b/SAMM/Core/Src/gpio.c index 5efdf6ec1..2711a3604 100644 --- a/SAMM/Core/Src/gpio.c +++ b/SAMM/Core/Src/gpio.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -33,71 +33,70 @@ /* USER CODE END 1 */ /** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI + * Analog + * Input + * Output + * EVENT_OUT + * EXTI PC8 ------> I2C3_SCL PC9 ------> I2C3_SDA */ void MX_GPIO_Init(void) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - //HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin : PF1 */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - */ - - /*Configure GPIO pin : PB1 */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pin : PB12 */ - /* corresponds to SPI - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PC8 PC9 */ - /* corresponds to tiretemp i2c - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PB4 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin : PF1 */ + /* + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + */ + + /*Configure GPIO pin : PB1 */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : PB12 */ + /* corresponds to SPI + GPIO_InitStruct.Pin = GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + */ + + /*Configure GPIO pins : PC8 PC9 */ + /* corresponds to tiretemp i2c + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + */ + + /*Configure GPIO pins : PB4 PB6 */ + GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } /* USER CODE BEGIN 2 */ diff --git a/SAMM/Core/Src/i2c.c b/SAMM/Core/Src/i2c.c index 0cab1143b..7119f062b 100644 --- a/SAMM/Core/Src/i2c.c +++ b/SAMM/Core/Src/i2c.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "i2c.h" @@ -30,104 +30,98 @@ I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.Timing = 0x10B30F25; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) - { - Error_Handler(); - } - - /** I2C Fast mode Plus enable - */ - HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x10B30F25; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ } -void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (i2cHandle->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C1 clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } } -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) { - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ + if (i2cHandle->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); - /* USER CODE BEGIN I2C1_MspDeInit 1 */ + /* USER CODE BEGIN I2C1_MspDeInit 1 */ - /* USER CODE END I2C1_MspDeInit 1 */ - } + /* USER CODE END I2C1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/main.c b/SAMM/Core/Src/main.c index 7ca2c8382..64aafa64f 100644 --- a/SAMM/Core/Src/main.c +++ b/SAMM/Core/Src/main.c @@ -1,34 +1,36 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" + #include "crc.h" #include "fdcan.h" +#include "gpio.h" #include "i2c.h" #include "spi.h" -#include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include + #include "VL53L4ED_api.h" -//#include "circularBuffer.h" +// #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -49,10 +51,10 @@ /* USER CODE BEGIN PM */ PUTCHAR_PROTOTYPE { - ITM_SendChar(ch); - return ch; + ITM_SendChar(ch); + return ch; } -//CircularBuffer *cb; +// CircularBuffer *cb; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ @@ -78,158 +80,145 @@ I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { - /* USER CODE BEGIN 1 */ - //cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); - /* USER CODE END 1 */ + /* USER CODE BEGIN 1 */ + // cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); + /* USER CODE END 1 */ - /* MCU Configuration--------------------------------------------------------*/ + /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* Configure the system clock */ - SystemClock_Config(); + /* Configure the system clock */ + SystemClock_Config(); - /* USER CODE BEGIN SysInit */ + /* USER CODE BEGIN SysInit */ - /* USER CODE END SysInit */ + /* USER CODE END SysInit */ - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_CRC_Init(); - MX_FDCAN1_Init(); - MX_FDCAN2_Init(); - MX_I2C1_Init(); - MX_SPI3_Init(); - /* USER CODE BEGIN 2 */ + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_FDCAN1_Init(); + MX_FDCAN2_Init(); + MX_I2C1_Init(); + MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ - // HAL_FDCAN_Start(&hfdcan1); - // HAL_FDCAN_Start(&hfdcan2); - // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_Start(&hfdcan1); + // HAL_FDCAN_Start(&hfdcan2); + // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // static uint16_t eeMLX90640[832]; + // static paramsMLX90640 mlx90640; + // #define MLX90640_ADDRESS 0x33<<1 + // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); - // static uint16_t eeMLX90640[832]; - // static paramsMLX90640 mlx90640; - // #define MLX90640_ADDRESS 0x33<<1 - // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); - // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); - // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + // MLX90640_SynchFrame(MLX90640_ADDRESS); + // MLX90640_SetRefreshRate(0x33, 0x05); + /* USER CODE END 2 */ - // MLX90640_SynchFrame(MLX90640_ADDRESS); - // MLX90640_SetRefreshRate(0x33, 0x05); - /* USER CODE END 2 */ + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to reset the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to power up the device - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to power up the device + uint16_t status = 0; - uint16_t status = 0; + uint16_t sensor_id = 0; + VL53L4ED_ResultsData_t results; + uint8_t p_data_ready; - uint16_t sensor_id = 0; - VL53L4ED_ResultsData_t results; - uint8_t p_data_ready; + int TOF_ID = 0x52; + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); + status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing - int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); - status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); - status = VL53L4ED_StartRanging(TOF_ID); - status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + while (1) { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ - while (1) - { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - if(p_data_ready){ + /* USER CODE BEGIN 3 */ + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if (p_data_ready) { /* (Mandatory) Clear HW interrupt to restart measurements */ VL53L4ED_ClearInterrupt(TOF_ID); /* Read measured distance. RangeStatus = 0 means valid data */ VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", - results.range_status, - results.distance_mm- 67, - results.signal_per_spad_kcps); - }else{ - HAL_Delay(10); - __disable_irq(); - __enable_irq(); - } - } - /* USER CODE END 3 */ + printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); + } else { + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + } + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); - while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) - { - } - LL_PWR_EnableRange1BoostMode(); - LL_RCC_HSE_EnableBypass(); - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while(LL_RCC_HSE_IsReady() != 1) - { - } - - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); - LL_RCC_PLL_EnableDomain_SYS(); - LL_RCC_PLL_Enable(); - /* Wait till PLL is ready */ - while(LL_RCC_PLL_IsReady() != 1) - { - } - - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) - { - } - - /* Insure 1us transition state at intermediate medium speed clock*/ - for (__IO uint32_t i = (170 >> 1); i !=0; i--); - - /* Set AHB prescaler*/ - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_SetSystemCoreClock(160000000); - - /* Update the time base */ - if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) - { - Error_Handler(); - } + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} + LL_PWR_EnableRange1BoostMode(); + LL_RCC_HSE_EnableBypass(); + LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while (LL_RCC_HSE_IsReady() != 1) {} + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + /* Wait till PLL is ready */ + while (LL_RCC_PLL_IsReady() != 1) {} + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} + + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (170 >> 1); i != 0; i--) + ; + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(160000000); + + /* Update the time base */ + if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ @@ -240,59 +229,56 @@ void SystemClock_Config(void) // printf("got messgae\n"); // //circularBufferPush(cb, RxData, sizeof(RxData)); - // } /* USER CODE END 4 */ /** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM1 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { - /* USER CODE BEGIN Callback 0 */ + /* USER CODE BEGIN Callback 0 */ - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM1) { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ - /* USER CODE END Callback 1 */ + /* USER CODE END Callback 1 */ } /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) {} + /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ diff --git a/SAMM/Core/Src/spi.c b/SAMM/Core/Src/spi.c index 22f78c561..665ad89d5 100644 --- a/SAMM/Core/Src/spi.c +++ b/SAMM/Core/Src/spi.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "spi.h" @@ -30,90 +30,86 @@ SPI_HandleTypeDef hspi3; void MX_SPI3_Init(void) { - /* USER CODE BEGIN SPI3_Init 0 */ - - /* USER CODE END SPI3_Init 0 */ - - /* USER CODE BEGIN SPI3_Init 1 */ - - /* USER CODE END SPI3_Init 1 */ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_8BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - if (HAL_SPI_Init(&hspi3) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI3_Init 2 */ - - /* USER CODE END SPI3_Init 2 */ - + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ } -void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==SPI3) - { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - /* SPI3 clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI3_MspInit 1 */ - - /* USER CODE END SPI3_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (spiHandle->Instance == SPI3) { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* SPI3 clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } } -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) { - if(spiHandle->Instance==SPI3) - { - /* USER CODE BEGIN SPI3_MspDeInit 0 */ + if (spiHandle->Instance == SPI3) { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ - /* USER CODE END SPI3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12); - /* USER CODE BEGIN SPI3_MspDeInit 1 */ + /* USER CODE BEGIN SPI3_MspDeInit 1 */ - /* USER CODE END SPI3_MspDeInit 1 */ - } + /* USER CODE END SPI3_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/stm32g4xx_hal_msp.c b/SAMM/Core/Src/stm32g4xx_hal_msp.c index 3fc223b63..69189ef4e 100644 --- a/SAMM/Core/Src/stm32g4xx_hal_msp.c +++ b/SAMM/Core/Src/stm32g4xx_hal_msp.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -58,27 +58,27 @@ /* USER CODE END 0 */ /** - * Initializes the Global MSP. - */ + * Initializes the Global MSP. + */ void HAL_MspInit(void) { - /* USER CODE BEGIN MspInit 0 */ + /* USER CODE BEGIN MspInit 0 */ - /* USER CODE END MspInit 0 */ + /* USER CODE END MspInit 0 */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); - /* System interrupt init*/ + /* System interrupt init*/ - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); - /* USER CODE BEGIN MspInit 1 */ + /* USER CODE BEGIN MspInit 1 */ - /* USER CODE END MspInit 1 */ + /* USER CODE END MspInit 1 */ } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c index 7ac4d76ff..8d49fd88c 100644 --- a/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c +++ b/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c @@ -1,20 +1,20 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_hal_timebase_tim.c + * @brief HAL time base based on the hardware TIM. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -25,103 +25,97 @@ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim1; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ + * @brief This function configures the TIM1 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); - -/* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM1 */ - htim1.Instance = TIM1; - - /* Initialize TIMx peripheral as follow: - - + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - + ClockDivision = 0 - + Counter direction = Up - */ - htim1.Init.Period = (1000000U / 1000U) - 1U; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - - status = HAL_TIM_Base_Init(&htim1); - if (status == HAL_OK) - { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim1); - if (status == HAL_OK) - { - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock = 0; + uint32_t uwPrescalerValue = 0; + uint32_t pFLatency; + + HAL_StatusTypeDef status; + + /* Enable TIM1 clock */ + __HAL_RCC_TIM1_CLK_ENABLE(); + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Compute TIM1 clock */ + uwTimclock = HAL_RCC_GetPCLK2Freq(); + + /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); + + /* Initialize TIM1 */ + htim1.Instance = TIM1; + + /* Initialize TIMx peripheral as follow: + + + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. + + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + + ClockDivision = 0 + + Counter direction = Up + */ + htim1.Init.Period = (1000000U / 1000U) - 1U; + htim1.Init.Prescaler = uwPrescalerValue; + htim1.Init.ClockDivision = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + + status = HAL_TIM_Base_Init(&htim1); + if (status == HAL_OK) { + /* Start the TIM time Base generation in interrupt mode */ + status = HAL_TIM_Base_Start_IT(&htim1); + if (status == HAL_OK) { + /* Enable the TIM1 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { + /* Configure the TIM IRQ priority */ + HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } else { + status = HAL_ERROR; + } + } + } + + /* Return function status */ + return status; } /** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM1 update interrupt. + * @param None + * @retval None + */ void HAL_SuspendTick(void) { - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); + /* Disable TIM1 update Interrupt */ + __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); } /** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling TIM1 update interrupt. + * @param None + * @retval None + */ void HAL_ResumeTick(void) { - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); + /* Enable TIM1 Update interrupt */ + __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); } - diff --git a/SAMM/Core/Src/stm32g4xx_it.c b/SAMM/Core/Src/stm32g4xx_it.c index ef94b5f52..2db0ff77b 100644 --- a/SAMM/Core/Src/stm32g4xx_it.c +++ b/SAMM/Core/Src/stm32g4xx_it.c @@ -1,25 +1,26 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "main.h" #include "stm32g4xx_it.h" + +#include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -65,131 +66,125 @@ extern TIM_HandleTypeDef htim1; /* Cortex-M4 Processor Interruption and Exception Handlers */ /******************************************************************************/ /** - * @brief This function handles Non maskable interrupt. - */ + * @brief This function handles Non maskable interrupt. + */ void NMI_Handler(void) { - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) {} + /* USER CODE END NonMaskableInt_IRQn 1 */ } /** - * @brief This function handles Hard fault interrupt. - */ + * @brief This function handles Hard fault interrupt. + */ void HardFault_Handler(void) { - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } } /** - * @brief This function handles Memory management fault. - */ + * @brief This function handles Memory management fault. + */ void MemManage_Handler(void) { - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } } /** - * @brief This function handles Prefetch fault, memory access fault. - */ + * @brief This function handles Prefetch fault, memory access fault. + */ void BusFault_Handler(void) { - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } } /** - * @brief This function handles Undefined instruction or illegal state. - */ + * @brief This function handles Undefined instruction or illegal state. + */ void UsageFault_Handler(void) { - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } } /** - * @brief This function handles System service call via SWI instruction. - */ + * @brief This function handles System service call via SWI instruction. + */ void SVC_Handler(void) { - /* USER CODE BEGIN SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 0 */ - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ - /* USER CODE END SVCall_IRQn 1 */ + /* USER CODE END SVCall_IRQn 1 */ } /** - * @brief This function handles Debug monitor. - */ + * @brief This function handles Debug monitor. + */ void DebugMon_Handler(void) { - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - /* USER CODE END DebugMonitor_IRQn 1 */ + /* USER CODE END DebugMonitor_IRQn 1 */ } /** - * @brief This function handles Pendable request for system service. - */ + * @brief This function handles Pendable request for system service. + */ void PendSV_Handler(void) { - /* USER CODE BEGIN PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 0 */ - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ - /* USER CODE END PendSV_IRQn 1 */ + /* USER CODE END PendSV_IRQn 1 */ } /** - * @brief This function handles System tick timer. - */ + * @brief This function handles System tick timer. + */ void SysTick_Handler(void) { - /* USER CODE BEGIN SysTick_IRQn 0 */ + /* USER CODE BEGIN SysTick_IRQn 0 */ - /* USER CODE END SysTick_IRQn 0 */ + /* USER CODE END SysTick_IRQn 0 */ - /* USER CODE BEGIN SysTick_IRQn 1 */ + /* USER CODE BEGIN SysTick_IRQn 1 */ - /* USER CODE END SysTick_IRQn 1 */ + /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ @@ -200,17 +195,17 @@ void SysTick_Handler(void) /******************************************************************************/ /** - * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. - */ + * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. + */ void TIM1_UP_TIM16_IRQHandler(void) { - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ - /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ - HAL_TIM_IRQHandler(&htim1); - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ + /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ + HAL_TIM_IRQHandler(&htim1); + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ - /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ + /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ } /* USER CODE BEGIN 1 */ diff --git a/SAMM/Core/Src/syscalls.c b/SAMM/Core/Src/syscalls.c index e33a8492c..a59a7d089 100644 --- a/SAMM/Core/Src/syscalls.c +++ b/SAMM/Core/Src/syscalls.c @@ -21,156 +21,148 @@ */ /* Includes */ -#include -#include #include -#include #include -#include +#include +#include +#include #include #include - +#include /* Variables */ extern int __io_putchar(int ch) __attribute__((weak)); extern int __io_getchar(void) __attribute__((weak)); - -char *__env[1] = { 0 }; +char *__env[1] = {0}; char **environ = __env; - /* Functions */ -void initialise_monitor_handles() -{ -} +void initialise_monitor_handles() {} int _getpid(void) { - return 1; + return 1; } int _kill(int pid, int sig) { - (void)pid; - (void)sig; - errno = EINVAL; - return -1; + (void)pid; + (void)sig; + errno = EINVAL; + return -1; } -void _exit (int status) +void _exit(int status) { - _kill(status, -1); - while (1) {} /* Make sure we hang here */ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ } __attribute__((weak)) int _read(int file, char *ptr, int len) { - (void)file; - int DataIdx; + (void)file; + int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - *ptr++ = __io_getchar(); - } + for (DataIdx = 0; DataIdx < len; DataIdx++) { + *ptr++ = __io_getchar(); + } - return len; + return len; } __attribute__((weak)) int _write(int file, char *ptr, int len) { - (void)file; - int DataIdx; + (void)file; + int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - __io_putchar(*ptr++); - } - return len; + for (DataIdx = 0; DataIdx < len; DataIdx++) { + __io_putchar(*ptr++); + } + return len; } int _close(int file) { - (void)file; - return -1; + (void)file; + return -1; } - int _fstat(int file, struct stat *st) { - (void)file; - st->st_mode = S_IFCHR; - return 0; + (void)file; + st->st_mode = S_IFCHR; + return 0; } int _isatty(int file) { - (void)file; - return 1; + (void)file; + return 1; } int _lseek(int file, int ptr, int dir) { - (void)file; - (void)ptr; - (void)dir; - return 0; + (void)file; + (void)ptr; + (void)dir; + return 0; } int _open(char *path, int flags, ...) { - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; } int _wait(int *status) { - (void)status; - errno = ECHILD; - return -1; + (void)status; + errno = ECHILD; + return -1; } int _unlink(char *name) { - (void)name; - errno = ENOENT; - return -1; + (void)name; + errno = ENOENT; + return -1; } int _times(struct tms *buf) { - (void)buf; - return -1; + (void)buf; + return -1; } int _stat(char *file, struct stat *st) { - (void)file; - st->st_mode = S_IFCHR; - return 0; + (void)file; + st->st_mode = S_IFCHR; + return 0; } int _link(char *old, char *new) { - (void)old; - (void)new; - errno = EMLINK; - return -1; + (void)old; + (void)new; + errno = EMLINK; + return -1; } int _fork(void) { - errno = EAGAIN; - return -1; + errno = EAGAIN; + return -1; } int _execve(char *name, char **argv, char **env) { - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; } diff --git a/SAMM/Core/Src/sysmem.c b/SAMM/Core/Src/sysmem.c index 246470ee8..00c397937 100644 --- a/SAMM/Core/Src/sysmem.c +++ b/SAMM/Core/Src/sysmem.c @@ -52,28 +52,26 @@ static uint8_t *__sbrk_heap_end = NULL; */ void *_sbrk(ptrdiff_t incr) { - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) - { - __sbrk_heap_end = &_end; - } + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) { + __sbrk_heap_end = &_end; + } - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) - { - errno = ENOMEM; - return (void *)-1; - } + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) { + errno = ENOMEM; + return (void *)-1; + } - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; - return (void *)prev_heap_end; + return (void *)prev_heap_end; } diff --git a/SAMM/Core/Src/system_stm32g4xx.c b/SAMM/Core/Src/system_stm32g4xx.c index 8d35a0aa0..14d0e1be1 100644 --- a/SAMM/Core/Src/system_stm32g4xx.c +++ b/SAMM/Core/Src/system_stm32g4xx.c @@ -1,109 +1,109 @@ /** - ****************************************************************************** - * @file system_stm32g4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32g4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * After each device reset the HSI (16 MHz) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to - * configure the system clock before to branch to main program. - * - * This file configures the system clock as follows: - *============================================================================= - *----------------------------------------------------------------------------- - * System Clock source | HSI - *----------------------------------------------------------------------------- - * SYSCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * HCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB1 Prescaler | 1 - *----------------------------------------------------------------------------- - * APB2 Prescaler | 1 - *----------------------------------------------------------------------------- - * PLL_M | 1 - *----------------------------------------------------------------------------- - * PLL_N | 16 - *----------------------------------------------------------------------------- - * PLL_P | 7 - *----------------------------------------------------------------------------- - * PLL_Q | 2 - *----------------------------------------------------------------------------- - * PLL_R | 2 - *----------------------------------------------------------------------------- - * Require 48MHz for RNG | Disabled - *----------------------------------------------------------------------------- - *============================================================================= - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file system_stm32g4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 16 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /** @addtogroup CMSIS - * @{ - */ + * @{ + */ /** @addtogroup stm32g4xx_system - * @{ - */ + * @{ + */ /** @addtogroup STM32G4xx_System_Private_Includes - * @{ - */ + * @{ + */ #include "stm32g4xx.h" -#if !defined (HSE_VALUE) - #define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ +#if !defined(HSE_VALUE) +#define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ -#if !defined (HSI_VALUE) - #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ +#if !defined(HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_TypesDefinitions - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Defines - * @{ - */ + * @{ + */ /************************* Miscellaneous Configuration ************************/ /* Note: Following vector table addresses must be defined in line with linker - configuration. */ + configuration. */ /*!< Uncomment the following line if you need to relocate the vector table anywhere in Flash or Sram, else the vector table is kept at the automatic remap of boot address selected */ @@ -114,172 +114,171 @@ in Sram else user remap will be done in Flash. */ /* #define VECT_TAB_SRAM */ #if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ +#define VECT_TAB_BASE_ADDRESS \ + SRAM_BASE /*!< Vector Table base address field. \ + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET \ + 0x00000000U /*!< Vector Table base offset field. \ + This value must be a multiple of 0x200. */ #else -#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -/******************************************************************************/ -/** - * @} - */ +#define VECT_TAB_BASE_ADDRESS \ + FLASH_BASE /*!< Vector Table base address field. \ + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET \ + 0x00000000U /*!< Vector Table base offset field. \ + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ + /******************************************************************************/ + /** + * @} + */ /** @addtogroup STM32G4xx_System_Private_Macros - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Variables - * @{ - */ - /* The SystemCoreClock variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = HSI_VALUE; - - const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; - const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + * @{ + */ +/* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. +*/ +uint32_t SystemCoreClock = HSI_VALUE; + +const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; +const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_FunctionPrototypes - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Functions - * @{ - */ + * @{ + */ /** - * @brief Setup the microcontroller system. - * @param None - * @retval None - */ + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ void SystemInit(void) { - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ - #endif +/* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2))); /* set CP10 and CP11 Full Access */ +#endif - /* Configure the Vector Table location add offset address ------------------*/ + /* Configure the Vector Table location add offset address ------------------*/ #if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ } /** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 24 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 24 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ void SystemCoreClockUpdate(void) { - uint32_t tmp, pllvco, pllr, pllsource, pllm; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case 0x04: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - - case 0x08: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - - case 0x0C: /* PLL used as system clock source */ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U ; - if (pllsource == 0x02UL) /* HSI used as PLL clock source */ - { - pllvco = (HSI_VALUE / pllm); - } - else /* HSE used as PLL clock source */ - { - pllvco = (HSE_VALUE / pllm); - } - pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); - pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; - SystemCoreClock = pllvco/pllr; - break; - - default: - break; - } - /* Compute HCLK clock frequency --------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; + uint32_t tmp, pllvco, pllr, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) { + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U; + if (pllsource == 0x02UL) /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } else /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; + SystemCoreClock = pllvco / pllr; + break; + + default: + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; } - /** - * @} - */ + * @} + */ /** - * @} - */ + * @} + */ /** - * @} - */ - - + * @} + */ From 83e55d0ea7a0578305678373b428757468fefde5 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 2 Apr 2026 20:41:24 -0700 Subject: [PATCH 005/158] Added new folders under SAMM --- SAMM/Common/Application/empty.txt | 0 SAMM/Common/Core/empty.txt | 0 SAMM/IMUandMAG/Application/empty.txt | 0 SAMM/IMUandMAG/Core/empty.txt | 0 SAMM/IMUandTOF/Application/empty.txt | 0 SAMM/IMUandTOF/Core/empty.txt | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 SAMM/Common/Application/empty.txt create mode 100644 SAMM/Common/Core/empty.txt create mode 100644 SAMM/IMUandMAG/Application/empty.txt create mode 100644 SAMM/IMUandMAG/Core/empty.txt create mode 100644 SAMM/IMUandTOF/Application/empty.txt create mode 100644 SAMM/IMUandTOF/Core/empty.txt diff --git a/SAMM/Common/Application/empty.txt b/SAMM/Common/Application/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/Common/Core/empty.txt b/SAMM/Common/Core/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/IMUandMAG/Application/empty.txt b/SAMM/IMUandMAG/Application/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/IMUandMAG/Core/empty.txt b/SAMM/IMUandMAG/Core/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/IMUandTOF/Application/empty.txt b/SAMM/IMUandTOF/Application/empty.txt new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/IMUandTOF/Core/empty.txt b/SAMM/IMUandTOF/Core/empty.txt new file mode 100644 index 000000000..e69de29bb From a87ae1580f1a7ef5354766a15155ed519d4b1716 Mon Sep 17 00:00:00 2001 From: Cuteturtle <93956770+TurtleTest2@users.noreply.github.com> Date: Thu, 2 Apr 2026 21:38:23 -0700 Subject: [PATCH 006/158] added and configured IMU --- .../Core/Extras/CircBuF/circularBuffer.c | 64 ++ .../Core/Extras/CircBuF/circularBuffer.h | 22 + .../Core/Extras/VL53L4ED/VL53L4ED_api.c | 699 ++++++++++++++++++ .../Core/Extras/VL53L4ED/VL53L4ED_api.h | 405 ++++++++++ .../Extras/VL53L4ED/VL53L4ED_calibration.c | 242 ++++++ .../Extras/VL53L4ED/VL53L4ED_calibration.h | 73 ++ .../IMUandTOF/Core/Extras/VL53L4ED/platform.c | 113 +++ .../IMUandTOF/Core/Extras/VL53L4ED/platform.h | 80 ++ SAMM/IMUandTOF/Core/Extras/extra.c | 58 ++ SAMM/IMUandTOF/Core/Extras/extra.h | 20 + SAMM/IMUandTOF/Core/Inc/adc.h | 52 ++ SAMM/IMUandTOF/Core/Inc/bmi323.h | 200 +++++ SAMM/IMUandTOF/Core/Inc/crc.h | 52 ++ SAMM/IMUandTOF/Core/Inc/dma.h | 52 ++ SAMM/IMUandTOF/Core/Inc/fdcan.h | 55 ++ SAMM/IMUandTOF/Core/Inc/gpio.h | 49 ++ SAMM/IMUandTOF/Core/Inc/i2c.h | 52 ++ SAMM/IMUandTOF/Core/Inc/main.h | 80 ++ SAMM/IMUandTOF/Core/Inc/spi.h | 51 ++ SAMM/IMUandTOF/Core/Inc/stm32_assert.h | 53 ++ SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h | 380 ++++++++++ SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h | 67 ++ SAMM/IMUandTOF/Core/Src/adc.c | 154 ++++ SAMM/IMUandTOF/Core/Src/bmi323.c | 283 +++++++ SAMM/IMUandTOF/Core/Src/crc.c | 90 +++ SAMM/IMUandTOF/Core/Src/dma.c | 59 ++ SAMM/IMUandTOF/Core/Src/fdcan.c | 223 ++++++ SAMM/IMUandTOF/Core/Src/gpio.c | 94 +++ SAMM/IMUandTOF/Core/Src/i2c.c | 135 ++++ SAMM/IMUandTOF/Core/Src/main.c | 325 ++++++++ SAMM/IMUandTOF/Core/Src/spi.c | 128 ++++ SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c | 86 +++ .../Core/Src/stm32g4xx_hal_timebase_tim.c | 126 ++++ SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c | 218 ++++++ SAMM/IMUandTOF/Core/Src/syscalls.c | 176 +++++ SAMM/IMUandTOF/Core/Src/sysmem.c | 79 ++ SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c | 285 +++++++ SAMM/IMUandTOF/Core/empty.txt | 0 38 files changed, 5380 insertions(+) create mode 100644 SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c create mode 100644 SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c create mode 100644 SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h create mode 100644 SAMM/IMUandTOF/Core/Extras/extra.c create mode 100644 SAMM/IMUandTOF/Core/Extras/extra.h create mode 100644 SAMM/IMUandTOF/Core/Inc/adc.h create mode 100644 SAMM/IMUandTOF/Core/Inc/bmi323.h create mode 100644 SAMM/IMUandTOF/Core/Inc/crc.h create mode 100644 SAMM/IMUandTOF/Core/Inc/dma.h create mode 100644 SAMM/IMUandTOF/Core/Inc/fdcan.h create mode 100644 SAMM/IMUandTOF/Core/Inc/gpio.h create mode 100644 SAMM/IMUandTOF/Core/Inc/i2c.h create mode 100644 SAMM/IMUandTOF/Core/Inc/main.h create mode 100644 SAMM/IMUandTOF/Core/Inc/spi.h create mode 100644 SAMM/IMUandTOF/Core/Inc/stm32_assert.h create mode 100644 SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h create mode 100644 SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h create mode 100644 SAMM/IMUandTOF/Core/Src/adc.c create mode 100644 SAMM/IMUandTOF/Core/Src/bmi323.c create mode 100644 SAMM/IMUandTOF/Core/Src/crc.c create mode 100644 SAMM/IMUandTOF/Core/Src/dma.c create mode 100644 SAMM/IMUandTOF/Core/Src/fdcan.c create mode 100644 SAMM/IMUandTOF/Core/Src/gpio.c create mode 100644 SAMM/IMUandTOF/Core/Src/i2c.c create mode 100644 SAMM/IMUandTOF/Core/Src/main.c create mode 100644 SAMM/IMUandTOF/Core/Src/spi.c create mode 100644 SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c create mode 100644 SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c create mode 100644 SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c create mode 100644 SAMM/IMUandTOF/Core/Src/syscalls.c create mode 100644 SAMM/IMUandTOF/Core/Src/sysmem.c create mode 100644 SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c delete mode 100644 SAMM/IMUandTOF/Core/empty.txt diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c new file mode 100644 index 000000000..e7f59de79 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c @@ -0,0 +1,64 @@ +#include "circularBuffer.h" +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) { + CircularBuffer *cb = malloc(sizeof(CircularBuffer)); + if (!cb) { + return NULL; + } + + cb->buffer = malloc(capacity * sizeof(void *)); + if (!cb->buffer) { + free(cb); + return NULL; + } + + for (size_t i = 0; i < capacity; i++) { + cb->buffer[i] = malloc(max_array_size); + if (!cb->buffer[i]) { + for (size_t j = 0; j < i; j++) { + free(cb->buffer[j]); + } + free(cb->buffer); + free(cb); + return NULL; + } + } + cb->capacity = capacity; + cb->max_arr_size = max_array_size; + cb->head = 0; + cb->tail = 0; + cb->size = 0; + return cb; +} + +void circularBufferDestroy(CircularBuffer *cb) { + if (!cb) return; + + for (size_t i = 0; i < cb->capacity; i++) { + free(cb->buffer[i]); + } + free(cb->buffer); + free(cb); +} + +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) { + if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { + return -1; // Buffer is full or array is too large + } + + // Copy the array into the buffer + memcpy(cb->buffer[cb->head], array, array_size); + cb->head = (cb->head + 1) % cb->capacity; + cb->size++; + return 0; +} + +void *circularBufferPop(CircularBuffer *cb) { + if (!cb || cb->size == 0) { + return NULL; // Buffer is empty + } + + void *array = cb->buffer[cb->tail]; + cb->tail = (cb->tail + 1) % cb->capacity; + cb->size--; + return array; +} diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h new file mode 100644 index 000000000..ae7ce9220 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h @@ -0,0 +1,22 @@ +#ifndef __circularBuffer_h__ +#define __circularBuffer_h__ + +#include +#include +#include +#include + +typedef struct { + void **buffer; // Array of void pointers + uint8_t capacity; // Maximum number of elements in the buffer + uint8_t head; // Index of the next element to write + uint8_t tail; // Index of the next element to read + uint8_t size; // Current number of elements in the buffer + uint8_t max_arr_size; // Maximum size of the array +} CircularBuffer; + +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); +void circularBufferDestroy(CircularBuffer *cb); +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size); +void *circularBufferPop(CircularBuffer *cb); +#endif \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c new file mode 100644 index 000000000..323148da4 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c @@ -0,0 +1,699 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_api.c + * @brief Functions implementation + */ + +#include +#include +#include "VL53L4ED_api.h" + +static const uint8_t VL53L4ED_DEFAULT_CONFIGURATION[] = { + #ifdef VL53L4ED_I2C_FAST_MODE_PLUS + 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ + #else + 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ + #endif + 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low + (bits 3:0 must be 0x1), use SetInterruptPolarity() */ + 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, + use CheckForDataReady() */ + 0x00, /* 0x32 : not user-modifiable */ + 0x02, /* 0x33 : not user-modifiable */ + 0x08, /* 0x34 : not user-modifiable */ + 0x00, /* 0x35 : not user-modifiable */ + 0x08, /* 0x36 : not user-modifiable */ + 0x10, /* 0x37 : not user-modifiable */ + 0x01, /* 0x38 : not user-modifiable */ + 0x01, /* 0x39 : not user-modifiable */ + 0x00, /* 0x3a : not user-modifiable */ + 0x00, /* 0x3b : not user-modifiable */ + 0x00, /* 0x3c : not user-modifiable */ + 0x00, /* 0x3d : not user-modifiable */ + 0xff, /* 0x3e : not user-modifiable */ + 0x00, /* 0x3f : not user-modifiable */ + 0x0F, /* 0x40 : not user-modifiable */ + 0x00, /* 0x41 : not user-modifiable */ + 0x00, /* 0x42 : not user-modifiable */ + 0x00, /* 0x43 : not user-modifiable */ + 0x00, /* 0x44 : not user-modifiable */ + 0x00, /* 0x45 : not user-modifiable */ + 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, + 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ + 0x0b, /* 0x47 : not user-modifiable */ + 0x00, /* 0x48 : not user-modifiable */ + 0x00, /* 0x49 : not user-modifiable */ + 0x02, /* 0x4a : not user-modifiable */ + 0x14, /* 0x4b : not user-modifiable */ + 0x21, /* 0x4c : not user-modifiable */ + 0x00, /* 0x4d : not user-modifiable */ + 0x00, /* 0x4e : not user-modifiable */ + 0x05, /* 0x4f : not user-modifiable */ + 0x00, /* 0x50 : not user-modifiable */ + 0x00, /* 0x51 : not user-modifiable */ + 0x00, /* 0x52 : not user-modifiable */ + 0x00, /* 0x53 : not user-modifiable */ + 0xc8, /* 0x54 : not user-modifiable */ + 0x00, /* 0x55 : not user-modifiable */ + 0x00, /* 0x56 : not user-modifiable */ + 0x38, /* 0x57 : not user-modifiable */ + 0xff, /* 0x58 : not user-modifiable */ + 0x01, /* 0x59 : not user-modifiable */ + 0x00, /* 0x5a : not user-modifiable */ + 0x08, /* 0x5b : not user-modifiable */ + 0x00, /* 0x5c : not user-modifiable */ + 0x00, /* 0x5d : not user-modifiable */ + 0x01, /* 0x5e : not user-modifiable */ + 0xcc, /* 0x5f : not user-modifiable */ + 0x07, /* 0x60 : not user-modifiable */ + 0x01, /* 0x61 : not user-modifiable */ + 0xf1, /* 0x62 : not user-modifiable */ + 0x05, /* 0x63 : not user-modifiable */ + 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), + use SetSigmaThreshold(), default value 90 mm */ + 0xa0, /* 0x65 : Sigma threshold LSB */ + 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), + use SetSignalThreshold() */ + 0x80, /* 0x67 : Min count Rate LSB */ + 0x08, /* 0x68 : not user-modifiable */ + 0x38, /* 0x69 : not user-modifiable */ + 0x00, /* 0x6a : not user-modifiable */ + 0x00, /* 0x6b : not user-modifiable */ + 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, + use SetIntermeasurementInMs() */ + 0x00, /* 0x6d : Intermeasurement period */ + 0x0f, /* 0x6e : Intermeasurement period */ + 0x89, /* 0x6f : Intermeasurement period LSB */ + 0x00, /* 0x70 : not user-modifiable */ + 0x00, /* 0x71 : not user-modifiable */ + 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x73 : distance threshold high LSB */ + 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x75 : distance threshold low LSB */ + 0x00, /* 0x76 : not user-modifiable */ + 0x01, /* 0x77 : not user-modifiable */ + 0x07, /* 0x78 : not user-modifiable */ + 0x05, /* 0x79 : not user-modifiable */ + 0x06, /* 0x7a : not user-modifiable */ + 0x06, /* 0x7b : not user-modifiable */ + 0x00, /* 0x7c : not user-modifiable */ + 0x00, /* 0x7d : not user-modifiable */ + 0x02, /* 0x7e : not user-modifiable */ + 0xc7, /* 0x7f : not user-modifiable */ + 0xff, /* 0x80 : not user-modifiable */ + 0x9B, /* 0x81 : not user-modifiable */ + 0x00, /* 0x82 : not user-modifiable */ + 0x00, /* 0x83 : not user-modifiable */ + 0x00, /* 0x84 : not user-modifiable */ + 0x01, /* 0x85 : not user-modifiable */ + 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ + 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), + If you want an automatic start after VL53L4ED_init() call, + put 0x40 in location 0x87 */ +}; + +VL53L4ED_Error VL53L4ED_GetSWVersion( + VL53L4ED_Version_t *p_Version) +{ + VL53L4ED_Error Status = VL53L4ED_ERROR_NONE; + + p_Version->major = VL53L4ED_IMPLEMENTATION_VER_MAJOR; + p_Version->minor = VL53L4ED_IMPLEMENTATION_VER_MINOR; + p_Version->build = VL53L4ED_IMPLEMENTATION_VER_BUILD; + p_Version->revision = VL53L4ED_IMPLEMENTATION_VER_REVISION; + return Status; +} + +VL53L4ED_Error VL53L4ED_SetI2CAddress( + Dev_t dev, + uint8_t new_address) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, + (uint8_t)(new_address >> (uint8_t)1)); + return status; +} + +VL53L4ED_Error VL53L4ED_GetSensorId( + Dev_t dev, + uint16_t *p_id) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_IDENTIFICATION__MODEL_ID, p_id); + return status; +} + +VL53L4ED_Error VL53L4ED_SensorInit( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t Addr, tmp; + uint8_t continue_loop = 1; + uint16_t i = 0; + + do{ + status |= VL53L4ED_RdByte(dev, + VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); + + if(tmp == (uint8_t)0x3) /* Sensor booted */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for boot */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + /* Load default configuration */ + for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) + { + status |= VL53L4ED_WrByte(dev, Addr, + VL53L4ED_DEFAULT_CONFIGURATION[ + Addr - (uint8_t)0x2D]); + } + + /* Start VHV */ + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, (uint8_t)0x40); + i = (uint8_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_ClearInterrupt(dev); + status |= VL53L4ED_StopRanging(dev); + status |= VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, + (uint8_t)0x09); + status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0); + status |= VL53L4ED_WrWord(dev, 0x0024, 0x500); + + status |= VL53L4ED_SetRangeTiming(dev, 100, 0); + + return status; +} + +VL53L4ED_Error VL53L4ED_ClearInterrupt( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT_CLEAR, 0x01); + return status; +} + +VL53L4ED_Error VL53L4ED_StartRanging( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint32_t tmp; + + status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); + + /* Sensor runs in continuous mode */ + if(tmp == (uint32_t)0) + { + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x21); + } + /* Sensor runs in autonomous mode */ + else + { + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x40); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_StopRanging( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x80); + return status; +} + +VL53L4ED_Error VL53L4ED_CheckForDataReady( + Dev_t dev, + uint8_t *p_is_data_ready) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t temp; + uint8_t int_pol; + + status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO_HV_MUX__CTRL, &temp); + temp = temp & (uint8_t)0x10; + temp = temp >> 4; + + if (temp == (uint8_t)1) + { + int_pol = (uint8_t)0; + } + else + { + int_pol = (uint8_t)1; + } + + status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO__TIO_HV_STATUS, &temp); + + if ((temp & (uint8_t)1) == int_pol) + { + *p_is_data_ready = (uint8_t)1; + } + else + { + *p_is_data_ready = (uint8_t)0; + } + + return status; +} + +VL53L4ED_Error VL53L4ED_SetRangeTiming( + Dev_t dev, + uint32_t timing_budget_ms, + uint32_t inter_measurement_ms) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t clock_pll, osc_frequency, ms_byte; + uint32_t macro_period_us = 0, timing_budget_us = 0, ls_byte, tmp; + float_t inter_measurement_factor = (float_t)1.055; + + status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); + if(osc_frequency != (uint16_t)0) + { + timing_budget_us = timing_budget_ms*(uint32_t)1000; + macro_period_us = (uint32_t)((uint32_t)2304 * + ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; + } + else + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + + /* Timing budget check validity */ + if ((timing_budget_ms < (uint32_t)10) + || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) + { + status |= VL53L4ED_ERROR_INVALID_ARGUMENT; + } + /* Sensor runs in continuous mode */ + else if(inter_measurement_ms == (uint32_t)0) + { + status |= VL53L4ED_WrDWord(dev,VL53L4ED_INTERMEASUREMENT_MS, 0); + timing_budget_us -= (uint32_t)2500; + } + /* Sensor runs in autonomous low power mode */ + else if(inter_measurement_ms > timing_budget_ms) + { + status |= VL53L4ED_RdWord(dev, + VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + clock_pll = clock_pll & (uint16_t)0x3FF; + inter_measurement_factor = inter_measurement_factor + * (float_t)inter_measurement_ms + * (float_t)clock_pll; + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, + (uint32_t)inter_measurement_factor); + + timing_budget_us -= (uint32_t)4300; + timing_budget_us /= (uint32_t)2; + + } + /* Invalid case */ + else + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + + if(status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) + { + ms_byte = 0; + timing_budget_us = timing_budget_us << 12; + tmp = macro_period_us*(uint32_t)16; + ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) + - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + + (uint16_t) (ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A,ms_byte); + + ms_byte = 0; + tmp = macro_period_us*(uint32_t)12; + ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) + - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + + (uint16_t) (ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B,ms_byte); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_GetRangeTiming( + Dev_t dev, + uint32_t *p_timing_budget_ms, + uint32_t *p_inter_measurement_ms) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t osc_frequency = 1, range_config_macrop_high, clock_pll = 1; + uint32_t tmp, ls_byte, ms_byte, macro_period_us; + float_t clock_pll_factor = (float_t)1.065; + + /* Get InterMeasurement */ + status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); + status |= VL53L4ED_RdWord(dev, + VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + clock_pll = clock_pll & (uint16_t)0x3FF; + clock_pll_factor = clock_pll_factor * (float_t)clock_pll; + clock_pll = (uint16_t)clock_pll_factor; + *p_inter_measurement_ms = (uint16_t)(tmp/(uint32_t)clock_pll); + + /* Get TimingBudget */ + status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, + &range_config_macrop_high); + + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 + / (uint32_t)osc_frequency)) >> 6; + ls_byte = (range_config_macrop_high & (uint32_t)0x00FF) << 4; + ms_byte = (range_config_macrop_high & (uint32_t)0xFF00) >> 8; + ms_byte = (uint32_t)0x04 - (ms_byte - (uint32_t)1) - (uint32_t)1; + + macro_period_us = macro_period_us * (uint32_t)16; + *p_timing_budget_ms = (((ls_byte + (uint32_t)1)*(macro_period_us>> 6)) + - ((macro_period_us>> 6)>>1)) >> 12; + + if(ms_byte < (uint8_t)12) + { + *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms + >> (uint8_t)ms_byte); + } + + /* Mode continuous */ + if(tmp == (uint32_t)0) + { + *p_timing_budget_ms += (uint32_t)2500; + } + /* Mode autonomous */ + else + { + *p_timing_budget_ms *= (uint32_t)2; + *p_timing_budget_ms += (uint32_t)4300; + } + + *p_timing_budget_ms = *p_timing_budget_ms/(uint32_t)1000; + + return status; +} + +VL53L4ED_Error VL53L4ED_GetResult( + Dev_t dev, + VL53L4ED_ResultsData_t *p_result) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp_16; + uint8_t temp_8; + uint8_t status_rtn[24] = { 255, 255, 255, 5, 2, 4, 1, 7, 3, + 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, + 255, 255, 11, 12 }; + + status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, + &temp_8); + temp_8 = temp_8 & (uint8_t)0x1F; + if (temp_8 < (uint8_t)24) + { + temp_8 = status_rtn[temp_8]; + } + p_result->range_status = temp_8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, + &temp_16); + p_result->number_of_spad = temp_16 / (uint16_t) 256; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, + &temp_16); + p_result->signal_rate_kcps = temp_16 * (uint16_t) 8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, + &temp_16); + p_result->ambient_rate_kcps = temp_16 * (uint16_t) 8; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, + &temp_16); + p_result->sigma_mm = temp_16 / (uint16_t) 4; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, + &temp_16); + p_result->distance_mm = temp_16; + + p_result->signal_per_spad_kcps = p_result->signal_rate_kcps + /p_result->number_of_spad; + p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps + /p_result->number_of_spad; + + return status; +} + +VL53L4ED_Error VL53L4ED_SetOffset( + Dev_t dev, + int16_t OffsetValueInMm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp; + + temp = (uint16_t)((uint16_t)OffsetValueInMm*(uint16_t)4); + + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, temp); + status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, (uint8_t)0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, (uint8_t)0x0); + return status; +} + +VL53L4ED_Error VL53L4ED_GetOffset( + Dev_t dev, + int16_t *p_offset) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t temp; + + status |= VL53L4ED_RdWord(dev,VL53L4ED_RANGE_OFFSET_MM, &temp); + + temp = temp<<3; + temp = temp>>5; + *p_offset = (int16_t)(temp); + + if(*p_offset > 1024) + { + *p_offset = *p_offset - 2048; + } + + return status; +} + +VL53L4ED_Error VL53L4ED_SetXtalk( + Dev_t dev, + uint16_t XtalkValueKcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, + (XtalkValueKcps<<9)); + + return status; +} + +VL53L4ED_Error VL53L4ED_GetXtalk( + Dev_t dev, + uint16_t *p_xtalk_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + float_t tmp_xtalk; + + status |= VL53L4ED_RdWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); + + tmp_xtalk = (float_t)*p_xtalk_kcps / (float_t)512.0; + *p_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); + + return status; +} + +VL53L4ED_Error VL53L4ED_SetDetectionThresholds( + Dev_t dev, + uint16_t distance_low_mm, + uint16_t distance_high_mm, + uint8_t window) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT, window); + status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_HIGH, distance_high_mm); + status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_LOW, distance_low_mm); + return status; +} + +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, + uint16_t *p_distance_low_mm, + uint16_t *p_distance_high_mm, + uint8_t *p_window) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH,p_distance_high_mm); + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_LOW, p_distance_low_mm); + status |= VL53L4ED_RdByte(dev, VL53L4ED_SYSTEM__INTERRUPT, p_window); + *p_window = (*p_window & (uint8_t)0x7); + + return status; +} + +VL53L4ED_Error VL53L4ED_SetSignalThreshold( + Dev_t dev, + uint16_t signal_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status |= VL53L4ED_WrWord(dev, + VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS,signal_kcps>>3); + return status; +} + +VL53L4ED_Error VL53L4ED_GetSignalThreshold( + Dev_t dev, + uint16_t *p_signal_kcps) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint16_t tmp = 0; + + status |= VL53L4ED_RdWord(dev, + VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); + *p_signal_kcps = tmp <<3; + + return status; +} + +VL53L4ED_Error VL53L4ED_SetSigmaThreshold( + Dev_t dev, + uint16_t sigma_mm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + if(sigma_mm>(uint16_t)((uint16_t)0xFFFF>>2)) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + status |= VL53L4ED_WrWord(dev, + VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm<<2); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_GetSigmaThreshold( + Dev_t dev, + uint16_t *p_sigma_mm) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + + status += VL53L4ED_RdWord(dev, + VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); + *p_sigma_mm = *p_sigma_mm >> 2; + + return status; +} + +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate( + Dev_t dev) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t tmp = 0, continue_loop = 1; + uint16_t i = 0; + + status |= VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); + status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0x92); + status |= VL53L4ED_StartRanging(dev); + + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } + else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_ClearInterrupt(dev); + status |= VL53L4ED_StopRanging(dev); + + status += VL53L4ED_WrByte(dev, + VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); + status += VL53L4ED_WrByte(dev, 0x0B, 0); + return status; +} diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h new file mode 100644 index 000000000..df55ef3d0 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h @@ -0,0 +1,405 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#ifndef VL53L4ED_API_H_ +#define VL53L4ED_API_H_ + +#include "platform.h" + +/** + * @brief Driver version + */ + +#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 +#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 + +/** + * @brief Driver error type + */ + +typedef uint8_t VL53L4ED_Error; + +#define VL53L4ED_ERROR_NONE ((uint8_t)0U) +#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) +#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) +#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) + + +/** + * @brief Inner Macro for API. Not for user, only for development. + */ + +#define VL53L4ED_SOFT_RESET ((uint16_t)0x0000)) +#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) +#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) +#define VL53L4ED_XTALK_PLANE_OFFSET_KCPS ((uint16_t)0x0016) +#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) +#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) +#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) +#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) +#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) +#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) +#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) +#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) +#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) +#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) +#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) +#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) +#define VL53L4ED_INTERMEASUREMENT_MS ((uint16_t)0x006C) +#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) +#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) +#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) +#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) +#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) +#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) +#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) +#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) +#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) +#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) + + +#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) +#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) +#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) + +/** + * @brief defines Software Version + */ + +typedef struct { + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ + uint32_t revision; /*!< revision number */ +} VL53L4ED_Version_t; + +/** + * @brief Packed reading results type + */ + +typedef struct { + + /* Status of measurements. If the status is equal to 0, the data are valid*/ + uint8_t range_status; + /* Measured distance in millimeters */ + uint16_t distance_mm; + /* Ambient noise in kcps */ + uint16_t ambient_rate_kcps; + /* Ambient noise in kcps/SPAD */ + uint16_t ambient_per_spad_kcps; + /* Measured signal of the target in kcps */ + uint16_t signal_rate_kcps; + /* Measured signal of the target in kcps/SPAD */ + uint16_t signal_per_spad_kcps; + /* Number of SPADs enabled */ + uint16_t number_of_spad; + /* Estimated measurements std deviation in mm */ + uint16_t sigma_mm; +} VL53L4ED_ResultsData_t; + +/** + * @brief This function programs the software driver version. + * @param (VL53L4ED_Version_t) pVersion : Pointer of structure, containing the + * software version. + * @return (VL53L4ED_ERROR) status : 0 if SW version is OK. + */ + +VL53L4ED_Error VL53L4ED_GetSWVersion( + VL53L4ED_Version_t *pVersion); + + +/** + * @brief This function sets a new I2C address to a sensor. It can be used for + * example when multiple sensors share the same I2C bus. + * @param (Dev_t) dev : Device instance to update. + * @param (uint8_t) new_address : New I2C address. + * @return (VL53L4ED_ERROR) status : 0 if I2C address has been correctly + * programmed. + */ + +VL53L4ED_Error VL53L4ED_SetI2CAddress( + Dev_t dev, + uint8_t new_address); + +/** + * @brief This function is used to get the sensor id of VL53L4ED. The sensor id + * should be 0xEBAA. + * @param (Dev_t) dev : Device instance. + * @param (uint16_t) *p_id : Sensor id. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetSensorId( + Dev_t dev, + uint16_t *p_id); + +/** + * @brief This function is used to initialize the sensor. + * @param (Dev_t) dev : Device instance to initialize. + * @return (VL53L4ED_ERROR) status : 0 if init is OK. + */ + +VL53L4ED_Error VL53L4ED_SensorInit( + Dev_t dev); + +/** + * @brief This function clears the interrupt. It needs to be called after a + * ranging data reading to arm the interrupt for the next data ready event. + * @param (Dev_t) dev : Device instance. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_ClearInterrupt( + Dev_t dev); + +/** + * @brief This function starts a ranging session. The ranging operation is + * continuous. The clear interrupt has to be done after each get data to allow + * the interrupt to raise when the next data is ready. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_StartRanging( + Dev_t dev); + +/** + * @brief This function stops the ranging in progress. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_StopRanging( + Dev_t dev); + +/** + * @brief This function check if a new data is available by polling a dedicated + * register. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint8_t) *p_is_data_ready : Pointer containing a flag to know if a + * data is ready : 0 = no data ready, 1 = data ready. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_CheckForDataReady( + Dev_t dev, + uint8_t *p_is_data_ready); + +/** + * @brief This function sets new range timing. Timing are composed of + * TimingBudget and InterMeasurement. TimingBudget represents the timing during + * VCSEL enabled, and InterMeasurement the time between two measurements. + * The sensor can have different ranging mode depending of the configuration, + * please refer to the user manual for more information. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint32_t) timing_budget_ms : New timing budget in ms. Value can be + * between 10ms and 200ms. Default is 50ms. + * @param (uint32_t) inter_measurement_ms : New inter-measurement in ms. If the + * value is equal to 0, the ranging period is defined by the timing budget. + * Otherwise, inter-measurement must be > timing budget. When all the timing + * budget is consumed, the device goes in low power mode until inter-measurement + * is done. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetRangeTiming( + Dev_t dev, + uint32_t timing_budget_ms, + uint32_t inter_measurement_ms); + +/** + * @brief This function gets the current range timing. Timing are composed of + * TimingBudget and InterMeasurement. TimingBudget represents the timing during + * VCSEL enabled, and InterMeasurement the time between two measurements. + * The sensor can have different ranging mode depending of the configuration, + * please refer to the user manual for more information. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint32_t) *p_timing_budget_ms : Pointer containing the current + * timing budget in ms. + * @param (uint32_t) *p_inter_measurement_ms : Pointer containing the current + * inter-measurement in ms. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetRangeTiming( + Dev_t dev, + uint32_t *p_timing_budget_ms, + uint32_t *p_inter_measurement_ms); + +/** + * @brief This function gets the results reported by the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (VL53L4ED_ResultsData_t) *pResult : Pointer of structure, filled with the + * ranging results. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *pResult); + +/** + * @brief This function sets a new offset correction in mm. Offset corresponds + * to the difference in millimeters between real distance and measured distance. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum + * value is -1024mm and maximum is 1023mm. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm); + +/** + * @brief This function gets the current offset correction in mm. Offset + * corresponds to the difference in millimeters between real distance and + * measured distance. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum + * value is -1024mm and maximum is 1023mm. + * @return (uint8_t) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *Offset); + +/** + * @brief This function sets a new Xtalk value in kcps. Xtalk represents the + * correction to apply to the sensor when a protective coverglass is placed + * at the top of the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) XtalkValueKcps : New xtalk value in kcps. The default + * value is 0 kcps (no coverglass). Minimum is 0 kcps , and maximum is 128 + * kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps); + +/** + * @brief This function gets the current Xtalk value in kcps. Xtalk represents + * the correction to apply to the sensor when a protective coverglass is placed + * at the top of the sensor. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) p_xtalk_kcps : Pointer of current xtalk value in kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps); + +/** + * @brief This function sets new detection thresholds. The detection + * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only + * when a condition on distance is reach. Example: + * VL53L4ED_SetDistanceThreshold(dev,100,300,0): Below 100 mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,1): Above 300 mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,2): Below 100mm or above 300mm + * VL53L4ED_SetDistanceThreshold(dev,100,300,3): Above 100mm or below 300mm + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) distance_low_mm : Low distance threshold in millimeters. + * @param (uint16_t) distance_high_mm : High distance threshold in millimeters. + * @param (uint8_t) window : Interrupt windows (0=below low threshold; + * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, + uint16_t distance_low_mm, + uint16_t distance_high_mm, + uint8_t window); + + +/** + * @brief This function gets the current detection thresholds. The detection + * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only + * when a condition on distance is reach. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_distance_low_mm : Pointer of low distance threshold in + * millimeters. + * @param (uint16_t) *p_distance_high_mm : Pointer of high distance threshold in + * millimeters. + * @param (uint8_t) *p_window : Interrupt windows (0=below low threshold; + * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, + uint16_t *p_distance_low_mm, + uint16_t *p_distance_high_mm, + uint8_t *p_window); + +/** + * @brief This function sets a new signal threshold in kcps. If a + * target has a lower signal as the programmed value, the result status in + * structure 'VL53L4ED_ResultsData_t' will be equal to 2. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) signal_kcps : New signal threshold in kcps. The default + * value is 1024 kcps. Minimum is 0 kcps (no threshold), and maximum is 16384 + * kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps); + +/** + * @brief This function returns the current signal threshold in kcps. If a + * target has a lower signal as the programmed value, the result status in + * structure 'VL53L4ED_ResultsData_t' will be equal to 2. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_signal_kcps : Pointer of signal threshold in kcps. + * @return (VL53L4ED_ERROR) status : 0 if OK. + */ + +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, + uint16_t *p_signal_kcps); + +/** + * @brief This function programs a new sigma threshold. The sigma corresponds to + * the standard deviation of the returned pulse. If the computed sigma is above + * the programmed value, the result status in structure 'VL53L4ED_ResultsData_t' + * will be equal to 1. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) sigma_mm : New sigma threshold in mm. The default value is + * 15mm. Minimum is 0mm (not threshold), and maximum is 16383mm. + * @return (VL53L4ED_ERROR) status : 0 if programming is or 255 if value is too + * high. + */ + +VL53L4ED_Error VL53L4ED_SetSigmaThreshold( + Dev_t dev, + uint16_t sigma_mm); + +/** + * @brief This function gets the current sigma threshold. The sigma corresponds + * to the standard deviation of the returned pulse. If the computed sigma is + * above the programmed value, the result status in structure + * 'VL53L4ED_ResultsData_t' will be equal to 1. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (uint16_t) *p_sigma_mm : Current sigma threshold in mm. + * @return (VL53L4ED_ERROR) status : 0 if programming is OK. + */ + +VL53L4ED_Error VL53L4ED_GetSigmaThreshold( + Dev_t dev, + uint16_t *p_sigma_mm); + +/** + * @brief This function can be called when the temperature might have changed by + * more than 8 degrees Celsius. The function can only be used if the sensor is + * not ranging, otherwise, the ranging needs to be stopped using function + * 'VL53L4ED_StopRanging()'. After calling this function, the ranging can + * restart normally. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @return (VL53L4ED_ERROR) status : 0 if update is OK. + */ + +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev); + +#endif //VL53L4ED_API_H_ diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c new file mode 100644 index 000000000..e3d95c223 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c @@ -0,0 +1,242 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_calibration.c + * @brief Calibration functions implementation + */ + +#include +#include "VL53L4ED_api.h" +#include "VL53L4ED_calibration.h" + +VL53L4ED_Error VL53L4ED_CalibrateOffset( + Dev_t dev, + int16_t TargetDistInMm, + int16_t *p_measured_offset_mm, + int16_t nb_samples) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t i, tmp, continue_loop; + uint16_t j, tmpOff; + int16_t AvgDistance = 0; + VL53L4ED_ResultsData_t results; + + if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) + || ((TargetDistInMm < (int16_t)10) + || (TargetDistInMm > (int16_t)1000))) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, 0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, 0x0); + status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, 0x0); + + /* Device heat loop (10 samples) */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)10; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + } + status |= VL53L4ED_StopRanging(dev); + + /* Device ranging */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)nb_samples; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + AvgDistance += (int16_t)results.distance_mm; + } + + status |= VL53L4ED_StopRanging(dev); + AvgDistance = AvgDistance / nb_samples; + *p_measured_offset_mm = (int16_t)TargetDistInMm - AvgDistance; + tmpOff = (uint16_t) *p_measured_offset_mm * (uint16_t)4; + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, tmpOff); + } + + return status; +} + +VL53L4ED_Error VL53L4ED_CalibrateXtalk( + Dev_t dev, + int16_t TargetDistInMm, + uint16_t *p_measured_xtalk_kcps, + int16_t nb_samples) +{ + VL53L4ED_Error status = VL53L4ED_ERROR_NONE; + uint8_t i, tmp, continue_loop; + float_t AverageSignal = (float_t)0.0; + float_t AvgDistance = (float_t)0.0; + float_t AverageSpadNb = (float_t)0.0; + float_t TargetDistance = (float_t)TargetDistInMm; + float_t tmp_xtalk, CounterNbSamples = (float_t)0.0; + VL53L4ED_ResultsData_t results; + + uint16_t calXtalk, j; + + *p_measured_xtalk_kcps = 0; + if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) + || ((TargetDistInMm < (int16_t)10) + || (TargetDistInMm > (int16_t)5000))) + { + status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; + } + else + { + /* Disable Xtalk compensation */ + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); + + /* Device heat loop (10 samples) */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)10; i++) { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + } + status |= VL53L4ED_StopRanging(dev); + + /* Device ranging loop */ + status |= VL53L4ED_StartRanging(dev); + for (i = 0; i < (uint8_t)nb_samples; i++) + { + tmp = (uint8_t)0; + j = (uint16_t)0; + continue_loop = (uint8_t)1; + do{ + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if(tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } + else if(j < (uint16_t)5000) /* Wait for answer*/ + { + j++; + } + else /* Timeout 5000ms reached */ + { + continue_loop = (uint8_t)0; + status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + }while(continue_loop == (uint8_t)1); + + status |= VL53L4ED_GetResult(dev, &results); + status |= VL53L4ED_ClearInterrupt(dev); + + /* Discard invalid measurements and first frame */ + if (results.range_status == (uint8_t)0 + && i > (uint8_t)0) + { + AvgDistance += (float_t)results.distance_mm; + AverageSpadNb += (float_t)results.number_of_spad; + AverageSignal += (float_t)results.signal_rate_kcps; + CounterNbSamples++; + } + } + status |= VL53L4ED_StopRanging(dev); + + if (CounterNbSamples == 0) + { + status = VL53L4ED_ERROR_XTALK_FAILED; + } + else + { + AvgDistance /= CounterNbSamples; + AverageSpadNb /= CounterNbSamples; + AverageSignal /= CounterNbSamples; + + tmp_xtalk = (float_t)1.0 - (AvgDistance/TargetDistance); + tmp_xtalk *= (AverageSignal/AverageSpadNb); + + /* 127kcps is the max Xtalk value (65536/512) */ + if(tmp_xtalk > (uint16_t)127) + { + status = VL53L4ED_ERROR_XTALK_FAILED; + } + else + { + *p_measured_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); + + /* Send data to firmware */ + calXtalk = (uint16_t)(tmp_xtalk * (float_t)512.0); + status |= VL53L4ED_WrWord(dev, + VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); + } + } + } + + return status; +} diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h new file mode 100644 index 000000000..c953d0239 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h @@ -0,0 +1,73 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +/** + * @file vl53l4ed_calibration.h + * @brief Calibration Functions definition + */ + +#ifndef VL53L4ED_CALIBRATION_H_ +#define VL53L4ED_CALIBRATION_H_ + +#include "platform.h" + +/** + * @brief This function can be used to perform an offset calibration. Offset + * corresponds to the difference in millimeters between real distance and + * measured distance. ST recommend to perform offset at 100m, on a grey17% + * reflective target, but any other distance and reflectance can be used. + * The function returns the offset value found and programs the offset + * compensation into the device. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param (int16_t) TargetDistInMm : Real distance between the sensor and the + * target in millimeters. ST recommend 100mm. Min distance is 10mm and max is + * 1000mm. + * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher + * number of samples increases the accuracy, but it also takes more time. ST + * recommend to use at least 10 samples. + * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g + * invalid nb of samples). + */ + +VL53L4ED_Error VL53L4ED_CalibrateOffset( + Dev_t dev, + int16_t TargetDistInMm, + int16_t *p_measured_offset_mm, + int16_t nb_samples); + + +/** + * @brief This function can be used to perform a Xtalk calibration. Xtalk + * represents the correction to apply to the sensor when a protective coverglass + * is placed at the top of the sensor. The distance for calibration depends of + * the coverglass, it needs to be characterized. Please refer to the User Manual + * for more information. + * The function returns the Xtalk value found and programs the Xtalk + * compensation into the device. + * @param (Dev_t) dev : instance of selected VL53L4ED sensor. + * @param uint16_t) TargetDistInMm : Real distance between the sensor and the + * target in millimeters. This distance needs to be characterized, as described + * into the User Manual. + * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher + * number of samples increases the accuracy, but it also takes more time. ST + * recommend to use at least 10 samples. + * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g + * invalid nb of samples). + */ + +VL53L4ED_Error VL53L4ED_CalibrateXtalk( + Dev_t dev, + int16_t TargetDistInMm, + uint16_t *p_measured_xtalk_kcps, + int16_t nb_samples); + +#endif //VL53L4ED_CALIBRATION_H_ diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c new file mode 100644 index 000000000..ba3d6f1a6 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c @@ -0,0 +1,113 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#include "platform.h" +#include "main.h" +#include "i2c.h" + +extern I2C_HandleTypeDef hi2c1; + + +/* +Im legit just using the example stm provides but instead of filling everything out im only copying the platform.c implemintation +for the vl53l4ed sensor. + + +*/ + +uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[4]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 4, 100); + *value = ((data_read[0] << 24) | (data_read[1]<<16) | + (data_read[2]<<8)| (data_read[3])); + return status; +} + +uint8_t VL53L4ED_RdWord(uint16_t dev, uint16_t RegisterAdress, uint16_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[2]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 2, 100); + *value = (data_read[0] << 8) | (data_read[1]); + return status; +} + +uint8_t VL53L4ED_RdByte(uint16_t dev, uint16_t RegisterAdress, uint8_t *value) +{ + uint8_t status = 0; + uint8_t data_write[2]; + uint8_t data_read[1]; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); + status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 1, 100); + *value = data_read[0]; + return status; +} + +uint8_t VL53L4ED_WrByte(uint16_t dev, uint16_t RegisterAdress, uint8_t value) +{ + uint8_t data_write[3]; + uint8_t status = 0; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 3, 100); + return status; +} + +uint8_t VL53L4ED_WrWord(uint16_t dev, uint16_t RegisterAdress, uint16_t value) +{ + uint8_t data_write[4]; + uint8_t status = 0; + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = (value >> 8) & 0xFF; + data_write[3] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 4, 100); + return status; +} + +uint8_t VL53L4ED_WrDWord(uint16_t dev, uint16_t RegisterAdress, uint32_t value) +{ + uint8_t data_write[6]; + uint8_t status = 0; + + data_write[0] = (RegisterAdress >> 8) & 0xFF; + data_write[1] = RegisterAdress & 0xFF; + data_write[2] = (value >> 24) & 0xFF; + data_write[3] = (value >> 16) & 0xFF; + data_write[4] = (value >> 8) & 0xFF; + data_write[5] = value & 0xFF; + status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 6, 100); + return status; +} + +uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t time_ms) +{ + HAL_Delay(time_ms); + return 0; +} diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h new file mode 100644 index 000000000..ee27e91f2 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h @@ -0,0 +1,80 @@ +/** + * + * 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. + * + ****************************************************************************** + */ + +#ifndef _PLATFORM_H_ +#define _PLATFORM_H_ +#pragma once + +#include +#include + +/** +* VL53L4ED device instance. +*/ + +typedef uint16_t Dev_t; + +/** + * @brief Error instance. + */ +typedef uint8_t VL53L4ED_Error; + +/** + * @brief If the macro below is defined, the device will be programmed to run + * with I2C Fast Mode Plus (up to 1MHz). Otherwise, default max value is 400kHz. + */ + +//#define VL53L4ED_I2C_FAST_MODE_PLUS + + +/** + * @brief Read 32 bits through I2C. + */ + +uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t registerAddr, uint32_t *value); +/** + * @brief Read 16 bits through I2C. + */ + +uint8_t VL53L4ED_RdWord(Dev_t dev, uint16_t registerAddr, uint16_t *value); + +/** + * @brief Read 8 bits through I2C. + */ + +uint8_t VL53L4ED_RdByte(Dev_t dev, uint16_t registerAddr, uint8_t *value); + +/** + * @brief Write 8 bits through I2C. + */ + +uint8_t VL53L4ED_WrByte(Dev_t dev, uint16_t registerAddr, uint8_t value); + +/** + * @brief Write 16 bits through I2C. + */ + +uint8_t VL53L4ED_WrWord(Dev_t dev, uint16_t RegisterAdress, uint16_t value); + +/** + * @brief Write 32 bits through I2C. + */ + +uint8_t VL53L4ED_WrDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t value); + +/** + * @brief Wait during N milliseconds. + */ + +uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t TimeMs); + +#endif // _PLATFORM_H_ \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Extras/extra.c b/SAMM/IMUandTOF/Core/Extras/extra.c new file mode 100644 index 000000000..3611c8904 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/extra.c @@ -0,0 +1,58 @@ +#include "extra.h" +#include "main.h" +#include "i2c.h" +#include + + +void MLX90640_I2CInit(void) +{ + MX_I2C2_Init(); + return; +} + +int MLX90640_I2CGeneralReset(void) +{ + uint8_t data = 0x06; + return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data , 1, 1000); +} + + +int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +{ + //HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); + //HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); + /* + HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t *pData, uint16_t Size) + */ + //return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 10000); +} + +int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) +{ + // union + // { + // uint8_t bytes[2]; + // uint16_t data; + // }extra = {.data = data}; + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); + //return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); +} + +void MLX90640_I2CFreqSet(int freq) +{ + return; +} + +uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +{ + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 500); +} + +uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data) +{ + + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *) &data, 2, 500); +} + diff --git a/SAMM/IMUandTOF/Core/Extras/extra.h b/SAMM/IMUandTOF/Core/Extras/extra.h new file mode 100644 index 000000000..2b820f432 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Extras/extra.h @@ -0,0 +1,20 @@ +#ifndef __EXTRA_H__ +#define __EXTRA_H__ +#include +/* +This is for some xtra fucntions that would be needed later on + + +*/ + +void MLX90640_I2CInit(void); +int MLX90640_I2CGeneralReset(void); +int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +int MLX90640_I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +void MLX90640_I2CFreqSet(int freq); + + +uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); + +#endif /* __EXTRA_H__ */ \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Inc/adc.h b/SAMM/IMUandTOF/Core/Inc/adc.h new file mode 100644 index 000000000..5692f3846 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/adc.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.h + * @brief This file contains all the function prototypes for + * the adc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern ADC_HandleTypeDef hadc1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_ADC1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ADC_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/bmi323.h b/SAMM/IMUandTOF/Core/Inc/bmi323.h new file mode 100644 index 000000000..f434cb8dd --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/bmi323.h @@ -0,0 +1,200 @@ +#ifndef BMI323_H +#define BMI323_H + +//includes + + +#include "main.h" +#include "spi.h" +#include "stm32g474xx.h" + +//BMI323 register defines + +#define BMI323_CHIP_ID 0x00 +#define BMI323_ERR_REG 0x01 +#define BMI323_STATUS 0x02 +#define BMI323_ACC_X 0x03 +#define BMI323_ACC_Y 0x04 +#define BMI323_ACC_Z 0x05 +#define BMI323_GYR_X 0x06 +#define BMI323_GYR_Y 0x07 +#define BMI323_GYR_Z 0x08 +#define BMI323_TEMP_DATA 0x09 + +#define BMI323_FEATURE_IO0 0x10 +#define BMI323_FEATURE_I01 0x11 +#define BMI323_FEATURE_IO2 0x12 +#define BMI323_FEATURE_IO3 0x13 +#define BMI323_FEATURE_IO_STATUS 0x14 + +#define BMI323_ACC_CONF 0x20 +#define BMI323_GYR_CONF 0x21 +#define BMI323_ALT_ACC_CONF 0x28 +#define BMI323_ALT_GYR_CONF 0x29 +#define BMI323_ALT_CONF 0x2A + +#define BMI323_FIFO_CONF 0x36 +#define BMI323_FIFO_CTRL 0x38 + +#define BMI323_FEATURE_CTRL 0x40 + +#define BMI323_ACC_DP_OFF_X 0x60 +#define BMI323_ACC_DP_DGAIN_X 0x61 +#define BMI323_ACC_DP_OFF_Y 0x62 +#define BMI323_ACC_DP_DGAIN_Y 0x63 +#define BMI323_ACC_DP_OFF_Z 0x64 +#define BMI323_ACC_DP_DGAIN_Z 0x65 +#define BMI323_GYR_DP_OFF_X 0x66 +#define BMI323_GYR_DP_DGAIN_X 0x67 +#define BMI323_GYR_DP_OFF_Y 0x68 +#define BMI323_GYR_DP_DGAIN_Y 0x69 +#define BMI323_GYR_DP_OFF_Z 0x6A +#define BMI323_GYR_DP_DGAIN_Z 0x6B + +#define BMI323_CMD 0x7E +#define BMI323_CFG_RES 0x7F + +//BMI323 potential spi address +#define BMI323_I2C_ADDR 0x68 +#define BMI323_I2C_ADDR_ALT 0x69 + +//BMI323 sub-defines for registers +#define BMI323_CHIP_ID_RESET_VAL 0x0043 +#define BMI323_ERR_REG_RESET_VAL 0x0000 +#define BMI323_STATUS_RESET_VAL 0x0001 +#define BMI323_ACC_X_RESET_VAL 0x8000 +#define BMI323_ACC_Y_RESET_VAL 0x8000 +#define BMI323_ACC_Z_RESET_VAL 0x8000 +#define BMI323_GYR_X_RESET_VAL 0x8000 +#define BMI323_GYR_Y_RESET_VAL 0x8000 +#define BMI323_GYR_Z_RESET_VAL 0x8000 +#define BMI323_TEMP_DATA_RESET_VAL 0x8000 + +#define BMI323_FEATURE_IO0_RESET_VAL 0x0000 +#define BMI323_FEATURE_I01_RESET_VAL 0x0000 + +#define BMI323_ACC_CONF_RESET_VAL 0x0028 +#define BMI323_GYR_CONF_RESET_VAL 0x0048 + +#define BMI323_FIFO_CONF_RESET_VAL 0x0000 +#define BMI323_FIFO_CTRL_RESET_VAL 0x0000 + +#define BMI323_ACC_DP_OFF_X_RESET_VAL 0x0000 +#define BMI323_ACC_DP_DGAIN_X_RESET_VAL 0x0000 +#define BMI323_ACC_DP_OFF_Y_RESET_VAL 0x0000 +#define BMI323_ACC_DP_DGAIN_Y_RESET_VAL 0x0000 +#define BMI323_ACC_DP_OFF_Z_RESET_VAL 0x0000 +#define BMI323_ACC_DP_DGAIN_Z_RESET_VAL 0x0000 +#define BMI323_GYR_DP_OFF_X_RESET_VAL 0x0000 +#define BMI323_GYR_DP_DGAIN_X_RESET_VAL 0x0000 +#define BMI323_GYR_DP_OFF_Y_RESET_VAL 0x0000 +#define BMI323_GYR_DP_DGAIN_Y_RESET_VAL 0x0000 +#define BMI323_GYR_DP_OFF_Z_RESET_VAL 0x0000 +#define BMI323_GYR_DP_DGAIN_Z_RESET_VAL 0x0000 + +#define BMI323_CMD_RESET_VAL 0x0000 +#define BMI323_CFG_RES_RESET_VAL 0x0000 + +//defines for commands +#define BMI323_CMD_SOFT_RESET 0xDEAF +#define BMI323_CMD_CALIB 0x0101 +#define BMI323_CMD_CALIB_ABORT 0x0200 + +//defines for features +#define BMI323_FEATURE_IO2_EN 0x012C +#define BMI323_FEATURE_IO_STS 0x0001 +#define BMI323_FEATURE_CTRL_ENGINE_EN 0x0001 +#define BMI323_FEATURE_IO1_STATUS 0x0001 + + +//defines for acc and gyro conf +#define SUSPEND 0b000 +#define LOW_POWER 0b011 +#define HIGH_PERF 0b111 +#define NORMAL 0b100 + +//these are the values that are used for the polling frequency +#define ODR_0_78 0x1 +#define ODR_1_56 0x2 +#define ODR_3_12 0x3 +#define ODR_6_25 0x4 +#define ODR_12_5 0x5 +#define ODR_25 0x6 +#define ODR_50 0x7 +#define ODR_100 0x8 +#define ODR_200 0x9 +#define ODR_400 0xA +#define ODR_800 0xB +#define ODR_1600 0xC +#define ODR_3200 0xD +#define ODR_6400 0xE + +//these are the values that are used for the -3dB bandwidth +#define ODR_DIV_2 0x0 +#define ODR_DIV_4 0x1 + +//these are defines for the sample averaging +#define AVG_0 0x0 +#define AVG_2 0x1 +#define AVG_4 0x2 +#define AVG_8 0x3 +#define AVG_16 0x4 +#define AVG_32 0x5 +#define AVG_64 0x6 + +//acc specific defines for range +#define ACC_RANGE_2G 0x0 +#define ACC_RANGE_4G 0x1 +#define ACC_RANGE_8G 0x2 +#define ACC_RANGE_16G 0x3 + +//gyro specific defines for range +//WRONG VALUES +#define GYR_RANGE_2000 0x0 +#define GYR_RANGE_1000 0x1 +#define GYR_RANGE_500 0x2 +#define GYR_RANGE_250 0x3 + +#define BMI323_TIMEOUT 1000 + +typedef struct +{ + SPI_HandleTypeDef *spi_port; + uint16_t chip_id; + GPIO_TypeDef *port; + uint16_t pin; + /* data */ +} bmi323 ; + +uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin); +uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg); +uint8_t bmi323_write(bmi323 *bmi323_dev, uint8_t reg, uint16_t data); +uint8_t bmi323_soft_reset(bmi323 *bmi323_dev); +uint8_t bmi323_calib(bmi323 *bmi323_dev); +uint8_t bmi323_calib_abort(bmi323 *bmi323_dev); +uint16_t bmi323_read_acc_x(bmi323 *bmi323_dev); +uint16_t bmi323_read_acc_y(bmi323 *bmi323_dev); +uint16_t bmi323_read_acc_z(bmi323 *bmi323_dev); +uint16_t bmi323_read_gyr_x(bmi323 *bmi323_dev); +uint16_t bmi323_read_gyr_y(bmi323 *bmi323_dev); +uint16_t bmi323_read_gyr_z(bmi323 *bmi323_dev); +uint16_t bmi323_read_temp_data(bmi323 *bmi323_dev); +uint16_t bmi323_read_status(bmi323 *bmi323_dev); +uint16_t bmi323_read_err_reg(bmi323 *bmi323_dev); +uint16_t bmi323_read_chip_id(bmi323 *bmi323_dev); +uint16_t bmi323_read_acc_conf(bmi323 *bmi323_dev); +uint16_t bmi323_read_gyr_conf(bmi323 *bmi323_dev); +uint16_t bmi323_read_acc_alt_conf(bmi323 *bmi323_dev); +uint16_t bmi323_read_gyr_alt_conf(bmi323 *bmi323_dev); +// uint8_t bmi323_enable_acc(bmi323 *bmi323_dev); +// uint8_t bmi323_enable_gyr(bmi323 *bmi323_dev); +uint8_t bmi323_disable_acc(bmi323 *bmi323_dev); +uint8_t bmi323_enable_gyro(bmi323 *bmi323_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr); +uint8_t bmi323_enable_acc(bmi323 *bmi323_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr); +uint8_t bmi323_read_acc(bmi323 *bmi323_dev, int16_t *acc_data); +uint8_t bmi323_read_gyr(bmi323 *bmi323_dev, int16_t *gyr_data); +uint8_t bmi323_read_all(bmi323 *bmi323_dev, int16_t *temp_data); + + + +#endif // BMI323_H \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Inc/crc.h b/SAMM/IMUandTOF/Core/Inc/crc.h new file mode 100644 index 000000000..836835d02 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/crc.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRC_H__ +#define __CRC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern CRC_HandleTypeDef hcrc; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_CRC_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRC_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/dma.h b/SAMM/IMUandTOF/Core/Inc/dma.h new file mode 100644 index 000000000..f3b1a09f9 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/dma.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/fdcan.h b/SAMM/IMUandTOF/Core/Inc/fdcan.h new file mode 100644 index 000000000..9289ea3a6 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/fdcan.h @@ -0,0 +1,55 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FDCAN_H__ +#define __FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern FDCAN_HandleTypeDef hfdcan1; + +extern FDCAN_HandleTypeDef hfdcan2; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_FDCAN1_Init(void); +void MX_FDCAN2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FDCAN_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/gpio.h b/SAMM/IMUandTOF/Core/Inc/gpio.h new file mode 100644 index 000000000..708bac71d --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/gpio.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/i2c.h b/SAMM/IMUandTOF/Core/Inc/i2c.h new file mode 100644 index 000000000..84ed75d2e --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/i2c.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern I2C_HandleTypeDef hi2c1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_I2C1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __I2C_H__ */ + diff --git a/SAMM/IMUandTOF/Core/Inc/main.h b/SAMM/IMUandTOF/Core/Inc/main.h new file mode 100644 index 000000000..17a2fe760 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/main.h @@ -0,0 +1,80 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" + +#include "stm32g4xx_ll_rcc.h" +#include "stm32g4xx_ll_bus.h" +#include "stm32g4xx_ll_crs.h" +#include "stm32g4xx_ll_system.h" +#include "stm32g4xx_ll_exti.h" +#include "stm32g4xx_ll_cortex.h" +#include "stm32g4xx_ll_utils.h" +#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_dma.h" +#include "stm32g4xx_ll_gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/SAMM/IMUandTOF/Core/Inc/spi.h b/SAMM/IMUandTOF/Core/Inc/spi.h new file mode 100644 index 000000000..434f0eeb8 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/spi.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ diff --git a/SAMM/IMUandTOF/Core/Inc/stm32_assert.h b/SAMM/IMUandTOF/Core/Inc/stm32_assert.h new file mode 100644 index 000000000..61631c41e --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/stm32_assert.h @@ -0,0 +1,53 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32_assert.h + * @author MCD Application Team + * @brief STM32 assert file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ASSERT_H +#define __STM32_ASSERT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Includes ------------------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ASSERT_H */ + diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h new file mode 100644 index 000000000..4087e183c --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h @@ -0,0 +1,380 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32G4xx_HAL_CONF_H +#define STM32G4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED + + /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CORDIC_MODULE_ENABLED */ +#define HAL_CRC_MODULE_ENABLED +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED +/*#define HAL_FMAC_MODULE_ENABLED */ +/*#define HAL_HRTIM_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/*#define HAL_SRAM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Register Callbacks selection ############################## */ +/** + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +/*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations in voltage and temperature.*/ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32g4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32g4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32g4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32g4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32g4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32g4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED +#include "stm32g4xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32g4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32g4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32g4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32g4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32g4xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32g4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED +#include "stm32g4xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED +#include "stm32g4xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32g4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32g4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32g4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32g4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32g4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32g4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32g4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32g4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32g4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32g4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32g4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32g4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32g4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32g4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32g4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32g4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32g4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32g4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32g4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32g4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32g4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32g4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32G4xx_HAL_CONF_H */ diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h new file mode 100644 index 000000000..e12321bcf --- /dev/null +++ b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32G4xx_IT_H +#define __STM32G4xx_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void TIM1_UP_TIM16_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32G4xx_IT_H */ diff --git a/SAMM/IMUandTOF/Core/Src/adc.c b/SAMM/IMUandTOF/Core/Src/adc.c new file mode 100644 index 000000000..15733df47 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/adc.c @@ -0,0 +1,154 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +ADC_HandleTypeDef hadc1; + +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.GainCompensation = 0; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_7; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + + /* ADC1 clock enable */ + __HAL_RCC_ADC12_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } +} + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) +{ + + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC12_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/bmi323.c b/SAMM/IMUandTOF/Core/Src/bmi323.c new file mode 100644 index 000000000..125342eb4 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/bmi323.c @@ -0,0 +1,283 @@ +#include "bmi323.h" +#include +#include "stm32g4xx_hal_spi.h" +#include "stm32g474xx.h" + +//init spi port before calling this function +uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin){ + uint8_t tx_word[4]; + uint8_t rx_word[4] = {0}; + uint8_t status = 0; + bmi323_dev->spi_port = spi_port; + bmi323_dev->port = port; + bmi323_dev->pin = pin; + tx_word[1] = (BMI323_CHIP_ID << 8); + tx_word[1] |= 0x80; + tx_word[0] = 0x69; + /* + Okay so for one of these transmits we need to follow the following operation:bmi323_dev + 1. to read the register we want to: + transmit first 8 bytes, then transmit a fake 8 bytes + after we want to read 16 bytes. This should complete a single read + */ + //first we read do the dummy read to switch to spi mode + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + // rx_word = 0; + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + if(rx_word[3] == 0x43){ + return HAL_OK; + } + return HAL_ERROR; +} + + + +/* +TODO: VIN DO THESE FUNCYIONS +*/ +uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg){ + uint16_t data; + // i2c_read_single(BMI323_I2C_ADDR, reg, &data, bmi323_dev->i2c_port); + return data; +} + +uint8_t bmi323_write(bmi323 *bmi323_dev, uint8_t reg, uint16_t data){ + // i2c_write(BMI323_I2C_ADDR, reg, data, bmi323_dev->i2c_port); + return 1; +} + +uint8_t bmi323_soft_reset(bmi323 *bmi323_dev){ + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_SOFT_RESET); + return 1; +} + + +/* +CALIBRATION PROCEDURE. VERY DANGEROUS. ONLY USE IF YOU KNOW WHAT YOU ARE DOING +THIS FUNCTION IS BLOCKING, CAN TAKE UP TO 3 SECONDS TO TIMEOUT +IF EVERYTHING IS DONE PROPERLY, THE FUNCTION WILL BLOCK FOR UP TO 500ms +THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT +STEPS: +1. Disable all sensors +2. Enable the feature engine +3. Check if a calibration is already in progress +4. Check if the accelerometer is in high performance mode and the ODR is between 25 and 200 hertz +5. Start the calibration +6. Check if the calibration was successful +7. If not, reset the accelerometer and try again +8. If successful, reset the accelerometer and gyro to their original configuration +9. Done +*/ +uint8_t bmi323_calib(bmi323 *bmi323_dev){ + //first we have to fucking start the feature engine + //to do that we have to disable all sensors + uint16_t acc_conf = bmi323_read(bmi323_dev, BMI323_ACC_CONF); + uint16_t gyro_conf = bmi323_read(bmi323_dev, BMI323_GYR_CONF); + uint32_t timeout_ref = 0; + if((acc_conf & 0x7000) != 0b000){ + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + } + if((gyro_conf & 0x7000) != 0b000){ + bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); + } + //now we need to check if the feature engine has been enabled prior + if((bmi323_read(bmi323_dev, BMI323_FEATURE_CTRL) & 0x0001) == 0b0){ + //then we write 0x012C to Feature Io 2 + bmi323_write(bmi323_dev, BMI323_FEATURE_IO2, BMI323_FEATURE_IO2_EN); + //then we write 0x0001 to Feature Io status + bmi323_write(bmi323_dev, BMI323_FEATURE_IO_STATUS, BMI323_FEATURE_IO_STS); + //now we set the feature ctrol engine enable to 1 + bmi323_write(bmi323_dev, BMI323_FEATURE_CTRL, BMI323_FEATURE_CTRL_ENGINE_EN); + //now we poll the feature engine + timeout_ref = millis(); + while((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0b001){ + if(millis() - timeout_ref > BMI323_TIMEOUT){ + D_println("Feature engine enable timeout"); + return 0; + } + continue; + } + D_println("enabled feature engine Hooray!"); + } + //no need for an else statement as the feature engine is already enabled and we can continue + //now we need to check if a calibration is already in progress + //polls the bmi323 FEATURE I01 state untill the state is 0b00, this means calibration can start. + timeout_ref = millis(); + while(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0b00){ + if(millis() - timeout_ref > BMI323_TIMEOUT){ + D_println("Calibration state timeout"); + return 0; + } + continue; + } + //check the current configuration of the accelerometer and make sure it is in high performance adn + //ODR is between 25 and 200 hertz + calibrate: + //read the acc conf register + uint16_t data = bmi323_read(bmi323_dev, BMI323_ACC_CONF) & 0x700F; + //checks if we are in the correct configuration. if not skips if statement + if(((data >> 12) == HIGH_PERF) && (((data & 0x000F) >= ODR_25) && ((data & 0x000F) <= ODR_200))){ + D_println("Starting calibration"); + //if it is, then we can start the calibration + //first we check if the alernalte configuration acc mode is set to 0: + if(((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000)>>11) != 0b000){ + //if it is, we set it to 0 + bmi323_write(bmi323_dev, BMI323_ALT_ACC_CONF, 0x0206); + } + //next we check if the alternate configuration gyro mode is set to 0: + if(((bmi323_read(bmi323_dev, BMI323_ALT_GYR_CONF) & 0x7000)>>11) != 0b000){ + //if it is, we set it to 0 + bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); + } + D_println("Alternate configurations set"); + //next we can actually send the command for calibration + //reset all of the gyro calibration values + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_X, BMI323_ACC_DP_DGAIN_X_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Y, BMI323_ACC_DP_DGAIN_Y_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Z, BMI323_ACC_DP_DGAIN_Z_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_X, BMI323_ACC_DP_OFF_X_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Y, BMI323_ACC_DP_OFF_Y_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Z, BMI323_ACC_DP_OFF_Z_RESET_VAL); + //now we poll the state of the calibration untill we get 0b1 + D_println("Starting calibration"); + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB); + + D_println("Polling calibration state"); + //check if the feature engine is enabled + timeout_ref = millis(); + while(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4 ) != 0b1){ + if(millis() - timeout_ref > BMI323_TIMEOUT){ + D_println("Feature engine enable timeout"); + return 0; + } + continue; + } + D_println("Calibration complete"); + if(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1){ + // D_println("Calibration successful"); + // D_println("reseting values to original configuration"); + //cycle the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_ACC_CONF, acc_conf); + //cycle the gyro + bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); + // D_println(gyro_conf); + bmi323_write(bmi323_dev, BMI323_GYR_CONF, gyro_conf); + //display the calibration values + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_X), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Y), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Z), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_X), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Y), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Z), HEX); + return 1; + } + else{ + // D_println("Calibration failed"); + return 0; + } + + } + // D_println("Calibration failed"); + // D_println("reseting values trying again"); + //turns off the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + //turn on the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL | 0x7000); + //jumps to the calibration sequence + goto calibrate; + return 1; +} + +uint8_t bmi323_calib_abort(bmi323 *bmi323_dev){ + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB_ABORT); + return 1; +} + +/* +TODO: +Check the status of the acc, gyro and temp before returning the values + if they are not ready return 0 + if they are ready return 1 + need to pass by reference the values to be returned + +*/ + +uint16_t bmi323_read_acc_x(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_ACC_X); +} + +uint16_t bmi323_read_acc_y(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_ACC_Y); +} + +uint16_t bmi323_read_acc_z(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_ACC_Z); +} + +uint16_t bmi323_read_gyr_x(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_GYR_X); +} + +uint16_t bmi323_read_gyr_y(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_GYR_Y); +} + +uint16_t bmi323_read_gyr_z(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_GYR_Z); +} + +uint16_t bmi323_read_temp_data(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_TEMP_DATA); +} + +uint16_t bmi323_read_status(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_STATUS); +} + +uint16_t bmi323_read_err_reg(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_ERR_REG); +} + +uint16_t bmi323_read_chip_id(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_CHIP_ID); +} + +uint16_t bmi323_read_acc_conf(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_ACC_CONF); +} + +uint16_t bmi323_read_gyr_conf(bmi323 *bmi323_dev){ + return bmi323_read(bmi323_dev, BMI323_GYR_CONF); +} + +uint8_t bmi323_enable_acc(bmi323 *bmi323_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr){ + //uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); + uint16_t new_conf = 0; + new_conf |= acc_mode << 12; + new_conf |= acc_avg_num << 8; + new_conf |= acc_bw << 7; + new_conf |= acc_range << 4; + new_conf |= acc_odr; + bmi323_write(bmi323_dev, BMI323_ACC_CONF, new_conf); + return 1; +} + +uint8_t bmi323_enable_gyro(bmi323 *bmi323_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr){ + //uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); + uint16_t new_conf = 0; + new_conf |= gyr_mode << 12; + new_conf |= gyr_avg_num << 8; + new_conf |= gyr_bw << 7; + new_conf |= gyr_range << 4; + new_conf |= gyr_odr; + bmi323_write(bmi323_dev, BMI323_GYR_CONF, new_conf); + return 1; +} + + + diff --git a/SAMM/IMUandTOF/Core/Src/crc.c b/SAMM/IMUandTOF/Core/Src/crc.c new file mode 100644 index 000000000..0a8907607 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/crc.c @@ -0,0 +1,90 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "crc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +CRC_HandleTypeDef hcrc; + +/* CRC init function */ +void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ + +} + +void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) +{ + + if(crcHandle->Instance==CRC) + { + /* USER CODE BEGIN CRC_MspInit 0 */ + + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ + + /* USER CODE END CRC_MspInit 1 */ + } +} + +void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) +{ + + if(crcHandle->Instance==CRC) + { + /* USER CODE BEGIN CRC_MspDeInit 0 */ + + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ + + /* USER CODE END CRC_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/dma.c b/SAMM/IMUandTOF/Core/Src/dma.c new file mode 100644 index 000000000..372b7e92c --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/dma.c @@ -0,0 +1,59 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ + diff --git a/SAMM/IMUandTOF/Core/Src/fdcan.c b/SAMM/IMUandTOF/Core/Src/fdcan.c new file mode 100644 index 000000000..59cf13f59 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/fdcan.c @@ -0,0 +1,223 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "fdcan.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +FDCAN_HandleTypeDef hfdcan1; +FDCAN_HandleTypeDef hfdcan2; + +/* FDCAN1 init function */ +void MX_FDCAN1_Init(void) +{ + + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 16; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 1; + hfdcan1.Init.NominalTimeSeg2 = 1; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ + +} +/* FDCAN2 init function */ +void MX_FDCAN2_Init(void) +{ + + /* USER CODE BEGIN FDCAN2_Init 0 */ + + /* USER CODE END FDCAN2_Init 0 */ + + /* USER CODE BEGIN FDCAN2_Init 1 */ + + /* USER CODE END FDCAN2_Init 1 */ + hfdcan2.Instance = FDCAN2; + hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan2.Init.AutoRetransmission = DISABLE; + hfdcan2.Init.TransmitPause = DISABLE; + hfdcan2.Init.ProtocolException = DISABLE; + hfdcan2.Init.NominalPrescaler = 16; + hfdcan2.Init.NominalSyncJumpWidth = 1; + hfdcan2.Init.NominalTimeSeg1 = 1; + hfdcan2.Init.NominalTimeSeg2 = 1; + hfdcan2.Init.DataPrescaler = 1; + hfdcan2.Init.DataSyncJumpWidth = 1; + hfdcan2.Init.DataTimeSeg1 = 1; + hfdcan2.Init.DataTimeSeg2 = 1; + hfdcan2.Init.StdFiltersNbr = 0; + hfdcan2.Init.ExtFiltersNbr = 0; + hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN2_Init 2 */ + + /* USER CODE END FDCAN2_Init 2 */ + +} + +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0; + +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(fdcanHandle->Instance==FDCAN1) + { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if(HAL_RCC_FDCAN_CLK_ENABLED==1){ + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } + else if(fdcanHandle->Instance==FDCAN2) + { + /* USER CODE BEGIN FDCAN2_MspInit 0 */ + + /* USER CODE END FDCAN2_MspInit 0 */ + + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN2 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if(HAL_RCC_FDCAN_CLK_ENABLED==1){ + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN2_MspInit 1 */ + + /* USER CODE END FDCAN2_MspInit 1 */ + } +} + +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) +{ + + if(fdcanHandle->Instance==FDCAN1) + { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if(HAL_RCC_FDCAN_CLK_ENABLED==0){ + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } + else if(fdcanHandle->Instance==FDCAN2) + { + /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + + /* USER CODE END FDCAN2_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if(HAL_RCC_FDCAN_CLK_ENABLED==0){ + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_5); + + /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + + /* USER CODE END FDCAN2_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/gpio.c b/SAMM/IMUandTOF/Core/Src/gpio.c new file mode 100644 index 000000000..ab7f2d3bf --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/gpio.c @@ -0,0 +1,94 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI + PC8 ------> I2C3_SCL + PC9 ------> I2C3_SDA +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_RESET); + + /*Configure GPIO pin : PF1 */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /*Configure GPIO pins : PB1 PB4 */ + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PB12 PB6 */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PC8 PC9 */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/SAMM/IMUandTOF/Core/Src/i2c.c b/SAMM/IMUandTOF/Core/Src/i2c.c new file mode 100644 index 000000000..8912dcd02 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/i2c.c @@ -0,0 +1,135 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + +/* USER CODE BEGIN 0 */ +extern uint32_t I2C_Freq; +/* USER CODE END 0 */ + +I2C_HandleTypeDef hi2c1; + +/* I2C1 init function */ +void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x10920C1D; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C1 clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +{ + + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/main.c b/SAMM/IMUandTOF/Core/Src/main.c new file mode 100644 index 000000000..7400c2e1f --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/main.c @@ -0,0 +1,325 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "crc.h" +#include "fdcan.h" +#include "i2c.h" +#include "spi.h" +#include "gpio.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include +#include "VL53L4ED_api.h" +#include "bmi323.h" +//#include "circularBuffer.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ +#define BMI323_CS_GPIO_Port GPIOA +#define BMI323_CS_Pin GPIO_PIN_4 +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +#ifdef __GNUC__ +#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) +#else +#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) +#endif +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ +PUTCHAR_PROTOTYPE +{ + ITM_SendChar(ch); + return ch; +} +//CircularBuffer *cb; +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +// FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +/* +I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations + - still need to fully test but ideally implmentation is done + + + */ +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + //cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_FDCAN1_Init(); + MX_FDCAN2_Init(); + MX_I2C1_Init(); + MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + /* USER CODE BEGIN 2 */ + + // HAL_FDCAN_Start(&hfdcan1); + // HAL_FDCAN_Start(&hfdcan2); + // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + bmi323 bmi323_dev; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + // Send 2 dummy bytes to switch BMI323 to SPI mode + // uint16_t dummy_byte = 0x8000; + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); + // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + //HAL_Delay(1); // Short delay after mode switch + + // Initialize BMI323 sensor + + // if (BMI323_Init() != HAL_OK) { + // printf("BMI323 initialization failed!\r\n"); + // Error_Handler(); + // } + + // static uint16_t eeMLX90640[832]; + // static paramsMLX90640 mlx90640; + // #define MLX90640_ADDRESS 0x33<<1 + // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + + // MLX90640_SynchFrame(MLX90640_ADDRESS); + // MLX90640_SetRefreshRate(0x33, 0x05); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + //begin VL53L4ED + HAL_Delay(100); // wait for 5ms to power up the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin + //HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to reset the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin + //HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to power up the device + + uint16_t status = 0; + + uint16_t sensor_id = 0; + VL53L4ED_ResultsData_t results; + uint8_t p_data_ready; + + int TOF_ID = 0x52; + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); + status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + + + while (1) + { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + //begin VL53L4ED + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if(p_data_ready){ + /* (Mandatory) Clear HW interrupt to restart measurements */ + VL53L4ED_ClearInterrupt(TOF_ID); + /* Read measured distance. RangeStatus = 0 means valid data */ + VL53L4ED_GetResult(TOF_ID, &results); + printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", + results.range_status, + results.distance_mm- 67, + results.signal_per_spad_kcps); + }else{ + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + + //begin BMI323 + // int16_t ax, ay, az; + // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { + // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); + // } + HAL_Delay(100); // Read every 100ms + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) + { + } + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); + LL_RCC_HSE_EnableBypass(); + LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while(LL_RCC_HSE_IsReady() != 1) + { + } + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + /* Wait till PLL is ready */ + while(LL_RCC_PLL_IsReady() != 1) + { + } + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + /* Wait till System clock is ready */ + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) + { + } + + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (170 >> 1); i !=0; i--); + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(128000000); + + /* Update the time base */ + if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) + { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ +// void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) +// { +// uint8_t RxData[64]; +// HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader_FDCAN2, RxData); +// printf("got messgae\n"); +// //circularBufferPush(cb, RxData, sizeof(RxData)); + + +// } +/* USER CODE END 4 */ + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM1) + { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/SAMM/IMUandTOF/Core/Src/spi.c b/SAMM/IMUandTOF/Core/Src/spi.c new file mode 100644 index 000000000..2944b6ce0 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/spi.c @@ -0,0 +1,128 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; + +/* spi1 init function */ +void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN spi1_Init 0 */ + + /* USER CODE END spi1_Init 0 */ + + /* USER CODE BEGIN spi1_Init 1 */ + + /* USER CODE END spi1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_16BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN spi1_Init 2 */ + + /* USER CODE END spi1_Init 2 */ + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(spiHandle->Instance==spi1) + { + /* USER CODE BEGIN spi1_MspInit 0 */ + + /* USER CODE END spi1_MspInit 0 */ + /* spi1 clock enable */ + __HAL_RCC_spi1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**spi1 GPIO Configuration + PA5 ------> spi1_SCK + PA6 ------> spi1_MISO + PA7 ------> spi1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN spi1_MspInit 1 */ + + /* USER CODE END spi1_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +{ + + if(spiHandle->Instance==spi1) + { + /* USER CODE BEGIN spi1_MspDeInit 0 */ + + /* USER CODE END spi1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_spi1_CLK_DISABLE(); + + /**spi1 GPIO Configuration + PC10 ------> spi1_SCK + PC11 ------> spi1_MISO + PC12 ------> spi1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN spi1_MspDeInit 1 */ + + /* USER CODE END spi1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c new file mode 100644 index 000000000..3fc223b63 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c new file mode 100644 index 000000000..f43496b92 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c @@ -0,0 +1,126 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_timebase_tim.c + * @brief HAL time base based on the hardware TIM. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" +#include "stm32g4xx_hal_tim.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim1; +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the TIM1 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock = 0; + uint32_t uwPrescalerValue = 0; + uint32_t pFLatency; + + HAL_StatusTypeDef status; + + /* Enable TIM1 clock */ + __HAL_RCC_TIM1_CLK_ENABLE(); + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Compute TIM1 clock */ + uwTimclock = HAL_RCC_GetPCLK2Freq(); + + /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); + + /* Initialize TIM1 */ + htim1.Instance = TIM1; + + /* Initialize TIMx peripheral as follow: + * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. + * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + * ClockDivision = 0 + * Counter direction = Up + */ + htim1.Init.Period = (1000000U / 1000U) - 1U; + htim1.Init.Prescaler = uwPrescalerValue; + htim1.Init.ClockDivision = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + + status = HAL_TIM_Base_Init(&htim1); + if (status == HAL_OK) + { + /* Start the TIM time Base generation in interrupt mode */ + status = HAL_TIM_Base_Start_IT(&htim1); + if (status == HAL_OK) + { + /* Enable the TIM1 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) + { + /* Configure the TIM IRQ priority */ + HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } + else + { + status = HAL_ERROR; + } + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable TIM1 update Interrupt */ + __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Enable TIM1 Update interrupt */ + __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); +} + diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c new file mode 100644 index 000000000..ef94b5f52 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32g4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim1; + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) + { + } + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32G4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32g4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. + */ +void TIM1_UP_TIM16_IRQHandler(void) +{ + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ + HAL_TIM_IRQHandler(&htim1); + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/syscalls.c b/SAMM/IMUandTOF/Core/Src/syscalls.c new file mode 100644 index 000000000..e33a8492c --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/syscalls.c @@ -0,0 +1,176 @@ +/** + ****************************************************************************** + * @file syscalls.c + * @author Auto-generated by STM32CubeMX + * @brief Minimal System calls file + * + * For more information about which c-functions + * need which of these lowlevel functions + * please consult the Newlib libc-manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2020-2024 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. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include +#include +#include +#include +#include +#include +#include + + +/* Variables */ +extern int __io_putchar(int ch) __attribute__((weak)); +extern int __io_getchar(void) __attribute__((weak)); + + +char *__env[1] = { 0 }; +char **environ = __env; + + +/* Functions */ +void initialise_monitor_handles() +{ +} + +int _getpid(void) +{ + return 1; +} + +int _kill(int pid, int sig) +{ + (void)pid; + (void)sig; + errno = EINVAL; + return -1; +} + +void _exit (int status) +{ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ +} + +__attribute__((weak)) int _read(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + *ptr++ = __io_getchar(); + } + + return len; +} + +__attribute__((weak)) int _write(int file, char *ptr, int len) +{ + (void)file; + int DataIdx; + + for (DataIdx = 0; DataIdx < len; DataIdx++) + { + __io_putchar(*ptr++); + } + return len; +} + +int _close(int file) +{ + (void)file; + return -1; +} + + +int _fstat(int file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _isatty(int file) +{ + (void)file; + return 1; +} + +int _lseek(int file, int ptr, int dir) +{ + (void)file; + (void)ptr; + (void)dir; + return 0; +} + +int _open(char *path, int flags, ...) +{ + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; +} + +int _wait(int *status) +{ + (void)status; + errno = ECHILD; + return -1; +} + +int _unlink(char *name) +{ + (void)name; + errno = ENOENT; + return -1; +} + +int _times(struct tms *buf) +{ + (void)buf; + return -1; +} + +int _stat(char *file, struct stat *st) +{ + (void)file; + st->st_mode = S_IFCHR; + return 0; +} + +int _link(char *old, char *new) +{ + (void)old; + (void)new; + errno = EMLINK; + return -1; +} + +int _fork(void) +{ + errno = EAGAIN; + return -1; +} + +int _execve(char *name, char **argv, char **env) +{ + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; +} diff --git a/SAMM/IMUandTOF/Core/Src/sysmem.c b/SAMM/IMUandTOF/Core/Src/sysmem.c new file mode 100644 index 000000000..246470ee8 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/sysmem.c @@ -0,0 +1,79 @@ +/** + ****************************************************************************** + * @file sysmem.c + * @author Generated by STM32CubeMX + * @brief System Memory calls file + * + * For more information about which C functions + * need which of these lowlevel functions + * please consult the newlib libc manual + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ + +/* Includes */ +#include +#include + +/** + * Pointer to the current high watermark of the heap usage + */ +static uint8_t *__sbrk_heap_end = NULL; + +/** + * @brief _sbrk() allocates memory to the newlib heap and is used by malloc + * and others from the C library + * + * @verbatim + * ############################################################################ + * # .data # .bss # newlib heap # MSP stack # + * # # # # Reserved by _Min_Stack_Size # + * ############################################################################ + * ^-- RAM start ^-- _end _estack, RAM end --^ + * @endverbatim + * + * This implementation starts allocating at the '_end' linker symbol + * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack + * The implementation considers '_estack' linker symbol to be RAM end + * NOTE: If the MSP stack, at any point during execution, grows larger than the + * reserved size, please increase the '_Min_Stack_Size'. + * + * @param incr Memory size + * @return Pointer to allocated memory + */ +void *_sbrk(ptrdiff_t incr) +{ + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; + + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) + { + __sbrk_heap_end = &_end; + } + + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) + { + errno = ENOMEM; + return (void *)-1; + } + + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; + + return (void *)prev_heap_end; +} diff --git a/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c b/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c new file mode 100644 index 000000000..8d35a0aa0 --- /dev/null +++ b/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c @@ -0,0 +1,285 @@ +/** + ****************************************************************************** + * @file system_stm32g4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 16 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32g4xx_system + * @{ + */ + +/** @addtogroup STM32G4xx_System_Private_Includes + * @{ + */ + +#include "stm32g4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +#define USER_VECT_TAB_ADDRESS + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = HSI_VALUE; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ + #endif + + /* Configure the Vector Table location add offset address ------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 24 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp, pllvco, pllr, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U ; + if (pllsource == 0x02UL) /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } + else /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/SAMM/IMUandTOF/Core/empty.txt b/SAMM/IMUandTOF/Core/empty.txt deleted file mode 100644 index e69de29bb..000000000 From ce994e5103e7f4b9dfe082bf20bfdb4d3c6afc89 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Apr 2026 04:39:51 +0000 Subject: [PATCH 007/158] Automatic Clang-Format: Standardized formatting automatically --- .../Core/Extras/CircBuF/circularBuffer.c | 108 +-- .../Core/Extras/CircBuF/circularBuffer.h | 14 +- .../Core/Extras/VL53L4ED/VL53L4ED_api.c | 651 +++++++----------- .../Core/Extras/VL53L4ED/VL53L4ED_api.h | 164 ++--- .../Extras/VL53L4ED/VL53L4ED_calibration.c | 139 ++-- .../Extras/VL53L4ED/VL53L4ED_calibration.h | 37 +- .../IMUandTOF/Core/Extras/VL53L4ED/platform.c | 29 +- .../IMUandTOF/Core/Extras/VL53L4ED/platform.h | 29 +- SAMM/IMUandTOF/Core/Extras/extra.c | 57 +- SAMM/IMUandTOF/Core/Extras/extra.h | 9 +- SAMM/IMUandTOF/Core/Inc/adc.h | 33 +- SAMM/IMUandTOF/Core/Inc/bmi323.h | 45 +- SAMM/IMUandTOF/Core/Inc/crc.h | 33 +- SAMM/IMUandTOF/Core/Inc/dma.h | 33 +- SAMM/IMUandTOF/Core/Inc/fdcan.h | 33 +- SAMM/IMUandTOF/Core/Inc/gpio.h | 33 +- SAMM/IMUandTOF/Core/Inc/i2c.h | 33 +- SAMM/IMUandTOF/Core/Inc/main.h | 45 +- SAMM/IMUandTOF/Core/Inc/spi.h | 32 +- SAMM/IMUandTOF/Core/Inc/stm32_assert.h | 49 +- SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h | 243 +++---- SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h | 30 +- SAMM/IMUandTOF/Core/Src/adc.c | 226 +++--- SAMM/IMUandTOF/Core/Src/bmi323.c | 436 ++++++------ SAMM/IMUandTOF/Core/Src/crc.c | 102 ++- SAMM/IMUandTOF/Core/Src/dma.c | 60 +- SAMM/IMUandTOF/Core/Src/fdcan.c | 364 +++++----- SAMM/IMUandTOF/Core/Src/gpio.c | 126 ++-- SAMM/IMUandTOF/Core/Src/i2c.c | 196 +++--- SAMM/IMUandTOF/Core/Src/main.c | 437 ++++++------ SAMM/IMUandTOF/Core/Src/spi.c | 186 +++-- SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c | 56 +- .../Core/Src/stm32g4xx_hal_timebase_tim.c | 170 +++-- SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c | 189 +++-- SAMM/IMUandTOF/Core/Src/syscalls.c | 134 ++-- SAMM/IMUandTOF/Core/Src/sysmem.c | 38 +- SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c | 437 ++++++------ 37 files changed, 2389 insertions(+), 2647 deletions(-) diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c index e7f59de79..4b0eaeaca 100644 --- a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c +++ b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c @@ -1,64 +1,70 @@ #include "circularBuffer.h" -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) { - CircularBuffer *cb = malloc(sizeof(CircularBuffer)); - if (!cb) { - return NULL; - } +CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) +{ + CircularBuffer *cb = malloc(sizeof(CircularBuffer)); + if (!cb) { + return NULL; + } - cb->buffer = malloc(capacity * sizeof(void *)); - if (!cb->buffer) { - free(cb); - return NULL; - } + cb->buffer = malloc(capacity * sizeof(void *)); + if (!cb->buffer) { + free(cb); + return NULL; + } - for (size_t i = 0; i < capacity; i++) { - cb->buffer[i] = malloc(max_array_size); - if (!cb->buffer[i]) { - for (size_t j = 0; j < i; j++) { - free(cb->buffer[j]); - } - free(cb->buffer); - free(cb); - return NULL; - } - } - cb->capacity = capacity; - cb->max_arr_size = max_array_size; - cb->head = 0; - cb->tail = 0; - cb->size = 0; - return cb; + for (size_t i = 0; i < capacity; i++) { + cb->buffer[i] = malloc(max_array_size); + if (!cb->buffer[i]) { + for (size_t j = 0; j < i; j++) { + free(cb->buffer[j]); + } + free(cb->buffer); + free(cb); + return NULL; + } + } + cb->capacity = capacity; + cb->max_arr_size = max_array_size; + cb->head = 0; + cb->tail = 0; + cb->size = 0; + return cb; } -void circularBufferDestroy(CircularBuffer *cb) { - if (!cb) return; +void circularBufferDestroy(CircularBuffer *cb) +{ + if (!cb) { + return; + } - for (size_t i = 0; i < cb->capacity; i++) { - free(cb->buffer[i]); - } - free(cb->buffer); - free(cb); + for (size_t i = 0; i < cb->capacity; i++) { + free(cb->buffer[i]); + } + free(cb->buffer); + free(cb); } -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) { - if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { - return -1; // Buffer is full or array is too large - } +int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) +{ + if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { + return -1; // Buffer is full or array is too large + } - // Copy the array into the buffer - memcpy(cb->buffer[cb->head], array, array_size); - cb->head = (cb->head + 1) % cb->capacity; - cb->size++; - return 0; + // Copy the array into the buffer + memcpy(cb->buffer[cb->head], array, array_size); + cb->head = (cb->head + 1) % cb->capacity; + cb->size++; + return 0; } -void *circularBufferPop(CircularBuffer *cb) { - if (!cb || cb->size == 0) { - return NULL; // Buffer is empty - } +void *circularBufferPop(CircularBuffer *cb) +{ + if (!cb || cb->size == 0) { + return NULL; // Buffer is empty + } - void *array = cb->buffer[cb->tail]; - cb->tail = (cb->tail + 1) % cb->capacity; - cb->size--; - return array; + void *array = cb->buffer[cb->tail]; + cb->tail = (cb->tail + 1) % cb->capacity; + cb->size--; + return array; } diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h index ae7ce9220..861792535 100644 --- a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h +++ b/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h @@ -1,18 +1,18 @@ #ifndef __circularBuffer_h__ #define __circularBuffer_h__ +#include #include #include -#include #include typedef struct { - void **buffer; // Array of void pointers - uint8_t capacity; // Maximum number of elements in the buffer - uint8_t head; // Index of the next element to write - uint8_t tail; // Index of the next element to read - uint8_t size; // Current number of elements in the buffer - uint8_t max_arr_size; // Maximum size of the array + void **buffer; // Array of void pointers + uint8_t capacity; // Maximum number of elements in the buffer + uint8_t head; // Index of the next element to write + uint8_t tail; // Index of the next element to read + uint8_t size; // Current number of elements in the buffer + uint8_t max_arr_size; // Maximum size of the array } CircularBuffer; CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c index 323148da4..7c844100e 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c @@ -1,138 +1,138 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_api.c * @brief Functions implementation */ -#include -#include #include "VL53L4ED_api.h" +#include +#include + static const uint8_t VL53L4ED_DEFAULT_CONFIGURATION[] = { - #ifdef VL53L4ED_I2C_FAST_MODE_PLUS - 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ - #else - 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ - #endif - 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low - (bits 3:0 must be 0x1), use SetInterruptPolarity() */ - 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, - use CheckForDataReady() */ - 0x00, /* 0x32 : not user-modifiable */ - 0x02, /* 0x33 : not user-modifiable */ - 0x08, /* 0x34 : not user-modifiable */ - 0x00, /* 0x35 : not user-modifiable */ - 0x08, /* 0x36 : not user-modifiable */ - 0x10, /* 0x37 : not user-modifiable */ - 0x01, /* 0x38 : not user-modifiable */ - 0x01, /* 0x39 : not user-modifiable */ - 0x00, /* 0x3a : not user-modifiable */ - 0x00, /* 0x3b : not user-modifiable */ - 0x00, /* 0x3c : not user-modifiable */ - 0x00, /* 0x3d : not user-modifiable */ - 0xff, /* 0x3e : not user-modifiable */ - 0x00, /* 0x3f : not user-modifiable */ - 0x0F, /* 0x40 : not user-modifiable */ - 0x00, /* 0x41 : not user-modifiable */ - 0x00, /* 0x42 : not user-modifiable */ - 0x00, /* 0x43 : not user-modifiable */ - 0x00, /* 0x44 : not user-modifiable */ - 0x00, /* 0x45 : not user-modifiable */ - 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, - 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ - 0x0b, /* 0x47 : not user-modifiable */ - 0x00, /* 0x48 : not user-modifiable */ - 0x00, /* 0x49 : not user-modifiable */ - 0x02, /* 0x4a : not user-modifiable */ - 0x14, /* 0x4b : not user-modifiable */ - 0x21, /* 0x4c : not user-modifiable */ - 0x00, /* 0x4d : not user-modifiable */ - 0x00, /* 0x4e : not user-modifiable */ - 0x05, /* 0x4f : not user-modifiable */ - 0x00, /* 0x50 : not user-modifiable */ - 0x00, /* 0x51 : not user-modifiable */ - 0x00, /* 0x52 : not user-modifiable */ - 0x00, /* 0x53 : not user-modifiable */ - 0xc8, /* 0x54 : not user-modifiable */ - 0x00, /* 0x55 : not user-modifiable */ - 0x00, /* 0x56 : not user-modifiable */ - 0x38, /* 0x57 : not user-modifiable */ - 0xff, /* 0x58 : not user-modifiable */ - 0x01, /* 0x59 : not user-modifiable */ - 0x00, /* 0x5a : not user-modifiable */ - 0x08, /* 0x5b : not user-modifiable */ - 0x00, /* 0x5c : not user-modifiable */ - 0x00, /* 0x5d : not user-modifiable */ - 0x01, /* 0x5e : not user-modifiable */ - 0xcc, /* 0x5f : not user-modifiable */ - 0x07, /* 0x60 : not user-modifiable */ - 0x01, /* 0x61 : not user-modifiable */ - 0xf1, /* 0x62 : not user-modifiable */ - 0x05, /* 0x63 : not user-modifiable */ - 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), - use SetSigmaThreshold(), default value 90 mm */ - 0xa0, /* 0x65 : Sigma threshold LSB */ - 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), - use SetSignalThreshold() */ - 0x80, /* 0x67 : Min count Rate LSB */ - 0x08, /* 0x68 : not user-modifiable */ - 0x38, /* 0x69 : not user-modifiable */ - 0x00, /* 0x6a : not user-modifiable */ - 0x00, /* 0x6b : not user-modifiable */ - 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, - use SetIntermeasurementInMs() */ - 0x00, /* 0x6d : Intermeasurement period */ - 0x0f, /* 0x6e : Intermeasurement period */ - 0x89, /* 0x6f : Intermeasurement period LSB */ - 0x00, /* 0x70 : not user-modifiable */ - 0x00, /* 0x71 : not user-modifiable */ - 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x73 : distance threshold high LSB */ - 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x75 : distance threshold low LSB */ - 0x00, /* 0x76 : not user-modifiable */ - 0x01, /* 0x77 : not user-modifiable */ - 0x07, /* 0x78 : not user-modifiable */ - 0x05, /* 0x79 : not user-modifiable */ - 0x06, /* 0x7a : not user-modifiable */ - 0x06, /* 0x7b : not user-modifiable */ - 0x00, /* 0x7c : not user-modifiable */ - 0x00, /* 0x7d : not user-modifiable */ - 0x02, /* 0x7e : not user-modifiable */ - 0xc7, /* 0x7f : not user-modifiable */ - 0xff, /* 0x80 : not user-modifiable */ - 0x9B, /* 0x81 : not user-modifiable */ - 0x00, /* 0x82 : not user-modifiable */ - 0x00, /* 0x83 : not user-modifiable */ - 0x00, /* 0x84 : not user-modifiable */ - 0x01, /* 0x85 : not user-modifiable */ - 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ - 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), - If you want an automatic start after VL53L4ED_init() call, - put 0x40 in location 0x87 */ +#ifdef VL53L4ED_I2C_FAST_MODE_PLUS + 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ +#else + 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), + else don't touch */ +#endif + 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 + (pull up at AVDD) */ + 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low + (bits 3:0 must be 0x1), use SetInterruptPolarity() */ + 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, + use CheckForDataReady() */ + 0x00, /* 0x32 : not user-modifiable */ + 0x02, /* 0x33 : not user-modifiable */ + 0x08, /* 0x34 : not user-modifiable */ + 0x00, /* 0x35 : not user-modifiable */ + 0x08, /* 0x36 : not user-modifiable */ + 0x10, /* 0x37 : not user-modifiable */ + 0x01, /* 0x38 : not user-modifiable */ + 0x01, /* 0x39 : not user-modifiable */ + 0x00, /* 0x3a : not user-modifiable */ + 0x00, /* 0x3b : not user-modifiable */ + 0x00, /* 0x3c : not user-modifiable */ + 0x00, /* 0x3d : not user-modifiable */ + 0xff, /* 0x3e : not user-modifiable */ + 0x00, /* 0x3f : not user-modifiable */ + 0x0F, /* 0x40 : not user-modifiable */ + 0x00, /* 0x41 : not user-modifiable */ + 0x00, /* 0x42 : not user-modifiable */ + 0x00, /* 0x43 : not user-modifiable */ + 0x00, /* 0x44 : not user-modifiable */ + 0x00, /* 0x45 : not user-modifiable */ + 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, + 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ + 0x0b, /* 0x47 : not user-modifiable */ + 0x00, /* 0x48 : not user-modifiable */ + 0x00, /* 0x49 : not user-modifiable */ + 0x02, /* 0x4a : not user-modifiable */ + 0x14, /* 0x4b : not user-modifiable */ + 0x21, /* 0x4c : not user-modifiable */ + 0x00, /* 0x4d : not user-modifiable */ + 0x00, /* 0x4e : not user-modifiable */ + 0x05, /* 0x4f : not user-modifiable */ + 0x00, /* 0x50 : not user-modifiable */ + 0x00, /* 0x51 : not user-modifiable */ + 0x00, /* 0x52 : not user-modifiable */ + 0x00, /* 0x53 : not user-modifiable */ + 0xc8, /* 0x54 : not user-modifiable */ + 0x00, /* 0x55 : not user-modifiable */ + 0x00, /* 0x56 : not user-modifiable */ + 0x38, /* 0x57 : not user-modifiable */ + 0xff, /* 0x58 : not user-modifiable */ + 0x01, /* 0x59 : not user-modifiable */ + 0x00, /* 0x5a : not user-modifiable */ + 0x08, /* 0x5b : not user-modifiable */ + 0x00, /* 0x5c : not user-modifiable */ + 0x00, /* 0x5d : not user-modifiable */ + 0x01, /* 0x5e : not user-modifiable */ + 0xcc, /* 0x5f : not user-modifiable */ + 0x07, /* 0x60 : not user-modifiable */ + 0x01, /* 0x61 : not user-modifiable */ + 0xf1, /* 0x62 : not user-modifiable */ + 0x05, /* 0x63 : not user-modifiable */ + 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), + use SetSigmaThreshold(), default value 90 mm */ + 0xa0, /* 0x65 : Sigma threshold LSB */ + 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), + use SetSignalThreshold() */ + 0x80, /* 0x67 : Min count Rate LSB */ + 0x08, /* 0x68 : not user-modifiable */ + 0x38, /* 0x69 : not user-modifiable */ + 0x00, /* 0x6a : not user-modifiable */ + 0x00, /* 0x6b : not user-modifiable */ + 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, + use SetIntermeasurementInMs() */ + 0x00, /* 0x6d : Intermeasurement period */ + 0x0f, /* 0x6e : Intermeasurement period */ + 0x89, /* 0x6f : Intermeasurement period LSB */ + 0x00, /* 0x70 : not user-modifiable */ + 0x00, /* 0x71 : not user-modifiable */ + 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x73 : distance threshold high LSB */ + 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), + use SetD:tanceThreshold() */ + 0x00, /* 0x75 : distance threshold low LSB */ + 0x00, /* 0x76 : not user-modifiable */ + 0x01, /* 0x77 : not user-modifiable */ + 0x07, /* 0x78 : not user-modifiable */ + 0x05, /* 0x79 : not user-modifiable */ + 0x06, /* 0x7a : not user-modifiable */ + 0x06, /* 0x7b : not user-modifiable */ + 0x00, /* 0x7c : not user-modifiable */ + 0x00, /* 0x7d : not user-modifiable */ + 0x02, /* 0x7e : not user-modifiable */ + 0xc7, /* 0x7f : not user-modifiable */ + 0xff, /* 0x80 : not user-modifiable */ + 0x9B, /* 0x81 : not user-modifiable */ + 0x00, /* 0x82 : not user-modifiable */ + 0x00, /* 0x83 : not user-modifiable */ + 0x00, /* 0x84 : not user-modifiable */ + 0x01, /* 0x85 : not user-modifiable */ + 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ + 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), + If you want an automatic start after VL53L4ED_init() call, + put 0x40 in location 0x87 */ }; -VL53L4ED_Error VL53L4ED_GetSWVersion( - VL53L4ED_Version_t *p_Version) +VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *p_Version) { VL53L4ED_Error Status = VL53L4ED_ERROR_NONE; @@ -143,20 +143,15 @@ VL53L4ED_Error VL53L4ED_GetSWVersion( return Status; } -VL53L4ED_Error VL53L4ED_SetI2CAddress( - Dev_t dev, - uint8_t new_address) +VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, - (uint8_t)(new_address >> (uint8_t)1)); + status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, (uint8_t)(new_address >> (uint8_t)1)); return status; } -VL53L4ED_Error VL53L4ED_GetSensorId( - Dev_t dev, - uint16_t *p_id) +VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -164,69 +159,58 @@ VL53L4ED_Error VL53L4ED_GetSensorId( return status; } -VL53L4ED_Error VL53L4ED_SensorInit( - Dev_t dev) +VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t Addr, tmp; uint8_t continue_loop = 1; uint16_t i = 0; - do{ - status |= VL53L4ED_RdByte(dev, - VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); + do { + status |= VL53L4ED_RdByte(dev, VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); - if(tmp == (uint8_t)0x3) /* Sensor booted */ + if (tmp == (uint8_t)0x3) /* Sensor booted */ { continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for boot */ + } else if (i < (uint16_t)1000) /* Wait for boot */ { i++; - } - else /* Timeout 1000ms reached */ + } else /* Timeout 1000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); /* Load default configuration */ - for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) - { - status |= VL53L4ED_WrByte(dev, Addr, - VL53L4ED_DEFAULT_CONFIGURATION[ - Addr - (uint8_t)0x2D]); + for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) { + status |= VL53L4ED_WrByte(dev, Addr, VL53L4ED_DEFAULT_CONFIGURATION[Addr - (uint8_t)0x2D]); } /* Start VHV */ status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, (uint8_t)0x40); - i = (uint8_t)0; + i = (uint8_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for answer */ + } else if (i < (uint16_t)1000) /* Wait for answer */ { i++; - } - else /* Timeout 1000ms reached */ + } else /* Timeout 1000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_ClearInterrupt(dev); status |= VL53L4ED_StopRanging(dev); - status |= VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, - (uint8_t)0x09); + status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x09); status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0); status |= VL53L4ED_WrWord(dev, 0x0024, 0x500); @@ -235,8 +219,7 @@ VL53L4ED_Error VL53L4ED_SensorInit( return status; } -VL53L4ED_Error VL53L4ED_ClearInterrupt( - Dev_t dev) +VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -244,8 +227,7 @@ VL53L4ED_Error VL53L4ED_ClearInterrupt( return status; } -VL53L4ED_Error VL53L4ED_StartRanging( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint32_t tmp; @@ -253,21 +235,18 @@ VL53L4ED_Error VL53L4ED_StartRanging( status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); /* Sensor runs in continuous mode */ - if(tmp == (uint32_t)0) - { + if (tmp == (uint32_t)0) { status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x21); } /* Sensor runs in autonomous mode */ - else - { + else { status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x40); } return status; } -VL53L4ED_Error VL53L4ED_StopRanging( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -275,9 +254,7 @@ VL53L4ED_Error VL53L4ED_StopRanging( return status; } -VL53L4ED_Error VL53L4ED_CheckForDataReady( - Dev_t dev, - uint8_t *p_is_data_ready) +VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t temp; @@ -287,33 +264,24 @@ VL53L4ED_Error VL53L4ED_CheckForDataReady( temp = temp & (uint8_t)0x10; temp = temp >> 4; - if (temp == (uint8_t)1) - { + if (temp == (uint8_t)1) { int_pol = (uint8_t)0; - } - else - { + } else { int_pol = (uint8_t)1; } status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO__TIO_HV_STATUS, &temp); - if ((temp & (uint8_t)1) == int_pol) - { + if ((temp & (uint8_t)1) == int_pol) { *p_is_data_ready = (uint8_t)1; - } - else - { + } else { *p_is_data_ready = (uint8_t)0; } return status; } -VL53L4ED_Error VL53L4ED_SetRangeTiming( - Dev_t dev, - uint32_t timing_budget_ms, - uint32_t inter_measurement_ms) +VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t clock_pll, osc_frequency, ms_byte; @@ -321,88 +289,67 @@ VL53L4ED_Error VL53L4ED_SetRangeTiming( float_t inter_measurement_factor = (float_t)1.055; status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - if(osc_frequency != (uint16_t)0) - { - timing_budget_us = timing_budget_ms*(uint32_t)1000; - macro_period_us = (uint32_t)((uint32_t)2304 * - ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; - } - else - { + if (osc_frequency != (uint16_t)0) { + timing_budget_us = timing_budget_ms * (uint32_t)1000; + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; + } else { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; } /* Timing budget check validity */ - if ((timing_budget_ms < (uint32_t)10) - || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) - { + if ((timing_budget_ms < (uint32_t)10) || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) { status |= VL53L4ED_ERROR_INVALID_ARGUMENT; } /* Sensor runs in continuous mode */ - else if(inter_measurement_ms == (uint32_t)0) - { - status |= VL53L4ED_WrDWord(dev,VL53L4ED_INTERMEASUREMENT_MS, 0); + else if (inter_measurement_ms == (uint32_t)0) { + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, 0); timing_budget_us -= (uint32_t)2500; } /* Sensor runs in autonomous low power mode */ - else if(inter_measurement_ms > timing_budget_ms) - { - status |= VL53L4ED_RdWord(dev, - VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + else if (inter_measurement_ms > timing_budget_ms) { + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); clock_pll = clock_pll & (uint16_t)0x3FF; - inter_measurement_factor = inter_measurement_factor - * (float_t)inter_measurement_ms - * (float_t)clock_pll; - status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, - (uint32_t)inter_measurement_factor); + inter_measurement_factor = inter_measurement_factor * (float_t)inter_measurement_ms * (float_t)clock_pll; + status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, (uint32_t)inter_measurement_factor); timing_budget_us -= (uint32_t)4300; timing_budget_us /= (uint32_t)2; } /* Invalid case */ - else - { + else { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; } - if(status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) - { - ms_byte = 0; - timing_budget_us = timing_budget_us << 12; - tmp = macro_period_us*(uint32_t)16; - ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) - - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) - + (uint16_t) (ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A,ms_byte); - - ms_byte = 0; - tmp = macro_period_us*(uint32_t)12; - ls_byte = ((timing_budget_us + ((tmp >> 6)>>1)) /(tmp>> 6)) - - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) - + (uint16_t) (ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B,ms_byte); + if (status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) { + ms_byte = 0; + timing_budget_us = timing_budget_us << 12; + tmp = macro_period_us * (uint32_t)16; + ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A, ms_byte); + + ms_byte = 0; + tmp = macro_period_us * (uint32_t)12; + ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; + + while ((ls_byte & 0xFFFFFF00U) > 0U) { + ls_byte = ls_byte >> 1; + ms_byte++; + } + ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B, ms_byte); } return status; } -VL53L4ED_Error VL53L4ED_GetRangeTiming( - Dev_t dev, - uint32_t *p_timing_budget_ms, - uint32_t *p_inter_measurement_ms) +VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t osc_frequency = 1, range_config_macrop_high, clock_pll = 1; @@ -411,107 +358,84 @@ VL53L4ED_Error VL53L4ED_GetRangeTiming( /* Get InterMeasurement */ status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); - status |= VL53L4ED_RdWord(dev, - VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); clock_pll = clock_pll & (uint16_t)0x3FF; clock_pll_factor = clock_pll_factor * (float_t)clock_pll; clock_pll = (uint16_t)clock_pll_factor; - *p_inter_measurement_ms = (uint16_t)(tmp/(uint32_t)clock_pll); + *p_inter_measurement_ms = (uint16_t)(tmp / (uint32_t)clock_pll); /* Get TimingBudget */ status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, - &range_config_macrop_high); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, &range_config_macrop_high); - macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 - / (uint32_t)osc_frequency)) >> 6; + macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; ls_byte = (range_config_macrop_high & (uint32_t)0x00FF) << 4; ms_byte = (range_config_macrop_high & (uint32_t)0xFF00) >> 8; ms_byte = (uint32_t)0x04 - (ms_byte - (uint32_t)1) - (uint32_t)1; macro_period_us = macro_period_us * (uint32_t)16; - *p_timing_budget_ms = (((ls_byte + (uint32_t)1)*(macro_period_us>> 6)) - - ((macro_period_us>> 6)>>1)) >> 12; + *p_timing_budget_ms = (((ls_byte + (uint32_t)1) * (macro_period_us >> 6)) - ((macro_period_us >> 6) >> 1)) >> 12; - if(ms_byte < (uint8_t)12) - { - *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms - >> (uint8_t)ms_byte); + if (ms_byte < (uint8_t)12) { + *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms >> (uint8_t)ms_byte); } - - /* Mode continuous */ - if(tmp == (uint32_t)0) - { + + /* Mode continuous */ + if (tmp == (uint32_t)0) { *p_timing_budget_ms += (uint32_t)2500; - } - /* Mode autonomous */ - else - { - *p_timing_budget_ms *= (uint32_t)2; - *p_timing_budget_ms += (uint32_t)4300; - } + } + /* Mode autonomous */ + else { + *p_timing_budget_ms *= (uint32_t)2; + *p_timing_budget_ms += (uint32_t)4300; + } - *p_timing_budget_ms = *p_timing_budget_ms/(uint32_t)1000; + *p_timing_budget_ms = *p_timing_budget_ms / (uint32_t)1000; return status; } -VL53L4ED_Error VL53L4ED_GetResult( - Dev_t dev, - VL53L4ED_ResultsData_t *p_result) +VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *p_result) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp_16; uint8_t temp_8; - uint8_t status_rtn[24] = { 255, 255, 255, 5, 2, 4, 1, 7, 3, - 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, - 255, 255, 11, 12 }; + uint8_t status_rtn[24] = {255, 255, 255, 5, 2, 4, 1, 7, 3, 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, 255, 255, 11, 12}; - status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, - &temp_8); + status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, &temp_8); temp_8 = temp_8 & (uint8_t)0x1F; - if (temp_8 < (uint8_t)24) - { + if (temp_8 < (uint8_t)24) { temp_8 = status_rtn[temp_8]; } p_result->range_status = temp_8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, - &temp_16); - p_result->number_of_spad = temp_16 / (uint16_t) 256; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, &temp_16); + p_result->number_of_spad = temp_16 / (uint16_t)256; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, - &temp_16); - p_result->signal_rate_kcps = temp_16 * (uint16_t) 8; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, &temp_16); + p_result->signal_rate_kcps = temp_16 * (uint16_t)8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, - &temp_16); - p_result->ambient_rate_kcps = temp_16 * (uint16_t) 8; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, &temp_16); + p_result->ambient_rate_kcps = temp_16 * (uint16_t)8; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, - &temp_16); - p_result->sigma_mm = temp_16 / (uint16_t) 4; + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, &temp_16); + p_result->sigma_mm = temp_16 / (uint16_t)4; - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, - &temp_16); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, &temp_16); p_result->distance_mm = temp_16; - p_result->signal_per_spad_kcps = p_result->signal_rate_kcps - /p_result->number_of_spad; - p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps - /p_result->number_of_spad; + p_result->signal_per_spad_kcps = p_result->signal_rate_kcps / p_result->number_of_spad; + p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps / p_result->number_of_spad; return status; } -VL53L4ED_Error VL53L4ED_SetOffset( - Dev_t dev, - int16_t OffsetValueInMm) +VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp; - temp = (uint16_t)((uint16_t)OffsetValueInMm*(uint16_t)4); + temp = (uint16_t)((uint16_t)OffsetValueInMm * (uint16_t)4); status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, temp); status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, (uint8_t)0x0); @@ -519,65 +443,49 @@ VL53L4ED_Error VL53L4ED_SetOffset( return status; } -VL53L4ED_Error VL53L4ED_GetOffset( - Dev_t dev, - int16_t *p_offset) +VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *p_offset) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t temp; - status |= VL53L4ED_RdWord(dev,VL53L4ED_RANGE_OFFSET_MM, &temp); + status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_OFFSET_MM, &temp); - temp = temp<<3; - temp = temp>>5; + temp = temp << 3; + temp = temp >> 5; *p_offset = (int16_t)(temp); - if(*p_offset > 1024) - { + if (*p_offset > 1024) { *p_offset = *p_offset - 2048; } return status; } -VL53L4ED_Error VL53L4ED_SetXtalk( - Dev_t dev, - uint16_t XtalkValueKcps) +VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, - (XtalkValueKcps<<9)); - + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, (XtalkValueKcps << 9)); + return status; } -VL53L4ED_Error VL53L4ED_GetXtalk( - Dev_t dev, - uint16_t *p_xtalk_kcps) +VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; float_t tmp_xtalk; - status |= VL53L4ED_RdWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); - + status |= VL53L4ED_RdWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); + tmp_xtalk = (float_t)*p_xtalk_kcps / (float_t)512.0; *p_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); return status; } -VL53L4ED_Error VL53L4ED_SetDetectionThresholds( - Dev_t dev, - uint16_t distance_low_mm, - uint16_t distance_high_mm, - uint8_t window) +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; @@ -587,14 +495,11 @@ VL53L4ED_Error VL53L4ED_SetDetectionThresholds( return status; } -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, - uint16_t *p_distance_low_mm, - uint16_t *p_distance_high_mm, - uint8_t *p_window) +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH,p_distance_high_mm); + status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH, p_distance_high_mm); status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_LOW, p_distance_low_mm); status |= VL53L4ED_RdByte(dev, VL53L4ED_SYSTEM__INTERRUPT, p_window); *p_window = (*p_window & (uint8_t)0x7); @@ -602,98 +507,78 @@ VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, return status; } -VL53L4ED_Error VL53L4ED_SetSignalThreshold( - Dev_t dev, - uint16_t signal_kcps) +VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status |= VL53L4ED_WrWord(dev, - VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS,signal_kcps>>3); + status |= VL53L4ED_WrWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, signal_kcps >> 3); return status; } -VL53L4ED_Error VL53L4ED_GetSignalThreshold( - Dev_t dev, - uint16_t *p_signal_kcps) +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint16_t tmp = 0; - status |= VL53L4ED_RdWord(dev, - VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); - *p_signal_kcps = tmp <<3; + status |= VL53L4ED_RdWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); + *p_signal_kcps = tmp << 3; return status; } -VL53L4ED_Error VL53L4ED_SetSigmaThreshold( - Dev_t dev, - uint16_t sigma_mm) +VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - if(sigma_mm>(uint16_t)((uint16_t)0xFFFF>>2)) - { + if (sigma_mm > (uint16_t)((uint16_t)0xFFFF >> 2)) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { - status |= VL53L4ED_WrWord(dev, - VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm<<2); + } else { + status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm << 2); } return status; } -VL53L4ED_Error VL53L4ED_GetSigmaThreshold( - Dev_t dev, - uint16_t *p_sigma_mm) +VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - status += VL53L4ED_RdWord(dev, - VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); + status += VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); *p_sigma_mm = *p_sigma_mm >> 2; return status; } -VL53L4ED_Error VL53L4ED_StartTemperatureUpdate( - Dev_t dev) +VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t tmp = 0, continue_loop = 1; uint16_t i = 0; - status |= VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); + status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0x92); status |= VL53L4ED_StartRanging(dev); - do{ - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } - else if(i < (uint16_t)1000) /* Wait for answer */ - { - i++; - } - else /* Timeout 1000ms reached */ - { - continue_loop = (uint8_t)0; - status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + do { + status |= VL53L4ED_CheckForDataReady(dev, &tmp); + if (tmp == (uint8_t)1) /* Data ready */ + { + continue_loop = (uint8_t)0; + } else if (i < (uint16_t)1000) /* Wait for answer */ + { + i++; + } else /* Timeout 1000ms reached */ + { + continue_loop = (uint8_t)0; + status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; + } + VL53L4ED_WaitMs(dev, 1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_ClearInterrupt(dev); status |= VL53L4ED_StopRanging(dev); - status += VL53L4ED_WrByte(dev, - VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); + status += VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); status += VL53L4ED_WrByte(dev, 0x0B, 0); return status; } diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h index df55ef3d0..e5d7acf2b 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #ifndef VL53L4ED_API_H_ #define VL53L4ED_API_H_ @@ -19,10 +19,10 @@ * @brief Driver version */ -#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 -#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 +#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 +#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 +#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 /** * @brief Driver error type @@ -30,58 +30,56 @@ typedef uint8_t VL53L4ED_Error; -#define VL53L4ED_ERROR_NONE ((uint8_t)0U) -#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) -#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) -#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) - +#define VL53L4ED_ERROR_NONE ((uint8_t)0U) +#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) +#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) +#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) /** * @brief Inner Macro for API. Not for user, only for development. */ #define VL53L4ED_SOFT_RESET ((uint16_t)0x0000)) -#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) -#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) +#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) +#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) #define VL53L4ED_XTALK_PLANE_OFFSET_KCPS ((uint16_t)0x0016) -#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) -#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) -#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) -#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) -#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) -#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) -#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) -#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) -#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) -#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) -#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) -#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) +#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) +#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) +#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) +#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) +#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) +#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) +#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) +#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) +#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) +#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) +#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) +#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) #define VL53L4ED_INTERMEASUREMENT_MS ((uint16_t)0x006C) -#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) -#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) -#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) -#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) -#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) -#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) -#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) -#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) -#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) -#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) - - -#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) -#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) -#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) +#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) +#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) +#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) +#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) +#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) +#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) +#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) +#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) +#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) +#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) + +#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) +#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) +#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) /** * @brief defines Software Version */ typedef struct { - uint8_t major; /*!< major number */ - uint8_t minor; /*!< minor number */ - uint8_t build; /*!< build number */ - uint32_t revision; /*!< revision number */ + uint8_t major; /*!< major number */ + uint8_t minor; /*!< minor number */ + uint8_t build; /*!< build number */ + uint32_t revision; /*!< revision number */ } VL53L4ED_Version_t; /** @@ -115,9 +113,7 @@ typedef struct { * @return (VL53L4ED_ERROR) status : 0 if SW version is OK. */ -VL53L4ED_Error VL53L4ED_GetSWVersion( - VL53L4ED_Version_t *pVersion); - +VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *pVersion); /** * @brief This function sets a new I2C address to a sensor. It can be used for @@ -128,9 +124,7 @@ VL53L4ED_Error VL53L4ED_GetSWVersion( * programmed. */ -VL53L4ED_Error VL53L4ED_SetI2CAddress( - Dev_t dev, - uint8_t new_address); +VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address); /** * @brief This function is used to get the sensor id of VL53L4ED. The sensor id @@ -140,9 +134,7 @@ VL53L4ED_Error VL53L4ED_SetI2CAddress( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetSensorId( - Dev_t dev, - uint16_t *p_id); +VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id); /** * @brief This function is used to initialize the sensor. @@ -150,8 +142,7 @@ VL53L4ED_Error VL53L4ED_GetSensorId( * @return (VL53L4ED_ERROR) status : 0 if init is OK. */ -VL53L4ED_Error VL53L4ED_SensorInit( - Dev_t dev); +VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev); /** * @brief This function clears the interrupt. It needs to be called after a @@ -160,8 +151,7 @@ VL53L4ED_Error VL53L4ED_SensorInit( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_ClearInterrupt( - Dev_t dev); +VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev); /** * @brief This function starts a ranging session. The ranging operation is @@ -171,8 +161,7 @@ VL53L4ED_Error VL53L4ED_ClearInterrupt( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_StartRanging( - Dev_t dev); +VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev); /** * @brief This function stops the ranging in progress. @@ -180,8 +169,7 @@ VL53L4ED_Error VL53L4ED_StartRanging( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_StopRanging( - Dev_t dev); +VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev); /** * @brief This function check if a new data is available by polling a dedicated @@ -192,9 +180,7 @@ VL53L4ED_Error VL53L4ED_StopRanging( * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_CheckForDataReady( - Dev_t dev, - uint8_t *p_is_data_ready); +VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready); /** * @brief This function sets new range timing. Timing are composed of @@ -213,10 +199,7 @@ VL53L4ED_Error VL53L4ED_CheckForDataReady( * @return (uint8_t) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_SetRangeTiming( - Dev_t dev, - uint32_t timing_budget_ms, - uint32_t inter_measurement_ms); +VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms); /** * @brief This function gets the current range timing. Timing are composed of @@ -232,10 +215,7 @@ VL53L4ED_Error VL53L4ED_SetRangeTiming( * @return (uint8_t) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetRangeTiming( - Dev_t dev, - uint32_t *p_timing_budget_ms, - uint32_t *p_inter_measurement_ms); +VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms); /** * @brief This function gets the results reported by the sensor. @@ -310,11 +290,7 @@ VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps); * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, - uint16_t distance_low_mm, - uint16_t distance_high_mm, - uint8_t window); - +VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window); /** * @brief This function gets the current detection thresholds. The detection @@ -330,10 +306,7 @@ VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, - uint16_t *p_distance_low_mm, - uint16_t *p_distance_high_mm, - uint8_t *p_window); +VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window); /** * @brief This function sets a new signal threshold in kcps. If a @@ -357,8 +330,7 @@ VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps); * @return (VL53L4ED_ERROR) status : 0 if OK. */ -VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, - uint16_t *p_signal_kcps); +VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps); /** * @brief This function programs a new sigma threshold. The sigma corresponds to @@ -372,9 +344,7 @@ VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, * high. */ -VL53L4ED_Error VL53L4ED_SetSigmaThreshold( - Dev_t dev, - uint16_t sigma_mm); +VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm); /** * @brief This function gets the current sigma threshold. The sigma corresponds @@ -386,9 +356,7 @@ VL53L4ED_Error VL53L4ED_SetSigmaThreshold( * @return (VL53L4ED_ERROR) status : 0 if programming is OK. */ -VL53L4ED_Error VL53L4ED_GetSigmaThreshold( - Dev_t dev, - uint16_t *p_sigma_mm); +VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm); /** * @brief This function can be called when the temperature might have changed by @@ -402,4 +370,4 @@ VL53L4ED_Error VL53L4ED_GetSigmaThreshold( VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev); -#endif //VL53L4ED_API_H_ +#endif // VL53L4ED_API_H_ diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c index e3d95c223..6a0d96eb1 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c @@ -1,29 +1,27 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_calibration.c * @brief Calibration functions implementation */ +#include "VL53L4ED_calibration.h" + #include + #include "VL53L4ED_api.h" -#include "VL53L4ED_calibration.h" -VL53L4ED_Error VL53L4ED_CalibrateOffset( - Dev_t dev, - int16_t TargetDistInMm, - int16_t *p_measured_offset_mm, - int16_t nb_samples) +VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t i, tmp, continue_loop; @@ -31,14 +29,9 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( int16_t AvgDistance = 0; VL53L4ED_ResultsData_t results; - if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) - || ((TargetDistInMm < (int16_t)10) - || (TargetDistInMm > (int16_t)1000))) - { + if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)1000))) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { + } else { status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, 0x0); status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, 0x0); status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, 0x0); @@ -49,23 +42,21 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); } @@ -77,23 +68,21 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { - continue_loop = (uint8_t)0; + continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); @@ -103,18 +92,14 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( status |= VL53L4ED_StopRanging(dev); AvgDistance = AvgDistance / nb_samples; *p_measured_offset_mm = (int16_t)TargetDistInMm - AvgDistance; - tmpOff = (uint16_t) *p_measured_offset_mm * (uint16_t)4; + tmpOff = (uint16_t)*p_measured_offset_mm * (uint16_t)4; status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, tmpOff); } return status; } -VL53L4ED_Error VL53L4ED_CalibrateXtalk( - Dev_t dev, - int16_t TargetDistInMm, - uint16_t *p_measured_xtalk_kcps, - int16_t nb_samples) +VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples) { VL53L4ED_Error status = VL53L4ED_ERROR_NONE; uint8_t i, tmp, continue_loop; @@ -128,17 +113,11 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( uint16_t calXtalk, j; *p_measured_xtalk_kcps = 0; - if(((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) - || ((TargetDistInMm < (int16_t)10) - || (TargetDistInMm > (int16_t)5000))) - { + if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)5000))) { status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - else - { + } else { /* Disable Xtalk compensation */ - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); /* Device heat loop (10 samples) */ status |= VL53L4ED_StartRanging(dev); @@ -146,23 +125,21 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); } @@ -170,36 +147,31 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( /* Device ranging loop */ status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)nb_samples; i++) - { + for (i = 0; i < (uint8_t)nb_samples; i++) { tmp = (uint8_t)0; j = (uint16_t)0; continue_loop = (uint8_t)1; - do{ + do { status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if(tmp == (uint8_t)1) /* Data ready */ + if (tmp == (uint8_t)1) /* Data ready */ { continue_loop = (uint8_t)0; - } - else if(j < (uint16_t)5000) /* Wait for answer*/ + } else if (j < (uint16_t)5000) /* Wait for answer*/ { j++; - } - else /* Timeout 5000ms reached */ + } else /* Timeout 5000ms reached */ { - continue_loop = (uint8_t)0; + continue_loop = (uint8_t)0; status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; } VL53L4ED_WaitMs(dev, 1); - }while(continue_loop == (uint8_t)1); + } while (continue_loop == (uint8_t)1); status |= VL53L4ED_GetResult(dev, &results); status |= VL53L4ED_ClearInterrupt(dev); /* Discard invalid measurements and first frame */ - if (results.range_status == (uint8_t)0 - && i > (uint8_t)0) - { + if (results.range_status == (uint8_t)0 && i > (uint8_t)0) { AvgDistance += (float_t)results.distance_mm; AverageSpadNb += (float_t)results.number_of_spad; AverageSignal += (float_t)results.signal_rate_kcps; @@ -208,32 +180,25 @@ VL53L4ED_Error VL53L4ED_CalibrateXtalk( } status |= VL53L4ED_StopRanging(dev); - if (CounterNbSamples == 0) - { + if (CounterNbSamples == 0) { status = VL53L4ED_ERROR_XTALK_FAILED; - } - else - { + } else { AvgDistance /= CounterNbSamples; AverageSpadNb /= CounterNbSamples; AverageSignal /= CounterNbSamples; - tmp_xtalk = (float_t)1.0 - (AvgDistance/TargetDistance); - tmp_xtalk *= (AverageSignal/AverageSpadNb); + tmp_xtalk = (float_t)1.0 - (AvgDistance / TargetDistance); + tmp_xtalk *= (AverageSignal / AverageSpadNb); /* 127kcps is the max Xtalk value (65536/512) */ - if(tmp_xtalk > (uint16_t)127) - { + if (tmp_xtalk > (uint16_t)127) { status = VL53L4ED_ERROR_XTALK_FAILED; - } - else - { + } else { *p_measured_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); /* Send data to firmware */ calXtalk = (uint16_t)(tmp_xtalk * (float_t)512.0); - status |= VL53L4ED_WrWord(dev, - VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); + status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); } } } diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h index c953d0239..97daa1d3c 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ /** * @file vl53l4ed_calibration.h @@ -38,12 +38,7 @@ * invalid nb of samples). */ -VL53L4ED_Error VL53L4ED_CalibrateOffset( - Dev_t dev, - int16_t TargetDistInMm, - int16_t *p_measured_offset_mm, - int16_t nb_samples); - +VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples); /** * @brief This function can be used to perform a Xtalk calibration. Xtalk @@ -63,11 +58,7 @@ VL53L4ED_Error VL53L4ED_CalibrateOffset( * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g * invalid nb of samples). */ - -VL53L4ED_Error VL53L4ED_CalibrateXtalk( - Dev_t dev, - int16_t TargetDistInMm, - uint16_t *p_measured_xtalk_kcps, - int16_t nb_samples); -#endif //VL53L4ED_CALIBRATION_H_ +VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples); + +#endif // VL53L4ED_CALIBRATION_H_ diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c index ba3d6f1a6..cf09e50e7 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c @@ -1,25 +1,25 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #include "platform.h" -#include "main.h" + #include "i2c.h" +#include "main.h" extern I2C_HandleTypeDef hi2c1; - /* Im legit just using the example stm provides but instead of filling everything out im only copying the platform.c implemintation -for the vl53l4ed sensor. +for the vl53l4ed sensor. */ @@ -34,8 +34,7 @@ uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t *value) data_write[1] = RegisterAdress & 0xFF; status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 4, 100); - *value = ((data_read[0] << 24) | (data_read[1]<<16) | - (data_read[2]<<8)| (data_read[3])); + *value = ((data_read[0] << 24) | (data_read[1] << 16) | (data_read[2] << 8) | (data_read[3])); return status; } diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h index ee27e91f2..9c7754970 100644 --- a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h +++ b/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h @@ -1,14 +1,14 @@ /** - * - * 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. - * - ****************************************************************************** - */ + * + * 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. + * + ****************************************************************************** + */ #ifndef _PLATFORM_H_ #define _PLATFORM_H_ @@ -18,8 +18,8 @@ #include /** -* VL53L4ED device instance. -*/ + * VL53L4ED device instance. + */ typedef uint16_t Dev_t; @@ -33,8 +33,7 @@ typedef uint8_t VL53L4ED_Error; * with I2C Fast Mode Plus (up to 1MHz). Otherwise, default max value is 400kHz. */ -//#define VL53L4ED_I2C_FAST_MODE_PLUS - +// #define VL53L4ED_I2C_FAST_MODE_PLUS /** * @brief Read 32 bits through I2C. @@ -77,4 +76,4 @@ uint8_t VL53L4ED_WrDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t value); uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t TimeMs); -#endif // _PLATFORM_H_ \ No newline at end of file +#endif // _PLATFORM_H_ \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Extras/extra.c b/SAMM/IMUandTOF/Core/Extras/extra.c index 3611c8904..25519615c 100644 --- a/SAMM/IMUandTOF/Core/Extras/extra.c +++ b/SAMM/IMUandTOF/Core/Extras/extra.c @@ -1,58 +1,57 @@ #include "extra.h" -#include "main.h" -#include "i2c.h" + #include +#include "i2c.h" +#include "main.h" void MLX90640_I2CInit(void) { - MX_I2C2_Init(); - return; + MX_I2C2_Init(); + return; } int MLX90640_I2CGeneralReset(void) { - uint8_t data = 0x06; - return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data , 1, 1000); + uint8_t data = 0x06; + return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data, 1, 1000); } - -int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) { - //HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); - //HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); - /* - HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size) - */ - //return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 10000); + // HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); + // HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); + /* + HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, + uint16_t MemAddSize, uint8_t *pData, uint16_t Size) + */ + // return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 10000); } int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) { - // union - // { - // uint8_t bytes[2]; - // uint16_t data; - // }extra = {.data = data}; - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); - //return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); + // union + // { + // uint8_t bytes[2]; + // uint16_t data; + // }extra = {.data = data}; + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); + // return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); } void MLX90640_I2CFreqSet(int freq) { - return; + return; } -uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) +uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) { - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2*nMemAddressRead, 500); + return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 500); } -uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data) +uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) { - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *) &data, 2, 500); + return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 500); } - diff --git a/SAMM/IMUandTOF/Core/Extras/extra.h b/SAMM/IMUandTOF/Core/Extras/extra.h index 2b820f432..f032f86ab 100644 --- a/SAMM/IMUandTOF/Core/Extras/extra.h +++ b/SAMM/IMUandTOF/Core/Extras/extra.h @@ -9,12 +9,11 @@ This is for some xtra fucntions that would be needed later on void MLX90640_I2CInit(void); int MLX90640_I2CGeneralReset(void); -int MLX90640_I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -int MLX90640_I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); void MLX90640_I2CFreqSet(int freq); - -uint8_t I2CRead(uint8_t slaveAddr,uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -uint8_t I2CWrite(uint8_t slaveAddr,uint16_t writeAddress, uint16_t data); +uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); +uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); #endif /* __EXTRA_H__ */ \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Inc/adc.h b/SAMM/IMUandTOF/Core/Inc/adc.h index 5692f3846..e65b1f6f8 100644 --- a/SAMM/IMUandTOF/Core/Inc/adc.h +++ b/SAMM/IMUandTOF/Core/Inc/adc.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file adc.h + * @brief This file contains all the function prototypes for + * the adc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __ADC_H__ @@ -49,4 +49,3 @@ void MX_ADC1_Init(void); #endif #endif /* __ADC_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/bmi323.h b/SAMM/IMUandTOF/Core/Inc/bmi323.h index f434cb8dd..3299db7ab 100644 --- a/SAMM/IMUandTOF/Core/Inc/bmi323.h +++ b/SAMM/IMUandTOF/Core/Inc/bmi323.h @@ -1,14 +1,13 @@ #ifndef BMI323_H #define BMI323_H -//includes - +// includes #include "main.h" #include "spi.h" #include "stm32g474xx.h" -//BMI323 register defines +// BMI323 register defines #define BMI323_CHIP_ID 0x00 #define BMI323_ERR_REG 0x01 @@ -54,11 +53,11 @@ #define BMI323_CMD 0x7E #define BMI323_CFG_RES 0x7F -//BMI323 potential spi address +// BMI323 potential spi address #define BMI323_I2C_ADDR 0x68 #define BMI323_I2C_ADDR_ALT 0x69 -//BMI323 sub-defines for registers +// BMI323 sub-defines for registers #define BMI323_CHIP_ID_RESET_VAL 0x0043 #define BMI323_ERR_REG_RESET_VAL 0x0000 #define BMI323_STATUS_RESET_VAL 0x0001 @@ -95,25 +94,24 @@ #define BMI323_CMD_RESET_VAL 0x0000 #define BMI323_CFG_RES_RESET_VAL 0x0000 -//defines for commands +// defines for commands #define BMI323_CMD_SOFT_RESET 0xDEAF #define BMI323_CMD_CALIB 0x0101 #define BMI323_CMD_CALIB_ABORT 0x0200 -//defines for features +// defines for features #define BMI323_FEATURE_IO2_EN 0x012C #define BMI323_FEATURE_IO_STS 0x0001 #define BMI323_FEATURE_CTRL_ENGINE_EN 0x0001 #define BMI323_FEATURE_IO1_STATUS 0x0001 - -//defines for acc and gyro conf +// defines for acc and gyro conf #define SUSPEND 0b000 #define LOW_POWER 0b011 #define HIGH_PERF 0b111 #define NORMAL 0b100 -//these are the values that are used for the polling frequency +// these are the values that are used for the polling frequency #define ODR_0_78 0x1 #define ODR_1_56 0x2 #define ODR_3_12 0x3 @@ -129,11 +127,11 @@ #define ODR_3200 0xD #define ODR_6400 0xE -//these are the values that are used for the -3dB bandwidth +// these are the values that are used for the -3dB bandwidth #define ODR_DIV_2 0x0 #define ODR_DIV_4 0x1 -//these are defines for the sample averaging +// these are defines for the sample averaging #define AVG_0 0x0 #define AVG_2 0x1 #define AVG_4 0x2 @@ -142,14 +140,14 @@ #define AVG_32 0x5 #define AVG_64 0x6 -//acc specific defines for range +// acc specific defines for range #define ACC_RANGE_2G 0x0 #define ACC_RANGE_4G 0x1 #define ACC_RANGE_8G 0x2 #define ACC_RANGE_16G 0x3 -//gyro specific defines for range -//WRONG VALUES +// gyro specific defines for range +// WRONG VALUES #define GYR_RANGE_2000 0x0 #define GYR_RANGE_1000 0x1 #define GYR_RANGE_500 0x2 @@ -157,14 +155,13 @@ #define BMI323_TIMEOUT 1000 -typedef struct -{ - SPI_HandleTypeDef *spi_port; - uint16_t chip_id; - GPIO_TypeDef *port; - uint16_t pin; - /* data */ -} bmi323 ; +typedef struct { + SPI_HandleTypeDef *spi_port; + uint16_t chip_id; + GPIO_TypeDef *port; + uint16_t pin; + /* data */ +} bmi323; uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin); uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg); @@ -195,6 +192,4 @@ uint8_t bmi323_read_acc(bmi323 *bmi323_dev, int16_t *acc_data); uint8_t bmi323_read_gyr(bmi323 *bmi323_dev, int16_t *gyr_data); uint8_t bmi323_read_all(bmi323 *bmi323_dev, int16_t *temp_data); - - #endif // BMI323_H \ No newline at end of file diff --git a/SAMM/IMUandTOF/Core/Inc/crc.h b/SAMM/IMUandTOF/Core/Inc/crc.h index 836835d02..133957e92 100644 --- a/SAMM/IMUandTOF/Core/Inc/crc.h +++ b/SAMM/IMUandTOF/Core/Inc/crc.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file crc.h - * @brief This file contains all the function prototypes for - * the crc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __CRC_H__ @@ -49,4 +49,3 @@ void MX_CRC_Init(void); #endif #endif /* __CRC_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/dma.h b/SAMM/IMUandTOF/Core/Inc/dma.h index f3b1a09f9..7774831e0 100644 --- a/SAMM/IMUandTOF/Core/Inc/dma.h +++ b/SAMM/IMUandTOF/Core/Inc/dma.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file dma.h - * @brief This file contains all the function prototypes for - * the dma.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __DMA_H__ @@ -49,4 +49,3 @@ void MX_DMA_Init(void); #endif #endif /* __DMA_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/fdcan.h b/SAMM/IMUandTOF/Core/Inc/fdcan.h index 9289ea3a6..a5cc22f04 100644 --- a/SAMM/IMUandTOF/Core/Inc/fdcan.h +++ b/SAMM/IMUandTOF/Core/Inc/fdcan.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __FDCAN_H__ @@ -52,4 +52,3 @@ void MX_FDCAN2_Init(void); #endif #endif /* __FDCAN_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/gpio.h b/SAMM/IMUandTOF/Core/Inc/gpio.h index 708bac71d..843d4e9e7 100644 --- a/SAMM/IMUandTOF/Core/Inc/gpio.h +++ b/SAMM/IMUandTOF/Core/Inc/gpio.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __GPIO_H__ @@ -46,4 +46,3 @@ void MX_GPIO_Init(void); } #endif #endif /*__ GPIO_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/i2c.h b/SAMM/IMUandTOF/Core/Inc/i2c.h index 84ed75d2e..64f5543e6 100644 --- a/SAMM/IMUandTOF/Core/Inc/i2c.h +++ b/SAMM/IMUandTOF/Core/Inc/i2c.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __I2C_H__ @@ -49,4 +49,3 @@ void MX_I2C1_Init(void); #endif #endif /* __I2C_H__ */ - diff --git a/SAMM/IMUandTOF/Core/Inc/main.h b/SAMM/IMUandTOF/Core/Inc/main.h index 17a2fe760..32df0ac37 100644 --- a/SAMM/IMUandTOF/Core/Inc/main.h +++ b/SAMM/IMUandTOF/Core/Inc/main.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -28,17 +28,16 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32g4xx_hal.h" - -#include "stm32g4xx_ll_rcc.h" #include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_crs.h" -#include "stm32g4xx_ll_system.h" -#include "stm32g4xx_ll_exti.h" #include "stm32g4xx_ll_cortex.h" -#include "stm32g4xx_ll_utils.h" -#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_crs.h" #include "stm32g4xx_ll_dma.h" +#include "stm32g4xx_ll_exti.h" #include "stm32g4xx_ll_gpio.h" +#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_rcc.h" +#include "stm32g4xx_ll_system.h" +#include "stm32g4xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/IMUandTOF/Core/Inc/spi.h b/SAMM/IMUandTOF/Core/Inc/spi.h index 434f0eeb8..795f9dd81 100644 --- a/SAMM/IMUandTOF/Core/Inc/spi.h +++ b/SAMM/IMUandTOF/Core/Inc/spi.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __SPI_H__ diff --git a/SAMM/IMUandTOF/Core/Inc/stm32_assert.h b/SAMM/IMUandTOF/Core/Inc/stm32_assert.h index 61631c41e..92460620f 100644 --- a/SAMM/IMUandTOF/Core/Inc/stm32_assert.h +++ b/SAMM/IMUandTOF/Core/Inc/stm32_assert.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32_assert.h - * @author MCD Application Team - * @brief STM32 assert file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32_assert.h + * @author MCD Application Team + * @brief STM32 assert file. + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __STM32_ASSERT_H @@ -29,15 +29,15 @@ extern "C" { /* Exported constants --------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t *file, uint32_t line); @@ -50,4 +50,3 @@ void assert_failed(uint8_t *file, uint32_t line); #endif #endif /* __STM32_ASSERT_H */ - diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h index 4087e183c..af665f477 100644 --- a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h +++ b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file - ****************************************************************************** + ****************************************************************************** + * @file stm32g4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -23,7 +23,7 @@ #define STM32G4xx_HAL_CONF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Exported types ------------------------------------------------------------*/ @@ -31,12 +31,12 @@ /* ########################## Module Selection ############################## */ /** - * @brief This is the list of modules to be used in the HAL driver - */ + * @brief This is the list of modules to be used in the HAL driver + */ #define HAL_MODULE_ENABLED - /*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_ADC_MODULE_ENABLED */ /*#define HAL_COMP_MODULE_ENABLED */ /*#define HAL_CORDIC_MODULE_ENABLED */ #define HAL_CRC_MODULE_ENABLED @@ -76,122 +76,123 @@ /* ########################## Register Callbacks selection ############################## */ /** - * @brief This is the list of modules where register callback can be used - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U -#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* ########################## Oscillator Values adaptation ####################*/ /** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined(HSE_VALUE) +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined(HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ /** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined(HSI_VALUE) +#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined (HSI48_VALUE) - #define HSI48_VALUE (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined(HSI48_VALUE) +#define HSI48_VALUE \ + (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. \ + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ /** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined(LSI_VALUE) /*!< Value of the Internal Low Speed oscillator in Hz The real value may vary depending on the variations in voltage and temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined(LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ -#if !defined (LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ +#if !defined(LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ /** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined (EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined(EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, === you can define the HSE value in your toolchain compiler preprocessor. */ /* ########################### System Configuration ######################### */ /** - * @brief This is the HAL system configuration section - */ + * @brief This is the HAL system configuration section + */ -#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 0U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U /* ########################## Assert Selection ############################## */ /** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ /* #define USE_FULL_ASSERT 1U */ /* ################## SPI peripheral configuration ########################## */ @@ -201,12 +202,12 @@ The real value may vary depending on the variations in voltage and temperature.* * Deactivated: CRC code cleaned from driver */ -#define USE_SPI_CRC 0U +#define USE_SPI_CRC 0U /* Includes ------------------------------------------------------------------*/ /** - * @brief Include module's header file - */ + * @brief Include module's header file + */ #ifdef HAL_RCC_MODULE_ENABLED #include "stm32g4xx_hal_rcc.h" @@ -357,15 +358,15 @@ The real value may vary depending on the variations in voltage and temperature.* #endif /* HAL_WWDG_MODULE_ENABLED */ /* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ void assert_failed(uint8_t *file, uint32_t line); diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h index e12321bcf..13530cb56 100644 --- a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h +++ b/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h @@ -1,20 +1,20 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ diff --git a/SAMM/IMUandTOF/Core/Src/adc.c b/SAMM/IMUandTOF/Core/Src/adc.c index 15733df47..fbcfbe933 100644 --- a/SAMM/IMUandTOF/Core/Src/adc.c +++ b/SAMM/IMUandTOF/Core/Src/adc.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "adc.h" @@ -30,123 +30,117 @@ ADC_HandleTypeDef hadc1; void MX_ADC1_Init(void) { - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.GainCompensation = 0; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DMAContinuousRequests = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = ENABLE; - hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; - hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; - hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; - hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure the ADC multi-mode - */ - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ - + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.GainCompensation = 0; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_7; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ } -void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspInit 0 */ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspInit 0 */ - /* USER CODE END ADC1_MspInit 0 */ - LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + /* USER CODE END ADC1_MspInit 0 */ + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); - /* ADC1 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); + /* ADC1 clock enable */ + __HAL_RCC_ADC12_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN ADC1_MspInit 1 */ + /* USER CODE BEGIN ADC1_MspInit 1 */ - /* USER CODE END ADC1_MspInit 1 */ - } + /* USER CODE END ADC1_MspInit 1 */ + } } -void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) +void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) { - if(adcHandle->Instance==ADC1) - { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC12_CLK_DISABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - /* USER CODE BEGIN ADC1_MspDeInit 1 */ + /* USER CODE BEGIN ADC1_MspDeInit 1 */ - /* USER CODE END ADC1_MspDeInit 1 */ - } + /* USER CODE END ADC1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/bmi323.c b/SAMM/IMUandTOF/Core/Src/bmi323.c index 125342eb4..30d292042 100644 --- a/SAMM/IMUandTOF/Core/Src/bmi323.c +++ b/SAMM/IMUandTOF/Core/Src/bmi323.c @@ -1,61 +1,64 @@ #include "bmi323.h" + #include -#include "stm32g4xx_hal_spi.h" + #include "stm32g474xx.h" +#include "stm32g4xx_hal_spi.h" -//init spi port before calling this function -uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin){ - uint8_t tx_word[4]; - uint8_t rx_word[4] = {0}; - uint8_t status = 0; - bmi323_dev->spi_port = spi_port; - bmi323_dev->port = port; - bmi323_dev->pin = pin; - tx_word[1] = (BMI323_CHIP_ID << 8); - tx_word[1] |= 0x80; - tx_word[0] = 0x69; - /* - Okay so for one of these transmits we need to follow the following operation:bmi323_dev - 1. to read the register we want to: - transmit first 8 bytes, then transmit a fake 8 bytes - after we want to read 16 bytes. This should complete a single read - */ - //first we read do the dummy read to switch to spi mode - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); - // rx_word = 0; - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); - if(rx_word[3] == 0x43){ - return HAL_OK; - } - return HAL_ERROR; +// init spi port before calling this function +uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) +{ + uint8_t tx_word[4]; + uint8_t rx_word[4] = {0}; + uint8_t status = 0; + bmi323_dev->spi_port = spi_port; + bmi323_dev->port = port; + bmi323_dev->pin = pin; + tx_word[1] = (BMI323_CHIP_ID << 8); + tx_word[1] |= 0x80; + tx_word[0] = 0x69; + /* + Okay so for one of these transmits we need to follow the following operation:bmi323_dev + 1. to read the register we want to: + transmit first 8 bytes, then transmit a fake 8 bytes + after we want to read 16 bytes. This should complete a single read + */ + // first we read do the dummy read to switch to spi mode + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + // rx_word = 0; + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + if (rx_word[3] == 0x43) { + return HAL_OK; + } + return HAL_ERROR; } - - /* TODO: VIN DO THESE FUNCYIONS */ -uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg){ - uint16_t data; - // i2c_read_single(BMI323_I2C_ADDR, reg, &data, bmi323_dev->i2c_port); - return data; +uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg) +{ + uint16_t data; + // i2c_read_single(BMI323_I2C_ADDR, reg, &data, bmi323_dev->i2c_port); + return data; } -uint8_t bmi323_write(bmi323 *bmi323_dev, uint8_t reg, uint16_t data){ - // i2c_write(BMI323_I2C_ADDR, reg, data, bmi323_dev->i2c_port); - return 1; +uint8_t bmi323_write(bmi323 *bmi323_dev, uint8_t reg, uint16_t data) +{ + // i2c_write(BMI323_I2C_ADDR, reg, data, bmi323_dev->i2c_port); + return 1; } -uint8_t bmi323_soft_reset(bmi323 *bmi323_dev){ - bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_SOFT_RESET); - return 1; +uint8_t bmi323_soft_reset(bmi323 *bmi323_dev) +{ + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_SOFT_RESET); + return 1; } - /* CALIBRATION PROCEDURE. VERY DANGEROUS. ONLY USE IF YOU KNOW WHAT YOU ARE DOING THIS FUNCTION IS BLOCKING, CAN TAKE UP TO 3 SECONDS TO TIMEOUT @@ -72,130 +75,130 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT 8. If successful, reset the accelerometer and gyro to their original configuration 9. Done */ -uint8_t bmi323_calib(bmi323 *bmi323_dev){ - //first we have to fucking start the feature engine - //to do that we have to disable all sensors - uint16_t acc_conf = bmi323_read(bmi323_dev, BMI323_ACC_CONF); - uint16_t gyro_conf = bmi323_read(bmi323_dev, BMI323_GYR_CONF); - uint32_t timeout_ref = 0; - if((acc_conf & 0x7000) != 0b000){ - bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); - } - if((gyro_conf & 0x7000) != 0b000){ - bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); - } - //now we need to check if the feature engine has been enabled prior - if((bmi323_read(bmi323_dev, BMI323_FEATURE_CTRL) & 0x0001) == 0b0){ - //then we write 0x012C to Feature Io 2 - bmi323_write(bmi323_dev, BMI323_FEATURE_IO2, BMI323_FEATURE_IO2_EN); - //then we write 0x0001 to Feature Io status - bmi323_write(bmi323_dev, BMI323_FEATURE_IO_STATUS, BMI323_FEATURE_IO_STS); - //now we set the feature ctrol engine enable to 1 - bmi323_write(bmi323_dev, BMI323_FEATURE_CTRL, BMI323_FEATURE_CTRL_ENGINE_EN); - //now we poll the feature engine - timeout_ref = millis(); - while((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0b001){ - if(millis() - timeout_ref > BMI323_TIMEOUT){ - D_println("Feature engine enable timeout"); - return 0; - } - continue; - } - D_println("enabled feature engine Hooray!"); - } - //no need for an else statement as the feature engine is already enabled and we can continue - //now we need to check if a calibration is already in progress - //polls the bmi323 FEATURE I01 state untill the state is 0b00, this means calibration can start. - timeout_ref = millis(); - while(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0b00){ - if(millis() - timeout_ref > BMI323_TIMEOUT){ - D_println("Calibration state timeout"); - return 0; - } - continue; - } - //check the current configuration of the accelerometer and make sure it is in high performance adn - //ODR is between 25 and 200 hertz - calibrate: - //read the acc conf register - uint16_t data = bmi323_read(bmi323_dev, BMI323_ACC_CONF) & 0x700F; - //checks if we are in the correct configuration. if not skips if statement - if(((data >> 12) == HIGH_PERF) && (((data & 0x000F) >= ODR_25) && ((data & 0x000F) <= ODR_200))){ - D_println("Starting calibration"); - //if it is, then we can start the calibration - //first we check if the alernalte configuration acc mode is set to 0: - if(((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000)>>11) != 0b000){ - //if it is, we set it to 0 - bmi323_write(bmi323_dev, BMI323_ALT_ACC_CONF, 0x0206); - } - //next we check if the alternate configuration gyro mode is set to 0: - if(((bmi323_read(bmi323_dev, BMI323_ALT_GYR_CONF) & 0x7000)>>11) != 0b000){ - //if it is, we set it to 0 - bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); - } - D_println("Alternate configurations set"); - //next we can actually send the command for calibration - //reset all of the gyro calibration values - bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_X, BMI323_ACC_DP_DGAIN_X_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Y, BMI323_ACC_DP_DGAIN_Y_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Z, BMI323_ACC_DP_DGAIN_Z_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_X, BMI323_ACC_DP_OFF_X_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Y, BMI323_ACC_DP_OFF_Y_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Z, BMI323_ACC_DP_OFF_Z_RESET_VAL); - //now we poll the state of the calibration untill we get 0b1 - D_println("Starting calibration"); - bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB); - - D_println("Polling calibration state"); - //check if the feature engine is enabled - timeout_ref = millis(); - while(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4 ) != 0b1){ - if(millis() - timeout_ref > BMI323_TIMEOUT){ - D_println("Feature engine enable timeout"); - return 0; - } - continue; - } - D_println("Calibration complete"); - if(((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1){ - // D_println("Calibration successful"); - // D_println("reseting values to original configuration"); - //cycle the acc - bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); - bmi323_write(bmi323_dev, BMI323_ACC_CONF, acc_conf); - //cycle the gyro - bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); - // D_println(gyro_conf); - bmi323_write(bmi323_dev, BMI323_GYR_CONF, gyro_conf); - //display the calibration values - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_X), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Y), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Z), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_X), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Y), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Z), HEX); - return 1; - } - else{ - // D_println("Calibration failed"); - return 0; - } +uint8_t bmi323_calib(bmi323 *bmi323_dev) +{ + // first we have to fucking start the feature engine + // to do that we have to disable all sensors + uint16_t acc_conf = bmi323_read(bmi323_dev, BMI323_ACC_CONF); + uint16_t gyro_conf = bmi323_read(bmi323_dev, BMI323_GYR_CONF); + uint32_t timeout_ref = 0; + if ((acc_conf & 0x7000) != 0b000) { + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + } + if ((gyro_conf & 0x7000) != 0b000) { + bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); + } + // now we need to check if the feature engine has been enabled prior + if ((bmi323_read(bmi323_dev, BMI323_FEATURE_CTRL) & 0x0001) == 0b0) { + // then we write 0x012C to Feature Io 2 + bmi323_write(bmi323_dev, BMI323_FEATURE_IO2, BMI323_FEATURE_IO2_EN); + // then we write 0x0001 to Feature Io status + bmi323_write(bmi323_dev, BMI323_FEATURE_IO_STATUS, BMI323_FEATURE_IO_STS); + // now we set the feature ctrol engine enable to 1 + bmi323_write(bmi323_dev, BMI323_FEATURE_CTRL, BMI323_FEATURE_CTRL_ENGINE_EN); + // now we poll the feature engine + timeout_ref = millis(); + while ((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0b001) { + if (millis() - timeout_ref > BMI323_TIMEOUT) { + D_println("Feature engine enable timeout"); + return 0; + } + continue; + } + D_println("enabled feature engine Hooray!"); + } + // no need for an else statement as the feature engine is already enabled and we can continue + // now we need to check if a calibration is already in progress + // polls the bmi323 FEATURE I01 state untill the state is 0b00, this means calibration can start. + timeout_ref = millis(); + while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0b00) { + if (millis() - timeout_ref > BMI323_TIMEOUT) { + D_println("Calibration state timeout"); + return 0; + } + continue; + } +// check the current configuration of the accelerometer and make sure it is in high performance adn +// ODR is between 25 and 200 hertz +calibrate: + // read the acc conf register + uint16_t data = bmi323_read(bmi323_dev, BMI323_ACC_CONF) & 0x700F; + // checks if we are in the correct configuration. if not skips if statement + if (((data >> 12) == HIGH_PERF) && (((data & 0x000F) >= ODR_25) && ((data & 0x000F) <= ODR_200))) { + D_println("Starting calibration"); + // if it is, then we can start the calibration + // first we check if the alernalte configuration acc mode is set to 0: + if (((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000) >> 11) != 0b000) { + // if it is, we set it to 0 + bmi323_write(bmi323_dev, BMI323_ALT_ACC_CONF, 0x0206); + } + // next we check if the alternate configuration gyro mode is set to 0: + if (((bmi323_read(bmi323_dev, BMI323_ALT_GYR_CONF) & 0x7000) >> 11) != 0b000) { + // if it is, we set it to 0 + bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); + } + D_println("Alternate configurations set"); + // next we can actually send the command for calibration + // reset all of the gyro calibration values + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_X, BMI323_ACC_DP_DGAIN_X_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Y, BMI323_ACC_DP_DGAIN_Y_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Z, BMI323_ACC_DP_DGAIN_Z_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_X, BMI323_ACC_DP_OFF_X_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Y, BMI323_ACC_DP_OFF_Y_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Z, BMI323_ACC_DP_OFF_Z_RESET_VAL); + // now we poll the state of the calibration untill we get 0b1 + D_println("Starting calibration"); + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB); - } - // D_println("Calibration failed"); - // D_println("reseting values trying again"); - //turns off the acc - bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); - //turn on the acc - bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL | 0x7000); - //jumps to the calibration sequence - goto calibrate; - return 1; + D_println("Polling calibration state"); + // check if the feature engine is enabled + timeout_ref = millis(); + while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4) != 0b1) { + if (millis() - timeout_ref > BMI323_TIMEOUT) { + D_println("Feature engine enable timeout"); + return 0; + } + continue; + } + D_println("Calibration complete"); + if (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1) { + // D_println("Calibration successful"); + // D_println("reseting values to original configuration"); + // cycle the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + bmi323_write(bmi323_dev, BMI323_ACC_CONF, acc_conf); + // cycle the gyro + bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); + // D_println(gyro_conf); + bmi323_write(bmi323_dev, BMI323_GYR_CONF, gyro_conf); + // display the calibration values + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_X), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Y), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Z), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_X), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Y), HEX); + // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Z), HEX); + return 1; + } else { + // D_println("Calibration failed"); + return 0; + } + } + // D_println("Calibration failed"); + // D_println("reseting values trying again"); + // turns off the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); + // turn on the acc + bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL | 0x7000); + // jumps to the calibration sequence + goto calibrate; + return 1; } -uint8_t bmi323_calib_abort(bmi323 *bmi323_dev){ - bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB_ABORT); - return 1; +uint8_t bmi323_calib_abort(bmi323 *bmi323_dev) +{ + bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB_ABORT); + return 1; } /* @@ -207,77 +210,88 @@ Check the status of the acc, gyro and temp before returning the values */ -uint16_t bmi323_read_acc_x(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_ACC_X); +uint16_t bmi323_read_acc_x(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_ACC_X); } -uint16_t bmi323_read_acc_y(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_ACC_Y); +uint16_t bmi323_read_acc_y(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_ACC_Y); } -uint16_t bmi323_read_acc_z(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_ACC_Z); +uint16_t bmi323_read_acc_z(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_ACC_Z); } -uint16_t bmi323_read_gyr_x(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_GYR_X); +uint16_t bmi323_read_gyr_x(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_GYR_X); } -uint16_t bmi323_read_gyr_y(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_GYR_Y); +uint16_t bmi323_read_gyr_y(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_GYR_Y); } -uint16_t bmi323_read_gyr_z(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_GYR_Z); +uint16_t bmi323_read_gyr_z(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_GYR_Z); } -uint16_t bmi323_read_temp_data(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_TEMP_DATA); +uint16_t bmi323_read_temp_data(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_TEMP_DATA); } -uint16_t bmi323_read_status(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_STATUS); +uint16_t bmi323_read_status(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_STATUS); } -uint16_t bmi323_read_err_reg(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_ERR_REG); +uint16_t bmi323_read_err_reg(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_ERR_REG); } -uint16_t bmi323_read_chip_id(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_CHIP_ID); +uint16_t bmi323_read_chip_id(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_CHIP_ID); } -uint16_t bmi323_read_acc_conf(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_ACC_CONF); +uint16_t bmi323_read_acc_conf(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_ACC_CONF); } -uint16_t bmi323_read_gyr_conf(bmi323 *bmi323_dev){ - return bmi323_read(bmi323_dev, BMI323_GYR_CONF); +uint16_t bmi323_read_gyr_conf(bmi323 *bmi323_dev) +{ + return bmi323_read(bmi323_dev, BMI323_GYR_CONF); } -uint8_t bmi323_enable_acc(bmi323 *bmi323_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr){ - //uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); - uint16_t new_conf = 0; - new_conf |= acc_mode << 12; - new_conf |= acc_avg_num << 8; - new_conf |= acc_bw << 7; - new_conf |= acc_range << 4; - new_conf |= acc_odr; - bmi323_write(bmi323_dev, BMI323_ACC_CONF, new_conf); - return 1; +uint8_t bmi323_enable_acc(bmi323 *bmi323_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr) +{ + // uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); + uint16_t new_conf = 0; + new_conf |= acc_mode << 12; + new_conf |= acc_avg_num << 8; + new_conf |= acc_bw << 7; + new_conf |= acc_range << 4; + new_conf |= acc_odr; + bmi323_write(bmi323_dev, BMI323_ACC_CONF, new_conf); + return 1; } -uint8_t bmi323_enable_gyro(bmi323 *bmi323_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr){ - //uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); - uint16_t new_conf = 0; - new_conf |= gyr_mode << 12; - new_conf |= gyr_avg_num << 8; - new_conf |= gyr_bw << 7; - new_conf |= gyr_range << 4; - new_conf |= gyr_odr; - bmi323_write(bmi323_dev, BMI323_GYR_CONF, new_conf); - return 1; +uint8_t bmi323_enable_gyro(bmi323 *bmi323_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr) +{ + // uint16_t acc_conf = bmi323_read_acc_conf(bmi323_dev); + uint16_t new_conf = 0; + new_conf |= gyr_mode << 12; + new_conf |= gyr_avg_num << 8; + new_conf |= gyr_bw << 7; + new_conf |= gyr_range << 4; + new_conf |= gyr_odr; + bmi323_write(bmi323_dev, BMI323_GYR_CONF, new_conf); + return 1; } - - - diff --git a/SAMM/IMUandTOF/Core/Src/crc.c b/SAMM/IMUandTOF/Core/Src/crc.c index 0a8907607..213510a5d 100644 --- a/SAMM/IMUandTOF/Core/Src/crc.c +++ b/SAMM/IMUandTOF/Core/Src/crc.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file crc.c - * @brief This file provides code for the configuration - * of the CRC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "crc.h" @@ -30,59 +30,55 @@ CRC_HandleTypeDef hcrc; void MX_CRC_Init(void) { - /* USER CODE BEGIN CRC_Init 0 */ + /* USER CODE BEGIN CRC_Init 0 */ - /* USER CODE END CRC_Init 0 */ + /* USER CODE END CRC_Init 0 */ - /* USER CODE BEGIN CRC_Init 1 */ + /* USER CODE BEGIN CRC_Init 1 */ - /* USER CODE END CRC_Init 1 */ - hcrc.Instance = CRC; - hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; - hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; - hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; - hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; - hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; - if (HAL_CRC_Init(&hcrc) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN CRC_Init 2 */ - - /* USER CODE END CRC_Init 2 */ + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + /* USER CODE END CRC_Init 2 */ } -void HAL_CRC_MspInit(CRC_HandleTypeDef* crcHandle) +void HAL_CRC_MspInit(CRC_HandleTypeDef *crcHandle) { - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspInit 0 */ + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspInit 0 */ - /* USER CODE END CRC_MspInit 0 */ - /* CRC clock enable */ - __HAL_RCC_CRC_CLK_ENABLE(); - /* USER CODE BEGIN CRC_MspInit 1 */ + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ - /* USER CODE END CRC_MspInit 1 */ - } + /* USER CODE END CRC_MspInit 1 */ + } } -void HAL_CRC_MspDeInit(CRC_HandleTypeDef* crcHandle) +void HAL_CRC_MspDeInit(CRC_HandleTypeDef *crcHandle) { - if(crcHandle->Instance==CRC) - { - /* USER CODE BEGIN CRC_MspDeInit 0 */ + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspDeInit 0 */ - /* USER CODE END CRC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_CRC_CLK_DISABLE(); - /* USER CODE BEGIN CRC_MspDeInit 1 */ + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ - /* USER CODE END CRC_MspDeInit 1 */ - } + /* USER CODE END CRC_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/dma.c b/SAMM/IMUandTOF/Core/Src/dma.c index 372b7e92c..0b82d0d7c 100644 --- a/SAMM/IMUandTOF/Core/Src/dma.c +++ b/SAMM/IMUandTOF/Core/Src/dma.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file dma.c - * @brief This file provides code for the configuration - * of all the requested memory to memory DMA transfers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -34,26 +34,24 @@ /* USER CODE END 1 */ /** - * Enable DMA controller clock - */ + * Enable DMA controller clock + */ void MX_DMA_Init(void) { - /* DMA controller clock enable */ - __HAL_RCC_DMAMUX1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); - /* DMA1_Channel2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); - + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); } /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ - diff --git a/SAMM/IMUandTOF/Core/Src/fdcan.c b/SAMM/IMUandTOF/Core/Src/fdcan.c index 59cf13f59..600df963c 100644 --- a/SAMM/IMUandTOF/Core/Src/fdcan.c +++ b/SAMM/IMUandTOF/Core/Src/fdcan.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "fdcan.h" @@ -31,191 +31,181 @@ FDCAN_HandleTypeDef hfdcan2; void MX_FDCAN1_Init(void) { - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 16; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 1; - hfdcan1.Init.NominalTimeSeg2 = 1; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ - + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 16; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 1; + hfdcan1.Init.NominalTimeSeg2 = 1; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ } /* FDCAN2 init function */ void MX_FDCAN2_Init(void) { - /* USER CODE BEGIN FDCAN2_Init 0 */ - - /* USER CODE END FDCAN2_Init 0 */ - - /* USER CODE BEGIN FDCAN2_Init 1 */ - - /* USER CODE END FDCAN2_Init 1 */ - hfdcan2.Instance = FDCAN2; - hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = DISABLE; - hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = DISABLE; - hfdcan2.Init.NominalPrescaler = 16; - hfdcan2.Init.NominalSyncJumpWidth = 1; - hfdcan2.Init.NominalTimeSeg1 = 1; - hfdcan2.Init.NominalTimeSeg2 = 1; - hfdcan2.Init.DataPrescaler = 1; - hfdcan2.Init.DataSyncJumpWidth = 1; - hfdcan2.Init.DataTimeSeg1 = 1; - hfdcan2.Init.DataTimeSeg2 = 1; - hfdcan2.Init.StdFiltersNbr = 0; - hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN2_Init 2 */ - - /* USER CODE END FDCAN2_Init 2 */ - + /* USER CODE BEGIN FDCAN2_Init 0 */ + + /* USER CODE END FDCAN2_Init 0 */ + + /* USER CODE BEGIN FDCAN2_Init 1 */ + + /* USER CODE END FDCAN2_Init 1 */ + hfdcan2.Instance = FDCAN2; + hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan2.Init.AutoRetransmission = DISABLE; + hfdcan2.Init.TransmitPause = DISABLE; + hfdcan2.Init.ProtocolException = DISABLE; + hfdcan2.Init.NominalPrescaler = 16; + hfdcan2.Init.NominalSyncJumpWidth = 1; + hfdcan2.Init.NominalTimeSeg1 = 1; + hfdcan2.Init.NominalTimeSeg2 = 1; + hfdcan2.Init.DataPrescaler = 1; + hfdcan2.Init.DataSyncJumpWidth = 1; + hfdcan2.Init.DataTimeSeg1 = 1; + hfdcan2.Init.DataTimeSeg2 = 1; + hfdcan2.Init.StdFiltersNbr = 0; + hfdcan2.Init.ExtFiltersNbr = 0; + hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN2_Init 2 */ + + /* USER CODE END FDCAN2_Init 2 */ } -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED=0; +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef* fdcanHandle) +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(fdcanHandle->Instance==FDCAN1) - { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if(HAL_RCC_FDCAN_CLK_ENABLED==1){ - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } - else if(fdcanHandle->Instance==FDCAN2) - { - /* USER CODE BEGIN FDCAN2_MspInit 0 */ - - /* USER CODE END FDCAN2_MspInit 0 */ - - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN2 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if(HAL_RCC_FDCAN_CLK_ENABLED==1){ - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN2_MspInit 1 */ - - /* USER CODE END FDCAN2_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspInit 0 */ + + /* USER CODE END FDCAN2_MspInit 0 */ + + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN2 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN2_MspInit 1 */ + + /* USER CODE END FDCAN2_MspInit 1 */ + } } -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef* fdcanHandle) +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) { - if(fdcanHandle->Instance==FDCAN1) - { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if(HAL_RCC_FDCAN_CLK_ENABLED==0){ - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } - else if(fdcanHandle->Instance==FDCAN2) - { - /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ - - /* USER CODE END FDCAN2_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if(HAL_RCC_FDCAN_CLK_ENABLED==0){ - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_5); - - /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ - - /* USER CODE END FDCAN2_MspDeInit 1 */ - } + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + + /* USER CODE END FDCAN2_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB5 ------> FDCAN2_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_5); + + /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + + /* USER CODE END FDCAN2_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/gpio.c b/SAMM/IMUandTOF/Core/Src/gpio.c index ab7f2d3bf..bd5e1df5f 100644 --- a/SAMM/IMUandTOF/Core/Src/gpio.c +++ b/SAMM/IMUandTOF/Core/Src/gpio.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -30,63 +30,61 @@ /*----------------------------------------------------------------------------*/ /* USER CODE BEGIN 1 */ - /* USER CODE END 1 */ /** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI + * Analog + * Input + * Output + * EVENT_OUT + * EXTI PC8 ------> I2C3_SCL PC9 ------> I2C3_SDA */ void MX_GPIO_Init(void) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1|GPIO_PIN_4, GPIO_PIN_RESET); - - /*Configure GPIO pin : PF1 */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - - /*Configure GPIO pins : PB1 PB4 */ - GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PB12 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PC8 PC9 */ - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET); + + /*Configure GPIO pin : PF1 */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /*Configure GPIO pins : PB1 PB4 */ + GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PB12 PB6 */ + GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PC8 PC9 */ + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } /* USER CODE BEGIN 2 */ diff --git a/SAMM/IMUandTOF/Core/Src/i2c.c b/SAMM/IMUandTOF/Core/Src/i2c.c index 8912dcd02..ec88833f4 100644 --- a/SAMM/IMUandTOF/Core/Src/i2c.c +++ b/SAMM/IMUandTOF/Core/Src/i2c.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "i2c.h" @@ -30,104 +30,98 @@ I2C_HandleTypeDef hi2c1; void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.Timing = 0x10920C1D; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) - { - Error_Handler(); - } - - /** I2C Fast mode Plus enable - */ - HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x10920C1D; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ } -void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (i2cHandle->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C1 clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } } -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) { - if(i2cHandle->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ + if (i2cHandle->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + /**I2C1 GPIO Configuration + PB7 ------> I2C1_SDA + PB8-BOOT0 ------> I2C1_SCL + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); - /* USER CODE BEGIN I2C1_MspDeInit 1 */ + /* USER CODE BEGIN I2C1_MspDeInit 1 */ - /* USER CODE END I2C1_MspDeInit 1 */ - } + /* USER CODE END I2C1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/main.c b/SAMM/IMUandTOF/Core/Src/main.c index 7400c2e1f..5c1dabb9e 100644 --- a/SAMM/IMUandTOF/Core/Src/main.c +++ b/SAMM/IMUandTOF/Core/Src/main.c @@ -1,41 +1,43 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" + #include "crc.h" #include "fdcan.h" +#include "gpio.h" #include "i2c.h" #include "spi.h" -#include "gpio.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include + #include "VL53L4ED_api.h" #include "bmi323.h" -//#include "circularBuffer.h" +// #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ #define BMI323_CS_GPIO_Port GPIOA -#define BMI323_CS_Pin GPIO_PIN_4 +#define BMI323_CS_Pin GPIO_PIN_4 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -51,10 +53,10 @@ /* USER CODE BEGIN PM */ PUTCHAR_PROTOTYPE { - ITM_SendChar(ch); - return ch; + ITM_SendChar(ch); + return ch; } -//CircularBuffer *cb; +// CircularBuffer *cb; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ @@ -80,182 +82,169 @@ I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ + * @brief The application entry point. + * @retval int + */ int main(void) { - /* USER CODE BEGIN 1 */ - //cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_CRC_Init(); - MX_FDCAN1_Init(); - MX_FDCAN2_Init(); - MX_I2C1_Init(); - MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 - /* USER CODE BEGIN 2 */ - - // HAL_FDCAN_Start(&hfdcan1); - // HAL_FDCAN_Start(&hfdcan2); - // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - bmi323 bmi323_dev; - HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); - // Send 2 dummy bytes to switch BMI323 to SPI mode - // uint16_t dummy_byte = 0x8000; - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); - // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - //HAL_Delay(1); // Short delay after mode switch - - // Initialize BMI323 sensor - - // if (BMI323_Init() != HAL_OK) { - // printf("BMI323 initialization failed!\r\n"); - // Error_Handler(); - // } - - // static uint16_t eeMLX90640[832]; - // static paramsMLX90640 mlx90640; - // #define MLX90640_ADDRESS 0x33<<1 - // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); - - // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); - - // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); - - // MLX90640_SynchFrame(MLX90640_ADDRESS); - // MLX90640_SetRefreshRate(0x33, 0x05); - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - //begin VL53L4ED - HAL_Delay(100); // wait for 5ms to power up the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_L_XSHUT_Pin - //HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //TOF_L_XSHUT_Pin - //HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to power up the device - - uint16_t status = 0; - - uint16_t sensor_id = 0; - VL53L4ED_ResultsData_t results; - uint8_t p_data_ready; - - int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); - status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); - status = VL53L4ED_StartRanging(TOF_ID); - status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing - - - while (1) - { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - //begin VL53L4ED - status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - if(p_data_ready){ - /* (Mandatory) Clear HW interrupt to restart measurements */ - VL53L4ED_ClearInterrupt(TOF_ID); - /* Read measured distance. RangeStatus = 0 means valid data */ - VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", - results.range_status, - results.distance_mm- 67, - results.signal_per_spad_kcps); - }else{ - HAL_Delay(10); - __disable_irq(); - __enable_irq(); - } - - //begin BMI323 - // int16_t ax, ay, az; - // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { - // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); - // } - HAL_Delay(100); // Read every 100ms - } - /* USER CODE END 3 */ + /* USER CODE BEGIN 1 */ + // cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_FDCAN1_Init(); + MX_FDCAN2_Init(); + MX_I2C1_Init(); + MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + /* USER CODE BEGIN 2 */ + + // HAL_FDCAN_Start(&hfdcan1); + // HAL_FDCAN_Start(&hfdcan2); + // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + bmi323 bmi323_dev; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + // Send 2 dummy bytes to switch BMI323 to SPI mode + // uint16_t dummy_byte = 0x8000; + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); + // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + // HAL_Delay(1); // Short delay after mode switch + + // Initialize BMI323 sensor + + // if (BMI323_Init() != HAL_OK) { + // printf("BMI323 initialization failed!\r\n"); + // Error_Handler(); + // } + + // static uint16_t eeMLX90640[832]; + // static paramsMLX90640 mlx90640; + // #define MLX90640_ADDRESS 0x33<<1 + // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + + // MLX90640_SynchFrame(MLX90640_ADDRESS); + // MLX90640_SetRefreshRate(0x33, 0x05); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + // begin VL53L4ED + HAL_Delay(100); // wait for 5ms to power up the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to reset the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to power up the device + + uint16_t status = 0; + + uint16_t sensor_id = 0; + VL53L4ED_ResultsData_t results; + uint8_t p_data_ready; + + int TOF_ID = 0x52; + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); + status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + + while (1) { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + // begin VL53L4ED + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if (p_data_ready) { + /* (Mandatory) Clear HW interrupt to restart measurements */ + VL53L4ED_ClearInterrupt(TOF_ID); + /* Read measured distance. RangeStatus = 0 means valid data */ + VL53L4ED_GetResult(TOF_ID, &results); + printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); + } else { + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + + // begin BMI323 + // int16_t ax, ay, az; + // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { + // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); + // } + HAL_Delay(100); // Read every 100ms + } + /* USER CODE END 3 */ } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); - while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) - { - } - LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); - LL_RCC_HSE_EnableBypass(); - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while(LL_RCC_HSE_IsReady() != 1) - { - } - - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); - LL_RCC_PLL_EnableDomain_SYS(); - LL_RCC_PLL_Enable(); - /* Wait till PLL is ready */ - while(LL_RCC_PLL_IsReady() != 1) - { - } - - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) - { - } - - /* Insure 1us transition state at intermediate medium speed clock*/ - for (__IO uint32_t i = (170 >> 1); i !=0; i--); - - /* Set AHB prescaler*/ - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_SetSystemCoreClock(128000000); - - /* Update the time base */ - if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) - { - Error_Handler(); - } + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); + LL_RCC_HSE_EnableBypass(); + LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while (LL_RCC_HSE_IsReady() != 1) {} + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + /* Wait till PLL is ready */ + while (LL_RCC_PLL_IsReady() != 1) {} + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} + + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (170 >> 1); i != 0; i--) + ; + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(128000000); + + /* Update the time base */ + if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ @@ -266,60 +255,56 @@ void SystemClock_Config(void) // printf("got messgae\n"); // //circularBufferPush(cb, RxData, sizeof(RxData)); - // } /* USER CODE END 4 */ /** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM1 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { - /* USER CODE BEGIN Callback 0 */ + /* USER CODE BEGIN Callback 0 */ - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM1) - { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ - /* USER CODE END Callback 1 */ + /* USER CODE END Callback 1 */ } /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ + * @brief This function is executed in case of error occurrence. + * @retval None + */ void Error_Handler(void) { - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) - { - } - /* USER CODE END Error_Handler_Debug */ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) {} + /* USER CODE END Error_Handler_Debug */ } -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ void assert_failed(uint8_t *file, uint32_t line) { - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ diff --git a/SAMM/IMUandTOF/Core/Src/spi.c b/SAMM/IMUandTOF/Core/Src/spi.c index 2944b6ce0..31f66776b 100644 --- a/SAMM/IMUandTOF/Core/Src/spi.c +++ b/SAMM/IMUandTOF/Core/Src/spi.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "spi.h" @@ -30,97 +30,93 @@ SPI_HandleTypeDef hspi1; void MX_SPI1_Init(void) { - /* USER CODE BEGIN spi1_Init 0 */ - - /* USER CODE END spi1_Init 0 */ - - /* USER CODE BEGIN spi1_Init 1 */ - - /* USER CODE END spi1_Init 1 */ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_16BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; - hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN spi1_Init 2 */ - - /* USER CODE END spi1_Init 2 */ - + /* USER CODE BEGIN spi1_Init 0 */ + + /* USER CODE END spi1_Init 0 */ + + /* USER CODE BEGIN spi1_Init 1 */ + + /* USER CODE END spi1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_16BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi1_Init 2 */ + + /* USER CODE END spi1_Init 2 */ } -void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==spi1) - { - /* USER CODE BEGIN spi1_MspInit 0 */ - - /* USER CODE END spi1_MspInit 0 */ - /* spi1 clock enable */ - __HAL_RCC_spi1_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**spi1 GPIO Configuration - PA5 ------> spi1_SCK - PA6 ------> spi1_MISO - PA7 ------> spi1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_spi1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_spi1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN spi1_MspInit 1 */ - - /* USER CODE END spi1_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (spiHandle->Instance == spi1) { + /* USER CODE BEGIN spi1_MspInit 0 */ + + /* USER CODE END spi1_MspInit 0 */ + /* spi1 clock enable */ + __HAL_RCC_spi1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**spi1 GPIO Configuration + PA5 ------> spi1_SCK + PA6 ------> spi1_MISO + PA7 ------> spi1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN spi1_MspInit 1 */ + + /* USER CODE END spi1_MspInit 1 */ + } } -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) { - if(spiHandle->Instance==spi1) - { - /* USER CODE BEGIN spi1_MspDeInit 0 */ + if (spiHandle->Instance == spi1) { + /* USER CODE BEGIN spi1_MspDeInit 0 */ - /* USER CODE END spi1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_spi1_CLK_DISABLE(); + /* USER CODE END spi1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_spi1_CLK_DISABLE(); - /**spi1 GPIO Configuration - PC10 ------> spi1_SCK - PC11 ------> spi1_MISO - PC12 ------> spi1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + /**spi1 GPIO Configuration + PC10 ------> spi1_SCK + PC11 ------> spi1_MISO + PC12 ------> spi1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); - /* USER CODE BEGIN spi1_MspDeInit 1 */ + /* USER CODE BEGIN spi1_MspDeInit 1 */ - /* USER CODE END spi1_MspDeInit 1 */ - } + /* USER CODE END spi1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c index 3fc223b63..69189ef4e 100644 --- a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -58,27 +58,27 @@ /* USER CODE END 0 */ /** - * Initializes the Global MSP. - */ + * Initializes the Global MSP. + */ void HAL_MspInit(void) { - /* USER CODE BEGIN MspInit 0 */ + /* USER CODE BEGIN MspInit 0 */ - /* USER CODE END MspInit 0 */ + /* USER CODE END MspInit 0 */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); - /* System interrupt init*/ + /* System interrupt init*/ - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); - /* USER CODE BEGIN MspInit 1 */ + /* USER CODE BEGIN MspInit 1 */ - /* USER CODE END MspInit 1 */ + /* USER CODE END MspInit 1 */ } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c index f43496b92..b9b75acf8 100644 --- a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c @@ -1,20 +1,20 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_hal_timebase_tim.c + * @brief HAL time base based on the hardware TIM. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ @@ -25,102 +25,96 @@ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim1; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ + * @brief This function configures the TIM1 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock = 0; + uint32_t uwPrescalerValue = 0; + uint32_t pFLatency; - HAL_StatusTypeDef status; + HAL_StatusTypeDef status; - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); + /* Enable TIM1 clock */ + __HAL_RCC_TIM1_CLK_ENABLE(); - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); + /* Compute TIM1 clock */ + uwTimclock = HAL_RCC_GetPCLK2Freq(); - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t) ((uwTimclock / 1000000U) - 1U); + /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); - /* Initialize TIM1 */ - htim1.Instance = TIM1; + /* Initialize TIM1 */ + htim1.Instance = TIM1; - /* Initialize TIMx peripheral as follow: - * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - * ClockDivision = 0 - * Counter direction = Up - */ - htim1.Init.Period = (1000000U / 1000U) - 1U; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + /* Initialize TIMx peripheral as follow: + * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. + * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + * ClockDivision = 0 + * Counter direction = Up + */ + htim1.Init.Period = (1000000U / 1000U) - 1U; + htim1.Init.Prescaler = uwPrescalerValue; + htim1.Init.ClockDivision = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - status = HAL_TIM_Base_Init(&htim1); - if (status == HAL_OK) - { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim1); - if (status == HAL_OK) - { - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) - { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } - else - { - status = HAL_ERROR; - } - } - } + status = HAL_TIM_Base_Init(&htim1); + if (status == HAL_OK) { + /* Start the TIM time Base generation in interrupt mode */ + status = HAL_TIM_Base_Start_IT(&htim1); + if (status == HAL_OK) { + /* Enable the TIM1 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { + /* Configure the TIM IRQ priority */ + HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } else { + status = HAL_ERROR; + } + } + } - /* Return function status */ - return status; + /* Return function status */ + return status; } /** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM1 update interrupt. + * @param None + * @retval None + */ void HAL_SuspendTick(void) { - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); + /* Disable TIM1 update Interrupt */ + __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); } /** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling TIM1 update interrupt. + * @param None + * @retval None + */ void HAL_ResumeTick(void) { - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); + /* Enable TIM1 Update interrupt */ + __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); } - diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c b/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c index ef94b5f52..2db0ff77b 100644 --- a/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c +++ b/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c @@ -1,25 +1,26 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file stm32g4xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file stm32g4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "main.h" #include "stm32g4xx_it.h" + +#include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ @@ -65,131 +66,125 @@ extern TIM_HandleTypeDef htim1; /* Cortex-M4 Processor Interruption and Exception Handlers */ /******************************************************************************/ /** - * @brief This function handles Non maskable interrupt. - */ + * @brief This function handles Non maskable interrupt. + */ void NMI_Handler(void) { - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) - { - } - /* USER CODE END NonMaskableInt_IRQn 1 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) {} + /* USER CODE END NonMaskableInt_IRQn 1 */ } /** - * @brief This function handles Hard fault interrupt. - */ + * @brief This function handles Hard fault interrupt. + */ void HardFault_Handler(void) { - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } } /** - * @brief This function handles Memory management fault. - */ + * @brief This function handles Memory management fault. + */ void MemManage_Handler(void) { - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } } /** - * @brief This function handles Prefetch fault, memory access fault. - */ + * @brief This function handles Prefetch fault, memory access fault. + */ void BusFault_Handler(void) { - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } } /** - * @brief This function handles Undefined instruction or illegal state. - */ + * @brief This function handles Undefined instruction or illegal state. + */ void UsageFault_Handler(void) { - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) - { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } } /** - * @brief This function handles System service call via SWI instruction. - */ + * @brief This function handles System service call via SWI instruction. + */ void SVC_Handler(void) { - /* USER CODE BEGIN SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 0 */ - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ - /* USER CODE END SVCall_IRQn 1 */ + /* USER CODE END SVCall_IRQn 1 */ } /** - * @brief This function handles Debug monitor. - */ + * @brief This function handles Debug monitor. + */ void DebugMon_Handler(void) { - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - /* USER CODE END DebugMonitor_IRQn 1 */ + /* USER CODE END DebugMonitor_IRQn 1 */ } /** - * @brief This function handles Pendable request for system service. - */ + * @brief This function handles Pendable request for system service. + */ void PendSV_Handler(void) { - /* USER CODE BEGIN PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 0 */ - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ - /* USER CODE END PendSV_IRQn 1 */ + /* USER CODE END PendSV_IRQn 1 */ } /** - * @brief This function handles System tick timer. - */ + * @brief This function handles System tick timer. + */ void SysTick_Handler(void) { - /* USER CODE BEGIN SysTick_IRQn 0 */ + /* USER CODE BEGIN SysTick_IRQn 0 */ - /* USER CODE END SysTick_IRQn 0 */ + /* USER CODE END SysTick_IRQn 0 */ - /* USER CODE BEGIN SysTick_IRQn 1 */ + /* USER CODE BEGIN SysTick_IRQn 1 */ - /* USER CODE END SysTick_IRQn 1 */ + /* USER CODE END SysTick_IRQn 1 */ } /******************************************************************************/ @@ -200,17 +195,17 @@ void SysTick_Handler(void) /******************************************************************************/ /** - * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. - */ + * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. + */ void TIM1_UP_TIM16_IRQHandler(void) { - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ - /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ - HAL_TIM_IRQHandler(&htim1); - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ + /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ + HAL_TIM_IRQHandler(&htim1); + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ - /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ + /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ } /* USER CODE BEGIN 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/syscalls.c b/SAMM/IMUandTOF/Core/Src/syscalls.c index e33a8492c..a59a7d089 100644 --- a/SAMM/IMUandTOF/Core/Src/syscalls.c +++ b/SAMM/IMUandTOF/Core/Src/syscalls.c @@ -21,156 +21,148 @@ */ /* Includes */ -#include -#include #include -#include #include -#include +#include +#include +#include #include #include - +#include /* Variables */ extern int __io_putchar(int ch) __attribute__((weak)); extern int __io_getchar(void) __attribute__((weak)); - -char *__env[1] = { 0 }; +char *__env[1] = {0}; char **environ = __env; - /* Functions */ -void initialise_monitor_handles() -{ -} +void initialise_monitor_handles() {} int _getpid(void) { - return 1; + return 1; } int _kill(int pid, int sig) { - (void)pid; - (void)sig; - errno = EINVAL; - return -1; + (void)pid; + (void)sig; + errno = EINVAL; + return -1; } -void _exit (int status) +void _exit(int status) { - _kill(status, -1); - while (1) {} /* Make sure we hang here */ + _kill(status, -1); + while (1) {} /* Make sure we hang here */ } __attribute__((weak)) int _read(int file, char *ptr, int len) { - (void)file; - int DataIdx; + (void)file; + int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - *ptr++ = __io_getchar(); - } + for (DataIdx = 0; DataIdx < len; DataIdx++) { + *ptr++ = __io_getchar(); + } - return len; + return len; } __attribute__((weak)) int _write(int file, char *ptr, int len) { - (void)file; - int DataIdx; + (void)file; + int DataIdx; - for (DataIdx = 0; DataIdx < len; DataIdx++) - { - __io_putchar(*ptr++); - } - return len; + for (DataIdx = 0; DataIdx < len; DataIdx++) { + __io_putchar(*ptr++); + } + return len; } int _close(int file) { - (void)file; - return -1; + (void)file; + return -1; } - int _fstat(int file, struct stat *st) { - (void)file; - st->st_mode = S_IFCHR; - return 0; + (void)file; + st->st_mode = S_IFCHR; + return 0; } int _isatty(int file) { - (void)file; - return 1; + (void)file; + return 1; } int _lseek(int file, int ptr, int dir) { - (void)file; - (void)ptr; - (void)dir; - return 0; + (void)file; + (void)ptr; + (void)dir; + return 0; } int _open(char *path, int flags, ...) { - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; + (void)path; + (void)flags; + /* Pretend like we always fail */ + return -1; } int _wait(int *status) { - (void)status; - errno = ECHILD; - return -1; + (void)status; + errno = ECHILD; + return -1; } int _unlink(char *name) { - (void)name; - errno = ENOENT; - return -1; + (void)name; + errno = ENOENT; + return -1; } int _times(struct tms *buf) { - (void)buf; - return -1; + (void)buf; + return -1; } int _stat(char *file, struct stat *st) { - (void)file; - st->st_mode = S_IFCHR; - return 0; + (void)file; + st->st_mode = S_IFCHR; + return 0; } int _link(char *old, char *new) { - (void)old; - (void)new; - errno = EMLINK; - return -1; + (void)old; + (void)new; + errno = EMLINK; + return -1; } int _fork(void) { - errno = EAGAIN; - return -1; + errno = EAGAIN; + return -1; } int _execve(char *name, char **argv, char **env) { - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; + (void)name; + (void)argv; + (void)env; + errno = ENOMEM; + return -1; } diff --git a/SAMM/IMUandTOF/Core/Src/sysmem.c b/SAMM/IMUandTOF/Core/Src/sysmem.c index 246470ee8..00c397937 100644 --- a/SAMM/IMUandTOF/Core/Src/sysmem.c +++ b/SAMM/IMUandTOF/Core/Src/sysmem.c @@ -52,28 +52,26 @@ static uint8_t *__sbrk_heap_end = NULL; */ void *_sbrk(ptrdiff_t incr) { - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; + extern uint8_t _end; /* Symbol defined in the linker script */ + extern uint8_t _estack; /* Symbol defined in the linker script */ + extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ + const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; + const uint8_t *max_heap = (uint8_t *)stack_limit; + uint8_t *prev_heap_end; - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) - { - __sbrk_heap_end = &_end; - } + /* Initialize heap end at first call */ + if (NULL == __sbrk_heap_end) { + __sbrk_heap_end = &_end; + } - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) - { - errno = ENOMEM; - return (void *)-1; - } + /* Protect heap from growing into the reserved MSP stack */ + if (__sbrk_heap_end + incr > max_heap) { + errno = ENOMEM; + return (void *)-1; + } - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; + prev_heap_end = __sbrk_heap_end; + __sbrk_heap_end += incr; - return (void *)prev_heap_end; + return (void *)prev_heap_end; } diff --git a/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c b/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c index 8d35a0aa0..14d0e1be1 100644 --- a/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c +++ b/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c @@ -1,109 +1,109 @@ /** - ****************************************************************************** - * @file system_stm32g4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32g4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * After each device reset the HSI (16 MHz) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to - * configure the system clock before to branch to main program. - * - * This file configures the system clock as follows: - *============================================================================= - *----------------------------------------------------------------------------- - * System Clock source | HSI - *----------------------------------------------------------------------------- - * SYSCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * HCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB1 Prescaler | 1 - *----------------------------------------------------------------------------- - * APB2 Prescaler | 1 - *----------------------------------------------------------------------------- - * PLL_M | 1 - *----------------------------------------------------------------------------- - * PLL_N | 16 - *----------------------------------------------------------------------------- - * PLL_P | 7 - *----------------------------------------------------------------------------- - * PLL_Q | 2 - *----------------------------------------------------------------------------- - * PLL_R | 2 - *----------------------------------------------------------------------------- - * Require 48MHz for RNG | Disabled - *----------------------------------------------------------------------------- - *============================================================================= - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file system_stm32g4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 16 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ /** @addtogroup CMSIS - * @{ - */ + * @{ + */ /** @addtogroup stm32g4xx_system - * @{ - */ + * @{ + */ /** @addtogroup STM32G4xx_System_Private_Includes - * @{ - */ + * @{ + */ #include "stm32g4xx.h" -#if !defined (HSE_VALUE) - #define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ +#if !defined(HSE_VALUE) +#define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ -#if !defined (HSI_VALUE) - #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ +#if !defined(HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_TypesDefinitions - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Defines - * @{ - */ + * @{ + */ /************************* Miscellaneous Configuration ************************/ /* Note: Following vector table addresses must be defined in line with linker - configuration. */ + configuration. */ /*!< Uncomment the following line if you need to relocate the vector table anywhere in Flash or Sram, else the vector table is kept at the automatic remap of boot address selected */ @@ -114,172 +114,171 @@ in Sram else user remap will be done in Flash. */ /* #define VECT_TAB_SRAM */ #if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ +#define VECT_TAB_BASE_ADDRESS \ + SRAM_BASE /*!< Vector Table base address field. \ + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET \ + 0x00000000U /*!< Vector Table base offset field. \ + This value must be a multiple of 0x200. */ #else -#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -/******************************************************************************/ -/** - * @} - */ +#define VECT_TAB_BASE_ADDRESS \ + FLASH_BASE /*!< Vector Table base address field. \ + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET \ + 0x00000000U /*!< Vector Table base offset field. \ + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ + /******************************************************************************/ + /** + * @} + */ /** @addtogroup STM32G4xx_System_Private_Macros - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Variables - * @{ - */ - /* The SystemCoreClock variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = HSI_VALUE; - - const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; - const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + * @{ + */ +/* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. +*/ +uint32_t SystemCoreClock = HSI_VALUE; + +const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; +const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_FunctionPrototypes - * @{ - */ + * @{ + */ /** - * @} - */ + * @} + */ /** @addtogroup STM32G4xx_System_Private_Functions - * @{ - */ + * @{ + */ /** - * @brief Setup the microcontroller system. - * @param None - * @retval None - */ + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ void SystemInit(void) { - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ - #endif +/* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2))); /* set CP10 and CP11 Full Access */ +#endif - /* Configure the Vector Table location add offset address ------------------*/ + /* Configure the Vector Table location add offset address ------------------*/ #if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ } /** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 24 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 24 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ void SystemCoreClockUpdate(void) { - uint32_t tmp, pllvco, pllr, pllsource, pllm; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) - { - case 0x04: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - - case 0x08: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - - case 0x0C: /* PLL used as system clock source */ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U ; - if (pllsource == 0x02UL) /* HSI used as PLL clock source */ - { - pllvco = (HSI_VALUE / pllm); - } - else /* HSE used as PLL clock source */ - { - pllvco = (HSE_VALUE / pllm); - } - pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); - pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; - SystemCoreClock = pllvco/pllr; - break; - - default: - break; - } - /* Compute HCLK clock frequency --------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; + uint32_t tmp, pllvco, pllr, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) { + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U; + if (pllsource == 0x02UL) /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } else /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; + SystemCoreClock = pllvco / pllr; + break; + + default: + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; } - /** - * @} - */ + * @} + */ /** - * @} - */ + * @} + */ /** - * @} - */ - - + * @} + */ From 126385c422737a02b078aa88283c9dabc2cd0e0b Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 6 Apr 2026 20:31:07 -0700 Subject: [PATCH 008/158] Moved some common files, corrected I2C pin for ToF --- SAMM/{IMUandTOF => Common}/Core/Inc/adc.h | 0 SAMM/{IMUandTOF => Common}/Core/Inc/crc.h | 0 SAMM/{IMUandTOF => Common}/Core/Inc/dma.h | 0 SAMM/{IMUandTOF => Common}/Core/Src/adc.c | 0 SAMM/{IMUandTOF => Common}/Core/Src/crc.c | 0 SAMM/{IMUandTOF => Common}/Core/Src/dma.c | 0 SAMM/IMUandMAG/Application/empty.txt | 0 SAMM/IMUandMAG/Application/mag.h | 17 ++ SAMM/IMUandMAG/Application/main.h | 79 ++++++ SAMM/IMUandMAG/Application/spi.h | 51 ++++ SAMM/IMUandMAG/Core/empty.txt | 0 SAMM/IMUandMAG/Core/mag.c | 37 +++ SAMM/IMUandMAG/Core/main.c | 310 ++++++++++++++++++++++ SAMM/IMUandMAG/Core/spi.c | 131 +++++++++ SAMM/IMUandTOF/Core/Src/i2c.c | 8 +- 15 files changed, 629 insertions(+), 4 deletions(-) rename SAMM/{IMUandTOF => Common}/Core/Inc/adc.h (100%) rename SAMM/{IMUandTOF => Common}/Core/Inc/crc.h (100%) rename SAMM/{IMUandTOF => Common}/Core/Inc/dma.h (100%) rename SAMM/{IMUandTOF => Common}/Core/Src/adc.c (100%) rename SAMM/{IMUandTOF => Common}/Core/Src/crc.c (100%) rename SAMM/{IMUandTOF => Common}/Core/Src/dma.c (100%) delete mode 100644 SAMM/IMUandMAG/Application/empty.txt create mode 100644 SAMM/IMUandMAG/Application/mag.h create mode 100644 SAMM/IMUandMAG/Application/main.h create mode 100644 SAMM/IMUandMAG/Application/spi.h delete mode 100644 SAMM/IMUandMAG/Core/empty.txt create mode 100644 SAMM/IMUandMAG/Core/mag.c create mode 100644 SAMM/IMUandMAG/Core/main.c create mode 100644 SAMM/IMUandMAG/Core/spi.c diff --git a/SAMM/IMUandTOF/Core/Inc/adc.h b/SAMM/Common/Core/Inc/adc.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/adc.h rename to SAMM/Common/Core/Inc/adc.h diff --git a/SAMM/IMUandTOF/Core/Inc/crc.h b/SAMM/Common/Core/Inc/crc.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/crc.h rename to SAMM/Common/Core/Inc/crc.h diff --git a/SAMM/IMUandTOF/Core/Inc/dma.h b/SAMM/Common/Core/Inc/dma.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/dma.h rename to SAMM/Common/Core/Inc/dma.h diff --git a/SAMM/IMUandTOF/Core/Src/adc.c b/SAMM/Common/Core/Src/adc.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/adc.c rename to SAMM/Common/Core/Src/adc.c diff --git a/SAMM/IMUandTOF/Core/Src/crc.c b/SAMM/Common/Core/Src/crc.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/crc.c rename to SAMM/Common/Core/Src/crc.c diff --git a/SAMM/IMUandTOF/Core/Src/dma.c b/SAMM/Common/Core/Src/dma.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/dma.c rename to SAMM/Common/Core/Src/dma.c diff --git a/SAMM/IMUandMAG/Application/empty.txt b/SAMM/IMUandMAG/Application/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/SAMM/IMUandMAG/Application/mag.h b/SAMM/IMUandMAG/Application/mag.h new file mode 100644 index 000000000..ae4cc9d84 --- /dev/null +++ b/SAMM/IMUandMAG/Application/mag.h @@ -0,0 +1,17 @@ +#ifndef __MAG_H__ +#define __MAG_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + + +#ifdef __cplusplus +} +#endif + + +#endif // __MAG_H__ diff --git a/SAMM/IMUandMAG/Application/main.h b/SAMM/IMUandMAG/Application/main.h new file mode 100644 index 000000000..32df0ac37 --- /dev/null +++ b/SAMM/IMUandMAG/Application/main.h @@ -0,0 +1,79 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" +#include "stm32g4xx_ll_bus.h" +#include "stm32g4xx_ll_cortex.h" +#include "stm32g4xx_ll_crs.h" +#include "stm32g4xx_ll_dma.h" +#include "stm32g4xx_ll_exti.h" +#include "stm32g4xx_ll_gpio.h" +#include "stm32g4xx_ll_pwr.h" +#include "stm32g4xx_ll_rcc.h" +#include "stm32g4xx_ll_system.h" +#include "stm32g4xx_ll_utils.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/SAMM/IMUandMAG/Application/spi.h b/SAMM/IMUandMAG/Application/spi.h new file mode 100644 index 000000000..51a96c6e5 --- /dev/null +++ b/SAMM/IMUandMAG/Application/spi.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ diff --git a/SAMM/IMUandMAG/Core/empty.txt b/SAMM/IMUandMAG/Core/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/SAMM/IMUandMAG/Core/mag.c b/SAMM/IMUandMAG/Core/mag.c new file mode 100644 index 000000000..d06076082 --- /dev/null +++ b/SAMM/IMUandMAG/Core/mag.c @@ -0,0 +1,37 @@ +#include "mag.h" +#include + +#include "stm32g474xx.h" +#include "stm32g4xx_hal_spi.h" + +// init spi port before calling this function +uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) +{ + uint8_t tx_word[4]; + uint8_t rx_word[4] = {0}; + uint8_t status = 0; + mag_dev->spi_port = spi_port; + mag_dev->port = port; + mag_dev->pin = pin; + tx_word[1] = (mag_CHIP_ID << 8); + tx_word[1] |= 0x80; + tx_word[0] = 0x69; + /* + Okay so for one of these transmits we need to follow the following operation:bmi323_dev + 1. to read the register we want to: + transmit first 8 bytes, then transmit a fake 8 bytes + after we want to read 16 bytes. This should complete a single read + */ + // first we read do the dummy read to switch to spi mode + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + // rx_word = 0; + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + if (rx_word[3] == 0x43) { + return HAL_OK; + } + return HAL_ERROR; +} diff --git a/SAMM/IMUandMAG/Core/main.c b/SAMM/IMUandMAG/Core/main.c new file mode 100644 index 000000000..5c1dabb9e --- /dev/null +++ b/SAMM/IMUandMAG/Core/main.c @@ -0,0 +1,310 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +#include "crc.h" +#include "fdcan.h" +#include "gpio.h" +#include "i2c.h" +#include "spi.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include + +#include "VL53L4ED_api.h" +#include "bmi323.h" +// #include "circularBuffer.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ +#define BMI323_CS_GPIO_Port GPIOA +#define BMI323_CS_Pin GPIO_PIN_4 +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +#ifdef __GNUC__ +#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) +#else +#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) +#endif +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ +PUTCHAR_PROTOTYPE +{ + ITM_SendChar(ch); + return ch; +} +// CircularBuffer *cb; +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +// FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +/* +I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations + - still need to fully test but ideally implmentation is done + + + */ +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + + /* USER CODE BEGIN 1 */ + // cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_CRC_Init(); + MX_FDCAN1_Init(); + MX_FDCAN2_Init(); + MX_I2C1_Init(); + MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + /* USER CODE BEGIN 2 */ + + // HAL_FDCAN_Start(&hfdcan1); + // HAL_FDCAN_Start(&hfdcan2); + // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + bmi323 bmi323_dev; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + // Send 2 dummy bytes to switch BMI323 to SPI mode + // uint16_t dummy_byte = 0x8000; + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); + // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + // HAL_Delay(1); // Short delay after mode switch + + // Initialize BMI323 sensor + + // if (BMI323_Init() != HAL_OK) { + // printf("BMI323 initialization failed!\r\n"); + // Error_Handler(); + // } + + // static uint16_t eeMLX90640[832]; + // static paramsMLX90640 mlx90640; + // #define MLX90640_ADDRESS 0x33<<1 + // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + + // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + + // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + + // MLX90640_SynchFrame(MLX90640_ADDRESS); + // MLX90640_SetRefreshRate(0x33, 0x05); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + // begin VL53L4ED + HAL_Delay(100); // wait for 5ms to power up the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to reset the device + HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + HAL_Delay(100); // wait for 5ms to power up the device + + uint16_t status = 0; + + uint16_t sensor_id = 0; + VL53L4ED_ResultsData_t results; + uint8_t p_data_ready; + + int TOF_ID = 0x52; + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); + status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + + while (1) { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + // begin VL53L4ED + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if (p_data_ready) { + /* (Mandatory) Clear HW interrupt to restart measurements */ + VL53L4ED_ClearInterrupt(TOF_ID); + /* Read measured distance. RangeStatus = 0 means valid data */ + VL53L4ED_GetResult(TOF_ID, &results); + printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); + } else { + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + + // begin BMI323 + // int16_t ax, ay, az; + // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { + // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); + // } + HAL_Delay(100); // Read every 100ms + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); + LL_RCC_HSE_EnableBypass(); + LL_RCC_HSE_Enable(); + /* Wait till HSE is ready */ + while (LL_RCC_HSE_IsReady() != 1) {} + + LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); + LL_RCC_PLL_EnableDomain_SYS(); + LL_RCC_PLL_Enable(); + /* Wait till PLL is ready */ + while (LL_RCC_PLL_IsReady() != 1) {} + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} + + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (170 >> 1); i != 0; i--) + ; + + /* Set AHB prescaler*/ + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_SetSystemCoreClock(128000000); + + /* Update the time base */ + if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { + Error_Handler(); + } +} + +/* USER CODE BEGIN 4 */ +// void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) +// { +// uint8_t RxData[64]; +// HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader_FDCAN2, RxData); +// printf("got messgae\n"); +// //circularBufferPush(cb, RxData, sizeof(RxData)); + +// } +/* USER CODE END 4 */ + +/** + * @brief Period elapsed callback in non blocking mode + * @note This function is called when TIM1 interrupt took place, inside + * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment + * a global variable "uwTick" used as application time base. + * @param htim : TIM handle + * @retval None + */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + /* USER CODE BEGIN Callback 0 */ + + /* USER CODE END Callback 0 */ + if (htim->Instance == TIM1) { + HAL_IncTick(); + } + /* USER CODE BEGIN Callback 1 */ + + /* USER CODE END Callback 1 */ +} + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + __disable_irq(); + while (1) {} + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/SAMM/IMUandMAG/Core/spi.c b/SAMM/IMUandMAG/Core/spi.c new file mode 100644 index 000000000..83faae536 --- /dev/null +++ b/SAMM/IMUandMAG/Core/spi.c @@ -0,0 +1,131 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi3; + +/* spi3 init function */ +void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN spi3_Init 0 */ + + /* USER CODE END spi3_Init 0 */ + + /* USER CODE BEGIN spi3_Init 1 */ + + /* USER CODE END spi3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_16BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi3_Init 2 */ + + /* USER CODE END spi3_Init 2 */ +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (spiHandle->Instance == spi3) { + /* USER CODE BEGIN spi3_MspInit 0 */ + + /* USER CODE END spi3_MspInit 0 */ + /* spi3 clock enable */ + __HAL_RCC_spi3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**spi3 GPIO Configuration + PA5 ------> spi3_SCK + PA6 ------> spi3_MISO + PA7 ------> spi3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_spi3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_spi3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_spi3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN spi3_MspInit 1 */ + + /* USER CODE END spi3_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) +{ + + if (spiHandle->Instance == spi3) { + /* USER CODE BEGIN spi3_MspDeInit 0 */ + + /* USER CODE END spi3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_spi3_CLK_DISABLE(); + + /**spi3 GPIO Configuration + PC10 ------> spi3_SCK + PC11 ------> spi3_MISO + PC12 ------> spi3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + + /* USER CODE BEGIN spi3_MspDeInit 1 */ + + /* USER CODE END spi3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/i2c.c b/SAMM/IMUandTOF/Core/Src/i2c.c index ec88833f4..16d08d427 100644 --- a/SAMM/IMUandTOF/Core/Src/i2c.c +++ b/SAMM/IMUandTOF/Core/Src/i2c.c @@ -83,9 +83,9 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) __HAL_RCC_GPIOB_CLK_ENABLE(); /**I2C1 GPIO Configuration PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL + PB6-BOOT0 ------> I2C1_SCL */ - GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8; + GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -112,11 +112,11 @@ void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) /**I2C1 GPIO Configuration PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL + PB6-BOOT0 ------> I2C1_SCL */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); /* USER CODE BEGIN I2C1_MspDeInit 1 */ From a9a8c53527d506c5d34c50ed054b31480cb77931 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Wed, 8 Apr 2026 19:06:09 -0700 Subject: [PATCH 009/158] Additions to mag encoder files --- SAMM/IMUandMAG/Application/mag.h | 17 ++-- SAMM/IMUandMAG/Core/mag.c | 128 +++++++++++++++++++++++++++++-- SAMM/IMUandTOF/Core/Src/main.c | 1 - SAMM/IMUandTOF/Core/Src/spi.c | 8 +- 4 files changed, 134 insertions(+), 20 deletions(-) diff --git a/SAMM/IMUandMAG/Application/mag.h b/SAMM/IMUandMAG/Application/mag.h index ae4cc9d84..20a6aedd2 100644 --- a/SAMM/IMUandMAG/Application/mag.h +++ b/SAMM/IMUandMAG/Application/mag.h @@ -1,17 +1,18 @@ #ifndef __MAG_H__ #define __MAG_H__ -#ifdef __cplusplus -extern "C" { -#endif /* Includes ------------------------------------------------------------------*/ #include "main.h" +#include "spi.h" +#include "stm32g474xx.h" +typedef struct { + SPI_HandleTypeDef *spi_port; + uint16_t chip_id; + GPIO_TypeDef *port; + uint16_t pin; + /* data */ +} mag; -#ifdef __cplusplus -} #endif - - -#endif // __MAG_H__ diff --git a/SAMM/IMUandMAG/Core/mag.c b/SAMM/IMUandMAG/Core/mag.c index d06076082..50a190ed9 100644 --- a/SAMM/IMUandMAG/Core/mag.c +++ b/SAMM/IMUandMAG/Core/mag.c @@ -17,21 +17,135 @@ uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, tx_word[1] |= 0x80; tx_word[0] = 0x69; /* - Okay so for one of these transmits we need to follow the following operation:bmi323_dev + Okay so for one of these transmits we need to follow the following operation:mag_dev 1. to read the register we want to: transmit first 8 bytes, then transmit a fake 8 bytes after we want to read 16 bytes. This should complete a single read */ // first we read do the dummy read to switch to spi mode - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // rx_word = 0; - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); if (rx_word[3] == 0x43) { return HAL_OK; } return HAL_ERROR; } + +uint16_t mag_read(mag *mag_dev, uint8_t reg) +{ + uint16_t data; + // i2c_read_single(mag_I2C_ADDR, reg, &data, mag_dev->i2c_port); + return data; +} + +uint8_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) +{ + // i2c_write(mag_I2C_ADDR, reg, data, mag_dev->i2c_port); + return 1; +} + +uint8_t mag_calib_abort(mag *mag_dev) +{ + mag_write(mag_dev, mag_CMD, mag_CMD_CALIB_ABORT); + return 1; +} + +/* +TODO: +Check the status of the acc, gyro and temp before returning the values + if they are not ready return 0 + if they are ready return 1 + need to pass by reference the values to be returned + +*/ + +uint16_t mag_read_acc_x(mag *mag_dev) +{ + return mag_read(mag_dev, mag_ACC_X); +} + +uint16_t mag_read_acc_y(mag *mag_dev) +{ + return mag_read(mag_dev, mag_ACC_Y); +} + +uint16_t mag_read_acc_z(mag *mag_dev) +{ + return mag_read(mag_dev, mag_ACC_Z); +} + +uint16_t mag_read_gyr_x(mag *mag_dev) +{ + return mag_read(mag_dev, mag_GYR_X); +} + +uint16_t mag_read_gyr_y(mag *mag_dev) +{ + return mag_read(mag_dev, mag_GYR_Y); +} + +uint16_t mag_read_gyr_z(mag *mag_dev) +{ + return mag_read(mag_dev, mag_GYR_Z); +} + +uint16_t mag_read_temp_data(mag *mag_dev) +{ + return mag_read(mag_dev, mag_TEMP_DATA); +} + +uint16_t mag_read_status(mag *mag_dev) +{ + return mag_read(mag_dev, mag_STATUS); +} + +uint16_t mag_read_err_reg(mag *mag_dev) +{ + return mag_read(mag_dev, mag_ERR_REG); +} + +uint16_t mag_read_chip_id(mag *mag_dev) +{ + return mag_read(mag_dev, mag_CHIP_ID); +} + +uint16_t mag_read_acc_conf(mag *mag_dev) +{ + return mag_read(mag_dev, mag_ACC_CONF); +} + +uint16_t mag_read_gyr_conf(mag *mag_dev) +{ + return mag_read(mag_dev, mag_GYR_CONF); +} + +uint8_t mag_enable_acc(mag *mag_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr) +{ + // uint16_t acc_conf = mag_read_acc_conf(mag_dev); + uint16_t new_conf = 0; + new_conf |= acc_mode << 12; + new_conf |= acc_avg_num << 8; + new_conf |= acc_bw << 7; + new_conf |= acc_range << 4; + new_conf |= acc_odr; + mag_write(mag_dev, mag_ACC_CONF, new_conf); + return 1; +} + +uint8_t mag_enable_gyro(mag *mag_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr) +{ + // uint16_t acc_conf = mag_read_acc_conf(mag_dev); + uint16_t new_conf = 0; + new_conf |= gyr_mode << 12; + new_conf |= gyr_avg_num << 8; + new_conf |= gyr_bw << 7; + new_conf |= gyr_range << 4; + new_conf |= gyr_odr; + mag_write(mag_dev, mag_GYR_CONF, new_conf); + return 1; +} diff --git a/SAMM/IMUandTOF/Core/Src/main.c b/SAMM/IMUandTOF/Core/Src/main.c index 5c1dabb9e..7137016a6 100644 --- a/SAMM/IMUandTOF/Core/Src/main.c +++ b/SAMM/IMUandTOF/Core/Src/main.c @@ -18,7 +18,6 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" - #include "crc.h" #include "fdcan.h" #include "gpio.h" diff --git a/SAMM/IMUandTOF/Core/Src/spi.c b/SAMM/IMUandTOF/Core/Src/spi.c index 31f66776b..aa8d4d0c8 100644 --- a/SAMM/IMUandTOF/Core/Src/spi.c +++ b/SAMM/IMUandTOF/Core/Src/spi.c @@ -70,7 +70,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) /* spi1 clock enable */ __HAL_RCC_spi1_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); /**spi1 GPIO Configuration PA5 ------> spi1_SCK PA6 ------> spi1_MISO @@ -107,9 +107,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) __HAL_RCC_spi1_CLK_DISABLE(); /**spi1 GPIO Configuration - PC10 ------> spi1_SCK - PC11 ------> spi1_MISO - PC12 ------> spi1_MOSI + PA5 ------> spi1_SCK + PA6 ------> spi1_MISO + PA7 ------> spi1_MOSI */ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); From 3dcfbe2587e5d198612b3488e1a88fe4522fe92e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 02:07:41 +0000 Subject: [PATCH 010/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/IMUandMAG/Application/mag.h | 1 - SAMM/IMUandMAG/Core/mag.c | 1 + SAMM/IMUandMAG/Core/spi.c | 2 +- SAMM/IMUandTOF/Core/Src/main.c | 1 + 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/SAMM/IMUandMAG/Application/mag.h b/SAMM/IMUandMAG/Application/mag.h index 20a6aedd2..941561274 100644 --- a/SAMM/IMUandMAG/Application/mag.h +++ b/SAMM/IMUandMAG/Application/mag.h @@ -1,7 +1,6 @@ #ifndef __MAG_H__ #define __MAG_H__ - /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "spi.h" diff --git a/SAMM/IMUandMAG/Core/mag.c b/SAMM/IMUandMAG/Core/mag.c index 50a190ed9..fd43cbd1c 100644 --- a/SAMM/IMUandMAG/Core/mag.c +++ b/SAMM/IMUandMAG/Core/mag.c @@ -1,4 +1,5 @@ #include "mag.h" + #include #include "stm32g474xx.h" diff --git a/SAMM/IMUandMAG/Core/spi.c b/SAMM/IMUandMAG/Core/spi.c index 83faae536..17e1803e9 100644 --- a/SAMM/IMUandMAG/Core/spi.c +++ b/SAMM/IMUandMAG/Core/spi.c @@ -90,7 +90,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) GPIO_InitStruct.Alternate = GPIO_AF5_spi3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; diff --git a/SAMM/IMUandTOF/Core/Src/main.c b/SAMM/IMUandTOF/Core/Src/main.c index 7137016a6..5c1dabb9e 100644 --- a/SAMM/IMUandTOF/Core/Src/main.c +++ b/SAMM/IMUandTOF/Core/Src/main.c @@ -18,6 +18,7 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" + #include "crc.h" #include "fdcan.h" #include "gpio.h" From c080b8ffbafce36a4832057940c80ea69c2532d8 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 16:43:54 -0700 Subject: [PATCH 011/158] Corrected GPIO pins for SPI and FDCAN --- SAMM/IMUandTOF/Core/Src/fdcan.c | 8 ++++---- SAMM/IMUandTOF/Core/Src/spi.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/SAMM/IMUandTOF/Core/Src/fdcan.c b/SAMM/IMUandTOF/Core/Src/fdcan.c index 600df963c..3e239ca01 100644 --- a/SAMM/IMUandTOF/Core/Src/fdcan.c +++ b/SAMM/IMUandTOF/Core/Src/fdcan.c @@ -149,9 +149,9 @@ void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) __HAL_RCC_GPIOB_CLK_ENABLE(); /**FDCAN2 GPIO Configuration PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX + PB12 ------> FDCAN2_RX */ - GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_5; + GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; @@ -198,9 +198,9 @@ void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) /**FDCAN2 GPIO Configuration PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX + PB12 ------> FDCAN2_RX */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_5); + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_12); /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/spi.c b/SAMM/IMUandTOF/Core/Src/spi.c index aa8d4d0c8..4e5e97e32 100644 --- a/SAMM/IMUandTOF/Core/Src/spi.c +++ b/SAMM/IMUandTOF/Core/Src/spi.c @@ -63,7 +63,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == spi1) { + if (spiHandle->Instance == SPI1) { /* USER CODE BEGIN spi1_MspInit 0 */ /* USER CODE END spi1_MspInit 0 */ @@ -80,14 +80,14 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_spi1; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN spi1_MspInit 1 */ @@ -99,7 +99,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) { - if (spiHandle->Instance == spi1) { + if (spiHandle->Instance == SPI1) { /* USER CODE BEGIN spi1_MspDeInit 0 */ /* USER CODE END spi1_MspDeInit 0 */ From 44cfb2a8eeacafbb4a4361c9518e475fa2ea047c Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 18:51:40 -0700 Subject: [PATCH 012/158] Reorganized files under IMUandMAG --- SAMM/{IMUandTOF => Common}/Core/Inc/bmi323.h | 0 SAMM/{IMUandTOF => Common}/Core/Inc/fdcan.h | 0 SAMM/{IMUandTOF => Common}/Core/Src/bmi323.c | 0 SAMM/{IMUandTOF => Common}/Core/Src/fdcan.c | 0 .../IMUandMAG/{Application => Core/Inc}/mag.h | 0 .../{Application => Core/Inc}/main.h | 0 .../IMUandMAG/{Application => Core/Inc}/spi.h | 1 + SAMM/IMUandMAG/Core/{ => Src}/mag.c | 0 SAMM/IMUandMAG/Core/{ => Src}/main.c | 0 SAMM/IMUandMAG/Core/{ => Src}/spi.c | 56 +++++++++++++++---- SAMM/IMUandTOF/Core/Src/gpio.c | 4 +- 11 files changed, 49 insertions(+), 12 deletions(-) rename SAMM/{IMUandTOF => Common}/Core/Inc/bmi323.h (100%) rename SAMM/{IMUandTOF => Common}/Core/Inc/fdcan.h (100%) rename SAMM/{IMUandTOF => Common}/Core/Src/bmi323.c (100%) rename SAMM/{IMUandTOF => Common}/Core/Src/fdcan.c (100%) rename SAMM/IMUandMAG/{Application => Core/Inc}/mag.h (100%) rename SAMM/IMUandMAG/{Application => Core/Inc}/main.h (100%) rename SAMM/IMUandMAG/{Application => Core/Inc}/spi.h (98%) rename SAMM/IMUandMAG/Core/{ => Src}/mag.c (100%) rename SAMM/IMUandMAG/Core/{ => Src}/main.c (100%) rename SAMM/IMUandMAG/Core/{ => Src}/spi.c (70%) diff --git a/SAMM/IMUandTOF/Core/Inc/bmi323.h b/SAMM/Common/Core/Inc/bmi323.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/bmi323.h rename to SAMM/Common/Core/Inc/bmi323.h diff --git a/SAMM/IMUandTOF/Core/Inc/fdcan.h b/SAMM/Common/Core/Inc/fdcan.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/fdcan.h rename to SAMM/Common/Core/Inc/fdcan.h diff --git a/SAMM/IMUandTOF/Core/Src/bmi323.c b/SAMM/Common/Core/Src/bmi323.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/bmi323.c rename to SAMM/Common/Core/Src/bmi323.c diff --git a/SAMM/IMUandTOF/Core/Src/fdcan.c b/SAMM/Common/Core/Src/fdcan.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/fdcan.c rename to SAMM/Common/Core/Src/fdcan.c diff --git a/SAMM/IMUandMAG/Application/mag.h b/SAMM/IMUandMAG/Core/Inc/mag.h similarity index 100% rename from SAMM/IMUandMAG/Application/mag.h rename to SAMM/IMUandMAG/Core/Inc/mag.h diff --git a/SAMM/IMUandMAG/Application/main.h b/SAMM/IMUandMAG/Core/Inc/main.h similarity index 100% rename from SAMM/IMUandMAG/Application/main.h rename to SAMM/IMUandMAG/Core/Inc/main.h diff --git a/SAMM/IMUandMAG/Application/spi.h b/SAMM/IMUandMAG/Core/Inc/spi.h similarity index 98% rename from SAMM/IMUandMAG/Application/spi.h rename to SAMM/IMUandMAG/Core/Inc/spi.h index 51a96c6e5..db79d4558 100644 --- a/SAMM/IMUandMAG/Application/spi.h +++ b/SAMM/IMUandMAG/Core/Inc/spi.h @@ -38,6 +38,7 @@ extern SPI_HandleTypeDef hspi3; /* USER CODE END Private defines */ +void MX_SPI1_Init(void); void MX_SPI3_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/SAMM/IMUandMAG/Core/mag.c b/SAMM/IMUandMAG/Core/Src/mag.c similarity index 100% rename from SAMM/IMUandMAG/Core/mag.c rename to SAMM/IMUandMAG/Core/Src/mag.c diff --git a/SAMM/IMUandMAG/Core/main.c b/SAMM/IMUandMAG/Core/Src/main.c similarity index 100% rename from SAMM/IMUandMAG/Core/main.c rename to SAMM/IMUandMAG/Core/Src/main.c diff --git a/SAMM/IMUandMAG/Core/spi.c b/SAMM/IMUandMAG/Core/Src/spi.c similarity index 70% rename from SAMM/IMUandMAG/Core/spi.c rename to SAMM/IMUandMAG/Core/Src/spi.c index 17e1803e9..bc7c80f1d 100644 --- a/SAMM/IMUandMAG/Core/spi.c +++ b/SAMM/IMUandMAG/Core/Src/spi.c @@ -24,9 +24,43 @@ /* USER CODE END 0 */ +SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi3; -/* spi3 init function */ +/* SPI1 Init function -> used for IMU */ +void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN spi1_Init 0 */ + + /* USER CODE END spi1_Init 0 */ + + /* USER CODE BEGIN spi1_Init 1 */ + + /* USER CODE END spi1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_16BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi1_Init 2 */ + + /* USER CODE END spi1_Init 2 */ +} + +/* SPI3 init function -> used for MAG encoder */ void MX_SPI3_Init(void) { @@ -72,29 +106,29 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) __HAL_RCC_GPIOC_CLK_ENABLE(); /**spi3 GPIO Configuration - PA5 ------> spi3_SCK - PA6 ------> spi3_MISO - PA7 ------> spi3_MOSI + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI */ GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_spi3; + GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_spi3; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_spi3; + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /* USER CODE BEGIN spi3_MspInit 1 */ @@ -106,7 +140,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) { - if (spiHandle->Instance == spi3) { + if (spiHandle->Instance == SPI3) { /* USER CODE BEGIN spi3_MspDeInit 0 */ /* USER CODE END spi3_MspDeInit 0 */ @@ -114,9 +148,9 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) __HAL_RCC_spi3_CLK_DISABLE(); /**spi3 GPIO Configuration - PC10 ------> spi3_SCK - PC11 ------> spi3_MISO - PC12 ------> spi3_MOSI + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI */ HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); diff --git a/SAMM/IMUandTOF/Core/Src/gpio.c b/SAMM/IMUandTOF/Core/Src/gpio.c index bd5e1df5f..64c996563 100644 --- a/SAMM/IMUandTOF/Core/Src/gpio.c +++ b/SAMM/IMUandTOF/Core/Src/gpio.c @@ -58,12 +58,14 @@ void MX_GPIO_Init(void) /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET); - /*Configure GPIO pin : PF1 */ + /*Configure GPIO pin : PF1 -> ToF not being used */ + /* GPIO_InitStruct.Pin = GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + */ /*Configure GPIO pins : PB1 PB4 */ GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4; From 5164eee16583c15c8d8a2d0528f3b785698c3a1f Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 20:16:05 -0700 Subject: [PATCH 013/158] Further reorganization, modifying some G4 files to H5 --- SAMM/Common/Application/empty.txt | 0 SAMM/Common/Core/empty.txt | 0 SAMM/IMUandTOF/Application/empty.txt | 0 SAMM/IMUandTOF/Core/Inc/stm32_assert.h | 52 ---- SAMM/IMUandTOF/Core/Src/spi.c | 124 -------- SAMM/IMUandTOF/Core/Src/syscalls.c | 168 ----------- SAMM/IMUandTOF/Core/Src/sysmem.c | 77 ----- SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c | 284 ------------------ SAMM/{Common/Core => SAMM_Mag}/Inc/adc.h | 0 SAMM/{Common/Core => SAMM_Mag}/Inc/bmi323.h | 0 SAMM/{Common/Core => SAMM_Mag}/Inc/crc.h | 0 SAMM/{Common/Core => SAMM_Mag}/Inc/dma.h | 0 SAMM/{Common/Core => SAMM_Mag}/Inc/fdcan.h | 0 SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/mag.h | 0 SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/main.h | 0 SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/spi.h | 0 SAMM/{Common/Core => SAMM_Mag}/Src/adc.c | 0 SAMM/{Common/Core => SAMM_Mag}/Src/bmi323.c | 0 SAMM/{Common/Core => SAMM_Mag}/Src/crc.c | 0 SAMM/{Common/Core => SAMM_Mag}/Src/dma.c | 0 SAMM/{Common/Core => SAMM_Mag}/Src/fdcan.c | 0 SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/mag.c | 0 SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/main.c | 72 ++--- SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/spi.c | 0 .../Extras/CircBuF/circularBuffer.c | 0 .../Extras/CircBuF/circularBuffer.h | 0 .../Extras/VL53L4ED/VL53L4ED_api.c | 0 .../Extras/VL53L4ED/VL53L4ED_api.h | 0 .../Extras/VL53L4ED/VL53L4ED_calibration.c | 0 .../Extras/VL53L4ED/VL53L4ED_calibration.h | 0 .../Extras/VL53L4ED/platform.c | 0 .../Extras/VL53L4ED/platform.h | 0 .../Core => SAMM_TOF}/Extras/extra.c | 0 .../Core => SAMM_TOF}/Extras/extra.h | 0 .../Core/Inc/spi.h => SAMM_TOF/Inc/adc.h} | 14 +- SAMM/SAMM_TOF/Inc/crc.h | 51 ++++ SAMM/SAMM_TOF/Inc/dma.h | 51 ++++ SAMM/SAMM_TOF/Inc/fdcan.h | 54 ++++ SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/gpio.h | 0 SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/i2c.h | 0 SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/main.h | 22 +- .../Inc/stm32h5xx_hal_conf.h} | 82 ++--- .../Inc/stm32h5xx_it.h} | 8 +- SAMM/SAMM_TOF/Src/adc.c | 148 +++++++++ SAMM/SAMM_TOF/Src/crc.c | 86 ++++++ SAMM/SAMM_TOF/Src/dma.c | 57 ++++ SAMM/SAMM_TOF/Src/fdcan.c | 213 +++++++++++++ SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/gpio.c | 0 SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/i2c.c | 0 SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/main.c | 15 +- .../Core => SAMM_TOF}/Src/stm32g4xx_hal_msp.c | 0 .../Src/stm32h5xx_hal_timebase_tim.c} | 6 +- .../Src/stm32h5xx_it.c} | 8 +- 53 files changed, 773 insertions(+), 819 deletions(-) delete mode 100644 SAMM/Common/Application/empty.txt delete mode 100644 SAMM/Common/Core/empty.txt delete mode 100644 SAMM/IMUandTOF/Application/empty.txt delete mode 100644 SAMM/IMUandTOF/Core/Inc/stm32_assert.h delete mode 100644 SAMM/IMUandTOF/Core/Src/spi.c delete mode 100644 SAMM/IMUandTOF/Core/Src/syscalls.c delete mode 100644 SAMM/IMUandTOF/Core/Src/sysmem.c delete mode 100644 SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c rename SAMM/{Common/Core => SAMM_Mag}/Inc/adc.h (100%) rename SAMM/{Common/Core => SAMM_Mag}/Inc/bmi323.h (100%) rename SAMM/{Common/Core => SAMM_Mag}/Inc/crc.h (100%) rename SAMM/{Common/Core => SAMM_Mag}/Inc/dma.h (100%) rename SAMM/{Common/Core => SAMM_Mag}/Inc/fdcan.h (100%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/mag.h (100%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/main.h (100%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Inc/spi.h (100%) rename SAMM/{Common/Core => SAMM_Mag}/Src/adc.c (100%) rename SAMM/{Common/Core => SAMM_Mag}/Src/bmi323.c (100%) rename SAMM/{Common/Core => SAMM_Mag}/Src/crc.c (100%) rename SAMM/{Common/Core => SAMM_Mag}/Src/dma.c (100%) rename SAMM/{Common/Core => SAMM_Mag}/Src/fdcan.c (100%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/mag.c (100%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/main.c (83%) rename SAMM/{IMUandMAG/Core => SAMM_Mag}/Src/spi.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/CircBuF/circularBuffer.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/CircBuF/circularBuffer.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/VL53L4ED_api.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/VL53L4ED_api.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/VL53L4ED_calibration.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/VL53L4ED_calibration.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/platform.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/VL53L4ED/platform.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/extra.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Extras/extra.h (100%) rename SAMM/{IMUandTOF/Core/Inc/spi.h => SAMM_TOF/Inc/adc.h} (87%) create mode 100644 SAMM/SAMM_TOF/Inc/crc.h create mode 100644 SAMM/SAMM_TOF/Inc/dma.h create mode 100644 SAMM/SAMM_TOF/Inc/fdcan.h rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/gpio.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/i2c.h (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Inc/main.h (84%) rename SAMM/{IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h => SAMM_TOF/Inc/stm32h5xx_hal_conf.h} (89%) rename SAMM/{IMUandTOF/Core/Inc/stm32g4xx_it.h => SAMM_TOF/Inc/stm32h5xx_it.h} (94%) create mode 100644 SAMM/SAMM_TOF/Src/adc.c create mode 100644 SAMM/SAMM_TOF/Src/crc.c create mode 100644 SAMM/SAMM_TOF/Src/dma.c create mode 100644 SAMM/SAMM_TOF/Src/fdcan.c rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/gpio.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/i2c.c (100%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/main.c (96%) rename SAMM/{IMUandTOF/Core => SAMM_TOF}/Src/stm32g4xx_hal_msp.c (100%) rename SAMM/{IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c => SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c} (97%) rename SAMM/{IMUandTOF/Core/Src/stm32g4xx_it.c => SAMM_TOF/Src/stm32h5xx_it.c} (96%) diff --git a/SAMM/Common/Application/empty.txt b/SAMM/Common/Application/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/SAMM/Common/Core/empty.txt b/SAMM/Common/Core/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/SAMM/IMUandTOF/Application/empty.txt b/SAMM/IMUandTOF/Application/empty.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/SAMM/IMUandTOF/Core/Inc/stm32_assert.h b/SAMM/IMUandTOF/Core/Inc/stm32_assert.h deleted file mode 100644 index 92460620f..000000000 --- a/SAMM/IMUandTOF/Core/Inc/stm32_assert.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32_assert.h - * @author MCD Application Team - * @brief STM32 assert file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32_ASSERT_H -#define __STM32_ASSERT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Includes ------------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32_ASSERT_H */ diff --git a/SAMM/IMUandTOF/Core/Src/spi.c b/SAMM/IMUandTOF/Core/Src/spi.c deleted file mode 100644 index 4e5e97e32..000000000 --- a/SAMM/IMUandTOF/Core/Src/spi.c +++ /dev/null @@ -1,124 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi1; - -/* spi1 init function */ -void MX_SPI1_Init(void) -{ - - /* USER CODE BEGIN spi1_Init 0 */ - - /* USER CODE END spi1_Init 0 */ - - /* USER CODE BEGIN spi1_Init 1 */ - - /* USER CODE END spi1_Init 1 */ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_16BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; - hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi1_Init 2 */ - - /* USER CODE END spi1_Init 2 */ -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == SPI1) { - /* USER CODE BEGIN spi1_MspInit 0 */ - - /* USER CODE END spi1_MspInit 0 */ - /* spi1 clock enable */ - __HAL_RCC_spi1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**spi1 GPIO Configuration - PA5 ------> spi1_SCK - PA6 ------> spi1_MISO - PA7 ------> spi1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN spi1_MspInit 1 */ - - /* USER CODE END spi1_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) -{ - - if (spiHandle->Instance == SPI1) { - /* USER CODE BEGIN spi1_MspDeInit 0 */ - - /* USER CODE END spi1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_spi1_CLK_DISABLE(); - - /**spi1 GPIO Configuration - PA5 ------> spi1_SCK - PA6 ------> spi1_MISO - PA7 ------> spi1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); - - /* USER CODE BEGIN spi1_MspDeInit 1 */ - - /* USER CODE END spi1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/syscalls.c b/SAMM/IMUandTOF/Core/Src/syscalls.c deleted file mode 100644 index a59a7d089..000000000 --- a/SAMM/IMUandTOF/Core/Src/syscalls.c +++ /dev/null @@ -1,168 +0,0 @@ -/** - ****************************************************************************** - * @file syscalls.c - * @author Auto-generated by STM32CubeMX - * @brief Minimal System calls file - * - * For more information about which c-functions - * need which of these lowlevel functions - * please consult the Newlib libc-manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2020-2024 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. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* Variables */ -extern int __io_putchar(int ch) __attribute__((weak)); -extern int __io_getchar(void) __attribute__((weak)); - -char *__env[1] = {0}; -char **environ = __env; - -/* Functions */ -void initialise_monitor_handles() {} - -int _getpid(void) -{ - return 1; -} - -int _kill(int pid, int sig) -{ - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - -void _exit(int status) -{ - _kill(status, -1); - while (1) {} /* Make sure we hang here */ -} - -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) { - *ptr++ = __io_getchar(); - } - - return len; -} - -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) { - __io_putchar(*ptr++); - } - return len; -} - -int _close(int file) -{ - (void)file; - return -1; -} - -int _fstat(int file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int file) -{ - (void)file; - return 1; -} - -int _lseek(int file, int ptr, int dir) -{ - (void)file; - (void)ptr; - (void)dir; - return 0; -} - -int _open(char *path, int flags, ...) -{ - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; -} - -int _wait(int *status) -{ - (void)status; - errno = ECHILD; - return -1; -} - -int _unlink(char *name) -{ - (void)name; - errno = ENOENT; - return -1; -} - -int _times(struct tms *buf) -{ - (void)buf; - return -1; -} - -int _stat(char *file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _link(char *old, char *new) -{ - (void)old; - (void)new; - errno = EMLINK; - return -1; -} - -int _fork(void) -{ - errno = EAGAIN; - return -1; -} - -int _execve(char *name, char **argv, char **env) -{ - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; -} diff --git a/SAMM/IMUandTOF/Core/Src/sysmem.c b/SAMM/IMUandTOF/Core/Src/sysmem.c deleted file mode 100644 index 00c397937..000000000 --- a/SAMM/IMUandTOF/Core/Src/sysmem.c +++ /dev/null @@ -1,77 +0,0 @@ -/** - ****************************************************************************** - * @file sysmem.c - * @author Generated by STM32CubeMX - * @brief System Memory calls file - * - * For more information about which C functions - * need which of these lowlevel functions - * please consult the newlib libc manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include - -/** - * Pointer to the current high watermark of the heap usage - */ -static uint8_t *__sbrk_heap_end = NULL; - -/** - * @brief _sbrk() allocates memory to the newlib heap and is used by malloc - * and others from the C library - * - * @verbatim - * ############################################################################ - * # .data # .bss # newlib heap # MSP stack # - * # # # # Reserved by _Min_Stack_Size # - * ############################################################################ - * ^-- RAM start ^-- _end _estack, RAM end --^ - * @endverbatim - * - * This implementation starts allocating at the '_end' linker symbol - * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack - * The implementation considers '_estack' linker symbol to be RAM end - * NOTE: If the MSP stack, at any point during execution, grows larger than the - * reserved size, please increase the '_Min_Stack_Size'. - * - * @param incr Memory size - * @return Pointer to allocated memory - */ -void *_sbrk(ptrdiff_t incr) -{ - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; - - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) { - __sbrk_heap_end = &_end; - } - - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) { - errno = ENOMEM; - return (void *)-1; - } - - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; - - return (void *)prev_heap_end; -} diff --git a/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c b/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c deleted file mode 100644 index 14d0e1be1..000000000 --- a/SAMM/IMUandTOF/Core/Src/system_stm32g4xx.c +++ /dev/null @@ -1,284 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32g4xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32g4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * After each device reset the HSI (16 MHz) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to - * configure the system clock before to branch to main program. - * - * This file configures the system clock as follows: - *============================================================================= - *----------------------------------------------------------------------------- - * System Clock source | HSI - *----------------------------------------------------------------------------- - * SYSCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * HCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB1 Prescaler | 1 - *----------------------------------------------------------------------------- - * APB2 Prescaler | 1 - *----------------------------------------------------------------------------- - * PLL_M | 1 - *----------------------------------------------------------------------------- - * PLL_N | 16 - *----------------------------------------------------------------------------- - * PLL_P | 7 - *----------------------------------------------------------------------------- - * PLL_Q | 2 - *----------------------------------------------------------------------------- - * PLL_R | 2 - *----------------------------------------------------------------------------- - * Require 48MHz for RNG | Disabled - *----------------------------------------------------------------------------- - *============================================================================= - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32g4xx_system - * @{ - */ - -/** @addtogroup STM32G4xx_System_Private_Includes - * @{ - */ - -#include "stm32g4xx.h" - -#if !defined(HSE_VALUE) -#define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSI_VALUE) -#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/* Note: Following vector table addresses must be defined in line with linker - configuration. */ -/*!< Uncomment the following line if you need to relocate the vector table - anywhere in Flash or Sram, else the vector table is kept at the automatic - remap of boot address selected */ -#define USER_VECT_TAB_ADDRESS - -#if defined(USER_VECT_TAB_ADDRESS) -/*!< Uncomment the following line if you need to relocate your vector Table - in Sram else user remap will be done in Flash. */ -/* #define VECT_TAB_SRAM */ -#if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS \ - SRAM_BASE /*!< Vector Table base address field. \ - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET \ - 0x00000000U /*!< Vector Table base offset field. \ - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_BASE_ADDRESS \ - FLASH_BASE /*!< Vector Table base address field. \ - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET \ - 0x00000000U /*!< Vector Table base offset field. \ - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ - /******************************************************************************/ - /** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Variables - * @{ - */ -/* The SystemCoreClock variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. -*/ -uint32_t SystemCoreClock = HSI_VALUE; - -const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; -const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system. - * @param None - * @retval None - */ - -void SystemInit(void) -{ -/* FPU settings ------------------------------------------------------------*/ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2))); /* set CP10 and CP11 Full Access */ -#endif - - /* Configure the Vector Table location add offset address ------------------*/ -#if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value - * 24 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp, pllvco, pllr, pllsource, pllm; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) { - case 0x04: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - - case 0x08: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - - case 0x0C: /* PLL used as system clock source */ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U; - if (pllsource == 0x02UL) /* HSI used as PLL clock source */ - { - pllvco = (HSI_VALUE / pllm); - } else /* HSE used as PLL clock source */ - { - pllvco = (HSE_VALUE / pllm); - } - pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); - pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; - SystemCoreClock = pllvco / pllr; - break; - - default: - break; - } - /* Compute HCLK clock frequency --------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/SAMM/Common/Core/Inc/adc.h b/SAMM/SAMM_Mag/Inc/adc.h similarity index 100% rename from SAMM/Common/Core/Inc/adc.h rename to SAMM/SAMM_Mag/Inc/adc.h diff --git a/SAMM/Common/Core/Inc/bmi323.h b/SAMM/SAMM_Mag/Inc/bmi323.h similarity index 100% rename from SAMM/Common/Core/Inc/bmi323.h rename to SAMM/SAMM_Mag/Inc/bmi323.h diff --git a/SAMM/Common/Core/Inc/crc.h b/SAMM/SAMM_Mag/Inc/crc.h similarity index 100% rename from SAMM/Common/Core/Inc/crc.h rename to SAMM/SAMM_Mag/Inc/crc.h diff --git a/SAMM/Common/Core/Inc/dma.h b/SAMM/SAMM_Mag/Inc/dma.h similarity index 100% rename from SAMM/Common/Core/Inc/dma.h rename to SAMM/SAMM_Mag/Inc/dma.h diff --git a/SAMM/Common/Core/Inc/fdcan.h b/SAMM/SAMM_Mag/Inc/fdcan.h similarity index 100% rename from SAMM/Common/Core/Inc/fdcan.h rename to SAMM/SAMM_Mag/Inc/fdcan.h diff --git a/SAMM/IMUandMAG/Core/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h similarity index 100% rename from SAMM/IMUandMAG/Core/Inc/mag.h rename to SAMM/SAMM_Mag/Inc/mag.h diff --git a/SAMM/IMUandMAG/Core/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h similarity index 100% rename from SAMM/IMUandMAG/Core/Inc/main.h rename to SAMM/SAMM_Mag/Inc/main.h diff --git a/SAMM/IMUandMAG/Core/Inc/spi.h b/SAMM/SAMM_Mag/Inc/spi.h similarity index 100% rename from SAMM/IMUandMAG/Core/Inc/spi.h rename to SAMM/SAMM_Mag/Inc/spi.h diff --git a/SAMM/Common/Core/Src/adc.c b/SAMM/SAMM_Mag/Src/adc.c similarity index 100% rename from SAMM/Common/Core/Src/adc.c rename to SAMM/SAMM_Mag/Src/adc.c diff --git a/SAMM/Common/Core/Src/bmi323.c b/SAMM/SAMM_Mag/Src/bmi323.c similarity index 100% rename from SAMM/Common/Core/Src/bmi323.c rename to SAMM/SAMM_Mag/Src/bmi323.c diff --git a/SAMM/Common/Core/Src/crc.c b/SAMM/SAMM_Mag/Src/crc.c similarity index 100% rename from SAMM/Common/Core/Src/crc.c rename to SAMM/SAMM_Mag/Src/crc.c diff --git a/SAMM/Common/Core/Src/dma.c b/SAMM/SAMM_Mag/Src/dma.c similarity index 100% rename from SAMM/Common/Core/Src/dma.c rename to SAMM/SAMM_Mag/Src/dma.c diff --git a/SAMM/Common/Core/Src/fdcan.c b/SAMM/SAMM_Mag/Src/fdcan.c similarity index 100% rename from SAMM/Common/Core/Src/fdcan.c rename to SAMM/SAMM_Mag/Src/fdcan.c diff --git a/SAMM/IMUandMAG/Core/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c similarity index 100% rename from SAMM/IMUandMAG/Core/Src/mag.c rename to SAMM/SAMM_Mag/Src/mag.c diff --git a/SAMM/IMUandMAG/Core/Src/main.c b/SAMM/SAMM_Mag/Src/main.c similarity index 83% rename from SAMM/IMUandMAG/Core/Src/main.c rename to SAMM/SAMM_Mag/Src/main.c index 5c1dabb9e..0483f2dbb 100644 --- a/SAMM/IMUandMAG/Core/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -22,14 +22,14 @@ #include "crc.h" #include "fdcan.h" #include "gpio.h" -#include "i2c.h" +//#include "i2c.h" #include "spi.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include -#include "VL53L4ED_api.h" +//#include "VL53L4ED_api.h" #include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ @@ -154,27 +154,27 @@ int main(void) /* Infinite loop */ /* USER CODE BEGIN WHILE */ // begin VL53L4ED - HAL_Delay(100); // wait for 5ms to power up the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to power up the device - - uint16_t status = 0; - - uint16_t sensor_id = 0; - VL53L4ED_ResultsData_t results; - uint8_t p_data_ready; - - int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); - status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); - status = VL53L4ED_StartRanging(TOF_ID); - status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + // HAL_Delay(100); // wait for 5ms to power up the device + // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin + // // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin + // HAL_Delay(100); // wait for 5ms to reset the device + // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin + // // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin + // HAL_Delay(100); // wait for 5ms to power up the device + + // uint16_t status = 0; + + // uint16_t sensor_id = 0; + // VL53L4ED_ResultsData_t results; + // uint8_t p_data_ready; + + // int TOF_ID = 0x52; + // HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + // status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); + // printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + // status = VL53L4ED_StartRanging(TOF_ID); + // status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); + // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); @@ -183,25 +183,25 @@ int main(void) /* USER CODE BEGIN 3 */ // begin VL53L4ED - status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - if (p_data_ready) { - /* (Mandatory) Clear HW interrupt to restart measurements */ - VL53L4ED_ClearInterrupt(TOF_ID); - /* Read measured distance. RangeStatus = 0 means valid data */ - VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); - } else { - HAL_Delay(10); - __disable_irq(); - __enable_irq(); - } + // status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + // if (p_data_ready) { + // /* (Mandatory) Clear HW interrupt to restart measurements */ + // VL53L4ED_ClearInterrupt(TOF_ID); + // /* Read measured distance. RangeStatus = 0 means valid data */ + // VL53L4ED_GetResult(TOF_ID, &results); + // printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); + // } else { + // HAL_Delay(10); + // __disable_irq(); + // __enable_irq(); + // } // begin BMI323 // int16_t ax, ay, az; // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); // } - HAL_Delay(100); // Read every 100ms + //HAL_Delay(100); // Read every 100ms } /* USER CODE END 3 */ } diff --git a/SAMM/IMUandMAG/Core/Src/spi.c b/SAMM/SAMM_Mag/Src/spi.c similarity index 100% rename from SAMM/IMUandMAG/Core/Src/spi.c rename to SAMM/SAMM_Mag/Src/spi.c diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c b/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.c rename to SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c diff --git a/SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h b/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/CircBuF/circularBuffer.h rename to SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.c similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.c rename to SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.c diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.h similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_api.h rename to SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.h diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.c similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.c rename to SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.c diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.h similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/VL53L4ED_calibration.h rename to SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.h diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c b/SAMM/SAMM_TOF/Extras/VL53L4ED/platform.c similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.c rename to SAMM/SAMM_TOF/Extras/VL53L4ED/platform.c diff --git a/SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h b/SAMM/SAMM_TOF/Extras/VL53L4ED/platform.h similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/VL53L4ED/platform.h rename to SAMM/SAMM_TOF/Extras/VL53L4ED/platform.h diff --git a/SAMM/IMUandTOF/Core/Extras/extra.c b/SAMM/SAMM_TOF/Extras/extra.c similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/extra.c rename to SAMM/SAMM_TOF/Extras/extra.c diff --git a/SAMM/IMUandTOF/Core/Extras/extra.h b/SAMM/SAMM_TOF/Extras/extra.h similarity index 100% rename from SAMM/IMUandTOF/Core/Extras/extra.h rename to SAMM/SAMM_TOF/Extras/extra.h diff --git a/SAMM/IMUandTOF/Core/Inc/spi.h b/SAMM/SAMM_TOF/Inc/adc.h similarity index 87% rename from SAMM/IMUandTOF/Core/Inc/spi.h rename to SAMM/SAMM_TOF/Inc/adc.h index 795f9dd81..e65b1f6f8 100644 --- a/SAMM/IMUandTOF/Core/Inc/spi.h +++ b/SAMM/SAMM_TOF/Inc/adc.h @@ -1,9 +1,9 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file spi.h + * @file adc.h * @brief This file contains all the function prototypes for - * the spi.c file + * the adc.c file ****************************************************************************** * @attention * @@ -18,8 +18,8 @@ */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ +#ifndef __ADC_H__ +#define __ADC_H__ #ifdef __cplusplus extern "C" { @@ -32,13 +32,13 @@ extern "C" { /* USER CODE END Includes */ -extern SPI_HandleTypeDef hspi1; +extern ADC_HandleTypeDef hadc1; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ -void MX_SPI1_Init(void); +void MX_ADC1_Init(void); /* USER CODE BEGIN Prototypes */ @@ -48,4 +48,4 @@ void MX_SPI1_Init(void); } #endif -#endif /* __SPI_H__ */ +#endif /* __ADC_H__ */ diff --git a/SAMM/SAMM_TOF/Inc/crc.h b/SAMM/SAMM_TOF/Inc/crc.h new file mode 100644 index 000000000..133957e92 --- /dev/null +++ b/SAMM/SAMM_TOF/Inc/crc.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRC_H__ +#define __CRC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern CRC_HandleTypeDef hcrc; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_CRC_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRC_H__ */ diff --git a/SAMM/SAMM_TOF/Inc/dma.h b/SAMM/SAMM_TOF/Inc/dma.h new file mode 100644 index 000000000..7774831e0 --- /dev/null +++ b/SAMM/SAMM_TOF/Inc/dma.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ diff --git a/SAMM/SAMM_TOF/Inc/fdcan.h b/SAMM/SAMM_TOF/Inc/fdcan.h new file mode 100644 index 000000000..a5cc22f04 --- /dev/null +++ b/SAMM/SAMM_TOF/Inc/fdcan.h @@ -0,0 +1,54 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FDCAN_H__ +#define __FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern FDCAN_HandleTypeDef hfdcan1; + +extern FDCAN_HandleTypeDef hfdcan2; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_FDCAN1_Init(void); +void MX_FDCAN2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FDCAN_H__ */ diff --git a/SAMM/IMUandTOF/Core/Inc/gpio.h b/SAMM/SAMM_TOF/Inc/gpio.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/gpio.h rename to SAMM/SAMM_TOF/Inc/gpio.h diff --git a/SAMM/IMUandTOF/Core/Inc/i2c.h b/SAMM/SAMM_TOF/Inc/i2c.h similarity index 100% rename from SAMM/IMUandTOF/Core/Inc/i2c.h rename to SAMM/SAMM_TOF/Inc/i2c.h diff --git a/SAMM/IMUandTOF/Core/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h similarity index 84% rename from SAMM/IMUandTOF/Core/Inc/main.h rename to SAMM/SAMM_TOF/Inc/main.h index 32df0ac37..42659c5d7 100644 --- a/SAMM/IMUandTOF/Core/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -27,17 +27,17 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" -#include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_cortex.h" -#include "stm32g4xx_ll_crs.h" -#include "stm32g4xx_ll_dma.h" -#include "stm32g4xx_ll_exti.h" -#include "stm32g4xx_ll_gpio.h" -#include "stm32g4xx_ll_pwr.h" -#include "stm32g4xx_ll_rcc.h" -#include "stm32g4xx_ll_system.h" -#include "stm32g4xx_ll_utils.h" +#include "stm32h5xx_hal.h" +#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_cortex.h" +#include "stm32h5xx_ll_crs.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_pwr.h" +#include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_system.h" +#include "stm32h5xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h similarity index 89% rename from SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h rename to SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index af665f477..efec9aabd 100644 --- a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_hal_conf.h + * @file stm32h5xx_hal_conf.h * @author MCD Application Team * @brief HAL configuration file ****************************************************************************** @@ -19,8 +19,8 @@ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_CONF_H -#define STM32G4xx_HAL_CONF_H +#ifndef STM32H5xx_HAL_CONF_H +#define STM32H5xx_HAL_CONF_H #ifdef __cplusplus extern "C" { @@ -210,151 +210,151 @@ The real value may vary depending on the variations in voltage and temperature.* */ #ifdef HAL_RCC_MODULE_ENABLED -#include "stm32g4xx_hal_rcc.h" +#include "stm32h5xx_hal_rcc.h" #endif /* HAL_RCC_MODULE_ENABLED */ #ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32g4xx_hal_gpio.h" +#include "stm32h5xx_hal_gpio.h" #endif /* HAL_GPIO_MODULE_ENABLED */ #ifdef HAL_DMA_MODULE_ENABLED -#include "stm32g4xx_hal_dma.h" +#include "stm32h5xx_hal_dma.h" #endif /* HAL_DMA_MODULE_ENABLED */ #ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32g4xx_hal_cortex.h" +#include "stm32h5xx_hal_cortex.h" #endif /* HAL_CORTEX_MODULE_ENABLED */ #ifdef HAL_ADC_MODULE_ENABLED -#include "stm32g4xx_hal_adc.h" +#include "stm32h5xx_hal_adc.h" #endif /* HAL_ADC_MODULE_ENABLED */ #ifdef HAL_COMP_MODULE_ENABLED -#include "stm32g4xx_hal_comp.h" +#include "stm32h5xx_hal_comp.h" #endif /* HAL_COMP_MODULE_ENABLED */ #ifdef HAL_CORDIC_MODULE_ENABLED -#include "stm32g4xx_hal_cordic.h" +#include "stm32h5xx_hal_cordic.h" #endif /* HAL_CORDIC_MODULE_ENABLED */ #ifdef HAL_CRC_MODULE_ENABLED -#include "stm32g4xx_hal_crc.h" +#include "stm32h5xx_hal_crc.h" #endif /* HAL_CRC_MODULE_ENABLED */ #ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32g4xx_hal_cryp.h" +#include "stm32h5xx_hal_cryp.h" #endif /* HAL_CRYP_MODULE_ENABLED */ #ifdef HAL_DAC_MODULE_ENABLED -#include "stm32g4xx_hal_dac.h" +#include "stm32h5xx_hal_dac.h" #endif /* HAL_DAC_MODULE_ENABLED */ #ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32g4xx_hal_exti.h" +#include "stm32h5xx_hal_exti.h" #endif /* HAL_EXTI_MODULE_ENABLED */ #ifdef HAL_FDCAN_MODULE_ENABLED -#include "stm32g4xx_hal_fdcan.h" +#include "stm32h5xx_hal_fdcan.h" #endif /* HAL_FDCAN_MODULE_ENABLED */ #ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32g4xx_hal_flash.h" +#include "stm32h5xx_hal_flash.h" #endif /* HAL_FLASH_MODULE_ENABLED */ #ifdef HAL_FMAC_MODULE_ENABLED -#include "stm32g4xx_hal_fmac.h" +#include "stm32h5xx_hal_fmac.h" #endif /* HAL_FMAC_MODULE_ENABLED */ #ifdef HAL_HRTIM_MODULE_ENABLED -#include "stm32g4xx_hal_hrtim.h" +#include "stm32h5xx_hal_hrtim.h" #endif /* HAL_HRTIM_MODULE_ENABLED */ #ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32g4xx_hal_irda.h" +#include "stm32h5xx_hal_irda.h" #endif /* HAL_IRDA_MODULE_ENABLED */ #ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32g4xx_hal_iwdg.h" +#include "stm32h5xx_hal_iwdg.h" #endif /* HAL_IWDG_MODULE_ENABLED */ #ifdef HAL_I2C_MODULE_ENABLED -#include "stm32g4xx_hal_i2c.h" +#include "stm32h5xx_hal_i2c.h" #endif /* HAL_I2C_MODULE_ENABLED */ #ifdef HAL_I2S_MODULE_ENABLED -#include "stm32g4xx_hal_i2s.h" +#include "stm32h5xx_hal_i2s.h" #endif /* HAL_I2S_MODULE_ENABLED */ #ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32g4xx_hal_lptim.h" +#include "stm32h5xx_hal_lptim.h" #endif /* HAL_LPTIM_MODULE_ENABLED */ #ifdef HAL_NAND_MODULE_ENABLED -#include "stm32g4xx_hal_nand.h" +#include "stm32h5xx_hal_nand.h" #endif /* HAL_NAND_MODULE_ENABLED */ #ifdef HAL_NOR_MODULE_ENABLED -#include "stm32g4xx_hal_nor.h" +#include "stm32h5xx_hal_nor.h" #endif /* HAL_NOR_MODULE_ENABLED */ #ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32g4xx_hal_opamp.h" +#include "stm32h5xx_hal_opamp.h" #endif /* HAL_OPAMP_MODULE_ENABLED */ #ifdef HAL_PCD_MODULE_ENABLED -#include "stm32g4xx_hal_pcd.h" +#include "stm32h5xx_hal_pcd.h" #endif /* HAL_PCD_MODULE_ENABLED */ #ifdef HAL_PWR_MODULE_ENABLED -#include "stm32g4xx_hal_pwr.h" +#include "stm32h5xx_hal_pwr.h" #endif /* HAL_PWR_MODULE_ENABLED */ #ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32g4xx_hal_qspi.h" +#include "stm32h5xx_hal_qspi.h" #endif /* HAL_QSPI_MODULE_ENABLED */ #ifdef HAL_RNG_MODULE_ENABLED -#include "stm32g4xx_hal_rng.h" +#include "stm32h5xx_hal_rng.h" #endif /* HAL_RNG_MODULE_ENABLED */ #ifdef HAL_RTC_MODULE_ENABLED -#include "stm32g4xx_hal_rtc.h" +#include "stm32h5xx_hal_rtc.h" #endif /* HAL_RTC_MODULE_ENABLED */ #ifdef HAL_SAI_MODULE_ENABLED -#include "stm32g4xx_hal_sai.h" +#include "stm32h5xx_hal_sai.h" #endif /* HAL_SAI_MODULE_ENABLED */ #ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32g4xx_hal_smartcard.h" +#include "stm32h5xx_hal_smartcard.h" #endif /* HAL_SMARTCARD_MODULE_ENABLED */ #ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32g4xx_hal_smbus.h" +#include "stm32h5xx_hal_smbus.h" #endif /* HAL_SMBUS_MODULE_ENABLED */ #ifdef HAL_SPI_MODULE_ENABLED -#include "stm32g4xx_hal_spi.h" +#include "stm32h5xx_hal_spi.h" #endif /* HAL_SPI_MODULE_ENABLED */ #ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32g4xx_hal_sram.h" +#include "stm32h5xx_hal_sram.h" #endif /* HAL_SRAM_MODULE_ENABLED */ #ifdef HAL_TIM_MODULE_ENABLED -#include "stm32g4xx_hal_tim.h" +#include "stm32h5xx_hal_tim.h" #endif /* HAL_TIM_MODULE_ENABLED */ #ifdef HAL_UART_MODULE_ENABLED -#include "stm32g4xx_hal_uart.h" +#include "stm32h5xx_hal_uart.h" #endif /* HAL_UART_MODULE_ENABLED */ #ifdef HAL_USART_MODULE_ENABLED -#include "stm32g4xx_hal_usart.h" +#include "stm32h5xx_hal_usart.h" #endif /* HAL_USART_MODULE_ENABLED */ #ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32g4xx_hal_wwdg.h" +#include "stm32h5xx_hal_wwdg.h" #endif /* HAL_WWDG_MODULE_ENABLED */ /* Exported macro ------------------------------------------------------------*/ @@ -378,4 +378,4 @@ void assert_failed(uint8_t *file, uint32_t line); } #endif -#endif /* STM32G4xx_HAL_CONF_H */ +#endif /* STM32H5xx_HAL_CONF_H */ diff --git a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_it.h similarity index 94% rename from SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h rename to SAMM/SAMM_TOF/Inc/stm32h5xx_it.h index 13530cb56..89694865e 100644 --- a/SAMM/IMUandTOF/Core/Inc/stm32g4xx_it.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_it.h @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_it.h + * @file stm32h5xx_it.h * @brief This file contains the headers of the interrupt handlers. ****************************************************************************** * @attention @@ -18,8 +18,8 @@ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32G4xx_IT_H -#define __STM32G4xx_IT_H +#ifndef __STM32H5xx_IT_H +#define __STM32H5xx_IT_H #ifdef __cplusplus extern "C" { @@ -64,4 +64,4 @@ void TIM1_UP_TIM16_IRQHandler(void); } #endif -#endif /* __STM32G4xx_IT_H */ +#endif /* __STM32H5xx_IT_H */ diff --git a/SAMM/SAMM_TOF/Src/adc.c b/SAMM/SAMM_TOF/Src/adc.c new file mode 100644 index 000000000..fbcfbe933 --- /dev/null +++ b/SAMM/SAMM_TOF/Src/adc.c @@ -0,0 +1,148 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +ADC_HandleTypeDef hadc1; + +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.GainCompensation = 0; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = ENABLE; + hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; + hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; + hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; + hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) { + Error_Handler(); + } + + /** Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { + Error_Handler(); + } + + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_7; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ +} + +void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + + /* ADC1 clock enable */ + __HAL_RCC_ADC12_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } +} + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) +{ + + if (adcHandle->Instance == ADC1) { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC12_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PC0 ------> ADC1_IN6 + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/crc.c b/SAMM/SAMM_TOF/Src/crc.c new file mode 100644 index 000000000..213510a5d --- /dev/null +++ b/SAMM/SAMM_TOF/Src/crc.c @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "crc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +CRC_HandleTypeDef hcrc; + +/* CRC init function */ +void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ +} + +void HAL_CRC_MspInit(CRC_HandleTypeDef *crcHandle) +{ + + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspInit 0 */ + + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ + + /* USER CODE END CRC_MspInit 1 */ + } +} + +void HAL_CRC_MspDeInit(CRC_HandleTypeDef *crcHandle) +{ + + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspDeInit 0 */ + + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ + + /* USER CODE END CRC_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/dma.c b/SAMM/SAMM_TOF/Src/dma.c new file mode 100644 index 000000000..0b82d0d7c --- /dev/null +++ b/SAMM/SAMM_TOF/Src/dma.c @@ -0,0 +1,57 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Channel1_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + /* DMA1_Channel2_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/SAMM/SAMM_TOF/Src/fdcan.c b/SAMM/SAMM_TOF/Src/fdcan.c new file mode 100644 index 000000000..3e239ca01 --- /dev/null +++ b/SAMM/SAMM_TOF/Src/fdcan.c @@ -0,0 +1,213 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.c + * @brief This file provides code for the configuration + * of the FDCAN instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "fdcan.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +FDCAN_HandleTypeDef hfdcan1; +FDCAN_HandleTypeDef hfdcan2; + +/* FDCAN1 init function */ +void MX_FDCAN1_Init(void) +{ + + /* USER CODE BEGIN FDCAN1_Init 0 */ + + /* USER CODE END FDCAN1_Init 0 */ + + /* USER CODE BEGIN FDCAN1_Init 1 */ + + /* USER CODE END FDCAN1_Init 1 */ + hfdcan1.Instance = FDCAN1; + hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan1.Init.AutoRetransmission = DISABLE; + hfdcan1.Init.TransmitPause = DISABLE; + hfdcan1.Init.ProtocolException = DISABLE; + hfdcan1.Init.NominalPrescaler = 16; + hfdcan1.Init.NominalSyncJumpWidth = 1; + hfdcan1.Init.NominalTimeSeg1 = 1; + hfdcan1.Init.NominalTimeSeg2 = 1; + hfdcan1.Init.DataPrescaler = 1; + hfdcan1.Init.DataSyncJumpWidth = 1; + hfdcan1.Init.DataTimeSeg1 = 1; + hfdcan1.Init.DataTimeSeg2 = 1; + hfdcan1.Init.StdFiltersNbr = 0; + hfdcan1.Init.ExtFiltersNbr = 0; + hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN1_Init 2 */ + + /* USER CODE END FDCAN1_Init 2 */ +} +/* FDCAN2 init function */ +void MX_FDCAN2_Init(void) +{ + + /* USER CODE BEGIN FDCAN2_Init 0 */ + + /* USER CODE END FDCAN2_Init 0 */ + + /* USER CODE BEGIN FDCAN2_Init 1 */ + + /* USER CODE END FDCAN2_Init 1 */ + hfdcan2.Instance = FDCAN2; + hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; + hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; + hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; + hfdcan2.Init.AutoRetransmission = DISABLE; + hfdcan2.Init.TransmitPause = DISABLE; + hfdcan2.Init.ProtocolException = DISABLE; + hfdcan2.Init.NominalPrescaler = 16; + hfdcan2.Init.NominalSyncJumpWidth = 1; + hfdcan2.Init.NominalTimeSeg1 = 1; + hfdcan2.Init.NominalTimeSeg2 = 1; + hfdcan2.Init.DataPrescaler = 1; + hfdcan2.Init.DataSyncJumpWidth = 1; + hfdcan2.Init.DataTimeSeg1 = 1; + hfdcan2.Init.DataTimeSeg2 = 1; + hfdcan2.Init.StdFiltersNbr = 0; + hfdcan2.Init.ExtFiltersNbr = 0; + hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN FDCAN2_Init 2 */ + + /* USER CODE END FDCAN2_Init 2 */ +} + +static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; + +void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspInit 0 */ + + /* USER CODE END FDCAN1_MspInit 0 */ + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN1 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN1_MspInit 1 */ + + /* USER CODE END FDCAN1_MspInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspInit 0 */ + + /* USER CODE END FDCAN2_MspInit 0 */ + + LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + /* FDCAN2 clock enable */ + HAL_RCC_FDCAN_CLK_ENABLED++; + if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { + __HAL_RCC_FDCAN_CLK_ENABLE(); + } + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB12 ------> FDCAN2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN FDCAN2_MspInit 1 */ + + /* USER CODE END FDCAN2_MspInit 1 */ + } +} + +void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) +{ + + if (fdcanHandle->Instance == FDCAN1) { + /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ + + /* USER CODE END FDCAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN1 GPIO Configuration + PA11 ------> FDCAN1_RX + PA12 ------> FDCAN1_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ + + /* USER CODE END FDCAN1_MspDeInit 1 */ + } else if (fdcanHandle->Instance == FDCAN2) { + /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + + /* USER CODE END FDCAN2_MspDeInit 0 */ + /* Peripheral clock disable */ + HAL_RCC_FDCAN_CLK_ENABLED--; + if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { + __HAL_RCC_FDCAN_CLK_DISABLE(); + } + + /**FDCAN2 GPIO Configuration + PB13 ------> FDCAN2_TX + PB12 ------> FDCAN2_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_12); + + /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + + /* USER CODE END FDCAN2_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/IMUandTOF/Core/Src/gpio.c b/SAMM/SAMM_TOF/Src/gpio.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/gpio.c rename to SAMM/SAMM_TOF/Src/gpio.c diff --git a/SAMM/IMUandTOF/Core/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/i2c.c rename to SAMM/SAMM_TOF/Src/i2c.c diff --git a/SAMM/IMUandTOF/Core/Src/main.c b/SAMM/SAMM_TOF/Src/main.c similarity index 96% rename from SAMM/IMUandTOF/Core/Src/main.c rename to SAMM/SAMM_TOF/Src/main.c index 5c1dabb9e..49d53573f 100644 --- a/SAMM/IMUandTOF/Core/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -23,21 +23,20 @@ #include "fdcan.h" #include "gpio.h" #include "i2c.h" -#include "spi.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include #include "VL53L4ED_api.h" -#include "bmi323.h" +//#include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -#define BMI323_CS_GPIO_Port GPIOA -#define BMI323_CS_Pin GPIO_PIN_4 +//#define BMI323_CS_GPIO_Port GPIOA +//#define BMI323_CS_Pin GPIO_PIN_4 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -114,16 +113,16 @@ int main(void) MX_FDCAN1_Init(); MX_FDCAN2_Init(); MX_I2C1_Init(); - MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + //MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - bmi323 bmi323_dev; - HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + //bmi323 bmi323_dev; + //HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + //bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c b/SAMM/SAMM_TOF/Src/stm32g4xx_hal_msp.c similarity index 100% rename from SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_msp.c rename to SAMM/SAMM_TOF/Src/stm32g4xx_hal_msp.c diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c similarity index 97% rename from SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c rename to SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c index b9b75acf8..c63b85dfd 100644 --- a/SAMM/IMUandTOF/Core/Src/stm32g4xx_hal_timebase_tim.c +++ b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_hal_timebase_tim.c + * @file stm32h5xx_hal_timebase_tim.c * @brief HAL time base based on the hardware TIM. ****************************************************************************** * @attention @@ -18,8 +18,8 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" -#include "stm32g4xx_hal_tim.h" +#include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_tim.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ diff --git a/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c b/SAMM/SAMM_TOF/Src/stm32h5xx_it.c similarity index 96% rename from SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c rename to SAMM/SAMM_TOF/Src/stm32h5xx_it.c index 2db0ff77b..8f4f91774 100644 --- a/SAMM/IMUandTOF/Core/Src/stm32g4xx_it.c +++ b/SAMM/SAMM_TOF/Src/stm32h5xx_it.c @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_it.c + * @file stm32h5xx_it.c * @brief Interrupt Service Routines. ****************************************************************************** * @attention @@ -18,7 +18,7 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_it.h" +#include "stm32h5xx_it.h" #include "main.h" /* Private includes ----------------------------------------------------------*/ @@ -188,10 +188,10 @@ void SysTick_Handler(void) } /******************************************************************************/ -/* STM32G4xx Peripheral Interrupt Handlers */ +/* STM32H5xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ /* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32g4xx.s). */ +/* please refer to the startup file (startup_stm32h5xx.s). */ /******************************************************************************/ /** From ec1b39d37af9d69f513c687f8854f33cd753bfb1 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 21:23:03 -0700 Subject: [PATCH 014/158] Renaming g4 files, (partly) setting up cmake --- CMakeLists.txt | 4 + SAMM/Core/Inc/main.h | 22 +-- ...32g4xx_hal_conf.h => stm32h5xx_hal_conf.h} | 82 ++++----- .../Inc/{stm32g4xx_it.h => stm32h5xx_it.h} | 6 +- .../Src/stm32h5xx_hal_msp.c} | 2 +- ...ase_tim.c => stm32h5xx_hal_timebase_tim.c} | 6 +- .../Src/{stm32g4xx_it.c => stm32h5xx_it.c} | 4 +- ...{system_stm32g4xx.c => system_stm32h5xx.c} | 18 +- SAMM/{SAMM_Mag/Inc => IMU/Inc/IMU}/bmi323.h | 4 +- SAMM/{SAMM_Mag => IMU}/Src/bmi323.c | 4 +- SAMM/IMU/imu.cmake | 13 ++ SAMM/SAMM_Mag/Inc/mag.h | 2 +- SAMM/SAMM_Mag/Inc/main.h | 22 +-- SAMM/SAMM_Mag/Src/mag.c | 29 +-- SAMM/SAMM_Mag/Src/main.c | 17 +- SAMM/SAMM_TOF/CMakeLists.txt | 59 +++++++ SAMM/SAMM_TOF/Inc/spi.h | 52 ++++++ SAMM/SAMM_TOF/Src/main.c | 21 +-- SAMM/SAMM_TOF/Src/spi.c | 165 ++++++++++++++++++ .../Src/stm32h5xx_hal_msp.c} | 0 20 files changed, 403 insertions(+), 129 deletions(-) rename SAMM/Core/Inc/{stm32g4xx_hal_conf.h => stm32h5xx_hal_conf.h} (89%) rename SAMM/Core/Inc/{stm32g4xx_it.h => stm32h5xx_it.h} (95%) rename SAMM/{SAMM_TOF/Src/stm32g4xx_hal_msp.c => Core/Src/stm32h5xx_hal_msp.c} (98%) rename SAMM/Core/Src/{stm32g4xx_hal_timebase_tim.c => stm32h5xx_hal_timebase_tim.c} (97%) rename SAMM/Core/Src/{stm32g4xx_it.c => stm32h5xx_it.c} (99%) rename SAMM/Core/Src/{system_stm32g4xx.c => system_stm32h5xx.c} (95%) rename SAMM/{SAMM_Mag/Inc => IMU/Inc/IMU}/bmi323.h (99%) rename SAMM/{SAMM_Mag => IMU}/Src/bmi323.c (99%) create mode 100644 SAMM/IMU/imu.cmake create mode 100644 SAMM/SAMM_TOF/CMakeLists.txt create mode 100644 SAMM/SAMM_TOF/Inc/spi.h create mode 100644 SAMM/SAMM_TOF/Src/spi.c rename SAMM/{Core/Src/stm32g4xx_hal_msp.c => SAMM_TOF/Src/stm32h5xx_hal_msp.c} (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f1a13a851..73fa89035 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,6 +78,10 @@ add_gr_project(STM32G474xE AnalogCalibration) add_gr_project(STM32G474xE CANine) add_gr_project(STM32G431x8 TireTemp) +# SAMM +add_gr_project(STM32H523xE SAMM SAMM_TOF) +add_gr_project(STM32H523xE SAMM SAMM_MAG) + # Development add_gr_project(STM32G474xE G4PERTESTING) add_gr_project(STM32G474xE G4SPITESTING) diff --git a/SAMM/Core/Inc/main.h b/SAMM/Core/Inc/main.h index 32df0ac37..42659c5d7 100644 --- a/SAMM/Core/Inc/main.h +++ b/SAMM/Core/Inc/main.h @@ -27,17 +27,17 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" -#include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_cortex.h" -#include "stm32g4xx_ll_crs.h" -#include "stm32g4xx_ll_dma.h" -#include "stm32g4xx_ll_exti.h" -#include "stm32g4xx_ll_gpio.h" -#include "stm32g4xx_ll_pwr.h" -#include "stm32g4xx_ll_rcc.h" -#include "stm32g4xx_ll_system.h" -#include "stm32g4xx_ll_utils.h" +#include "stm32h5xx_hal.h" +#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_cortex.h" +#include "stm32h5xx_ll_crs.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_pwr.h" +#include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_system.h" +#include "stm32h5xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/Core/Inc/stm32g4xx_hal_conf.h b/SAMM/Core/Inc/stm32h5xx_hal_conf.h similarity index 89% rename from SAMM/Core/Inc/stm32g4xx_hal_conf.h rename to SAMM/Core/Inc/stm32h5xx_hal_conf.h index af665f477..efec9aabd 100644 --- a/SAMM/Core/Inc/stm32g4xx_hal_conf.h +++ b/SAMM/Core/Inc/stm32h5xx_hal_conf.h @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_hal_conf.h + * @file stm32h5xx_hal_conf.h * @author MCD Application Team * @brief HAL configuration file ****************************************************************************** @@ -19,8 +19,8 @@ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32G4xx_HAL_CONF_H -#define STM32G4xx_HAL_CONF_H +#ifndef STM32H5xx_HAL_CONF_H +#define STM32H5xx_HAL_CONF_H #ifdef __cplusplus extern "C" { @@ -210,151 +210,151 @@ The real value may vary depending on the variations in voltage and temperature.* */ #ifdef HAL_RCC_MODULE_ENABLED -#include "stm32g4xx_hal_rcc.h" +#include "stm32h5xx_hal_rcc.h" #endif /* HAL_RCC_MODULE_ENABLED */ #ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32g4xx_hal_gpio.h" +#include "stm32h5xx_hal_gpio.h" #endif /* HAL_GPIO_MODULE_ENABLED */ #ifdef HAL_DMA_MODULE_ENABLED -#include "stm32g4xx_hal_dma.h" +#include "stm32h5xx_hal_dma.h" #endif /* HAL_DMA_MODULE_ENABLED */ #ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32g4xx_hal_cortex.h" +#include "stm32h5xx_hal_cortex.h" #endif /* HAL_CORTEX_MODULE_ENABLED */ #ifdef HAL_ADC_MODULE_ENABLED -#include "stm32g4xx_hal_adc.h" +#include "stm32h5xx_hal_adc.h" #endif /* HAL_ADC_MODULE_ENABLED */ #ifdef HAL_COMP_MODULE_ENABLED -#include "stm32g4xx_hal_comp.h" +#include "stm32h5xx_hal_comp.h" #endif /* HAL_COMP_MODULE_ENABLED */ #ifdef HAL_CORDIC_MODULE_ENABLED -#include "stm32g4xx_hal_cordic.h" +#include "stm32h5xx_hal_cordic.h" #endif /* HAL_CORDIC_MODULE_ENABLED */ #ifdef HAL_CRC_MODULE_ENABLED -#include "stm32g4xx_hal_crc.h" +#include "stm32h5xx_hal_crc.h" #endif /* HAL_CRC_MODULE_ENABLED */ #ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32g4xx_hal_cryp.h" +#include "stm32h5xx_hal_cryp.h" #endif /* HAL_CRYP_MODULE_ENABLED */ #ifdef HAL_DAC_MODULE_ENABLED -#include "stm32g4xx_hal_dac.h" +#include "stm32h5xx_hal_dac.h" #endif /* HAL_DAC_MODULE_ENABLED */ #ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32g4xx_hal_exti.h" +#include "stm32h5xx_hal_exti.h" #endif /* HAL_EXTI_MODULE_ENABLED */ #ifdef HAL_FDCAN_MODULE_ENABLED -#include "stm32g4xx_hal_fdcan.h" +#include "stm32h5xx_hal_fdcan.h" #endif /* HAL_FDCAN_MODULE_ENABLED */ #ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32g4xx_hal_flash.h" +#include "stm32h5xx_hal_flash.h" #endif /* HAL_FLASH_MODULE_ENABLED */ #ifdef HAL_FMAC_MODULE_ENABLED -#include "stm32g4xx_hal_fmac.h" +#include "stm32h5xx_hal_fmac.h" #endif /* HAL_FMAC_MODULE_ENABLED */ #ifdef HAL_HRTIM_MODULE_ENABLED -#include "stm32g4xx_hal_hrtim.h" +#include "stm32h5xx_hal_hrtim.h" #endif /* HAL_HRTIM_MODULE_ENABLED */ #ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32g4xx_hal_irda.h" +#include "stm32h5xx_hal_irda.h" #endif /* HAL_IRDA_MODULE_ENABLED */ #ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32g4xx_hal_iwdg.h" +#include "stm32h5xx_hal_iwdg.h" #endif /* HAL_IWDG_MODULE_ENABLED */ #ifdef HAL_I2C_MODULE_ENABLED -#include "stm32g4xx_hal_i2c.h" +#include "stm32h5xx_hal_i2c.h" #endif /* HAL_I2C_MODULE_ENABLED */ #ifdef HAL_I2S_MODULE_ENABLED -#include "stm32g4xx_hal_i2s.h" +#include "stm32h5xx_hal_i2s.h" #endif /* HAL_I2S_MODULE_ENABLED */ #ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32g4xx_hal_lptim.h" +#include "stm32h5xx_hal_lptim.h" #endif /* HAL_LPTIM_MODULE_ENABLED */ #ifdef HAL_NAND_MODULE_ENABLED -#include "stm32g4xx_hal_nand.h" +#include "stm32h5xx_hal_nand.h" #endif /* HAL_NAND_MODULE_ENABLED */ #ifdef HAL_NOR_MODULE_ENABLED -#include "stm32g4xx_hal_nor.h" +#include "stm32h5xx_hal_nor.h" #endif /* HAL_NOR_MODULE_ENABLED */ #ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32g4xx_hal_opamp.h" +#include "stm32h5xx_hal_opamp.h" #endif /* HAL_OPAMP_MODULE_ENABLED */ #ifdef HAL_PCD_MODULE_ENABLED -#include "stm32g4xx_hal_pcd.h" +#include "stm32h5xx_hal_pcd.h" #endif /* HAL_PCD_MODULE_ENABLED */ #ifdef HAL_PWR_MODULE_ENABLED -#include "stm32g4xx_hal_pwr.h" +#include "stm32h5xx_hal_pwr.h" #endif /* HAL_PWR_MODULE_ENABLED */ #ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32g4xx_hal_qspi.h" +#include "stm32h5xx_hal_qspi.h" #endif /* HAL_QSPI_MODULE_ENABLED */ #ifdef HAL_RNG_MODULE_ENABLED -#include "stm32g4xx_hal_rng.h" +#include "stm32h5xx_hal_rng.h" #endif /* HAL_RNG_MODULE_ENABLED */ #ifdef HAL_RTC_MODULE_ENABLED -#include "stm32g4xx_hal_rtc.h" +#include "stm32h5xx_hal_rtc.h" #endif /* HAL_RTC_MODULE_ENABLED */ #ifdef HAL_SAI_MODULE_ENABLED -#include "stm32g4xx_hal_sai.h" +#include "stm32h5xx_hal_sai.h" #endif /* HAL_SAI_MODULE_ENABLED */ #ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32g4xx_hal_smartcard.h" +#include "stm32h5xx_hal_smartcard.h" #endif /* HAL_SMARTCARD_MODULE_ENABLED */ #ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32g4xx_hal_smbus.h" +#include "stm32h5xx_hal_smbus.h" #endif /* HAL_SMBUS_MODULE_ENABLED */ #ifdef HAL_SPI_MODULE_ENABLED -#include "stm32g4xx_hal_spi.h" +#include "stm32h5xx_hal_spi.h" #endif /* HAL_SPI_MODULE_ENABLED */ #ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32g4xx_hal_sram.h" +#include "stm32h5xx_hal_sram.h" #endif /* HAL_SRAM_MODULE_ENABLED */ #ifdef HAL_TIM_MODULE_ENABLED -#include "stm32g4xx_hal_tim.h" +#include "stm32h5xx_hal_tim.h" #endif /* HAL_TIM_MODULE_ENABLED */ #ifdef HAL_UART_MODULE_ENABLED -#include "stm32g4xx_hal_uart.h" +#include "stm32h5xx_hal_uart.h" #endif /* HAL_UART_MODULE_ENABLED */ #ifdef HAL_USART_MODULE_ENABLED -#include "stm32g4xx_hal_usart.h" +#include "stm32h5xx_hal_usart.h" #endif /* HAL_USART_MODULE_ENABLED */ #ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32g4xx_hal_wwdg.h" +#include "stm32h5xx_hal_wwdg.h" #endif /* HAL_WWDG_MODULE_ENABLED */ /* Exported macro ------------------------------------------------------------*/ @@ -378,4 +378,4 @@ void assert_failed(uint8_t *file, uint32_t line); } #endif -#endif /* STM32G4xx_HAL_CONF_H */ +#endif /* STM32H5xx_HAL_CONF_H */ diff --git a/SAMM/Core/Inc/stm32g4xx_it.h b/SAMM/Core/Inc/stm32h5xx_it.h similarity index 95% rename from SAMM/Core/Inc/stm32g4xx_it.h rename to SAMM/Core/Inc/stm32h5xx_it.h index 13530cb56..e767e808c 100644 --- a/SAMM/Core/Inc/stm32g4xx_it.h +++ b/SAMM/Core/Inc/stm32h5xx_it.h @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_it.h + * @file stm32h5xx_it.h * @brief This file contains the headers of the interrupt handlers. ****************************************************************************** * @attention @@ -18,8 +18,8 @@ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32G4xx_IT_H -#define __STM32G4xx_IT_H +#ifndef __STM32H5xx_IT_H +#define __STM32H5xx_IT_H #ifdef __cplusplus extern "C" { diff --git a/SAMM/SAMM_TOF/Src/stm32g4xx_hal_msp.c b/SAMM/Core/Src/stm32h5xx_hal_msp.c similarity index 98% rename from SAMM/SAMM_TOF/Src/stm32g4xx_hal_msp.c rename to SAMM/Core/Src/stm32h5xx_hal_msp.c index 69189ef4e..c0f8bfdeb 100644 --- a/SAMM/SAMM_TOF/Src/stm32g4xx_hal_msp.c +++ b/SAMM/Core/Src/stm32h5xx_hal_msp.c @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_hal_msp.c + * @file stm32h5xx_hal_msp.c * @brief This file provides code for the MSP Initialization * and de-Initialization codes. ****************************************************************************** diff --git a/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c b/SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c similarity index 97% rename from SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c rename to SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c index 8d49fd88c..b4332029f 100644 --- a/SAMM/Core/Src/stm32g4xx_hal_timebase_tim.c +++ b/SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_hal_timebase_tim.c + * @file stm32h5xx_hal_timebase_tim.c * @brief HAL time base based on the hardware TIM. ****************************************************************************** * @attention @@ -18,8 +18,8 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" -#include "stm32g4xx_hal_tim.h" +#include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_tim.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ diff --git a/SAMM/Core/Src/stm32g4xx_it.c b/SAMM/Core/Src/stm32h5xx_it.c similarity index 99% rename from SAMM/Core/Src/stm32g4xx_it.c rename to SAMM/Core/Src/stm32h5xx_it.c index 2db0ff77b..6c3676d49 100644 --- a/SAMM/Core/Src/stm32g4xx_it.c +++ b/SAMM/Core/Src/stm32h5xx_it.c @@ -1,7 +1,7 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file stm32g4xx_it.c + * @file stm32h5xx_it.c * @brief Interrupt Service Routines. ****************************************************************************** * @attention @@ -18,7 +18,7 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_it.h" +#include "stm32h5xx_it.h" #include "main.h" /* Private includes ----------------------------------------------------------*/ diff --git a/SAMM/Core/Src/system_stm32g4xx.c b/SAMM/Core/Src/system_stm32h5xx.c similarity index 95% rename from SAMM/Core/Src/system_stm32g4xx.c rename to SAMM/Core/Src/system_stm32h5xx.c index 14d0e1be1..5aa62f144 100644 --- a/SAMM/Core/Src/system_stm32g4xx.c +++ b/SAMM/Core/Src/system_stm32h5xx.c @@ -1,6 +1,6 @@ /** ****************************************************************************** - * @file system_stm32g4xx.c + * @file system_stm32h5xx.c * @author MCD Application Team * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File * @@ -67,11 +67,11 @@ * @{ */ -/** @addtogroup stm32g4xx_system +/** @addtogroup stm32h5xx_system * @{ */ -/** @addtogroup STM32G4xx_System_Private_Includes +/** @addtogroup STM32H5xx_System_Private_Includes * @{ */ @@ -89,7 +89,7 @@ * @} */ -/** @addtogroup STM32G4xx_System_Private_TypesDefinitions +/** @addtogroup STM32H5xx_System_Private_TypesDefinitions * @{ */ @@ -97,7 +97,7 @@ * @} */ -/** @addtogroup STM32G4xx_System_Private_Defines +/** @addtogroup STM32H5xx_System_Private_Defines * @{ */ @@ -162,7 +162,7 @@ const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; * @} */ -/** @addtogroup STM32G4xx_System_Private_FunctionPrototypes +/** @addtogroup STM32H5xx_System_Private_FunctionPrototypes * @{ */ @@ -170,7 +170,7 @@ const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; * @} */ -/** @addtogroup STM32G4xx_System_Private_Functions +/** @addtogroup STM32H5xx_System_Private_Functions * @{ */ @@ -214,11 +214,11 @@ void SystemInit(void) * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) * or HSI_VALUE(*) multiplied/divided by the PLL factors. * - * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * (**) HSI_VALUE is a constant defined in stm32h5xx_hal.h file (default value * 16 MHz) but the real value may vary depending on the variations * in voltage and temperature. * - * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * (***) HSE_VALUE is a constant defined in stm32h5xx_hal.h file (default value * 24 MHz), user has to ensure that HSE_VALUE is same as the real * frequency of the crystal used. Otherwise, this function may * have wrong result. diff --git a/SAMM/SAMM_Mag/Inc/bmi323.h b/SAMM/IMU/Inc/IMU/bmi323.h similarity index 99% rename from SAMM/SAMM_Mag/Inc/bmi323.h rename to SAMM/IMU/Inc/IMU/bmi323.h index 3299db7ab..828606bf0 100644 --- a/SAMM/SAMM_Mag/Inc/bmi323.h +++ b/SAMM/IMU/Inc/IMU/bmi323.h @@ -5,7 +5,7 @@ #include "main.h" #include "spi.h" -#include "stm32g474xx.h" +#include "stm32h574xx.h" // BMI323 register defines @@ -192,4 +192,4 @@ uint8_t bmi323_read_acc(bmi323 *bmi323_dev, int16_t *acc_data); uint8_t bmi323_read_gyr(bmi323 *bmi323_dev, int16_t *gyr_data); uint8_t bmi323_read_all(bmi323 *bmi323_dev, int16_t *temp_data); -#endif // BMI323_H \ No newline at end of file +#endif // BMI323_H diff --git a/SAMM/SAMM_Mag/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c similarity index 99% rename from SAMM/SAMM_Mag/Src/bmi323.c rename to SAMM/IMU/Src/bmi323.c index 30d292042..c80331abe 100644 --- a/SAMM/SAMM_Mag/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -2,8 +2,8 @@ #include -#include "stm32g474xx.h" -#include "stm32g4xx_hal_spi.h" +#include "stm32h574xx.h" +#include "stm32h5xx_hal_spi.h" // init spi port before calling this function uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) diff --git a/SAMM/IMU/imu.cmake b/SAMM/IMU/imu.cmake new file mode 100644 index 000000000..fb945b39a --- /dev/null +++ b/SAMM/IMU/imu.cmake @@ -0,0 +1,13 @@ +add_library(SAMM_IMU_Lib INTERFACE) + +target_include_directories( + SAMM_IMU_Lib + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/Inc +) + +target_sources( + SAMM_IMU_Lib + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/Src/setBits.c +) diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 941561274..4a6bdd2f8 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -4,7 +4,7 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "spi.h" -#include "stm32g474xx.h" +#include "stm32h574xx.h" typedef struct { SPI_HandleTypeDef *spi_port; diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index 32df0ac37..42659c5d7 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -27,17 +27,17 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32g4xx_hal.h" -#include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_cortex.h" -#include "stm32g4xx_ll_crs.h" -#include "stm32g4xx_ll_dma.h" -#include "stm32g4xx_ll_exti.h" -#include "stm32g4xx_ll_gpio.h" -#include "stm32g4xx_ll_pwr.h" -#include "stm32g4xx_ll_rcc.h" -#include "stm32g4xx_ll_system.h" -#include "stm32g4xx_ll_utils.h" +#include "stm32h5xx_hal.h" +#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_cortex.h" +#include "stm32h5xx_ll_crs.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_pwr.h" +#include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_system.h" +#include "stm32h5xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index fd43cbd1c..766dbc1b4 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -2,38 +2,25 @@ #include -#include "stm32g474xx.h" -#include "stm32g4xx_hal_spi.h" +#include "stm32h574xx.h" +#include "stm32h5xx_hal_spi.h" // init spi port before calling this function uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) { + uint8_t tx_word[4]; - uint8_t rx_word[4] = {0}; - uint8_t status = 0; + uint8_t rx_word[4] = {0} mag_dev->spi_port = spi_port; mag_dev->port = port; mag_dev->pin = pin; - tx_word[1] = (mag_CHIP_ID << 8); - tx_word[1] |= 0x80; - tx_word[0] = 0x69; - /* - Okay so for one of these transmits we need to follow the following operation:mag_dev - 1. to read the register we want to: - transmit first 8 bytes, then transmit a fake 8 bytes - after we want to read 16 bytes. This should complete a single read - */ - // first we read do the dummy read to switch to spi mode - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - // rx_word = 0; + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - if (rx_word[3] == 0x43) { + return HAL_OK; - } + return HAL_ERROR; } @@ -44,7 +31,7 @@ uint16_t mag_read(mag *mag_dev, uint8_t reg) return data; } -uint8_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) +uint8_t mag_write(mag *mag_dev, uint8_t reg, uint8_t data) { // i2c_write(mag_I2C_ADDR, reg, data, mag_dev->i2c_port); return 1; diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 0483f2dbb..144d769b5 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -19,10 +19,9 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" -#include "crc.h" -#include "fdcan.h" +//#include "crc.h" +//#include "fdcan.h" #include "gpio.h" -//#include "i2c.h" #include "spi.h" /* Private includes ----------------------------------------------------------*/ @@ -73,12 +72,6 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -/* -I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations - - still need to fully test but ideally implmentation is done - - - */ /* USER CODE END 0 */ /** @@ -110,9 +103,9 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); - MX_CRC_Init(); - MX_FDCAN1_Init(); - MX_FDCAN2_Init(); + //MX_CRC_Init(); + //MX_FDCAN1_Init(); + //MX_FDCAN2_Init(); MX_I2C1_Init(); MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt new file mode 100644 index 000000000..ae1349ea6 --- /dev/null +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -0,0 +1,59 @@ +cmake_minimum_required(VERSION 3.25) + +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) + +# Define the build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +# what, does in fact not get the filename of somthing but rather the name of the project from the path +get_filename_component(GR_PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +# Enable CMake support for ASM and C languages +enable_language( + C + ASM +) + +include("../IMU/imu.cmake") + +# Core project settings +project(${CMAKE_PROJECT_NAME}) + +add_library(${GR_PROJECT_NAME}_USER_CODE INTERFACE) +target_sources( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + # Core + Src/adc.c + Src/crc.c + Src/dma.c + Src/fdcan.c + Src/gpio.c + Src/i2c.c + Src/main.c + Src/spi.c + Src/stm32h5xx_hal_msp.c + Src/stm32h5xx_hal_timebase_tim.c + Src/stm32h5xx_it.c + # TODO +) + +target_link_libraries( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + CANfigurator + PERIPHERAL_CAN_LIB + BitManipulations_Lib +) + +target_include_directories( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + Inc + +) diff --git a/SAMM/SAMM_TOF/Inc/spi.h b/SAMM/SAMM_TOF/Inc/spi.h new file mode 100644 index 000000000..db79d4558 --- /dev/null +++ b/SAMM/SAMM_TOF/Inc/spi.h @@ -0,0 +1,52 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI1_Init(void); +void MX_SPI3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 49d53573f..edb838bd7 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -19,17 +19,18 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" -#include "crc.h" -#include "fdcan.h" +//#include "crc.h" +//#include "fdcan.h" #include "gpio.h" #include "i2c.h" +#include "spi.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include #include "VL53L4ED_api.h" -//#include "bmi323.h" +#include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ @@ -109,20 +110,20 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); - MX_CRC_Init(); - MX_FDCAN1_Init(); - MX_FDCAN2_Init(); + //MX_CRC_Init(); + //MX_FDCAN1_Init(); + //MX_FDCAN2_Init(); MX_I2C1_Init(); - //MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - //bmi323 bmi323_dev; - //HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - //bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + bmi323 bmi323_dev; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c new file mode 100644 index 000000000..bc7c80f1d --- /dev/null +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -0,0 +1,165 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi3; + +/* SPI1 Init function -> used for IMU */ +void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN spi1_Init 0 */ + + /* USER CODE END spi1_Init 0 */ + + /* USER CODE BEGIN spi1_Init 1 */ + + /* USER CODE END spi1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_16BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi1_Init 2 */ + + /* USER CODE END spi1_Init 2 */ +} + +/* SPI3 init function -> used for MAG encoder */ +void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN spi3_Init 0 */ + + /* USER CODE END spi3_Init 0 */ + + /* USER CODE BEGIN spi3_Init 1 */ + + /* USER CODE END spi3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_16BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi3_Init 2 */ + + /* USER CODE END spi3_Init 2 */ +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (spiHandle->Instance == spi3) { + /* USER CODE BEGIN spi3_MspInit 0 */ + + /* USER CODE END spi3_MspInit 0 */ + /* spi3 clock enable */ + __HAL_RCC_spi3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**spi3 GPIO Configuration + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN spi3_MspInit 1 */ + + /* USER CODE END spi3_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) +{ + + if (spiHandle->Instance == SPI3) { + /* USER CODE BEGIN spi3_MspDeInit 0 */ + + /* USER CODE END spi3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_spi3_CLK_DISABLE(); + + /**spi3 GPIO Configuration + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + + /* USER CODE BEGIN spi3_MspDeInit 1 */ + + /* USER CODE END spi3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/stm32g4xx_hal_msp.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c similarity index 100% rename from SAMM/Core/Src/stm32g4xx_hal_msp.c rename to SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c From a31f77aec821d5df716dc0260fba979c83720d7a Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 21:30:28 -0700 Subject: [PATCH 015/158] More cmake changes --- SAMM/IMU/imu.cmake | 2 +- SAMM/SAMM_Mag/CMakeLists.txt | 60 ++++++++++++++++++++++++++++++++++++ SAMM/SAMM_TOF/CMakeLists.txt | 3 +- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 SAMM/SAMM_Mag/CMakeLists.txt diff --git a/SAMM/IMU/imu.cmake b/SAMM/IMU/imu.cmake index fb945b39a..9c6bbe434 100644 --- a/SAMM/IMU/imu.cmake +++ b/SAMM/IMU/imu.cmake @@ -9,5 +9,5 @@ target_include_directories( target_sources( SAMM_IMU_Lib INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/Src/setBits.c + ${CMAKE_CURRENT_LIST_DIR}/Src/bmi323.c ) diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt new file mode 100644 index 000000000..23c5b5bd0 --- /dev/null +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -0,0 +1,60 @@ +cmake_minimum_required(VERSION 3.25) + +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) + +# Define the build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +# what, does in fact not get the filename of somthing but rather the name of the project from the path +get_filename_component(GR_PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +# Enable CMake support for ASM and C languages +enable_language( + C + ASM +) + +include("../IMU/imu.cmake") + +# Core project settings +project(${CMAKE_PROJECT_NAME}) + +add_library(${GR_PROJECT_NAME}_USER_CODE INTERFACE) +target_sources( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + # Core + Src/adc.c + Src/crc.c + Src/dma.c + Src/fdcan.c + Src/gpio.c + Src/mag.c + Src/main.c + Src/spi.c + Src/stm32h5xx_hal_msp.c + Src/stm32h5xx_hal_timebase_tim.c + Src/stm32h5xx_it.c + # TODO +) + +target_link_libraries( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + CANfigurator + PERIPHERAL_CAN_LIB + BitManipulations_Lib + SAMM_IMU_Lib +) + +target_include_directories( + ${GR_PROJECT_NAME}_USER_CODE + INTERFACE + Inc +#TODO: Figure out how to set up Extras folder +) diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index ae1349ea6..615da077b 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -49,11 +49,12 @@ target_link_libraries( CANfigurator PERIPHERAL_CAN_LIB BitManipulations_Lib + SAMM_IMU_Lib ) target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc - +#TODO: Figure out how to set up Extras folder ) From 8f31c7c94c3f64668b9d58b133bc516475994781 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:31:31 +0000 Subject: [PATCH 016/158] Automatic CMake Format: Standardized formatting automatically --- SAMM/IMU/imu.cmake | 12 ++---------- SAMM/SAMM_Mag/CMakeLists.txt | 26 +++++++++++++------------- SAMM/SAMM_TOF/CMakeLists.txt | 26 +++++++++++++------------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/SAMM/IMU/imu.cmake b/SAMM/IMU/imu.cmake index 9c6bbe434..b0719dc1a 100644 --- a/SAMM/IMU/imu.cmake +++ b/SAMM/IMU/imu.cmake @@ -1,13 +1,5 @@ add_library(SAMM_IMU_Lib INTERFACE) -target_include_directories( - SAMM_IMU_Lib - INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/Inc -) +target_include_directories(SAMM_IMU_Lib INTERFACE ${CMAKE_CURRENT_LIST_DIR}/Inc) -target_sources( - SAMM_IMU_Lib - INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/Src/bmi323.c -) +target_sources(SAMM_IMU_Lib INTERFACE ${CMAKE_CURRENT_LIST_DIR}/Src/bmi323.c) diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index 23c5b5bd0..dba8cf08e 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -29,17 +29,17 @@ target_sources( ${GR_PROJECT_NAME}_USER_CODE INTERFACE # Core - Src/adc.c - Src/crc.c - Src/dma.c - Src/fdcan.c - Src/gpio.c - Src/mag.c - Src/main.c - Src/spi.c - Src/stm32h5xx_hal_msp.c - Src/stm32h5xx_hal_timebase_tim.c - Src/stm32h5xx_it.c + Src/adc.c + Src/crc.c + Src/dma.c + Src/fdcan.c + Src/gpio.c + Src/mag.c + Src/main.c + Src/spi.c + Src/stm32h5xx_hal_msp.c + Src/stm32h5xx_hal_timebase_tim.c + Src/stm32h5xx_it.c # TODO ) @@ -49,12 +49,12 @@ target_link_libraries( CANfigurator PERIPHERAL_CAN_LIB BitManipulations_Lib - SAMM_IMU_Lib + SAMM_IMU_Lib ) target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc -#TODO: Figure out how to set up Extras folder + #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index 615da077b..bd33afad6 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -29,17 +29,17 @@ target_sources( ${GR_PROJECT_NAME}_USER_CODE INTERFACE # Core - Src/adc.c - Src/crc.c - Src/dma.c - Src/fdcan.c - Src/gpio.c - Src/i2c.c - Src/main.c - Src/spi.c - Src/stm32h5xx_hal_msp.c - Src/stm32h5xx_hal_timebase_tim.c - Src/stm32h5xx_it.c + Src/adc.c + Src/crc.c + Src/dma.c + Src/fdcan.c + Src/gpio.c + Src/i2c.c + Src/main.c + Src/spi.c + Src/stm32h5xx_hal_msp.c + Src/stm32h5xx_hal_timebase_tim.c + Src/stm32h5xx_it.c # TODO ) @@ -49,12 +49,12 @@ target_link_libraries( CANfigurator PERIPHERAL_CAN_LIB BitManipulations_Lib - SAMM_IMU_Lib + SAMM_IMU_Lib ) target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc -#TODO: Figure out how to set up Extras folder + #TODO: Figure out how to set up Extras folder ) From 5e4ee0127e8e987db9794a4e44880d90c140a2dd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 04:33:06 +0000 Subject: [PATCH 017/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 5 ++--- SAMM/SAMM_Mag/Src/main.c | 14 +++++++------- SAMM/SAMM_TOF/Src/main.c | 14 +++++++------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 766dbc1b4..39043a01e 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -10,8 +10,7 @@ uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, { uint8_t tx_word[4]; - uint8_t rx_word[4] = {0} - mag_dev->spi_port = spi_port; + uint8_t rx_word[4] = {0} mag_dev->spi_port = spi_port; mag_dev->port = port; mag_dev->pin = pin; @@ -19,7 +18,7 @@ uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - return HAL_OK; + return HAL_OK; return HAL_ERROR; } diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 144d769b5..6feb6abdc 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -19,8 +19,8 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" -//#include "crc.h" -//#include "fdcan.h" +// #include "crc.h" +// #include "fdcan.h" #include "gpio.h" #include "spi.h" @@ -28,7 +28,7 @@ /* USER CODE BEGIN Includes */ #include -//#include "VL53L4ED_api.h" +// #include "VL53L4ED_api.h" #include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ @@ -103,9 +103,9 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); - //MX_CRC_Init(); - //MX_FDCAN1_Init(); - //MX_FDCAN2_Init(); + // MX_CRC_Init(); + // MX_FDCAN1_Init(); + // MX_FDCAN2_Init(); MX_I2C1_Init(); MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ @@ -194,7 +194,7 @@ int main(void) // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); // } - //HAL_Delay(100); // Read every 100ms + // HAL_Delay(100); // Read every 100ms } /* USER CODE END 3 */ } diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index edb838bd7..2015704f7 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -19,8 +19,8 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" -//#include "crc.h" -//#include "fdcan.h" +// #include "crc.h" +// #include "fdcan.h" #include "gpio.h" #include "i2c.h" #include "spi.h" @@ -36,8 +36,8 @@ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -//#define BMI323_CS_GPIO_Port GPIOA -//#define BMI323_CS_Pin GPIO_PIN_4 +// #define BMI323_CS_GPIO_Port GPIOA +// #define BMI323_CS_Pin GPIO_PIN_4 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -110,9 +110,9 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); - //MX_CRC_Init(); - //MX_FDCAN1_Init(); - //MX_FDCAN2_Init(); + // MX_CRC_Init(); + // MX_FDCAN1_Init(); + // MX_FDCAN2_Init(); MX_I2C1_Init(); MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ From e994bd3f20e6f8673e98d795d10b117374633de0 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 22:16:18 -0700 Subject: [PATCH 018/158] Mag updates, set up CMake --- CMakeLists.txt | 1 + SAMM/SAMM_Mag/CMakeLists.txt | 2 - SAMM/SAMM_Mag/Inc/gpio.h | 48 +++ SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h | 381 ++++++++++++++++++ SAMM/SAMM_Mag/Inc/stm32h5xx_it.h | 67 +++ SAMM/SAMM_Mag/Src/gpio.c | 94 +++++ SAMM/SAMM_Mag/Src/mag.c | 26 +- SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c | 86 ++++ .../SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c | 120 ++++++ SAMM/SAMM_Mag/Src/stm32h5xx_it.c | 213 ++++++++++ SAMM/SAMM_TOF/CMakeLists.txt | 2 - SAMM/samm.cmake | 1 + 12 files changed, 1025 insertions(+), 16 deletions(-) create mode 100644 SAMM/SAMM_Mag/Inc/gpio.h create mode 100644 SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h create mode 100644 SAMM/SAMM_Mag/Inc/stm32h5xx_it.h create mode 100644 SAMM/SAMM_Mag/Src/gpio.c create mode 100644 SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c create mode 100644 SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c create mode 100644 SAMM/SAMM_Mag/Src/stm32h5xx_it.c create mode 100644 SAMM/samm.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 73fa89035..564d631da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,7 @@ add_gr_project(STM32G474xE CANine) add_gr_project(STM32G431x8 TireTemp) # SAMM +include("SAMM/samm.cmake") add_gr_project(STM32H523xE SAMM SAMM_TOF) add_gr_project(STM32H523xE SAMM SAMM_MAG) diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index dba8cf08e..5926cc21d 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -19,8 +19,6 @@ enable_language( ASM ) -include("../IMU/imu.cmake") - # Core project settings project(${CMAKE_PROJECT_NAME}) diff --git a/SAMM/SAMM_Mag/Inc/gpio.h b/SAMM/SAMM_Mag/Inc/gpio.h new file mode 100644 index 000000000..843d4e9e7 --- /dev/null +++ b/SAMM/SAMM_Mag/Inc/gpio.h @@ -0,0 +1,48 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h new file mode 100644 index 000000000..efec9aabd --- /dev/null +++ b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h @@ -0,0 +1,381 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32H5xx_HAL_CONF_H +#define STM32H5xx_HAL_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED + +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CORDIC_MODULE_ENABLED */ +#define HAL_CRC_MODULE_ENABLED +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED +/*#define HAL_FMAC_MODULE_ENABLED */ +/*#define HAL_HRTIM_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/*#define HAL_SRAM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Register Callbacks selection ############################## */ +/** + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined(HSE_VALUE) +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined(HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined(HSI_VALUE) +#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined(HSI48_VALUE) +#define HSI48_VALUE \ + (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. \ + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined(LSI_VALUE) +/*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations in voltage and temperature.*/ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined(LSE_VALUE) +#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined(LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined(EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32h5xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32h5xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32h5xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32h5xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32h5xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32h5xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED +#include "stm32h5xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32h5xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32h5xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32h5xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32h5xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32h5xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32h5xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED +#include "stm32h5xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED +#include "stm32h5xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32h5xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32h5xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32h5xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32h5xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h5xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32h5xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32h5xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32h5xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32h5xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32h5xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32h5xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32h5xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32h5xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32h5xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32h5xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32h5xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32h5xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32h5xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32h5xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32h5xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32h5xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32h5xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32H5xx_HAL_CONF_H */ diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_it.h b/SAMM/SAMM_Mag/Inc/stm32h5xx_it.h new file mode 100644 index 000000000..89694865e --- /dev/null +++ b/SAMM/SAMM_Mag/Inc/stm32h5xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32H5xx_IT_H +#define __STM32H5xx_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void TIM1_UP_TIM16_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32H5xx_IT_H */ diff --git a/SAMM/SAMM_Mag/Src/gpio.c b/SAMM/SAMM_Mag/Src/gpio.c new file mode 100644 index 000000000..5926d6c84 --- /dev/null +++ b/SAMM/SAMM_Mag/Src/gpio.c @@ -0,0 +1,94 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI + PC8 ------> I2C3_SCL + PC9 ------> I2C3_SDA +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET); + + /*Configure GPIO pin : PF1 -> ToF not being used */ + /* + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + */ + + /*Configure GPIO pins : PB1 PB4 */ + GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PB12 PB6 */ + GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /*Configure GPIO pins : PC8 PC9 */ + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 39043a01e..0b9a5bd05 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -6,11 +6,12 @@ #include "stm32h5xx_hal_spi.h" // init spi port before calling this function -uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) +uint16_t mag_transmit(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin, uint16_t data) { - uint8_t tx_word[4]; - uint8_t rx_word[4] = {0} mag_dev->spi_port = spi_port; + uint8_t tx_word[2] = {data >> 8, data & 0xFF}; + uint8_t rx_word[2] = {0} + mag_dev->spi_port = spi_port; mag_dev->port = port; mag_dev->pin = pin; @@ -18,22 +19,23 @@ uint8_t mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - return HAL_OK; - - return HAL_ERROR; + return (uint16_t(rx_word[0]) << 8) | rx_word[1]; } uint16_t mag_read(mag *mag_dev, uint8_t reg) { - uint16_t data; - // i2c_read_single(mag_I2C_ADDR, reg, &data, mag_dev->i2c_port); - return data; + uint16_t data = uint16_t(reg) << 8; + uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data) + uint16_t read = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data) + return read; } -uint8_t mag_write(mag *mag_dev, uint8_t reg, uint8_t data) +uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { - // i2c_write(mag_I2C_ADDR, reg, data, mag_dev->i2c_port); - return 1; + uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; + uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) + + return 0; } uint8_t mag_calib_abort(mag *mag_dev) diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c new file mode 100644 index 000000000..69189ef4e --- /dev/null +++ b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c new file mode 100644 index 000000000..c63b85dfd --- /dev/null +++ b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c @@ -0,0 +1,120 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_hal_timebase_tim.c + * @brief HAL time base based on the hardware TIM. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_tim.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +TIM_HandleTypeDef htim1; +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** + * @brief This function configures the TIM1 as a time base source. + * The time source is configured to have 1ms time base with a dedicated + * Tick interrupt priority. + * @note This function is called automatically at the beginning of program after + * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). + * @param TickPriority: Tick interrupt priority. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) +{ + RCC_ClkInitTypeDef clkconfig; + uint32_t uwTimclock = 0; + uint32_t uwPrescalerValue = 0; + uint32_t pFLatency; + + HAL_StatusTypeDef status; + + /* Enable TIM1 clock */ + __HAL_RCC_TIM1_CLK_ENABLE(); + + /* Get clock configuration */ + HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); + + /* Compute TIM1 clock */ + uwTimclock = HAL_RCC_GetPCLK2Freq(); + + /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ + uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); + + /* Initialize TIM1 */ + htim1.Instance = TIM1; + + /* Initialize TIMx peripheral as follow: + * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. + * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. + * ClockDivision = 0 + * Counter direction = Up + */ + htim1.Init.Period = (1000000U / 1000U) - 1U; + htim1.Init.Prescaler = uwPrescalerValue; + htim1.Init.ClockDivision = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + + status = HAL_TIM_Base_Init(&htim1); + if (status == HAL_OK) { + /* Start the TIM time Base generation in interrupt mode */ + status = HAL_TIM_Base_Start_IT(&htim1); + if (status == HAL_OK) { + /* Enable the TIM1 global Interrupt */ + HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); + /* Configure the SysTick IRQ priority */ + if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { + /* Configure the TIM IRQ priority */ + HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); + uwTickPrio = TickPriority; + } else { + status = HAL_ERROR; + } + } + } + + /* Return function status */ + return status; +} + +/** + * @brief Suspend Tick increment. + * @note Disable the tick increment by disabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_SuspendTick(void) +{ + /* Disable TIM1 update Interrupt */ + __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); +} + +/** + * @brief Resume Tick increment. + * @note Enable the tick increment by Enabling TIM1 update interrupt. + * @param None + * @retval None + */ +void HAL_ResumeTick(void) +{ + /* Enable TIM1 Update interrupt */ + __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); +} diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_it.c b/SAMM/SAMM_Mag/Src/stm32h5xx_it.c new file mode 100644 index 000000000..8f4f91774 --- /dev/null +++ b/SAMM/SAMM_Mag/Src/stm32h5xx_it.c @@ -0,0 +1,213 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h5xx_it.h" + +#include "main.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern TIM_HandleTypeDef htim1; + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) {} + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32H5xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32h5xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. + */ +void TIM1_UP_TIM16_IRQHandler(void) +{ + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ + HAL_TIM_IRQHandler(&htim1); + /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ + + /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index bd33afad6..43916efc4 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -19,8 +19,6 @@ enable_language( ASM ) -include("../IMU/imu.cmake") - # Core project settings project(${CMAKE_PROJECT_NAME}) diff --git a/SAMM/samm.cmake b/SAMM/samm.cmake new file mode 100644 index 000000000..1550e1a1a --- /dev/null +++ b/SAMM/samm.cmake @@ -0,0 +1 @@ +include("${CMAKE_CURRENT_LIST_DIR}/IMU/imu.cmake") From 0c66d0f1a50c07b393cc235f5226bac14150a051 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 9 Apr 2026 22:21:50 -0700 Subject: [PATCH 019/158] MAG changes --- SAMM/SAMM_Mag/Src/mag.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 0b9a5bd05..94d305a6c 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -6,35 +6,40 @@ #include "stm32h5xx_hal_spi.h" // init spi port before calling this function -uint16_t mag_transmit(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin, uint16_t data) +void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) +{ + mag_dev->spi_port = spi_port; + mag_dev->port = port; + mag_dev->pin = pin; +} + +uint16_t mag_transmit(mag *mag_dev, uint16_t data) { uint8_t tx_word[2] = {data >> 8, data & 0xFF}; - uint8_t rx_word[2] = {0} - mag_dev->spi_port = spi_port; - mag_dev->port = port; - mag_dev->pin = pin; + uint8_t rx_word[2] = {0}; HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - return (uint16_t(rx_word[0]) << 8) | rx_word[1]; + return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } uint16_t mag_read(mag *mag_dev, uint8_t reg) { - uint16_t data = uint16_t(reg) << 8; - uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data) - uint16_t read = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data) - return read; + uint16_t data = (uint16_t)reg << 8; + uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data); + return mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, 0); } uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; - uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) - + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) + reg += 1; + uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } From 25b93fd55862b966e25e9302629c5922abea8577 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Apr 2026 15:04:52 +0000 Subject: [PATCH 020/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 94d305a6c..f1b979157 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -8,9 +8,9 @@ // init spi port before calling this function void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) { - mag_dev->spi_port = spi_port; - mag_dev->port = port; - mag_dev->pin = pin; + mag_dev->spi_port = spi_port; + mag_dev->port = port; + mag_dev->pin = pin; } uint16_t mag_transmit(mag *mag_dev, uint16_t data) @@ -36,11 +36,9 @@ uint16_t mag_read(mag *mag_dev, uint8_t reg) uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) - reg += 1; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) - return 0; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } uint8_t mag_calib_abort(mag *mag_dev) From d14934825f6b93d9aa6b8ef8dfd5f4b582901e54 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 14:47:10 -0700 Subject: [PATCH 021/158] Changed HSE, LSE, CSI clock speeds to match H5 --- SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h index efec9aabd..36941c600 100644 --- a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h @@ -115,20 +115,29 @@ extern "C" { * (when HSE is used as system clock source, directly or through the PLL). */ #if !defined(HSE_VALUE) -#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#define HSE_VALUE (25000000UL) /*!< Value of the External oscillator in Hz */ #endif /* HSE_VALUE */ #if !defined(HSE_STARTUP_TIMEOUT) #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ #endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + /** * @brief Internal High Speed oscillator (HSI) value. * This value is used by the RCC HAL module to compute the system frequency * (when HSI is used as system clock source, directly or through the PLL). */ #if !defined(HSI_VALUE) -#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#define HSI_VALUE (64000000UL) /*!< Value of the Internal oscillator in Hz*/ #endif /* HSI_VALUE */ /** From 905881df067a7d2a337393bd8eec6abfabda2413 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 19:45:26 -0700 Subject: [PATCH 022/158] Updates to mag functions --- SAMM/SAMM_Mag/Inc/mag.h | 2 +- SAMM/SAMM_Mag/Src/mag.c | 56 ++++++++++++++------------ SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 8 ++++ SAMM/SAMM_TOF/Src/main.c | 2 +- SAMM/SAMM_TOF/Src/spi.c | 2 +- 5 files changed, 41 insertions(+), 29 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 4a6bdd2f8..0cd9a7e16 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -4,7 +4,7 @@ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "spi.h" -#include "stm32h574xx.h" +#include "stm32h5xx.h" typedef struct { SPI_HandleTypeDef *spi_port; diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index f1b979157..68b63a5af 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -2,43 +2,47 @@ #include -#include "stm32h574xx.h" +#include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" -// init spi port before calling this function -void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) -{ - mag_dev->spi_port = spi_port; - mag_dev->port = port; - mag_dev->pin = pin; -} - -uint16_t mag_transmit(mag *mag_dev, uint16_t data) +void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_t pin) { + mag_dev->spi_port = spi_port; + mag_dev->port = port; + mag_dev->pin = pin; - uint8_t tx_word[2] = {data >> 8, data & 0xFF}; - uint8_t rx_word[2] = {0}; + uint16_t sta = mag_read(mag_dev, 0x22); + if (!(sta & 0x0001)) {return HAL_ERROR; } - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + mag_write(mag_dev, 0x1E, 0x01); - return ((uint16_t)rx_word[0] << 8) | rx_word[1]; + return HAL_OK; } +uint16_t mag_transmit(magmag_dev, uint16_t data) +{ + uint8_t tx_word[2] = {data >> 8, data & 0xFF}; + uint8_t rx_word[2] = {0}; -uint16_t mag_read(mag *mag_dev, uint8_t reg) + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + + return ((uint16_t)rx_word[0] << 8) | rx_word[1]; +} +uint16_t mag_read(mag mag_dev, uint8_t reg) { - uint16_t data = (uint16_t)reg << 8; - uint16_t dummy = mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, data); - return mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, 0); + uint16_t cmd = (uint16_t)reg << 8; // read: bit 14 = 0, address in bits 13:8 + mag_transmit(mag_dev, cmd); // frame 1: send command, discard response + return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data } - -uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) +uint16_t mag_write(mag mag_dev, uint8_t reg, uint16_t data) { - uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; - uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; + uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) + reg += 1; + uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) + return 0; } uint8_t mag_calib_abort(mag *mag_dev) diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index efec9aabd..ad2f4eee4 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -122,6 +122,14 @@ extern "C" { #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ #endif /* HSE_STARTUP_TIMEOUT */ +/** + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + /** * @brief Internal High Speed oscillator (HSI) value. * This value is used by the RCC HAL module to compute the system frequency diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 2015704f7..5c00881a9 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -30,7 +30,7 @@ #include #include "VL53L4ED_api.h" -#include "bmi323.h" +#include "IMU/bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index bc7c80f1d..0b1da9dfb 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -97,7 +97,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == spi3) { + if (spiHandle->Instance == SPI3) { /* USER CODE BEGIN spi3_MspInit 0 */ /* USER CODE END spi3_MspInit 0 */ From c52ac3a600a42c6d969135dce747ce378165e75b Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 02:46:43 +0000 Subject: [PATCH 023/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h | 15 ++++----- SAMM/SAMM_Mag/Src/mag.c | 44 +++++++++++++------------- SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 12 +++---- SAMM/SAMM_TOF/Src/main.c | 2 +- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h index 36941c600..4a8ddf5a6 100644 --- a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h @@ -116,20 +116,19 @@ extern "C" { */ #if !defined(HSE_VALUE) #define HSE_VALUE (25000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ +#endif /* HSE_VALUE */ #if !defined(HSE_STARTUP_TIMEOUT) #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ #endif /* HSE_STARTUP_TIMEOUT */ - /** - * @brief Internal Core Speed oscillator (CSI) default value. - * This value is the default CSI range value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined(CSI_VALUE) +#define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ /** * @brief Internal High Speed oscillator (HSI) value. diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 68b63a5af..91f2bbdd1 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -7,42 +7,42 @@ void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_t pin) { - mag_dev->spi_port = spi_port; - mag_dev->port = port; - mag_dev->pin = pin; + mag_dev->spi_port = spi_port; + mag_dev->port = port; + mag_dev->pin = pin; - uint16_t sta = mag_read(mag_dev, 0x22); - if (!(sta & 0x0001)) {return HAL_ERROR; } + uint16_t sta = mag_read(mag_dev, 0x22); + if (!(sta & 0x0001)) { + return HAL_ERROR; + } - mag_write(mag_dev, 0x1E, 0x01); + mag_write(mag_dev, 0x1E, 0x01); - return HAL_OK; + return HAL_OK; } uint16_t mag_transmit(magmag_dev, uint16_t data) { - uint8_t tx_word[2] = {data >> 8, data & 0xFF}; - uint8_t rx_word[2] = {0}; + uint8_t tx_word[2] = {data >> 8, data & 0xFF}; + uint8_t rx_word[2] = {0}; - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - return ((uint16_t)rx_word[0] << 8) | rx_word[1]; + return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } uint16_t mag_read(mag mag_dev, uint8_t reg) { - uint16_t cmd = (uint16_t)reg << 8; // read: bit 14 = 0, address in bits 13:8 - mag_transmit(mag_dev, cmd); // frame 1: send command, discard response - return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data + uint16_t cmd = (uint16_t)reg << 8; // read: bit 14 = 0, address in bits 13:8 + mag_transmit(mag_dev, cmd); // frame 1: send command, discard response + return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data } uint16_t mag_write(mag mag_dev, uint8_t reg, uint16_t data) { - uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) - reg += 1; - uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) - return 0; + uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; + uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } uint8_t mag_calib_abort(mag *mag_dev) diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index ad2f4eee4..03f6fef64 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -123,12 +123,12 @@ extern "C" { #endif /* HSE_STARTUP_TIMEOUT */ /** - * @brief Internal Core Speed oscillator (CSI) default value. - * This value is the default CSI range value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined(CSI_VALUE) +#define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ /** * @brief Internal High Speed oscillator (HSI) value. diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 5c00881a9..341758995 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -29,8 +29,8 @@ /* USER CODE BEGIN Includes */ #include -#include "VL53L4ED_api.h" #include "IMU/bmi323.h" +#include "VL53L4ED_api.h" // #include "circularBuffer.h" /* USER CODE END Includes */ From 8cda03466c24eb2733e6799c67bc82c47be8e0d8 Mon Sep 17 00:00:00 2001 From: Anthony Ma Date: Mon, 13 Apr 2026 19:56:54 -0700 Subject: [PATCH 024/158] Changed CMakeLists.txt - SAMM_MAG needs to be changed to SAMM_Mag, MAC does not care about capitalization but other OS do care --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 564d631da..91746c15b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,7 @@ add_gr_project(STM32G431x8 TireTemp) # SAMM include("SAMM/samm.cmake") add_gr_project(STM32H523xE SAMM SAMM_TOF) -add_gr_project(STM32H523xE SAMM SAMM_MAG) +add_gr_project(STM32H523xE SAMM SAMM_Mag) # Development add_gr_project(STM32G474xE G4PERTESTING) From 0dd5d3121ed6287dbb7d67caade541906cf7954e Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 13 Apr 2026 20:25:34 -0700 Subject: [PATCH 025/158] Some small fixes hopefully Signed-off-by: Daniel Hansen --- SAMM/SAMM_TOF/Inc/adc.h | 3 ++- SAMM/SAMM_TOF/Inc/main.h | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/SAMM/SAMM_TOF/Inc/adc.h b/SAMM/SAMM_TOF/Inc/adc.h index e65b1f6f8..b5cbcc253 100644 --- a/SAMM/SAMM_TOF/Inc/adc.h +++ b/SAMM/SAMM_TOF/Inc/adc.h @@ -27,7 +27,8 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "main.h" - +#include "stm32h5xx_ll_adc.h" +#include "stm32h5xx_hal_adc.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h index 42659c5d7..aee83de80 100644 --- a/SAMM/SAMM_TOF/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -28,6 +28,7 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32h5xx_hal.h" +#include "stm32h5xx_ll_adc.h" #include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_crs.h" @@ -38,7 +39,11 @@ extern "C" { #include "stm32h5xx_ll_rcc.h" #include "stm32h5xx_ll_system.h" #include "stm32h5xx_ll_utils.h" - +#include "stm32h5xx_ll_lpuart.h" +#include "stm32h5xx_hal_dma.h" +#include "stm32h5xx_hal_rcc.h" +#include "stm32h5xx_hal_i2c.h" +#include "stm32h5xx_hal_rcc.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ From 2be366ba4a7a2c60d24663c5745ec198a510f6fb Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 03:29:15 +0000 Subject: [PATCH 026/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_TOF/Inc/adc.h | 2 +- SAMM/SAMM_TOF/Inc/main.h | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/SAMM/SAMM_TOF/Inc/adc.h b/SAMM/SAMM_TOF/Inc/adc.h index b5cbcc253..f8541e8da 100644 --- a/SAMM/SAMM_TOF/Inc/adc.h +++ b/SAMM/SAMM_TOF/Inc/adc.h @@ -27,8 +27,8 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "main.h" -#include "stm32h5xx_ll_adc.h" #include "stm32h5xx_hal_adc.h" +#include "stm32h5xx_ll_adc.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h index aee83de80..48e4d6b34 100644 --- a/SAMM/SAMM_TOF/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -28,6 +28,9 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_dma.h" +#include "stm32h5xx_hal_i2c.h" +#include "stm32h5xx_hal_rcc.h" #include "stm32h5xx_ll_adc.h" #include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" @@ -35,15 +38,11 @@ extern "C" { #include "stm32h5xx_ll_dma.h" #include "stm32h5xx_ll_exti.h" #include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_lpuart.h" #include "stm32h5xx_ll_pwr.h" #include "stm32h5xx_ll_rcc.h" #include "stm32h5xx_ll_system.h" #include "stm32h5xx_ll_utils.h" -#include "stm32h5xx_ll_lpuart.h" -#include "stm32h5xx_hal_dma.h" -#include "stm32h5xx_hal_rcc.h" -#include "stm32h5xx_hal_i2c.h" -#include "stm32h5xx_hal_rcc.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ From c2e2b6064cf0f0431e9d96947fbf3814d5954044 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 20:35:38 -0700 Subject: [PATCH 027/158] Fixed includes --- SAMM/IMU/Inc/IMU/bmi323.h | 2 +- SAMM/SAMM_Mag/Inc/main.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SAMM/IMU/Inc/IMU/bmi323.h b/SAMM/IMU/Inc/IMU/bmi323.h index 828606bf0..9fd308cf2 100644 --- a/SAMM/IMU/Inc/IMU/bmi323.h +++ b/SAMM/IMU/Inc/IMU/bmi323.h @@ -5,7 +5,7 @@ #include "main.h" #include "spi.h" -#include "stm32h574xx.h" +#include "stm32h5xx.h" // BMI323 register defines diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index 42659c5d7..3214ed137 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -41,7 +41,7 @@ extern "C" { /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ From 573da1b936b00a13324229b377bdc1778bf9418b Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 21:13:34 -0700 Subject: [PATCH 028/158] Fixed adc issues --- SAMM/SAMM_TOF/Src/adc.c | 23 ++++++++++++++++++----- SAMM/SAMM_TOF/Src/dma.c | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/SAMM/SAMM_TOF/Src/adc.c b/SAMM/SAMM_TOF/Src/adc.c index fbcfbe933..85f95921b 100644 --- a/SAMM/SAMM_TOF/Src/adc.c +++ b/SAMM/SAMM_TOF/Src/adc.c @@ -44,10 +44,9 @@ void MX_ADC1_Init(void) /** Common config */ hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // TODO: possibly change???? hadc1.Init.Resolution = ADC_RESOLUTION_12B; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.GainCompensation = 0; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hadc1.Init.LowPowerAutoWait = DISABLE; @@ -94,14 +93,28 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; if (adcHandle->Instance == ADC1) { /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ - LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + //LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); /* ADC1 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); + //__HAL_RCC_ADC12_CLK_ENABLE(); + + + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC; + PeriphClkInitStruct.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**ADC1 GPIO Configuration @@ -128,7 +141,7 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) /* USER CODE END ADC1_MspDeInit 0 */ /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); + __HAL_RCC_ADC_CLK_DISABLE(); /**ADC1 GPIO Configuration PC0 ------> ADC1_IN6 diff --git a/SAMM/SAMM_TOF/Src/dma.c b/SAMM/SAMM_TOF/Src/dma.c index 0b82d0d7c..55897ebea 100644 --- a/SAMM/SAMM_TOF/Src/dma.c +++ b/SAMM/SAMM_TOF/Src/dma.c @@ -40,7 +40,7 @@ void MX_DMA_Init(void) { /* DMA controller clock enable */ - __HAL_RCC_DMAMUX1_CLK_ENABLE(); + __HAL_RCC_GPDMA1_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ From 469339a35aa9deaf7bb374052b5cd3792509a2bf Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:14:54 +0000 Subject: [PATCH 029/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_TOF/Src/adc.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/SAMM/SAMM_TOF/Src/adc.c b/SAMM/SAMM_TOF/Src/adc.c index 85f95921b..75fb542e3 100644 --- a/SAMM/SAMM_TOF/Src/adc.c +++ b/SAMM/SAMM_TOF/Src/adc.c @@ -98,23 +98,21 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) /* USER CODE BEGIN ADC1_MspInit 0 */ /* USER CODE END ADC1_MspInit 0 */ - //LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + // LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); /* ADC1 clock enable */ //__HAL_RCC_ADC12_CLK_ENABLE(); - /** Initializes the peripherals clock - */ + */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC; PeriphClkInitStruct.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HCLK; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) - { - Error_Handler(); + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { + Error_Handler(); } - /* Peripheral clock enable */ - __HAL_RCC_ADC_CLK_ENABLE(); + /* Peripheral clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**ADC1 GPIO Configuration From 05b108cf969b9c6b4c062a7e7f4e1edaf3e0606f Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 21:23:31 -0700 Subject: [PATCH 030/158] Fixed some more includes --- SAMM/SAMM_Mag/Inc/main.h | 5 +++++ SAMM/SAMM_TOF/Inc/main.h | 2 +- SAMM/SAMM_TOF/Src/dma.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index 3214ed137..a4629eb72 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -28,12 +28,17 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_dma.h" +#include "stm32h5xx_hal_i2c.h" +#include "stm32h5xx_hal_rcc.h" +#include "stm32h5xx_ll_adc.h" #include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_crs.h" #include "stm32h5xx_ll_dma.h" #include "stm32h5xx_ll_exti.h" #include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_lpuart.h" #include "stm32h5xx_ll_pwr.h" #include "stm32h5xx_ll_rcc.h" #include "stm32h5xx_ll_system.h" diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h index 48e4d6b34..cd33143dc 100644 --- a/SAMM/SAMM_TOF/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -45,7 +45,7 @@ extern "C" { #include "stm32h5xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ diff --git a/SAMM/SAMM_TOF/Src/dma.c b/SAMM/SAMM_TOF/Src/dma.c index 55897ebea..4f6ea3d01 100644 --- a/SAMM/SAMM_TOF/Src/dma.c +++ b/SAMM/SAMM_TOF/Src/dma.c @@ -41,7 +41,7 @@ void MX_DMA_Init(void) /* DMA controller clock enable */ __HAL_RCC_GPDMA1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); + __HAL_RCC_DMAMUX1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ From ebc6fe4d92463cdd92d67d78e0959f46ca2fa1d7 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 13 Apr 2026 21:47:01 -0700 Subject: [PATCH 031/158] More debugging for linker problems --- SAMM/SAMM_Mag/Src/gpio.c | 3 +++ SAMM/SAMM_TOF/Src/dma.c | 9 ++++----- SAMM/SAMM_TOF/Src/gpio.c | 2 ++ SAMM/SAMM_TOF/Src/spi.c | 4 ++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/gpio.c b/SAMM/SAMM_Mag/Src/gpio.c index 5926d6c84..3a59aa2e9 100644 --- a/SAMM/SAMM_Mag/Src/gpio.c +++ b/SAMM/SAMM_Mag/Src/gpio.c @@ -80,13 +80,16 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pins : PC8 PC9 */ + /* GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + */ } /* USER CODE BEGIN 2 */ diff --git a/SAMM/SAMM_TOF/Src/dma.c b/SAMM/SAMM_TOF/Src/dma.c index 4f6ea3d01..972b9efea 100644 --- a/SAMM/SAMM_TOF/Src/dma.c +++ b/SAMM/SAMM_TOF/Src/dma.c @@ -41,15 +41,14 @@ void MX_DMA_Init(void) /* DMA controller clock enable */ __HAL_RCC_GPDMA1_CLK_ENABLE(); - __HAL_RCC_DMAMUX1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + HAL_NVIC_SetPriority(GPDMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(GPDMA1_Channel1_IRQn); /* DMA1_Channel2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + HAL_NVIC_SetPriority(GPDMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(GPDMA1_Channel2_IRQn); } /* USER CODE BEGIN 2 */ diff --git a/SAMM/SAMM_TOF/Src/gpio.c b/SAMM/SAMM_TOF/Src/gpio.c index 64c996563..1d447103f 100644 --- a/SAMM/SAMM_TOF/Src/gpio.c +++ b/SAMM/SAMM_TOF/Src/gpio.c @@ -81,12 +81,14 @@ void MX_GPIO_Init(void) HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); /*Configure GPIO pins : PC8 PC9 */ + /* GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + */ } /* USER CODE BEGIN 2 */ diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index 0b1da9dfb..f11858f55 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -102,7 +102,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) /* USER CODE END spi3_MspInit 0 */ /* spi3 clock enable */ - __HAL_RCC_spi3_CLK_ENABLE(); + __HAL_RCC_SPI3_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /**spi3 GPIO Configuration @@ -145,7 +145,7 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) /* USER CODE END spi3_MspDeInit 0 */ /* Peripheral clock disable */ - __HAL_RCC_spi3_CLK_DISABLE(); + __HAL_RCC_SPI3_CLK_DISABLE(); /**spi3 GPIO Configuration PB1 ------> SPI3_SCK From dc5ea22dc0a1568b1c0fa238dd0453985e9697e3 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:48:31 +0000 Subject: [PATCH 032/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/gpio.c | 1 - 1 file changed, 1 deletion(-) diff --git a/SAMM/SAMM_Mag/Src/gpio.c b/SAMM/SAMM_Mag/Src/gpio.c index 3a59aa2e9..de043543c 100644 --- a/SAMM/SAMM_Mag/Src/gpio.c +++ b/SAMM/SAMM_Mag/Src/gpio.c @@ -80,7 +80,6 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /*Configure GPIO pins : PC8 PC9 */ /* GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; From 9343d1bdbd27011f77500c585c84a063dd408314 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 16 Apr 2026 21:26:49 -0700 Subject: [PATCH 033/158] Removed FDCAN files, removed some linker errors --- SAMM/SAMM_Mag/Inc/fdcan.h | 54 ------- SAMM/SAMM_Mag/Src/fdcan.c | 213 -------------------------- SAMM/SAMM_Mag/Src/mag.c | 16 +- SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c | 2 +- SAMM/SAMM_TOF/Inc/fdcan.h | 54 ------- SAMM/SAMM_TOF/Src/fdcan.c | 213 -------------------------- SAMM/SAMM_TOF/Src/main.c | 6 +- SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c | 3 +- 8 files changed, 21 insertions(+), 540 deletions(-) delete mode 100644 SAMM/SAMM_Mag/Inc/fdcan.h delete mode 100644 SAMM/SAMM_Mag/Src/fdcan.c delete mode 100644 SAMM/SAMM_TOF/Inc/fdcan.h delete mode 100644 SAMM/SAMM_TOF/Src/fdcan.c diff --git a/SAMM/SAMM_Mag/Inc/fdcan.h b/SAMM/SAMM_Mag/Inc/fdcan.h deleted file mode 100644 index a5cc22f04..000000000 --- a/SAMM/SAMM_Mag/Inc/fdcan.h +++ /dev/null @@ -1,54 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FDCAN_H__ -#define __FDCAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern FDCAN_HandleTypeDef hfdcan1; - -extern FDCAN_HandleTypeDef hfdcan2; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FDCAN1_Init(void); -void MX_FDCAN2_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __FDCAN_H__ */ diff --git a/SAMM/SAMM_Mag/Src/fdcan.c b/SAMM/SAMM_Mag/Src/fdcan.c deleted file mode 100644 index 3e239ca01..000000000 --- a/SAMM/SAMM_Mag/Src/fdcan.c +++ /dev/null @@ -1,213 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "fdcan.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -FDCAN_HandleTypeDef hfdcan1; -FDCAN_HandleTypeDef hfdcan2; - -/* FDCAN1 init function */ -void MX_FDCAN1_Init(void) -{ - - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 16; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 1; - hfdcan1.Init.NominalTimeSeg2 = 1; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ -} -/* FDCAN2 init function */ -void MX_FDCAN2_Init(void) -{ - - /* USER CODE BEGIN FDCAN2_Init 0 */ - - /* USER CODE END FDCAN2_Init 0 */ - - /* USER CODE BEGIN FDCAN2_Init 1 */ - - /* USER CODE END FDCAN2_Init 1 */ - hfdcan2.Instance = FDCAN2; - hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = DISABLE; - hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = DISABLE; - hfdcan2.Init.NominalPrescaler = 16; - hfdcan2.Init.NominalSyncJumpWidth = 1; - hfdcan2.Init.NominalTimeSeg1 = 1; - hfdcan2.Init.NominalTimeSeg2 = 1; - hfdcan2.Init.DataPrescaler = 1; - hfdcan2.Init.DataSyncJumpWidth = 1; - hfdcan2.Init.DataTimeSeg1 = 1; - hfdcan2.Init.DataTimeSeg2 = 1; - hfdcan2.Init.StdFiltersNbr = 0; - hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN2_Init 2 */ - - /* USER CODE END FDCAN2_Init 2 */ -} - -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; - -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspInit 0 */ - - /* USER CODE END FDCAN2_MspInit 0 */ - - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN2 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB12 ------> FDCAN2_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN2_MspInit 1 */ - - /* USER CODE END FDCAN2_MspInit 1 */ - } -} - -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ - - /* USER CODE END FDCAN2_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB12 ------> FDCAN2_RX - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ - - /* USER CODE END FDCAN2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 91f2bbdd1..b56498069 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -20,7 +20,8 @@ void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_ return HAL_OK; } -uint16_t mag_transmit(magmag_dev, uint16_t data) + +uint16_t mag_transmit(mag mag_dev, uint16_t data) { uint8_t tx_word[2] = {data >> 8, data & 0xFF}; uint8_t rx_word[2] = {0}; @@ -31,6 +32,7 @@ uint16_t mag_transmit(magmag_dev, uint16_t data) return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } + uint16_t mag_read(mag mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)reg << 8; // read: bit 14 = 0, address in bits 13:8 @@ -51,6 +53,18 @@ uint8_t mag_calib_abort(mag *mag_dev) return 1; } +//may ormay not work +uint16_t mag_read_encoder_angle(mag mag_dev) +{ + uint16_t read_angle = mag_transmit(mag_dev, 0x32); //0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) +} + +//Address 0x22:0x23 (STA)—Device Status + //read bit 0 AOK [0] +//Address 0x28:0x29 (TSEN)—Temperature Sensor + + /* TODO: Check the status of the acc, gyro and temp before returning the values diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c index 69189ef4e..df23c6f59 100644 --- a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c +++ b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c @@ -66,7 +66,7 @@ void HAL_MspInit(void) /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ - +//there should be an error here- like in TOF __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); diff --git a/SAMM/SAMM_TOF/Inc/fdcan.h b/SAMM/SAMM_TOF/Inc/fdcan.h deleted file mode 100644 index a5cc22f04..000000000 --- a/SAMM/SAMM_TOF/Inc/fdcan.h +++ /dev/null @@ -1,54 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FDCAN_H__ -#define __FDCAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern FDCAN_HandleTypeDef hfdcan1; - -extern FDCAN_HandleTypeDef hfdcan2; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FDCAN1_Init(void); -void MX_FDCAN2_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __FDCAN_H__ */ diff --git a/SAMM/SAMM_TOF/Src/fdcan.c b/SAMM/SAMM_TOF/Src/fdcan.c deleted file mode 100644 index 3e239ca01..000000000 --- a/SAMM/SAMM_TOF/Src/fdcan.c +++ /dev/null @@ -1,213 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "fdcan.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -FDCAN_HandleTypeDef hfdcan1; -FDCAN_HandleTypeDef hfdcan2; - -/* FDCAN1 init function */ -void MX_FDCAN1_Init(void) -{ - - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 16; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 1; - hfdcan1.Init.NominalTimeSeg2 = 1; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ -} -/* FDCAN2 init function */ -void MX_FDCAN2_Init(void) -{ - - /* USER CODE BEGIN FDCAN2_Init 0 */ - - /* USER CODE END FDCAN2_Init 0 */ - - /* USER CODE BEGIN FDCAN2_Init 1 */ - - /* USER CODE END FDCAN2_Init 1 */ - hfdcan2.Instance = FDCAN2; - hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = DISABLE; - hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = DISABLE; - hfdcan2.Init.NominalPrescaler = 16; - hfdcan2.Init.NominalSyncJumpWidth = 1; - hfdcan2.Init.NominalTimeSeg1 = 1; - hfdcan2.Init.NominalTimeSeg2 = 1; - hfdcan2.Init.DataPrescaler = 1; - hfdcan2.Init.DataSyncJumpWidth = 1; - hfdcan2.Init.DataTimeSeg1 = 1; - hfdcan2.Init.DataTimeSeg2 = 1; - hfdcan2.Init.StdFiltersNbr = 0; - hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN2_Init 2 */ - - /* USER CODE END FDCAN2_Init 2 */ -} - -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; - -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspInit 0 */ - - /* USER CODE END FDCAN2_MspInit 0 */ - - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN2 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB12 ------> FDCAN2_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN2_MspInit 1 */ - - /* USER CODE END FDCAN2_MspInit 1 */ - } -} - -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ - - /* USER CODE END FDCAN2_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB12 ------> FDCAN2_RX - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ - - /* USER CODE END FDCAN2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 341758995..31193441e 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -30,14 +30,14 @@ #include #include "IMU/bmi323.h" -#include "VL53L4ED_api.h" +#include "../Extras/VL53L4ED/VL53L4ED_api.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -// #define BMI323_CS_GPIO_Port GPIOA -// #define BMI323_CS_Pin GPIO_PIN_4 + #define BMI323_CS_GPIO_Port GPIOA //Uncommented 4/16/26 to fix reference errors + #define BMI323_CS_Pin GPIO_PIN_4 //Uncommented 4/16/26 to fix reference errors /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ diff --git a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c index 69189ef4e..c2cd9df0d 100644 --- a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c +++ b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c @@ -67,7 +67,8 @@ void HAL_MspInit(void) /* USER CODE END MspInit 0 */ - __HAL_RCC_SYSCFG_CLK_ENABLE(); + // __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_SBS_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); /* System interrupt init*/ From 8c9fbb74d36f38ed104c7a8840b74734659dcfde Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 04:28:11 +0000 Subject: [PATCH 034/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 13 ++++++------- SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c | 2 +- SAMM/SAMM_TOF/Src/main.c | 6 +++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index b56498069..a385a9c46 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -53,17 +53,16 @@ uint8_t mag_calib_abort(mag *mag_dev) return 1; } -//may ormay not work +// may ormay not work uint16_t mag_read_encoder_angle(mag mag_dev) { - uint16_t read_angle = mag_transmit(mag_dev, 0x32); //0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) + uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) } -//Address 0x22:0x23 (STA)—Device Status - //read bit 0 AOK [0] -//Address 0x28:0x29 (TSEN)—Temperature Sensor - +// Address 0x22:0x23 (STA)—Device Status +// read bit 0 AOK [0] +// Address 0x28:0x29 (TSEN)—Temperature Sensor /* TODO: diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c index df23c6f59..4257acb5a 100644 --- a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c +++ b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c @@ -66,7 +66,7 @@ void HAL_MspInit(void) /* USER CODE BEGIN MspInit 0 */ /* USER CODE END MspInit 0 */ -//there should be an error here- like in TOF + // there should be an error here- like in TOF __HAL_RCC_SYSCFG_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 31193441e..b4a53cdc9 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -29,15 +29,15 @@ /* USER CODE BEGIN Includes */ #include -#include "IMU/bmi323.h" #include "../Extras/VL53L4ED/VL53L4ED_api.h" +#include "IMU/bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ - #define BMI323_CS_GPIO_Port GPIOA //Uncommented 4/16/26 to fix reference errors - #define BMI323_CS_Pin GPIO_PIN_4 //Uncommented 4/16/26 to fix reference errors +#define BMI323_CS_GPIO_Port GPIOA // Uncommented 4/16/26 to fix reference errors +#define BMI323_CS_Pin GPIO_PIN_4 // Uncommented 4/16/26 to fix reference errors /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ From 14fead5161ca99ff09feaaaf874dc89e9c43470a Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 16 Apr 2026 21:28:51 -0700 Subject: [PATCH 035/158] Modified CMake files to address removing fdcan --- SAMM/SAMM_Mag/CMakeLists.txt | 1 - SAMM/SAMM_TOF/CMakeLists.txt | 1 - 2 files changed, 2 deletions(-) diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index 5926cc21d..eb5e952f8 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -30,7 +30,6 @@ target_sources( Src/adc.c Src/crc.c Src/dma.c - Src/fdcan.c Src/gpio.c Src/mag.c Src/main.c diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index 43916efc4..7461b5f1f 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -30,7 +30,6 @@ target_sources( Src/adc.c Src/crc.c Src/dma.c - Src/fdcan.c Src/gpio.c Src/i2c.c Src/main.c From d94d7b725c2d5bc343cebf3157bb834b49df9da9 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 16 Apr 2026 22:32:46 -0700 Subject: [PATCH 036/158] Added safety and changed read and write, added error checker function (need LOGOMATIC) --- SAMM/SAMM_Mag/Src/mag.c | 76 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index a385a9c46..64417d8ed 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -1,10 +1,17 @@ #include "mag.h" - +#include "stdbool.h" #include #include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" +#define mag_write_address_msb 22 +#define mag_write_address_lsb 23 + +#define mag_addr_mask 0x3F +#define mag_msb 0xFF00 +#define mag_lsb 0x00FF + void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_t pin) { mag_dev->spi_port = spi_port; @@ -26,24 +33,50 @@ uint16_t mag_transmit(mag mag_dev, uint16_t data) uint8_t tx_word[2] = {data >> 8, data & 0xFF}; uint8_t rx_word[2] = {0}; + //HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); //disable + bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + //fix-me add error handling HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + //HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } +/* +0 +0 (W/R') +addr (6 bits) +data (8 bits) +crc (4 bits -- optional) + +0 +0 +addr +0x00 +crc +*/ uint16_t mag_read(mag mag_dev, uint8_t reg) { - uint16_t cmd = (uint16_t)reg << 8; // read: bit 14 = 0, address in bits 13:8 + uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 mag_transmit(mag_dev, cmd); // frame 1: send command, discard response return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data } + +/* +write cycle: +0 +1 (W/R') +addr (6 bits) +data (8 bits) +crc (4 bits -- optional) +*/ + uint16_t mag_write(mag mag_dev, uint8_t reg, uint16_t data) { - uint16_t msb = data >> 8 | (uint16_t(reg) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; - uint16_t lsb = (data & 0x00FF) | (uint16_t(reg) << 8) | 0x4000; + uint16_t msb = (data & mag_msb) >> 8 | ((uint16_t(reg) & mag_addr_mask) << 8) | 0x4000; + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; //increment from 0x22 to 0x23 for lsb + uint16_t lsb = (data & mag_lsb) | ((uint16_t(reg) & mag_addr_mask) << 8)) | 0x4000; mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } @@ -71,8 +104,37 @@ Check the status of the acc, gyro and temp before returning the values if they are ready return 1 need to pass by reference the values to be returned +12 bit angle: 0 EF UV P data(12 bits) -- can use EF for error flag, uv for undervoltage + +0x09 : extended write status +0x0D : extended read status */ +bool check_status(mag mag_dev) { + //Device Error Flags + uint32_t error25 = mag_read(mag_dev, 0x25); + bool voltage_err = ((error25 & 0x18) > 0); + bool magnetic_err = ((error25 & 0x02) > 0); + + uint32_t error24 = mag_read(mag_dev, 0x24); + bool angle_error = ((error24 & 0x02) > 0); + + //Device Warning Flags + uint32_t warning27 = mag_read(mag_dev, 0x27); + uint32_t warning26 = mag_read(mag_dev, 0x26); + + bool invalid_spi_len = ((warning26 & 0x80) > 0); + bool temp_out_of_range = ((warning27 & 0x40) > 0); + + bool turn_counter_saturated = ((warning27 && 0x01) > 0); + bool excessive_magnet_vel = ((warning27 && 0x08) > 0); + + //fix-me add LOGOMATIC + + return true; +} + + uint16_t mag_read_acc_x(mag *mag_dev) { return mag_read(mag_dev, mag_ACC_X); From 7002bfb0e53bb6a5d2f784d4ab9743ed44dab5ab Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 05:40:16 +0000 Subject: [PATCH 037/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 64417d8ed..999bfa6f6 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -1,7 +1,8 @@ #include "mag.h" -#include "stdbool.h" + #include +#include "stdbool.h" #include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" @@ -33,12 +34,12 @@ uint16_t mag_transmit(mag mag_dev, uint16_t data) uint8_t tx_word[2] = {data >> 8, data & 0xFF}; uint8_t rx_word[2] = {0}; - //HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); //disable + // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // disable bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - //fix-me add error handling + // fix-me add error handling HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - //HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } @@ -58,9 +59,9 @@ crc */ uint16_t mag_read(mag mag_dev, uint8_t reg) { - uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 - mag_transmit(mag_dev, cmd); // frame 1: send command, discard response - return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data + uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 + mag_transmit(mag_dev, cmd); // frame 1: send command, discard response + return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data } /* @@ -75,7 +76,7 @@ crc (4 bits -- optional) uint16_t mag_write(mag mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = (data & mag_msb) >> 8 | ((uint16_t(reg) & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; //increment from 0x22 to 0x23 for lsb + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; // increment from 0x22 to 0x23 for lsb uint16_t lsb = (data & mag_lsb) | ((uint16_t(reg) & mag_addr_mask) << 8)) | 0x4000; mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } @@ -110,8 +111,9 @@ Check the status of the acc, gyro and temp before returning the values 0x0D : extended read status */ -bool check_status(mag mag_dev) { - //Device Error Flags +bool check_status(mag mag_dev) +{ + // Device Error Flags uint32_t error25 = mag_read(mag_dev, 0x25); bool voltage_err = ((error25 & 0x18) > 0); bool magnetic_err = ((error25 & 0x02) > 0); @@ -119,7 +121,7 @@ bool check_status(mag mag_dev) { uint32_t error24 = mag_read(mag_dev, 0x24); bool angle_error = ((error24 & 0x02) > 0); - //Device Warning Flags + // Device Warning Flags uint32_t warning27 = mag_read(mag_dev, 0x27); uint32_t warning26 = mag_read(mag_dev, 0x26); @@ -129,12 +131,11 @@ bool check_status(mag mag_dev) { bool turn_counter_saturated = ((warning27 && 0x01) > 0); bool excessive_magnet_vel = ((warning27 && 0x08) > 0); - //fix-me add LOGOMATIC + // fix-me add LOGOMATIC return true; } - uint16_t mag_read_acc_x(mag *mag_dev) { return mag_read(mag_dev, mag_ACC_X); From 9229db974b05708b230db3b234ea645fb0a2335d Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Fri, 17 Apr 2026 07:30:32 -0700 Subject: [PATCH 038/158] Minor changes --- SAMM/SAMM_Mag/Src/mag.c | 89 ++++---------------------- SAMM/SAMM_Mag/Src/main.c | 13 ++-- SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 2 +- SAMM/SAMM_TOF/Src/main.c | 3 +- SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c | 2 +- 5 files changed, 25 insertions(+), 84 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 999bfa6f6..280a612c3 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -24,6 +24,7 @@ void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_ return HAL_ERROR; } + mag_write(mag_dev, 0x1E, 0x01); return HAL_OK; @@ -87,11 +88,11 @@ uint8_t mag_calib_abort(mag *mag_dev) return 1; } -// may ormay not work -uint16_t mag_read_encoder_angle(mag mag_dev) +//Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) +float mag_read_encoder_angle(mag mag_dev) { uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) + return ((uint16_t)(read_angle & 0x7FFF) * 360.0f / 32768); // Mask to 15 bits (valid angle data) } // Address 0x22:0x23 (STA)—Device Status @@ -143,81 +144,19 @@ uint16_t mag_read_acc_x(mag *mag_dev) uint16_t mag_read_acc_y(mag *mag_dev) { - return mag_read(mag_dev, mag_ACC_Y); -} - -uint16_t mag_read_acc_z(mag *mag_dev) -{ - return mag_read(mag_dev, mag_ACC_Z); -} - -uint16_t mag_read_gyr_x(mag *mag_dev) -{ - return mag_read(mag_dev, mag_GYR_X); -} - -uint16_t mag_read_gyr_y(mag *mag_dev) -{ - return mag_read(mag_dev, mag_GYR_Y); -} - -uint16_t mag_read_gyr_z(mag *mag_dev) -{ - return mag_read(mag_dev, mag_GYR_Z); -} - -uint16_t mag_read_temp_data(mag *mag_dev) -{ - return mag_read(mag_dev, mag_TEMP_DATA); -} - -uint16_t mag_read_status(mag *mag_dev) -{ - return mag_read(mag_dev, mag_STATUS); + int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter + return ((int16_t)(read_angle & 0x0FFF));; // Mask to 12 bits (valid angle data) } -uint16_t mag_read_err_reg(mag *mag_dev) -{ - return mag_read(mag_dev, mag_ERR_REG); -} +//Address 0x24:0x25 (ERR)—Device Error Flags + // FIXME: add error handling -uint16_t mag_read_chip_id(mag *mag_dev) +//Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) +float mag_read_HANG(mag mag_dev) { - return mag_read(mag_dev, mag_CHIP_ID); + int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + return ((uint16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } -uint16_t mag_read_acc_conf(mag *mag_dev) -{ - return mag_read(mag_dev, mag_ACC_CONF); -} - -uint16_t mag_read_gyr_conf(mag *mag_dev) -{ - return mag_read(mag_dev, mag_GYR_CONF); -} - -uint8_t mag_enable_acc(mag *mag_dev, uint8_t acc_mode, uint8_t acc_avg_num, uint8_t acc_bw, uint8_t acc_range, uint8_t acc_odr) -{ - // uint16_t acc_conf = mag_read_acc_conf(mag_dev); - uint16_t new_conf = 0; - new_conf |= acc_mode << 12; - new_conf |= acc_avg_num << 8; - new_conf |= acc_bw << 7; - new_conf |= acc_range << 4; - new_conf |= acc_odr; - mag_write(mag_dev, mag_ACC_CONF, new_conf); - return 1; -} - -uint8_t mag_enable_gyro(mag *mag_dev, uint8_t gyr_mode, uint8_t gyr_avg_num, uint8_t gyr_bw, uint8_t gyr_range, uint8_t gyr_odr) -{ - // uint16_t acc_conf = mag_read_acc_conf(mag_dev); - uint16_t new_conf = 0; - new_conf |= gyr_mode << 12; - new_conf |= gyr_avg_num << 8; - new_conf |= gyr_bw << 7; - new_conf |= gyr_range << 4; - new_conf |= gyr_odr; - mag_write(mag_dev, mag_GYR_CONF, new_conf); - return 1; -} +//Address 0x1E:0x1F (CTRL)—Device Control + // FIXME: add error flag handling diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 6feb6abdc..e76973921 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -29,14 +29,14 @@ #include // #include "VL53L4ED_api.h" -#include "bmi323.h" +#include "mag.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -#define BMI323_CS_GPIO_Port GPIOA -#define BMI323_CS_Pin GPIO_PIN_4 +#define MAG_CS_GPIO_Port GPIOA +#define MAG_CS_Pin GPIO_PIN_4 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -114,9 +114,10 @@ int main(void) // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - bmi323 bmi323_dev; - HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + //bmi323 bmi323_dev; + //HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + //bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index 03f6fef64..7b42d9281 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -42,7 +42,7 @@ extern "C" { #define HAL_CRC_MODULE_ENABLED /*#define HAL_CRYP_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -#define HAL_FDCAN_MODULE_ENABLED +/*#define HAL_FDCAN_MODULE_ENABLED */ /*#define HAL_FMAC_MODULE_ENABLED */ /*#define HAL_HRTIM_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index b4a53cdc9..6178c2ce0 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -115,6 +115,7 @@ int main(void) // MX_FDCAN2_Init(); MX_I2C1_Init(); MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + MX_SPI3_Init(); /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); @@ -123,7 +124,7 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); diff --git a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c index c2cd9df0d..64d68abdf 100644 --- a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c +++ b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c @@ -67,7 +67,7 @@ void HAL_MspInit(void) /* USER CODE END MspInit 0 */ - // __HAL_RCC_SYSCFG_CLK_ENABLE(); + //__HAL_RCC_SYS_CFG_CLK_ENABLE(); __HAL_RCC_SBS_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); From aa242c3dac1349ca4c3d27a8db24dc33d252cdf5 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:34:24 +0000 Subject: [PATCH 039/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 24 ++++++++++++------------ SAMM/SAMM_Mag/Src/main.c | 6 +++--- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 280a612c3..2f33b38df 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -24,7 +24,6 @@ void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_ return HAL_ERROR; } - mag_write(mag_dev, 0x1E, 0x01); return HAL_OK; @@ -88,11 +87,11 @@ uint8_t mag_calib_abort(mag *mag_dev) return 1; } -//Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) +// Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) float mag_read_encoder_angle(mag mag_dev) { - uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF) * 360.0f / 32768); // Mask to 15 bits (valid angle data) + uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF) * 360.0f / 32768); // Mask to 15 bits (valid angle data) } // Address 0x22:0x23 (STA)—Device Status @@ -145,18 +144,19 @@ uint16_t mag_read_acc_x(mag *mag_dev) uint16_t mag_read_acc_y(mag *mag_dev) { int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_angle & 0x0FFF));; // Mask to 12 bits (valid angle data) + return ((int16_t)(read_angle & 0x0FFF)); + ; // Mask to 12 bits (valid angle data) } -//Address 0x24:0x25 (ERR)—Device Error Flags - // FIXME: add error handling +// Address 0x24:0x25 (ERR)—Device Error Flags +// FIXME: add error handling -//Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) +// Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) float mag_read_HANG(mag mag_dev) { - int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value - return ((uint16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) + int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + return ((uint16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } -//Address 0x1E:0x1F (CTRL)—Device Control - // FIXME: add error flag handling +// Address 0x1E:0x1F (CTRL)—Device Control +// FIXME: add error flag handling diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index e76973921..13b9ca4ab 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -114,9 +114,9 @@ int main(void) // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - //bmi323 bmi323_dev; - //HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - //bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + // bmi323 bmi323_dev; + // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + // bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; From 48973cda16f180562738c121c50ee4e5bc90196f Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 20 Apr 2026 20:16:05 -0700 Subject: [PATCH 040/158] Mag updates + added CubeMX generated SystemClock_Config in main --- SAMM/SAMM_Mag/Inc/mag.h | 18 +++++++ SAMM/SAMM_Mag/Src/mag.c | 25 ++++------ SAMM/SAMM_Mag/Src/main.c | 21 ++++---- SAMM/SAMM_TOF/Src/main.c | 103 ++++++++++++++++++++++++--------------- 4 files changed, 103 insertions(+), 64 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 0cd9a7e16..75434a64e 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -14,4 +14,22 @@ typedef struct { /* data */ } mag; +void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin); + +uint16_t mag_transmit(mag *mag_dev, uint16_t data); + +uint16_t mag_read(mag *mag_dev, uint8_t reg); + +uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data); + +uint8_t mag_calib_abort(mag *mag_dev); + +float mag_read_encoder_angle(mag *mag_dev); + +bool check_status(mag *mag_dev); + +uint16_t mag_read_turns(mag *mag_dev); + +float mag_read_HANG(mag *mag_dev); + #endif diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 2f33b38df..656c85e41 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -13,7 +13,7 @@ #define mag_msb 0xFF00 #define mag_lsb 0x00FF -void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_t pin) +void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) { mag_dev->spi_port = spi_port; mag_dev->port = port; @@ -29,16 +29,16 @@ void mag_init(mag mag_dev, SPI_HandleTypeDefspi_port, GPIO_TypeDef port, uint16_ return HAL_OK; } -uint16_t mag_transmit(mag mag_dev, uint16_t data) +uint16_t mag_transmit(mag *mag_dev, uint16_t data) { uint8_t tx_word[2] = {data >> 8, data & 0xFF}; uint8_t rx_word[2] = {0}; // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // disable + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // disable bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); // fix-me add error handling - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); return ((uint16_t)rx_word[0] << 8) | rx_word[1]; @@ -57,7 +57,7 @@ addr 0x00 crc */ -uint16_t mag_read(mag mag_dev, uint8_t reg) +uint16_t mag_read(mag *mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 mag_transmit(mag_dev, cmd); // frame 1: send command, discard response @@ -73,7 +73,7 @@ data (8 bits) crc (4 bits -- optional) */ -uint16_t mag_write(mag mag_dev, uint8_t reg, uint16_t data) +uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = (data & mag_msb) >> 8 | ((uint16_t(reg) & mag_addr_mask) << 8) | 0x4000; mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; // increment from 0x22 to 0x23 for lsb @@ -88,7 +88,7 @@ uint8_t mag_calib_abort(mag *mag_dev) } // Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) -float mag_read_encoder_angle(mag mag_dev) +float mag_read_encoder_angle(mag *mag_dev) { uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register return ((uint16_t)(read_angle & 0x7FFF) * 360.0f / 32768); // Mask to 15 bits (valid angle data) @@ -111,7 +111,7 @@ Check the status of the acc, gyro and temp before returning the values 0x0D : extended read status */ -bool check_status(mag mag_dev) +bool check_status(mag *mag_dev) { // Device Error Flags uint32_t error25 = mag_read(mag_dev, 0x25); @@ -136,12 +136,7 @@ bool check_status(mag mag_dev) return true; } -uint16_t mag_read_acc_x(mag *mag_dev) -{ - return mag_read(mag_dev, mag_ACC_X); -} - -uint16_t mag_read_acc_y(mag *mag_dev) +uint16_t mag_read_turns(mag *mag_dev) { int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter return ((int16_t)(read_angle & 0x0FFF)); @@ -152,7 +147,7 @@ uint16_t mag_read_acc_y(mag *mag_dev) // FIXME: add error handling // Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) -float mag_read_HANG(mag mag_dev) +float mag_read_HANG(mag *mag_dev) { int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value return ((uint16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 13b9ca4ab..86a0af917 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -35,8 +35,8 @@ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -#define MAG_CS_GPIO_Port GPIOA -#define MAG_CS_Pin GPIO_PIN_4 +#define MAG_CS_GPIO_Port GPIOB +#define MAG_CS_Pin GPIO_PIN_10 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -107,7 +107,7 @@ int main(void) // MX_FDCAN1_Init(); // MX_FDCAN2_Init(); MX_I2C1_Init(); - MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + MX_SPI3_Init(); // TODO: change all instances of spi1 -> SPI1 /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); @@ -115,8 +115,9 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // bmi323 bmi323_dev; - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - // bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); + mag mag_dev; + HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); + mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; @@ -125,12 +126,10 @@ int main(void) // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); // HAL_Delay(1); // Short delay after mode switch - // Initialize BMI323 sensor - - // if (BMI323_Init() != HAL_OK) { - // printf("BMI323 initialization failed!\r\n"); - // Error_Handler(); - // } + if (mag_init() != HAL_OK) { + printf("MAG initialization failed!\r\n"); + Error_Handler(); + } // static uint16_t eeMLX90640[832]; // static paramsMLX90640 mlx90640; diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 6178c2ce0..31d4bcf10 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -115,7 +115,7 @@ int main(void) // MX_FDCAN2_Init(); MX_I2C1_Init(); MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 - MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); @@ -124,7 +124,7 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: + bmi323_init(&bmi323_dev, &hspi1, &BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); @@ -208,44 +208,71 @@ int main(void) } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); - while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} - LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); - LL_RCC_HSE_EnableBypass(); - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while (LL_RCC_HSE_IsReady() != 1) {} - - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); - LL_RCC_PLL_EnableDomain_SYS(); - LL_RCC_PLL_Enable(); - /* Wait till PLL is ready */ - while (LL_RCC_PLL_IsReady() != 1) {} - - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - /* Wait till System clock is ready */ - while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} - - /* Insure 1us transition state at intermediate medium speed clock*/ - for (__IO uint32_t i = (170 >> 1); i != 0; i--) - ; - - /* Set AHB prescaler*/ - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_SetSystemCoreClock(128000000); - - /* Update the time base */ - if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { - Error_Handler(); - } + LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); + while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_1) + { + } + + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3); + while (LL_PWR_IsActiveFlag_VOS() == 0) + { + } + LL_RCC_HSI_Enable(); + + /* Wait till HSI is ready */ + while(LL_RCC_HSI_IsReady() != 1) + { + } + + LL_RCC_HSI_SetCalibTrimming(64); + LL_RCC_HSI_SetDivider(LL_RCC_HSI_DIV_2); + LL_RCC_CSI_Enable(); + + /* Wait till CSI is ready */ + while(LL_RCC_CSI_IsReady() != 1) + { + } + + LL_RCC_CSI_SetCalibTrimming(32); + LL_RCC_PLL1_SetSource(LL_RCC_PLL1SOURCE_CSI); + LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8); + LL_RCC_PLL1_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE); + LL_RCC_PLL1_SetM(1); + LL_RCC_PLL1_SetN(32); + LL_RCC_PLL1_SetP(2); + LL_RCC_PLL1_SetQ(2); + LL_RCC_PLL1_SetR(2); + LL_RCC_PLL1Q_Enable(); + LL_RCC_PLL1_Enable(); + + /* Wait till PLL is ready */ + while(LL_RCC_PLL1_IsReady() != 1) + { + } + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI); + + /* Wait till System clock is ready */ + while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) + { + } + + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1); + LL_SetSystemCoreClock(32000000); + + /* Update the time base */ + if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) + { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ From f3f7ea7a04414716d1d52b7ee26556ff9d31c947 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 20 Apr 2026 20:32:22 -0700 Subject: [PATCH 041/158] Added more includes to main.h based on CubeMX generation --- SAMM/SAMM_Mag/Src/mag.c | 18 ++++++++++++++---- SAMM/SAMM_Mag/Src/main.c | 30 ++++++++---------------------- SAMM/SAMM_TOF/Inc/main.h | 17 ++++++++++------- SAMM/SAMM_TOF/Src/i2c.c | 2 +- 4 files changed, 33 insertions(+), 34 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 656c85e41..f60741a5e 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -96,7 +96,18 @@ float mag_read_encoder_angle(mag *mag_dev) // Address 0x22:0x23 (STA)—Device Status // read bit 0 AOK [0] -// Address 0x28:0x29 (TSEN)—Temperature Sensor +bool mag_read_device_status(mag *mag_dev) +{ + uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status + return read[0]; // read aok +} + + +float mag_read_temp(mag *mag_dev) +{ + uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register + return ((uint16_t)(read_temp & 0x0FFF) / 8.0 + 25); // Mask to 12 bits (valid temp data) +} /* TODO: @@ -136,11 +147,10 @@ bool check_status(mag *mag_dev) return true; } -uint16_t mag_read_turns(mag *mag_dev) +int16_t mag_read_turns(mag *mag_dev) { int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_angle & 0x0FFF)); - ; // Mask to 12 bits (valid angle data) + return ((int16_t)(read_angle & 0x0FFF)); // Mask to 12 bits (valid angle data) } // Address 0x24:0x25 (ERR)—Device Error Flags diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 86a0af917..802b92bdd 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -173,28 +173,14 @@ int main(void) // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - // begin VL53L4ED - // status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - // if (p_data_ready) { - // /* (Mandatory) Clear HW interrupt to restart measurements */ - // VL53L4ED_ClearInterrupt(TOF_ID); - // /* Read measured distance. RangeStatus = 0 means valid data */ - // VL53L4ED_GetResult(TOF_ID, &results); - // printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); - // } else { - // HAL_Delay(10); - // __disable_irq(); - // __enable_irq(); - // } - - // begin BMI323 - // int16_t ax, ay, az; - // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { - // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); - // } - // HAL_Delay(100); // Read every 100ms + float temp = mag_read_temp(mag_dev); + float angle = mag_read_encoder_angle(mag_dev); + int16_t turns = mag_read_turns(mag_dev); + float hang = mag_read_HANG(mag_dev); + check_status(mag_dev); + printf("Temperature is %f\n", temp); + printf("Angle is %f\n", angle); + printf("Number of turns is ") } /* USER CODE END 3 */ } diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h index cd33143dc..85ef7fa7f 100644 --- a/SAMM/SAMM_TOF/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -28,21 +28,24 @@ extern "C" { /* Includes ------------------------------------------------------------------*/ #include "stm32h5xx_hal.h" +#include "stm32h5xx.h" #include "stm32h5xx_hal_dma.h" #include "stm32h5xx_hal_i2c.h" #include "stm32h5xx_hal_rcc.h" -#include "stm32h5xx_ll_adc.h" -#include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" -#include "stm32h5xx_ll_crs.h" -#include "stm32h5xx_ll_dma.h" -#include "stm32h5xx_ll_exti.h" -#include "stm32h5xx_ll_gpio.h" -#include "stm32h5xx_ll_lpuart.h" +#include "stm32h5xx_ll_i2c.h" #include "stm32h5xx_ll_pwr.h" +#include "stm32h5xx_ll_crs.h" #include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_system.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_utils.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_spi.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_lpuart.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c index 16d08d427..c1dfe13aa 100644 --- a/SAMM/SAMM_TOF/Src/i2c.c +++ b/SAMM/SAMM_TOF/Src/i2c.c @@ -64,7 +64,7 @@ void MX_I2C1_Init(void) /** I2C Fast mode Plus enable */ - HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); + LL_I2C_EnableFastModePlus(I2C1); /* USER CODE BEGIN I2C1_Init 2 */ /* USER CODE END I2C1_Init 2 */ From f818d10b17b9571e5a77978fa3b88110e5fe3fd2 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 20 Apr 2026 22:01:16 -0700 Subject: [PATCH 042/158] Removed Core file (old code), changed HAL to LL for SPI3 and I2C1, created can_cfg, other general debugging and removal of unnecessary files --- CMakeLists.txt | 2 +- SAMM/Core/Extras/CircBuF/circularBuffer.c | 70 --- SAMM/Core/Extras/CircBuF/circularBuffer.h | 22 - SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c | 584 ------------------ SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h | 373 ----------- .../Extras/VL53L4ED/VL53L4ED_calibration.c | 207 ------- .../Extras/VL53L4ED/VL53L4ED_calibration.h | 64 -- SAMM/Core/Extras/VL53L4ED/platform.c | 112 ---- SAMM/Core/Extras/VL53L4ED/platform.h | 79 --- SAMM/Core/Extras/extra.c | 57 -- SAMM/Core/Extras/extra.h | 19 - SAMM/Core/Inc/adc.h | 51 -- SAMM/Core/Inc/crc.h | 51 -- SAMM/Core/Inc/dma.h | 51 -- SAMM/Core/Inc/fdcan.h | 54 -- SAMM/Core/Inc/gpio.h | 48 -- SAMM/Core/Inc/i2c.h | 51 -- SAMM/Core/Inc/main.h | 79 --- SAMM/Core/Inc/spi.h | 51 -- SAMM/Core/Inc/stm32_assert.h | 52 -- SAMM/Core/Inc/stm32h5xx_hal_conf.h | 381 ------------ SAMM/Core/Inc/stm32h5xx_it.h | 67 -- SAMM/Core/Src/adc.c | 148 ----- SAMM/Core/Src/crc.c | 86 --- SAMM/Core/Src/dma.c | 57 -- SAMM/Core/Src/fdcan.c | 213 ------- SAMM/Core/Src/gpio.c | 104 ---- SAMM/Core/Src/i2c.c | 129 ---- SAMM/Core/Src/main.c | 284 --------- SAMM/Core/Src/spi.c | 117 ---- SAMM/Core/Src/stm32h5xx_hal_msp.c | 86 --- SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c | 121 ---- SAMM/Core/Src/stm32h5xx_it.c | 213 ------- SAMM/Core/Src/syscalls.c | 168 ----- SAMM/Core/Src/sysmem.c | 77 --- SAMM/Core/Src/system_stm32h5xx.c | 284 --------- SAMM/IMU/Inc/{IMU => }/bmi323.h | 1 + SAMM/IMU/Src/bmi323.c | 5 +- SAMM/SAMM_Mag/CMakeLists.txt | 2 - SAMM/SAMM_Mag/Inc/can_cfg.h | 10 + SAMM/SAMM_Mag/Inc/mag.h | 6 + SAMM/SAMM_Mag/Inc/spi.h | 159 ++++- SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h | 6 +- SAMM/SAMM_Mag/Src/mag.c | 10 +- SAMM/SAMM_Mag/Src/main.c | 10 +- SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c | 86 --- .../SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c | 120 ---- SAMM/SAMM_TOF/CMakeLists.txt | 2 - SAMM/SAMM_TOF/Inc/can_cfg.h | 10 + SAMM/SAMM_TOF/Inc/i2c.h | 1 - SAMM/SAMM_TOF/Inc/spi.h | 3 +- SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 2 +- SAMM/SAMM_TOF/Src/gpio.c | 87 +-- SAMM/SAMM_TOF/Src/i2c.c | 133 ++-- SAMM/SAMM_TOF/Src/main.c | 12 +- SAMM/SAMM_TOF/Src/spi.c | 119 +--- SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c | 87 --- .../SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c | 120 ---- 58 files changed, 272 insertions(+), 5331 deletions(-) delete mode 100644 SAMM/Core/Extras/CircBuF/circularBuffer.c delete mode 100644 SAMM/Core/Extras/CircBuF/circularBuffer.h delete mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c delete mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h delete mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c delete mode 100644 SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h delete mode 100644 SAMM/Core/Extras/VL53L4ED/platform.c delete mode 100644 SAMM/Core/Extras/VL53L4ED/platform.h delete mode 100644 SAMM/Core/Extras/extra.c delete mode 100644 SAMM/Core/Extras/extra.h delete mode 100644 SAMM/Core/Inc/adc.h delete mode 100644 SAMM/Core/Inc/crc.h delete mode 100644 SAMM/Core/Inc/dma.h delete mode 100644 SAMM/Core/Inc/fdcan.h delete mode 100644 SAMM/Core/Inc/gpio.h delete mode 100644 SAMM/Core/Inc/i2c.h delete mode 100644 SAMM/Core/Inc/main.h delete mode 100644 SAMM/Core/Inc/spi.h delete mode 100644 SAMM/Core/Inc/stm32_assert.h delete mode 100644 SAMM/Core/Inc/stm32h5xx_hal_conf.h delete mode 100644 SAMM/Core/Inc/stm32h5xx_it.h delete mode 100644 SAMM/Core/Src/adc.c delete mode 100644 SAMM/Core/Src/crc.c delete mode 100644 SAMM/Core/Src/dma.c delete mode 100644 SAMM/Core/Src/fdcan.c delete mode 100644 SAMM/Core/Src/gpio.c delete mode 100644 SAMM/Core/Src/i2c.c delete mode 100644 SAMM/Core/Src/main.c delete mode 100644 SAMM/Core/Src/spi.c delete mode 100644 SAMM/Core/Src/stm32h5xx_hal_msp.c delete mode 100644 SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c delete mode 100644 SAMM/Core/Src/stm32h5xx_it.c delete mode 100644 SAMM/Core/Src/syscalls.c delete mode 100644 SAMM/Core/Src/sysmem.c delete mode 100644 SAMM/Core/Src/system_stm32h5xx.c rename SAMM/IMU/Inc/{IMU => }/bmi323.h (99%) create mode 100644 SAMM/SAMM_Mag/Inc/can_cfg.h delete mode 100644 SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c delete mode 100644 SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c create mode 100644 SAMM/SAMM_TOF/Inc/can_cfg.h delete mode 100644 SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c delete mode 100644 SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d5c8821a..f5b0ac49d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,8 +109,8 @@ add_gr_project(STM32G431x8 TireTemp) # SAMM include("SAMM/samm.cmake") -add_gr_project(STM32H523xE SAMM SAMM_TOF) add_gr_project(STM32H523xE SAMM SAMM_Mag) +add_gr_project(STM32H523xE SAMM SAMM_TOF) # Development add_gr_project(STM32G474xE G4PERTESTING) diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.c b/SAMM/Core/Extras/CircBuF/circularBuffer.c deleted file mode 100644 index 4b0eaeaca..000000000 --- a/SAMM/Core/Extras/CircBuF/circularBuffer.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "circularBuffer.h" -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) -{ - CircularBuffer *cb = malloc(sizeof(CircularBuffer)); - if (!cb) { - return NULL; - } - - cb->buffer = malloc(capacity * sizeof(void *)); - if (!cb->buffer) { - free(cb); - return NULL; - } - - for (size_t i = 0; i < capacity; i++) { - cb->buffer[i] = malloc(max_array_size); - if (!cb->buffer[i]) { - for (size_t j = 0; j < i; j++) { - free(cb->buffer[j]); - } - free(cb->buffer); - free(cb); - return NULL; - } - } - cb->capacity = capacity; - cb->max_arr_size = max_array_size; - cb->head = 0; - cb->tail = 0; - cb->size = 0; - return cb; -} - -void circularBufferDestroy(CircularBuffer *cb) -{ - if (!cb) { - return; - } - - for (size_t i = 0; i < cb->capacity; i++) { - free(cb->buffer[i]); - } - free(cb->buffer); - free(cb); -} - -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) -{ - if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { - return -1; // Buffer is full or array is too large - } - - // Copy the array into the buffer - memcpy(cb->buffer[cb->head], array, array_size); - cb->head = (cb->head + 1) % cb->capacity; - cb->size++; - return 0; -} - -void *circularBufferPop(CircularBuffer *cb) -{ - if (!cb || cb->size == 0) { - return NULL; // Buffer is empty - } - - void *array = cb->buffer[cb->tail]; - cb->tail = (cb->tail + 1) % cb->capacity; - cb->size--; - return array; -} diff --git a/SAMM/Core/Extras/CircBuF/circularBuffer.h b/SAMM/Core/Extras/CircBuF/circularBuffer.h deleted file mode 100644 index 861792535..000000000 --- a/SAMM/Core/Extras/CircBuF/circularBuffer.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __circularBuffer_h__ -#define __circularBuffer_h__ - -#include -#include -#include -#include - -typedef struct { - void **buffer; // Array of void pointers - uint8_t capacity; // Maximum number of elements in the buffer - uint8_t head; // Index of the next element to write - uint8_t tail; // Index of the next element to read - uint8_t size; // Current number of elements in the buffer - uint8_t max_arr_size; // Maximum size of the array -} CircularBuffer; - -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); -void circularBufferDestroy(CircularBuffer *cb); -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size); -void *circularBufferPop(CircularBuffer *cb); -#endif \ No newline at end of file diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c deleted file mode 100644 index 7c844100e..000000000 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.c +++ /dev/null @@ -1,584 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -/** - * @file vl53l4ed_api.c - * @brief Functions implementation - */ - -#include "VL53L4ED_api.h" - -#include -#include - -static const uint8_t VL53L4ED_DEFAULT_CONFIGURATION[] = { -#ifdef VL53L4ED_I2C_FAST_MODE_PLUS - 0x12, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ -#else - 0x00, /* 0x2d : set bit 2 and 5 to 1 for fast plus mode (1MHz I2C), - else don't touch */ -#endif - 0x00, /* 0x2e : bit 0 if I2C pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x00, /* 0x2f : bit 0 if GPIO pulled up at 1.8V, else set bit 0 to 1 - (pull up at AVDD) */ - 0x11, /* 0x30 : set bit 4 to 0 for active high interrupt and 1 for active low - (bits 3:0 must be 0x1), use SetInterruptPolarity() */ - 0x02, /* 0x31 : bit 1 = interrupt depending on the polarity, - use CheckForDataReady() */ - 0x00, /* 0x32 : not user-modifiable */ - 0x02, /* 0x33 : not user-modifiable */ - 0x08, /* 0x34 : not user-modifiable */ - 0x00, /* 0x35 : not user-modifiable */ - 0x08, /* 0x36 : not user-modifiable */ - 0x10, /* 0x37 : not user-modifiable */ - 0x01, /* 0x38 : not user-modifiable */ - 0x01, /* 0x39 : not user-modifiable */ - 0x00, /* 0x3a : not user-modifiable */ - 0x00, /* 0x3b : not user-modifiable */ - 0x00, /* 0x3c : not user-modifiable */ - 0x00, /* 0x3d : not user-modifiable */ - 0xff, /* 0x3e : not user-modifiable */ - 0x00, /* 0x3f : not user-modifiable */ - 0x0F, /* 0x40 : not user-modifiable */ - 0x00, /* 0x41 : not user-modifiable */ - 0x00, /* 0x42 : not user-modifiable */ - 0x00, /* 0x43 : not user-modifiable */ - 0x00, /* 0x44 : not user-modifiable */ - 0x00, /* 0x45 : not user-modifiable */ - 0x20, /* 0x46 : interrupt configuration 0->level low detection, 1-> level high, - 2-> Out of window, 3->In window, 0x20-> New sample ready , TBC */ - 0x0b, /* 0x47 : not user-modifiable */ - 0x00, /* 0x48 : not user-modifiable */ - 0x00, /* 0x49 : not user-modifiable */ - 0x02, /* 0x4a : not user-modifiable */ - 0x14, /* 0x4b : not user-modifiable */ - 0x21, /* 0x4c : not user-modifiable */ - 0x00, /* 0x4d : not user-modifiable */ - 0x00, /* 0x4e : not user-modifiable */ - 0x05, /* 0x4f : not user-modifiable */ - 0x00, /* 0x50 : not user-modifiable */ - 0x00, /* 0x51 : not user-modifiable */ - 0x00, /* 0x52 : not user-modifiable */ - 0x00, /* 0x53 : not user-modifiable */ - 0xc8, /* 0x54 : not user-modifiable */ - 0x00, /* 0x55 : not user-modifiable */ - 0x00, /* 0x56 : not user-modifiable */ - 0x38, /* 0x57 : not user-modifiable */ - 0xff, /* 0x58 : not user-modifiable */ - 0x01, /* 0x59 : not user-modifiable */ - 0x00, /* 0x5a : not user-modifiable */ - 0x08, /* 0x5b : not user-modifiable */ - 0x00, /* 0x5c : not user-modifiable */ - 0x00, /* 0x5d : not user-modifiable */ - 0x01, /* 0x5e : not user-modifiable */ - 0xcc, /* 0x5f : not user-modifiable */ - 0x07, /* 0x60 : not user-modifiable */ - 0x01, /* 0x61 : not user-modifiable */ - 0xf1, /* 0x62 : not user-modifiable */ - 0x05, /* 0x63 : not user-modifiable */ - 0x00, /* 0x64 : Sigma threshold MSB (mm in 14.2 format for MSB+LSB), - use SetSigmaThreshold(), default value 90 mm */ - 0xa0, /* 0x65 : Sigma threshold LSB */ - 0x00, /* 0x66 : Min count Rate MSB (MCPS in 9.7 format for MSB+LSB), - use SetSignalThreshold() */ - 0x80, /* 0x67 : Min count Rate LSB */ - 0x08, /* 0x68 : not user-modifiable */ - 0x38, /* 0x69 : not user-modifiable */ - 0x00, /* 0x6a : not user-modifiable */ - 0x00, /* 0x6b : not user-modifiable */ - 0x00, /* 0x6c : Intermeasurement period MSB, 32 bits register, - use SetIntermeasurementInMs() */ - 0x00, /* 0x6d : Intermeasurement period */ - 0x0f, /* 0x6e : Intermeasurement period */ - 0x89, /* 0x6f : Intermeasurement period LSB */ - 0x00, /* 0x70 : not user-modifiable */ - 0x00, /* 0x71 : not user-modifiable */ - 0x00, /* 0x72 : distance threshold high MSB (in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x73 : distance threshold high LSB */ - 0x00, /* 0x74 : distance threshold low MSB ( in mm, MSB+LSB), - use SetD:tanceThreshold() */ - 0x00, /* 0x75 : distance threshold low LSB */ - 0x00, /* 0x76 : not user-modifiable */ - 0x01, /* 0x77 : not user-modifiable */ - 0x07, /* 0x78 : not user-modifiable */ - 0x05, /* 0x79 : not user-modifiable */ - 0x06, /* 0x7a : not user-modifiable */ - 0x06, /* 0x7b : not user-modifiable */ - 0x00, /* 0x7c : not user-modifiable */ - 0x00, /* 0x7d : not user-modifiable */ - 0x02, /* 0x7e : not user-modifiable */ - 0xc7, /* 0x7f : not user-modifiable */ - 0xff, /* 0x80 : not user-modifiable */ - 0x9B, /* 0x81 : not user-modifiable */ - 0x00, /* 0x82 : not user-modifiable */ - 0x00, /* 0x83 : not user-modifiable */ - 0x00, /* 0x84 : not user-modifiable */ - 0x01, /* 0x85 : not user-modifiable */ - 0x00, /* 0x86 : clear interrupt, use ClearInterrupt() */ - 0x00 /* 0x87 : start ranging, use StartRanging() or StopRanging(), - If you want an automatic start after VL53L4ED_init() call, - put 0x40 in location 0x87 */ -}; - -VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *p_Version) -{ - VL53L4ED_Error Status = VL53L4ED_ERROR_NONE; - - p_Version->major = VL53L4ED_IMPLEMENTATION_VER_MAJOR; - p_Version->minor = VL53L4ED_IMPLEMENTATION_VER_MINOR; - p_Version->build = VL53L4ED_IMPLEMENTATION_VER_BUILD; - p_Version->revision = VL53L4ED_IMPLEMENTATION_VER_REVISION; - return Status; -} - -VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrByte(dev, VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS, (uint8_t)(new_address >> (uint8_t)1)); - return status; -} - -VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_IDENTIFICATION__MODEL_ID, p_id); - return status; -} - -VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint8_t Addr, tmp; - uint8_t continue_loop = 1; - uint16_t i = 0; - - do { - status |= VL53L4ED_RdByte(dev, VL53L4ED_FIRMWARE__SYSTEM_STATUS, &tmp); - - if (tmp == (uint8_t)0x3) /* Sensor booted */ - { - continue_loop = (uint8_t)0; - } else if (i < (uint16_t)1000) /* Wait for boot */ - { - i++; - } else /* Timeout 1000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - - /* Load default configuration */ - for (Addr = (uint8_t)0x2D; Addr <= (uint8_t)0x87; Addr++) { - status |= VL53L4ED_WrByte(dev, Addr, VL53L4ED_DEFAULT_CONFIGURATION[Addr - (uint8_t)0x2D]); - } - - /* Start VHV */ - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, (uint8_t)0x40); - i = (uint8_t)0; - continue_loop = (uint8_t)1; - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (i < (uint16_t)1000) /* Wait for answer */ - { - i++; - } else /* Timeout 1000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - - status |= VL53L4ED_ClearInterrupt(dev); - status |= VL53L4ED_StopRanging(dev); - status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x09); - status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0); - status |= VL53L4ED_WrWord(dev, 0x0024, 0x500); - - status |= VL53L4ED_SetRangeTiming(dev, 100, 0); - - return status; -} - -VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT_CLEAR, 0x01); - return status; -} - -VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint32_t tmp; - - status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); - - /* Sensor runs in continuous mode */ - if (tmp == (uint32_t)0) { - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x21); - } - /* Sensor runs in autonomous mode */ - else { - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x40); - } - - return status; -} - -VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM_START, 0x80); - return status; -} - -VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint8_t temp; - uint8_t int_pol; - - status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO_HV_MUX__CTRL, &temp); - temp = temp & (uint8_t)0x10; - temp = temp >> 4; - - if (temp == (uint8_t)1) { - int_pol = (uint8_t)0; - } else { - int_pol = (uint8_t)1; - } - - status |= VL53L4ED_RdByte(dev, VL53L4ED_GPIO__TIO_HV_STATUS, &temp); - - if ((temp & (uint8_t)1) == int_pol) { - *p_is_data_ready = (uint8_t)1; - } else { - *p_is_data_ready = (uint8_t)0; - } - - return status; -} - -VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t clock_pll, osc_frequency, ms_byte; - uint32_t macro_period_us = 0, timing_budget_us = 0, ls_byte, tmp; - float_t inter_measurement_factor = (float_t)1.055; - - status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - if (osc_frequency != (uint16_t)0) { - timing_budget_us = timing_budget_ms * (uint32_t)1000; - macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; - } else { - status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - - /* Timing budget check validity */ - if ((timing_budget_ms < (uint32_t)10) || (timing_budget_ms > (uint32_t)200) || (status != (uint8_t)0)) { - status |= VL53L4ED_ERROR_INVALID_ARGUMENT; - } - /* Sensor runs in continuous mode */ - else if (inter_measurement_ms == (uint32_t)0) { - status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, 0); - timing_budget_us -= (uint32_t)2500; - } - /* Sensor runs in autonomous low power mode */ - else if (inter_measurement_ms > timing_budget_ms) { - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); - clock_pll = clock_pll & (uint16_t)0x3FF; - inter_measurement_factor = inter_measurement_factor * (float_t)inter_measurement_ms * (float_t)clock_pll; - status |= VL53L4ED_WrDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, (uint32_t)inter_measurement_factor); - - timing_budget_us -= (uint32_t)4300; - timing_budget_us /= (uint32_t)2; - - } - /* Invalid case */ - else { - status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } - - if (status != (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT) { - ms_byte = 0; - timing_budget_us = timing_budget_us << 12; - tmp = macro_period_us * (uint32_t)16; - ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_A, ms_byte); - - ms_byte = 0; - tmp = macro_period_us * (uint32_t)12; - ls_byte = ((timing_budget_us + ((tmp >> 6) >> 1)) / (tmp >> 6)) - (uint32_t)1; - - while ((ls_byte & 0xFFFFFF00U) > 0U) { - ls_byte = ls_byte >> 1; - ms_byte++; - } - ms_byte = (uint16_t)(ms_byte << 8) + (uint16_t)(ls_byte & (uint32_t)0xFF); - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG_B, ms_byte); - } - - return status; -} - -VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t osc_frequency = 1, range_config_macrop_high, clock_pll = 1; - uint32_t tmp, ls_byte, ms_byte, macro_period_us; - float_t clock_pll_factor = (float_t)1.065; - - /* Get InterMeasurement */ - status |= VL53L4ED_RdDWord(dev, VL53L4ED_INTERMEASUREMENT_MS, &tmp); - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__OSC_CALIBRATE_VAL, &clock_pll); - clock_pll = clock_pll & (uint16_t)0x3FF; - clock_pll_factor = clock_pll_factor * (float_t)clock_pll; - clock_pll = (uint16_t)clock_pll_factor; - *p_inter_measurement_ms = (uint16_t)(tmp / (uint32_t)clock_pll); - - /* Get TimingBudget */ - status |= VL53L4ED_RdWord(dev, 0x0006, &osc_frequency); - status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG_A, &range_config_macrop_high); - - macro_period_us = (uint32_t)((uint32_t)2304 * ((uint32_t)0x40000000 / (uint32_t)osc_frequency)) >> 6; - ls_byte = (range_config_macrop_high & (uint32_t)0x00FF) << 4; - ms_byte = (range_config_macrop_high & (uint32_t)0xFF00) >> 8; - ms_byte = (uint32_t)0x04 - (ms_byte - (uint32_t)1) - (uint32_t)1; - - macro_period_us = macro_period_us * (uint32_t)16; - *p_timing_budget_ms = (((ls_byte + (uint32_t)1) * (macro_period_us >> 6)) - ((macro_period_us >> 6) >> 1)) >> 12; - - if (ms_byte < (uint8_t)12) { - *p_timing_budget_ms = (uint32_t)(*p_timing_budget_ms >> (uint8_t)ms_byte); - } - - /* Mode continuous */ - if (tmp == (uint32_t)0) { - *p_timing_budget_ms += (uint32_t)2500; - } - /* Mode autonomous */ - else { - *p_timing_budget_ms *= (uint32_t)2; - *p_timing_budget_ms += (uint32_t)4300; - } - - *p_timing_budget_ms = *p_timing_budget_ms / (uint32_t)1000; - - return status; -} - -VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *p_result) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t temp_16; - uint8_t temp_8; - uint8_t status_rtn[24] = {255, 255, 255, 5, 2, 4, 1, 7, 3, 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, 255, 255, 11, 12}; - - status |= VL53L4ED_RdByte(dev, VL53L4ED_RESULT__RANGE_STATUS, &temp_8); - temp_8 = temp_8 & (uint8_t)0x1F; - if (temp_8 < (uint8_t)24) { - temp_8 = status_rtn[temp_8]; - } - p_result->range_status = temp_8; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SPAD_NB, &temp_16); - p_result->number_of_spad = temp_16 / (uint16_t)256; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGNAL_RATE, &temp_16); - p_result->signal_rate_kcps = temp_16 * (uint16_t)8; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__AMBIENT_RATE, &temp_16); - p_result->ambient_rate_kcps = temp_16 * (uint16_t)8; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__SIGMA, &temp_16); - p_result->sigma_mm = temp_16 / (uint16_t)4; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RESULT__DISTANCE, &temp_16); - p_result->distance_mm = temp_16; - - p_result->signal_per_spad_kcps = p_result->signal_rate_kcps / p_result->number_of_spad; - p_result->ambient_per_spad_kcps = p_result->ambient_rate_kcps / p_result->number_of_spad; - - return status; -} - -VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t temp; - - temp = (uint16_t)((uint16_t)OffsetValueInMm * (uint16_t)4); - - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, temp); - status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, (uint8_t)0x0); - status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, (uint8_t)0x0); - return status; -} - -VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *p_offset) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t temp; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_RANGE_OFFSET_MM, &temp); - - temp = temp << 3; - temp = temp >> 5; - *p_offset = (int16_t)(temp); - - if (*p_offset > 1024) { - *p_offset = *p_offset - 2048; - } - - return status; -} - -VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000); - status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, (XtalkValueKcps << 9)); - - return status; -} - -VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - float_t tmp_xtalk; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, p_xtalk_kcps); - - tmp_xtalk = (float_t)*p_xtalk_kcps / (float_t)512.0; - *p_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); - - return status; -} - -VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrByte(dev, VL53L4ED_SYSTEM__INTERRUPT, window); - status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_HIGH, distance_high_mm); - status |= VL53L4ED_WrWord(dev, VL53L4ED_THRESH_LOW, distance_low_mm); - return status; -} - -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_HIGH, p_distance_high_mm); - status |= VL53L4ED_RdWord(dev, VL53L4ED_THRESH_LOW, p_distance_low_mm); - status |= VL53L4ED_RdByte(dev, VL53L4ED_SYSTEM__INTERRUPT, p_window); - *p_window = (*p_window & (uint8_t)0x7); - - return status; -} - -VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status |= VL53L4ED_WrWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, signal_kcps >> 3); - return status; -} - -VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint16_t tmp = 0; - - status |= VL53L4ED_RdWord(dev, VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS, &tmp); - *p_signal_kcps = tmp << 3; - - return status; -} - -VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - if (sigma_mm > (uint16_t)((uint16_t)0xFFFF >> 2)) { - status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } else { - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, sigma_mm << 2); - } - - return status; -} - -VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - - status += VL53L4ED_RdWord(dev, VL53L4ED_RANGE_CONFIG__SIGMA_THRESH, p_sigma_mm); - *p_sigma_mm = *p_sigma_mm >> 2; - - return status; -} - -VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint8_t tmp = 0, continue_loop = 1; - uint16_t i = 0; - - status |= VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, (uint8_t)0x81); - status |= VL53L4ED_WrByte(dev, 0x0B, (uint8_t)0x92); - status |= VL53L4ED_StartRanging(dev); - - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (i < (uint16_t)1000) /* Wait for answer */ - { - i++; - } else /* Timeout 1000ms reached */ - { - continue_loop = (uint8_t)0; - status = (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - - status |= VL53L4ED_ClearInterrupt(dev); - status |= VL53L4ED_StopRanging(dev); - - status += VL53L4ED_WrByte(dev, VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); - status += VL53L4ED_WrByte(dev, 0x0B, 0); - return status; -} diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h deleted file mode 100644 index e5d7acf2b..000000000 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_api.h +++ /dev/null @@ -1,373 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -#ifndef VL53L4ED_API_H_ -#define VL53L4ED_API_H_ - -#include "platform.h" - -/** - * @brief Driver version - */ - -#define VL53L4ED_IMPLEMENTATION_VER_MAJOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_MINOR 1 -#define VL53L4ED_IMPLEMENTATION_VER_BUILD 2 -#define VL53L4ED_IMPLEMENTATION_VER_REVISION 0 - -/** - * @brief Driver error type - */ - -typedef uint8_t VL53L4ED_Error; - -#define VL53L4ED_ERROR_NONE ((uint8_t)0U) -#define VL53L4ED_ERROR_XTALK_FAILED ((uint8_t)253U) -#define VL53L4ED_ERROR_INVALID_ARGUMENT ((uint8_t)254U) -#define VL53L4ED_ERROR_TIMEOUT ((uint8_t)255U) - -/** - * @brief Inner Macro for API. Not for user, only for development. - */ - -#define VL53L4ED_SOFT_RESET ((uint16_t)0x0000)) -#define VL53L4ED_I2C_SLAVE__DEVICE_ADDRESS ((uint16_t)0x0001) -#define VL53L4ED_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND ((uint16_t)0x0008) -#define VL53L4ED_XTALK_PLANE_OFFSET_KCPS ((uint16_t)0x0016) -#define VL53L4ED_XTALK_X_PLANE_GRADIENT_KCPS ((uint16_t)0x0018) -#define VL53L4ED_XTALK_Y_PLANE_GRADIENT_KCPS ((uint16_t)0x001A) -#define VL53L4ED_RANGE_OFFSET_MM ((uint16_t)0x001E) -#define VL53L4ED_INNER_OFFSET_MM ((uint16_t)0x0020) -#define VL53L4ED_OUTER_OFFSET_MM ((uint16_t)0x0022) -#define VL53L4ED_GPIO_HV_MUX__CTRL ((uint16_t)0x0030) -#define VL53L4ED_GPIO__TIO_HV_STATUS ((uint16_t)0x0031) -#define VL53L4ED_SYSTEM__INTERRUPT ((uint16_t)0x0046) -#define VL53L4ED_RANGE_CONFIG_A ((uint16_t)0x005E) -#define VL53L4ED_RANGE_CONFIG_B ((uint16_t)0x0061) -#define VL53L4ED_RANGE_CONFIG__SIGMA_THRESH ((uint16_t)0x0064) -#define VL53L4ED_MIN_COUNT_RATE_RTN_LIMIT_MCPS ((uint16_t)0x0066) -#define VL53L4ED_INTERMEASUREMENT_MS ((uint16_t)0x006C) -#define VL53L4ED_THRESH_HIGH ((uint16_t)0x0072) -#define VL53L4ED_THRESH_LOW ((uint16_t)0x0074) -#define VL53L4ED_SYSTEM__INTERRUPT_CLEAR ((uint16_t)0x0086) -#define VL53L4ED_SYSTEM_START ((uint16_t)0x0087) -#define VL53L4ED_RESULT__RANGE_STATUS ((uint16_t)0x0089) -#define VL53L4ED_RESULT__SPAD_NB ((uint16_t)0x008C) -#define VL53L4ED_RESULT__SIGNAL_RATE ((uint16_t)0x008E) -#define VL53L4ED_RESULT__AMBIENT_RATE ((uint16_t)0x0090) -#define VL53L4ED_RESULT__SIGMA ((uint16_t)0x0092) -#define VL53L4ED_RESULT__DISTANCE ((uint16_t)0x0096) - -#define VL53L4ED_RESULT__OSC_CALIBRATE_VAL ((uint16_t)0x00DE) -#define VL53L4ED_FIRMWARE__SYSTEM_STATUS ((uint16_t)0x00E5) -#define VL53L4ED_IDENTIFICATION__MODEL_ID ((uint16_t)0x010F) - -/** - * @brief defines Software Version - */ - -typedef struct { - uint8_t major; /*!< major number */ - uint8_t minor; /*!< minor number */ - uint8_t build; /*!< build number */ - uint32_t revision; /*!< revision number */ -} VL53L4ED_Version_t; - -/** - * @brief Packed reading results type - */ - -typedef struct { - - /* Status of measurements. If the status is equal to 0, the data are valid*/ - uint8_t range_status; - /* Measured distance in millimeters */ - uint16_t distance_mm; - /* Ambient noise in kcps */ - uint16_t ambient_rate_kcps; - /* Ambient noise in kcps/SPAD */ - uint16_t ambient_per_spad_kcps; - /* Measured signal of the target in kcps */ - uint16_t signal_rate_kcps; - /* Measured signal of the target in kcps/SPAD */ - uint16_t signal_per_spad_kcps; - /* Number of SPADs enabled */ - uint16_t number_of_spad; - /* Estimated measurements std deviation in mm */ - uint16_t sigma_mm; -} VL53L4ED_ResultsData_t; - -/** - * @brief This function programs the software driver version. - * @param (VL53L4ED_Version_t) pVersion : Pointer of structure, containing the - * software version. - * @return (VL53L4ED_ERROR) status : 0 if SW version is OK. - */ - -VL53L4ED_Error VL53L4ED_GetSWVersion(VL53L4ED_Version_t *pVersion); - -/** - * @brief This function sets a new I2C address to a sensor. It can be used for - * example when multiple sensors share the same I2C bus. - * @param (Dev_t) dev : Device instance to update. - * @param (uint8_t) new_address : New I2C address. - * @return (VL53L4ED_ERROR) status : 0 if I2C address has been correctly - * programmed. - */ - -VL53L4ED_Error VL53L4ED_SetI2CAddress(Dev_t dev, uint8_t new_address); - -/** - * @brief This function is used to get the sensor id of VL53L4ED. The sensor id - * should be 0xEBAA. - * @param (Dev_t) dev : Device instance. - * @param (uint16_t) *p_id : Sensor id. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetSensorId(Dev_t dev, uint16_t *p_id); - -/** - * @brief This function is used to initialize the sensor. - * @param (Dev_t) dev : Device instance to initialize. - * @return (VL53L4ED_ERROR) status : 0 if init is OK. - */ - -VL53L4ED_Error VL53L4ED_SensorInit(Dev_t dev); - -/** - * @brief This function clears the interrupt. It needs to be called after a - * ranging data reading to arm the interrupt for the next data ready event. - * @param (Dev_t) dev : Device instance. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_ClearInterrupt(Dev_t dev); - -/** - * @brief This function starts a ranging session. The ranging operation is - * continuous. The clear interrupt has to be done after each get data to allow - * the interrupt to raise when the next data is ready. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_StartRanging(Dev_t dev); - -/** - * @brief This function stops the ranging in progress. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_StopRanging(Dev_t dev); - -/** - * @brief This function check if a new data is available by polling a dedicated - * register. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint8_t) *p_is_data_ready : Pointer containing a flag to know if a - * data is ready : 0 = no data ready, 1 = data ready. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_CheckForDataReady(Dev_t dev, uint8_t *p_is_data_ready); - -/** - * @brief This function sets new range timing. Timing are composed of - * TimingBudget and InterMeasurement. TimingBudget represents the timing during - * VCSEL enabled, and InterMeasurement the time between two measurements. - * The sensor can have different ranging mode depending of the configuration, - * please refer to the user manual for more information. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint32_t) timing_budget_ms : New timing budget in ms. Value can be - * between 10ms and 200ms. Default is 50ms. - * @param (uint32_t) inter_measurement_ms : New inter-measurement in ms. If the - * value is equal to 0, the ranging period is defined by the timing budget. - * Otherwise, inter-measurement must be > timing budget. When all the timing - * budget is consumed, the device goes in low power mode until inter-measurement - * is done. - * @return (uint8_t) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_SetRangeTiming(Dev_t dev, uint32_t timing_budget_ms, uint32_t inter_measurement_ms); - -/** - * @brief This function gets the current range timing. Timing are composed of - * TimingBudget and InterMeasurement. TimingBudget represents the timing during - * VCSEL enabled, and InterMeasurement the time between two measurements. - * The sensor can have different ranging mode depending of the configuration, - * please refer to the user manual for more information. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint32_t) *p_timing_budget_ms : Pointer containing the current - * timing budget in ms. - * @param (uint32_t) *p_inter_measurement_ms : Pointer containing the current - * inter-measurement in ms. - * @return (uint8_t) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetRangeTiming(Dev_t dev, uint32_t *p_timing_budget_ms, uint32_t *p_inter_measurement_ms); - -/** - * @brief This function gets the results reported by the sensor. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (VL53L4ED_ResultsData_t) *pResult : Pointer of structure, filled with the - * ranging results. - * @return (uint8_t) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetResult(Dev_t dev, VL53L4ED_ResultsData_t *pResult); - -/** - * @brief This function sets a new offset correction in mm. Offset corresponds - * to the difference in millimeters between real distance and measured distance. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum - * value is -1024mm and maximum is 1023mm. - * @return (uint8_t) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_SetOffset(Dev_t dev, int16_t OffsetValueInMm); - -/** - * @brief This function gets the current offset correction in mm. Offset - * corresponds to the difference in millimeters between real distance and - * measured distance. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (int16_t) OffsetValueInMm : Offset value in millimeters. The minimum - * value is -1024mm and maximum is 1023mm. - * @return (uint8_t) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetOffset(Dev_t dev, int16_t *Offset); - -/** - * @brief This function sets a new Xtalk value in kcps. Xtalk represents the - * correction to apply to the sensor when a protective coverglass is placed - * at the top of the sensor. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) XtalkValueKcps : New xtalk value in kcps. The default - * value is 0 kcps (no coverglass). Minimum is 0 kcps , and maximum is 128 - * kcps. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_SetXtalk(Dev_t dev, uint16_t XtalkValueKcps); - -/** - * @brief This function gets the current Xtalk value in kcps. Xtalk represents - * the correction to apply to the sensor when a protective coverglass is placed - * at the top of the sensor. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) p_xtalk_kcps : Pointer of current xtalk value in kcps. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetXtalk(Dev_t dev, uint16_t *p_xtalk_kcps); - -/** - * @brief This function sets new detection thresholds. The detection - * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only - * when a condition on distance is reach. Example: - * VL53L4ED_SetDistanceThreshold(dev,100,300,0): Below 100 mm - * VL53L4ED_SetDistanceThreshold(dev,100,300,1): Above 300 mm - * VL53L4ED_SetDistanceThreshold(dev,100,300,2): Below 100mm or above 300mm - * VL53L4ED_SetDistanceThreshold(dev,100,300,3): Above 100mm or below 300mm - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) distance_low_mm : Low distance threshold in millimeters. - * @param (uint16_t) distance_high_mm : High distance threshold in millimeters. - * @param (uint8_t) window : Interrupt windows (0=below low threshold; - * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_SetDetectionThresholds(Dev_t dev, uint16_t distance_low_mm, uint16_t distance_high_mm, uint8_t window); - -/** - * @brief This function gets the current detection thresholds. The detection - * thresholds can be programmed to generate an interrupt on pin 7 (GPIO1), only - * when a condition on distance is reach. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) *p_distance_low_mm : Pointer of low distance threshold in - * millimeters. - * @param (uint16_t) *p_distance_high_mm : Pointer of high distance threshold in - * millimeters. - * @param (uint8_t) *p_window : Interrupt windows (0=below low threshold; - * 1=above high threshold; 2=out of low/high windows; 3=in low/high windows) - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetDetectionThresholds(Dev_t dev, uint16_t *p_distance_low_mm, uint16_t *p_distance_high_mm, uint8_t *p_window); - -/** - * @brief This function sets a new signal threshold in kcps. If a - * target has a lower signal as the programmed value, the result status in - * structure 'VL53L4ED_ResultsData_t' will be equal to 2. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) signal_kcps : New signal threshold in kcps. The default - * value is 1024 kcps. Minimum is 0 kcps (no threshold), and maximum is 16384 - * kcps. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_SetSignalThreshold(Dev_t dev, uint16_t signal_kcps); - -/** - * @brief This function returns the current signal threshold in kcps. If a - * target has a lower signal as the programmed value, the result status in - * structure 'VL53L4ED_ResultsData_t' will be equal to 2. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) *p_signal_kcps : Pointer of signal threshold in kcps. - * @return (VL53L4ED_ERROR) status : 0 if OK. - */ - -VL53L4ED_Error VL53L4ED_GetSignalThreshold(Dev_t dev, uint16_t *p_signal_kcps); - -/** - * @brief This function programs a new sigma threshold. The sigma corresponds to - * the standard deviation of the returned pulse. If the computed sigma is above - * the programmed value, the result status in structure 'VL53L4ED_ResultsData_t' - * will be equal to 1. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) sigma_mm : New sigma threshold in mm. The default value is - * 15mm. Minimum is 0mm (not threshold), and maximum is 16383mm. - * @return (VL53L4ED_ERROR) status : 0 if programming is or 255 if value is too - * high. - */ - -VL53L4ED_Error VL53L4ED_SetSigmaThreshold(Dev_t dev, uint16_t sigma_mm); - -/** - * @brief This function gets the current sigma threshold. The sigma corresponds - * to the standard deviation of the returned pulse. If the computed sigma is - * above the programmed value, the result status in structure - * 'VL53L4ED_ResultsData_t' will be equal to 1. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (uint16_t) *p_sigma_mm : Current sigma threshold in mm. - * @return (VL53L4ED_ERROR) status : 0 if programming is OK. - */ - -VL53L4ED_Error VL53L4ED_GetSigmaThreshold(Dev_t dev, uint16_t *p_sigma_mm); - -/** - * @brief This function can be called when the temperature might have changed by - * more than 8 degrees Celsius. The function can only be used if the sensor is - * not ranging, otherwise, the ranging needs to be stopped using function - * 'VL53L4ED_StopRanging()'. After calling this function, the ranging can - * restart normally. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @return (VL53L4ED_ERROR) status : 0 if update is OK. - */ - -VL53L4ED_Error VL53L4ED_StartTemperatureUpdate(Dev_t dev); - -#endif // VL53L4ED_API_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c deleted file mode 100644 index 6a0d96eb1..000000000 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.c +++ /dev/null @@ -1,207 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -/** - * @file vl53l4ed_calibration.c - * @brief Calibration functions implementation - */ - -#include "VL53L4ED_calibration.h" - -#include - -#include "VL53L4ED_api.h" - -VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint8_t i, tmp, continue_loop; - uint16_t j, tmpOff; - int16_t AvgDistance = 0; - VL53L4ED_ResultsData_t results; - - if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)1000))) { - status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } else { - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, 0x0); - status |= VL53L4ED_WrWord(dev, VL53L4ED_INNER_OFFSET_MM, 0x0); - status |= VL53L4ED_WrWord(dev, VL53L4ED_OUTER_OFFSET_MM, 0x0); - - /* Device heat loop (10 samples) */ - status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)10; i++) { - tmp = (uint8_t)0; - j = (uint16_t)0; - continue_loop = (uint8_t)1; - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (j < (uint16_t)5000) /* Wait for answer*/ - { - j++; - } else /* Timeout 5000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - status |= VL53L4ED_GetResult(dev, &results); - status |= VL53L4ED_ClearInterrupt(dev); - } - status |= VL53L4ED_StopRanging(dev); - - /* Device ranging */ - status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)nb_samples; i++) { - tmp = (uint8_t)0; - j = (uint16_t)0; - continue_loop = (uint8_t)1; - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (j < (uint16_t)5000) /* Wait for answer*/ - { - j++; - } else /* Timeout 5000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - - status |= VL53L4ED_GetResult(dev, &results); - status |= VL53L4ED_ClearInterrupt(dev); - AvgDistance += (int16_t)results.distance_mm; - } - - status |= VL53L4ED_StopRanging(dev); - AvgDistance = AvgDistance / nb_samples; - *p_measured_offset_mm = (int16_t)TargetDistInMm - AvgDistance; - tmpOff = (uint16_t)*p_measured_offset_mm * (uint16_t)4; - status |= VL53L4ED_WrWord(dev, VL53L4ED_RANGE_OFFSET_MM, tmpOff); - } - - return status; -} - -VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples) -{ - VL53L4ED_Error status = VL53L4ED_ERROR_NONE; - uint8_t i, tmp, continue_loop; - float_t AverageSignal = (float_t)0.0; - float_t AvgDistance = (float_t)0.0; - float_t AverageSpadNb = (float_t)0.0; - float_t TargetDistance = (float_t)TargetDistInMm; - float_t tmp_xtalk, CounterNbSamples = (float_t)0.0; - VL53L4ED_ResultsData_t results; - - uint16_t calXtalk, j; - - *p_measured_xtalk_kcps = 0; - if (((nb_samples < (int16_t)5) || (nb_samples > (int16_t)255)) || ((TargetDistInMm < (int16_t)10) || (TargetDistInMm > (int16_t)5000))) { - status |= (uint8_t)VL53L4ED_ERROR_INVALID_ARGUMENT; - } else { - /* Disable Xtalk compensation */ - status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, *p_measured_xtalk_kcps); - - /* Device heat loop (10 samples) */ - status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)10; i++) { - tmp = (uint8_t)0; - j = (uint16_t)0; - continue_loop = (uint8_t)1; - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (j < (uint16_t)5000) /* Wait for answer*/ - { - j++; - } else /* Timeout 5000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - status |= VL53L4ED_GetResult(dev, &results); - status |= VL53L4ED_ClearInterrupt(dev); - } - status |= VL53L4ED_StopRanging(dev); - - /* Device ranging loop */ - status |= VL53L4ED_StartRanging(dev); - for (i = 0; i < (uint8_t)nb_samples; i++) { - tmp = (uint8_t)0; - j = (uint16_t)0; - continue_loop = (uint8_t)1; - do { - status |= VL53L4ED_CheckForDataReady(dev, &tmp); - if (tmp == (uint8_t)1) /* Data ready */ - { - continue_loop = (uint8_t)0; - } else if (j < (uint16_t)5000) /* Wait for answer*/ - { - j++; - } else /* Timeout 5000ms reached */ - { - continue_loop = (uint8_t)0; - status |= (uint8_t)VL53L4ED_ERROR_TIMEOUT; - } - VL53L4ED_WaitMs(dev, 1); - } while (continue_loop == (uint8_t)1); - - status |= VL53L4ED_GetResult(dev, &results); - status |= VL53L4ED_ClearInterrupt(dev); - - /* Discard invalid measurements and first frame */ - if (results.range_status == (uint8_t)0 && i > (uint8_t)0) { - AvgDistance += (float_t)results.distance_mm; - AverageSpadNb += (float_t)results.number_of_spad; - AverageSignal += (float_t)results.signal_rate_kcps; - CounterNbSamples++; - } - } - status |= VL53L4ED_StopRanging(dev); - - if (CounterNbSamples == 0) { - status = VL53L4ED_ERROR_XTALK_FAILED; - } else { - AvgDistance /= CounterNbSamples; - AverageSpadNb /= CounterNbSamples; - AverageSignal /= CounterNbSamples; - - tmp_xtalk = (float_t)1.0 - (AvgDistance / TargetDistance); - tmp_xtalk *= (AverageSignal / AverageSpadNb); - - /* 127kcps is the max Xtalk value (65536/512) */ - if (tmp_xtalk > (uint16_t)127) { - status = VL53L4ED_ERROR_XTALK_FAILED; - } else { - *p_measured_xtalk_kcps = (uint16_t)(round(tmp_xtalk)); - - /* Send data to firmware */ - calXtalk = (uint16_t)(tmp_xtalk * (float_t)512.0); - status |= VL53L4ED_WrWord(dev, VL53L4ED_XTALK_PLANE_OFFSET_KCPS, calXtalk); - } - } - } - - return status; -} diff --git a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h deleted file mode 100644 index 97daa1d3c..000000000 --- a/SAMM/Core/Extras/VL53L4ED/VL53L4ED_calibration.h +++ /dev/null @@ -1,64 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -/** - * @file vl53l4ed_calibration.h - * @brief Calibration Functions definition - */ - -#ifndef VL53L4ED_CALIBRATION_H_ -#define VL53L4ED_CALIBRATION_H_ - -#include "platform.h" - -/** - * @brief This function can be used to perform an offset calibration. Offset - * corresponds to the difference in millimeters between real distance and - * measured distance. ST recommend to perform offset at 100m, on a grey17% - * reflective target, but any other distance and reflectance can be used. - * The function returns the offset value found and programs the offset - * compensation into the device. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param (int16_t) TargetDistInMm : Real distance between the sensor and the - * target in millimeters. ST recommend 100mm. Min distance is 10mm and max is - * 1000mm. - * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher - * number of samples increases the accuracy, but it also takes more time. ST - * recommend to use at least 10 samples. - * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g - * invalid nb of samples). - */ - -VL53L4ED_Error VL53L4ED_CalibrateOffset(Dev_t dev, int16_t TargetDistInMm, int16_t *p_measured_offset_mm, int16_t nb_samples); - -/** - * @brief This function can be used to perform a Xtalk calibration. Xtalk - * represents the correction to apply to the sensor when a protective coverglass - * is placed at the top of the sensor. The distance for calibration depends of - * the coverglass, it needs to be characterized. Please refer to the User Manual - * for more information. - * The function returns the Xtalk value found and programs the Xtalk - * compensation into the device. - * @param (Dev_t) dev : instance of selected VL53L4ED sensor. - * @param uint16_t) TargetDistInMm : Real distance between the sensor and the - * target in millimeters. This distance needs to be characterized, as described - * into the User Manual. - * @param (int16_t) nb_samples : Number of samples (between 5 and 255). A higher - * number of samples increases the accuracy, but it also takes more time. ST - * recommend to use at least 10 samples. - * @return (VL53L4ED_ERROR) status : 0 if OK, or 255 if something occurred (e.g - * invalid nb of samples). - */ - -VL53L4ED_Error VL53L4ED_CalibrateXtalk(Dev_t dev, int16_t TargetDistInMm, uint16_t *p_measured_xtalk_kcps, int16_t nb_samples); - -#endif // VL53L4ED_CALIBRATION_H_ diff --git a/SAMM/Core/Extras/VL53L4ED/platform.c b/SAMM/Core/Extras/VL53L4ED/platform.c deleted file mode 100644 index cf09e50e7..000000000 --- a/SAMM/Core/Extras/VL53L4ED/platform.c +++ /dev/null @@ -1,112 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -#include "platform.h" - -#include "i2c.h" -#include "main.h" - -extern I2C_HandleTypeDef hi2c1; - -/* -Im legit just using the example stm provides but instead of filling everything out im only copying the platform.c implemintation -for the vl53l4ed sensor. - - -*/ - -uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t *value) -{ - uint8_t status = 0; - uint8_t data_write[2]; - uint8_t data_read[4]; - - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); - status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 4, 100); - *value = ((data_read[0] << 24) | (data_read[1] << 16) | (data_read[2] << 8) | (data_read[3])); - return status; -} - -uint8_t VL53L4ED_RdWord(uint16_t dev, uint16_t RegisterAdress, uint16_t *value) -{ - uint8_t status = 0; - uint8_t data_write[2]; - uint8_t data_read[2]; - - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); - status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 2, 100); - *value = (data_read[0] << 8) | (data_read[1]); - return status; -} - -uint8_t VL53L4ED_RdByte(uint16_t dev, uint16_t RegisterAdress, uint8_t *value) -{ - uint8_t status = 0; - uint8_t data_write[2]; - uint8_t data_read[1]; - - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 2, 100); - status = HAL_I2C_Master_Receive(&hi2c1, dev, data_read, 1, 100); - *value = data_read[0]; - return status; -} - -uint8_t VL53L4ED_WrByte(uint16_t dev, uint16_t RegisterAdress, uint8_t value) -{ - uint8_t data_write[3]; - uint8_t status = 0; - - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - data_write[2] = value & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 3, 100); - return status; -} - -uint8_t VL53L4ED_WrWord(uint16_t dev, uint16_t RegisterAdress, uint16_t value) -{ - uint8_t data_write[4]; - uint8_t status = 0; - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - data_write[2] = (value >> 8) & 0xFF; - data_write[3] = value & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 4, 100); - return status; -} - -uint8_t VL53L4ED_WrDWord(uint16_t dev, uint16_t RegisterAdress, uint32_t value) -{ - uint8_t data_write[6]; - uint8_t status = 0; - - data_write[0] = (RegisterAdress >> 8) & 0xFF; - data_write[1] = RegisterAdress & 0xFF; - data_write[2] = (value >> 24) & 0xFF; - data_write[3] = (value >> 16) & 0xFF; - data_write[4] = (value >> 8) & 0xFF; - data_write[5] = value & 0xFF; - status = HAL_I2C_Master_Transmit(&hi2c1, dev, data_write, 6, 100); - return status; -} - -uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t time_ms) -{ - HAL_Delay(time_ms); - return 0; -} diff --git a/SAMM/Core/Extras/VL53L4ED/platform.h b/SAMM/Core/Extras/VL53L4ED/platform.h deleted file mode 100644 index 9c7754970..000000000 --- a/SAMM/Core/Extras/VL53L4ED/platform.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * - * 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. - * - ****************************************************************************** - */ - -#ifndef _PLATFORM_H_ -#define _PLATFORM_H_ -#pragma once - -#include -#include - -/** - * VL53L4ED device instance. - */ - -typedef uint16_t Dev_t; - -/** - * @brief Error instance. - */ -typedef uint8_t VL53L4ED_Error; - -/** - * @brief If the macro below is defined, the device will be programmed to run - * with I2C Fast Mode Plus (up to 1MHz). Otherwise, default max value is 400kHz. - */ - -// #define VL53L4ED_I2C_FAST_MODE_PLUS - -/** - * @brief Read 32 bits through I2C. - */ - -uint8_t VL53L4ED_RdDWord(Dev_t dev, uint16_t registerAddr, uint32_t *value); -/** - * @brief Read 16 bits through I2C. - */ - -uint8_t VL53L4ED_RdWord(Dev_t dev, uint16_t registerAddr, uint16_t *value); - -/** - * @brief Read 8 bits through I2C. - */ - -uint8_t VL53L4ED_RdByte(Dev_t dev, uint16_t registerAddr, uint8_t *value); - -/** - * @brief Write 8 bits through I2C. - */ - -uint8_t VL53L4ED_WrByte(Dev_t dev, uint16_t registerAddr, uint8_t value); - -/** - * @brief Write 16 bits through I2C. - */ - -uint8_t VL53L4ED_WrWord(Dev_t dev, uint16_t RegisterAdress, uint16_t value); - -/** - * @brief Write 32 bits through I2C. - */ - -uint8_t VL53L4ED_WrDWord(Dev_t dev, uint16_t RegisterAdress, uint32_t value); - -/** - * @brief Wait during N milliseconds. - */ - -uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t TimeMs); - -#endif // _PLATFORM_H_ \ No newline at end of file diff --git a/SAMM/Core/Extras/extra.c b/SAMM/Core/Extras/extra.c deleted file mode 100644 index 25519615c..000000000 --- a/SAMM/Core/Extras/extra.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "extra.h" - -#include - -#include "i2c.h" -#include "main.h" - -void MLX90640_I2CInit(void) -{ - MX_I2C2_Init(); - return; -} - -int MLX90640_I2CGeneralReset(void) -{ - uint8_t data = 0x06; - return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data, 1, 1000); -} - -int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) -{ - // HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); - // HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); - /* - HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size) - */ - // return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 10000); -} - -int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) -{ - // union - // { - // uint8_t bytes[2]; - // uint16_t data; - // }extra = {.data = data}; - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); - // return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); -} - -void MLX90640_I2CFreqSet(int freq) -{ - return; -} - -uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) -{ - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 500); -} - -uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) -{ - - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 500); -} diff --git a/SAMM/Core/Extras/extra.h b/SAMM/Core/Extras/extra.h deleted file mode 100644 index f032f86ab..000000000 --- a/SAMM/Core/Extras/extra.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __EXTRA_H__ -#define __EXTRA_H__ -#include -/* -This is for some xtra fucntions that would be needed later on - - -*/ - -void MLX90640_I2CInit(void); -int MLX90640_I2CGeneralReset(void); -int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); -void MLX90640_I2CFreqSet(int freq); - -uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); - -#endif /* __EXTRA_H__ */ \ No newline at end of file diff --git a/SAMM/Core/Inc/adc.h b/SAMM/Core/Inc/adc.h deleted file mode 100644 index e65b1f6f8..000000000 --- a/SAMM/Core/Inc/adc.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __ADC_H__ -#define __ADC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern ADC_HandleTypeDef hadc1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_ADC1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ADC_H__ */ diff --git a/SAMM/Core/Inc/crc.h b/SAMM/Core/Inc/crc.h deleted file mode 100644 index 133957e92..000000000 --- a/SAMM/Core/Inc/crc.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file crc.h - * @brief This file contains all the function prototypes for - * the crc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __CRC_H__ -#define __CRC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern CRC_HandleTypeDef hcrc; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_CRC_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CRC_H__ */ diff --git a/SAMM/Core/Inc/dma.h b/SAMM/Core/Inc/dma.h deleted file mode 100644 index 7774831e0..000000000 --- a/SAMM/Core/Inc/dma.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.h - * @brief This file contains all the function prototypes for - * the dma.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __DMA_H__ -#define __DMA_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* DMA memory to memory transfer handles -------------------------------------*/ - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_DMA_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __DMA_H__ */ diff --git a/SAMM/Core/Inc/fdcan.h b/SAMM/Core/Inc/fdcan.h deleted file mode 100644 index a5cc22f04..000000000 --- a/SAMM/Core/Inc/fdcan.h +++ /dev/null @@ -1,54 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.h - * @brief This file contains all the function prototypes for - * the fdcan.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FDCAN_H__ -#define __FDCAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern FDCAN_HandleTypeDef hfdcan1; - -extern FDCAN_HandleTypeDef hfdcan2; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_FDCAN1_Init(void); -void MX_FDCAN2_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __FDCAN_H__ */ diff --git a/SAMM/Core/Inc/gpio.h b/SAMM/Core/Inc/gpio.h deleted file mode 100644 index 843d4e9e7..000000000 --- a/SAMM/Core/Inc/gpio.h +++ /dev/null @@ -1,48 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.h - * @brief This file contains all the function prototypes for - * the gpio.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GPIO_H__ -#define __GPIO_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_GPIO_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif -#endif /*__ GPIO_H__ */ diff --git a/SAMM/Core/Inc/i2c.h b/SAMM/Core/Inc/i2c.h deleted file mode 100644 index 64f5543e6..000000000 --- a/SAMM/Core/Inc/i2c.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.h - * @brief This file contains all the function prototypes for - * the i2c.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __I2C_H__ -#define __I2C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern I2C_HandleTypeDef hi2c1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_I2C1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __I2C_H__ */ diff --git a/SAMM/Core/Inc/main.h b/SAMM/Core/Inc/main.h deleted file mode 100644 index 42659c5d7..000000000 --- a/SAMM/Core/Inc/main.h +++ /dev/null @@ -1,79 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAIN_H -#define __MAIN_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_hal.h" -#include "stm32h5xx_ll_bus.h" -#include "stm32h5xx_ll_cortex.h" -#include "stm32h5xx_ll_crs.h" -#include "stm32h5xx_ll_dma.h" -#include "stm32h5xx_ll_exti.h" -#include "stm32h5xx_ll_gpio.h" -#include "stm32h5xx_ll_pwr.h" -#include "stm32h5xx_ll_rcc.h" -#include "stm32h5xx_ll_system.h" -#include "stm32h5xx_ll_utils.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void Error_Handler(void); - -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -/* Private defines -----------------------------------------------------------*/ - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAIN_H */ diff --git a/SAMM/Core/Inc/spi.h b/SAMM/Core/Inc/spi.h deleted file mode 100644 index 51a96c6e5..000000000 --- a/SAMM/Core/Inc/spi.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern SPI_HandleTypeDef hspi3; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_SPI3_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __SPI_H__ */ diff --git a/SAMM/Core/Inc/stm32_assert.h b/SAMM/Core/Inc/stm32_assert.h deleted file mode 100644 index 92460620f..000000000 --- a/SAMM/Core/Inc/stm32_assert.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32_assert.h - * @author MCD Application Team - * @brief STM32 assert file. - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32_ASSERT_H -#define __STM32_ASSERT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ -/* Includes ------------------------------------------------------------------*/ -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32_ASSERT_H */ diff --git a/SAMM/Core/Inc/stm32h5xx_hal_conf.h b/SAMM/Core/Inc/stm32h5xx_hal_conf.h deleted file mode 100644 index efec9aabd..000000000 --- a/SAMM/Core/Inc/stm32h5xx_hal_conf.h +++ /dev/null @@ -1,381 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_hal_conf.h - * @author MCD Application Team - * @brief HAL configuration file - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef STM32H5xx_HAL_CONF_H -#define STM32H5xx_HAL_CONF_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Exported types ------------------------------------------------------------*/ -/* Exported constants --------------------------------------------------------*/ - -/* ########################## Module Selection ############################## */ -/** - * @brief This is the list of modules to be used in the HAL driver - */ - -#define HAL_MODULE_ENABLED - -/*#define HAL_ADC_MODULE_ENABLED */ -/*#define HAL_COMP_MODULE_ENABLED */ -/*#define HAL_CORDIC_MODULE_ENABLED */ -#define HAL_CRC_MODULE_ENABLED -/*#define HAL_CRYP_MODULE_ENABLED */ -/*#define HAL_DAC_MODULE_ENABLED */ -#define HAL_FDCAN_MODULE_ENABLED -/*#define HAL_FMAC_MODULE_ENABLED */ -/*#define HAL_HRTIM_MODULE_ENABLED */ -/*#define HAL_IRDA_MODULE_ENABLED */ -/*#define HAL_IWDG_MODULE_ENABLED */ -#define HAL_I2C_MODULE_ENABLED -/*#define HAL_I2S_MODULE_ENABLED */ -/*#define HAL_LPTIM_MODULE_ENABLED */ -/*#define HAL_NAND_MODULE_ENABLED */ -/*#define HAL_NOR_MODULE_ENABLED */ -/*#define HAL_OPAMP_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ -/*#define HAL_QSPI_MODULE_ENABLED */ -/*#define HAL_RNG_MODULE_ENABLED */ -/*#define HAL_RTC_MODULE_ENABLED */ -/*#define HAL_SAI_MODULE_ENABLED */ -/*#define HAL_SMARTCARD_MODULE_ENABLED */ -/*#define HAL_SMBUS_MODULE_ENABLED */ -#define HAL_SPI_MODULE_ENABLED -/*#define HAL_SRAM_MODULE_ENABLED */ -#define HAL_TIM_MODULE_ENABLED -/*#define HAL_UART_MODULE_ENABLED */ -/*#define HAL_USART_MODULE_ENABLED */ -/*#define HAL_WWDG_MODULE_ENABLED */ -#define HAL_GPIO_MODULE_ENABLED -#define HAL_EXTI_MODULE_ENABLED -#define HAL_DMA_MODULE_ENABLED -#define HAL_RCC_MODULE_ENABLED -#define HAL_FLASH_MODULE_ENABLED -#define HAL_PWR_MODULE_ENABLED -#define HAL_CORTEX_MODULE_ENABLED - -/* ########################## Register Callbacks selection ############################## */ -/** - * @brief This is the list of modules where register callback can be used - */ -#define USE_HAL_ADC_REGISTER_CALLBACKS 0U -#define USE_HAL_COMP_REGISTER_CALLBACKS 0U -#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U -#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U -#define USE_HAL_DAC_REGISTER_CALLBACKS 0U -#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U -#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U -#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U -#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_I2C_REGISTER_CALLBACKS 0U -#define USE_HAL_I2S_REGISTER_CALLBACKS 0U -#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U -#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U -#define USE_HAL_NAND_REGISTER_CALLBACKS 0U -#define USE_HAL_NOR_REGISTER_CALLBACKS 0U -#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U -#define USE_HAL_PCD_REGISTER_CALLBACKS 0U -#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U -#define USE_HAL_RNG_REGISTER_CALLBACKS 0U -#define USE_HAL_RTC_REGISTER_CALLBACKS 0U -#define USE_HAL_SAI_REGISTER_CALLBACKS 0U -#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U -#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U -#define USE_HAL_SPI_REGISTER_CALLBACKS 0U -#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U -#define USE_HAL_TIM_REGISTER_CALLBACKS 0U -#define USE_HAL_UART_REGISTER_CALLBACKS 0U -#define USE_HAL_USART_REGISTER_CALLBACKS 0U -#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U - -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined(HSE_VALUE) -#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ - -/** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined(HSI_VALUE) -#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined(HSI48_VALUE) -#define HSI48_VALUE \ - (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. \ - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ - -/** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined(LSI_VALUE) -/*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations in voltage and temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined(LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ - -#if !defined(LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ - -/** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined(EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ - -/* Tip: To avoid modifying this file each time you need to use different HSE, - === you can define the HSE value in your toolchain compiler preprocessor. */ - -/* ########################### System Configuration ######################### */ -/** - * @brief This is the HAL system configuration section - */ - -#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ -#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ -#define USE_RTOS 0U -#define PREFETCH_ENABLE 0U -#define INSTRUCTION_CACHE_ENABLE 1U -#define DATA_CACHE_ENABLE 1U - -/* ########################## Assert Selection ############################## */ -/** - * @brief Uncomment the line below to expanse the "assert_param" macro in the - * HAL drivers code - */ -/* #define USE_FULL_ASSERT 1U */ - -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver - * Activated: CRC code is present inside driver - * Deactivated: CRC code cleaned from driver - */ - -#define USE_SPI_CRC 0U - -/* Includes ------------------------------------------------------------------*/ -/** - * @brief Include module's header file - */ - -#ifdef HAL_RCC_MODULE_ENABLED -#include "stm32h5xx_hal_rcc.h" -#endif /* HAL_RCC_MODULE_ENABLED */ - -#ifdef HAL_GPIO_MODULE_ENABLED -#include "stm32h5xx_hal_gpio.h" -#endif /* HAL_GPIO_MODULE_ENABLED */ - -#ifdef HAL_DMA_MODULE_ENABLED -#include "stm32h5xx_hal_dma.h" -#endif /* HAL_DMA_MODULE_ENABLED */ - -#ifdef HAL_CORTEX_MODULE_ENABLED -#include "stm32h5xx_hal_cortex.h" -#endif /* HAL_CORTEX_MODULE_ENABLED */ - -#ifdef HAL_ADC_MODULE_ENABLED -#include "stm32h5xx_hal_adc.h" -#endif /* HAL_ADC_MODULE_ENABLED */ - -#ifdef HAL_COMP_MODULE_ENABLED -#include "stm32h5xx_hal_comp.h" -#endif /* HAL_COMP_MODULE_ENABLED */ - -#ifdef HAL_CORDIC_MODULE_ENABLED -#include "stm32h5xx_hal_cordic.h" -#endif /* HAL_CORDIC_MODULE_ENABLED */ - -#ifdef HAL_CRC_MODULE_ENABLED -#include "stm32h5xx_hal_crc.h" -#endif /* HAL_CRC_MODULE_ENABLED */ - -#ifdef HAL_CRYP_MODULE_ENABLED -#include "stm32h5xx_hal_cryp.h" -#endif /* HAL_CRYP_MODULE_ENABLED */ - -#ifdef HAL_DAC_MODULE_ENABLED -#include "stm32h5xx_hal_dac.h" -#endif /* HAL_DAC_MODULE_ENABLED */ - -#ifdef HAL_EXTI_MODULE_ENABLED -#include "stm32h5xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - -#ifdef HAL_FDCAN_MODULE_ENABLED -#include "stm32h5xx_hal_fdcan.h" -#endif /* HAL_FDCAN_MODULE_ENABLED */ - -#ifdef HAL_FLASH_MODULE_ENABLED -#include "stm32h5xx_hal_flash.h" -#endif /* HAL_FLASH_MODULE_ENABLED */ - -#ifdef HAL_FMAC_MODULE_ENABLED -#include "stm32h5xx_hal_fmac.h" -#endif /* HAL_FMAC_MODULE_ENABLED */ - -#ifdef HAL_HRTIM_MODULE_ENABLED -#include "stm32h5xx_hal_hrtim.h" -#endif /* HAL_HRTIM_MODULE_ENABLED */ - -#ifdef HAL_IRDA_MODULE_ENABLED -#include "stm32h5xx_hal_irda.h" -#endif /* HAL_IRDA_MODULE_ENABLED */ - -#ifdef HAL_IWDG_MODULE_ENABLED -#include "stm32h5xx_hal_iwdg.h" -#endif /* HAL_IWDG_MODULE_ENABLED */ - -#ifdef HAL_I2C_MODULE_ENABLED -#include "stm32h5xx_hal_i2c.h" -#endif /* HAL_I2C_MODULE_ENABLED */ - -#ifdef HAL_I2S_MODULE_ENABLED -#include "stm32h5xx_hal_i2s.h" -#endif /* HAL_I2S_MODULE_ENABLED */ - -#ifdef HAL_LPTIM_MODULE_ENABLED -#include "stm32h5xx_hal_lptim.h" -#endif /* HAL_LPTIM_MODULE_ENABLED */ - -#ifdef HAL_NAND_MODULE_ENABLED -#include "stm32h5xx_hal_nand.h" -#endif /* HAL_NAND_MODULE_ENABLED */ - -#ifdef HAL_NOR_MODULE_ENABLED -#include "stm32h5xx_hal_nor.h" -#endif /* HAL_NOR_MODULE_ENABLED */ - -#ifdef HAL_OPAMP_MODULE_ENABLED -#include "stm32h5xx_hal_opamp.h" -#endif /* HAL_OPAMP_MODULE_ENABLED */ - -#ifdef HAL_PCD_MODULE_ENABLED -#include "stm32h5xx_hal_pcd.h" -#endif /* HAL_PCD_MODULE_ENABLED */ - -#ifdef HAL_PWR_MODULE_ENABLED -#include "stm32h5xx_hal_pwr.h" -#endif /* HAL_PWR_MODULE_ENABLED */ - -#ifdef HAL_QSPI_MODULE_ENABLED -#include "stm32h5xx_hal_qspi.h" -#endif /* HAL_QSPI_MODULE_ENABLED */ - -#ifdef HAL_RNG_MODULE_ENABLED -#include "stm32h5xx_hal_rng.h" -#endif /* HAL_RNG_MODULE_ENABLED */ - -#ifdef HAL_RTC_MODULE_ENABLED -#include "stm32h5xx_hal_rtc.h" -#endif /* HAL_RTC_MODULE_ENABLED */ - -#ifdef HAL_SAI_MODULE_ENABLED -#include "stm32h5xx_hal_sai.h" -#endif /* HAL_SAI_MODULE_ENABLED */ - -#ifdef HAL_SMARTCARD_MODULE_ENABLED -#include "stm32h5xx_hal_smartcard.h" -#endif /* HAL_SMARTCARD_MODULE_ENABLED */ - -#ifdef HAL_SMBUS_MODULE_ENABLED -#include "stm32h5xx_hal_smbus.h" -#endif /* HAL_SMBUS_MODULE_ENABLED */ - -#ifdef HAL_SPI_MODULE_ENABLED -#include "stm32h5xx_hal_spi.h" -#endif /* HAL_SPI_MODULE_ENABLED */ - -#ifdef HAL_SRAM_MODULE_ENABLED -#include "stm32h5xx_hal_sram.h" -#endif /* HAL_SRAM_MODULE_ENABLED */ - -#ifdef HAL_TIM_MODULE_ENABLED -#include "stm32h5xx_hal_tim.h" -#endif /* HAL_TIM_MODULE_ENABLED */ - -#ifdef HAL_UART_MODULE_ENABLED -#include "stm32h5xx_hal_uart.h" -#endif /* HAL_UART_MODULE_ENABLED */ - -#ifdef HAL_USART_MODULE_ENABLED -#include "stm32h5xx_hal_usart.h" -#endif /* HAL_USART_MODULE_ENABLED */ - -#ifdef HAL_WWDG_MODULE_ENABLED -#include "stm32h5xx_hal_wwdg.h" -#endif /* HAL_WWDG_MODULE_ENABLED */ - -/* Exported macro ------------------------------------------------------------*/ -#ifdef USE_FULL_ASSERT -/** - * @brief The assert_param macro is used for function's parameters check. - * @param expr: If expr is false, it calls assert_failed function - * which reports the name of the source file and the source - * line number of the call that failed. - * If expr is true, it returns no value. - * @retval None - */ -#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) -/* Exported functions ------------------------------------------------------- */ -void assert_failed(uint8_t *file, uint32_t line); -#else -#define assert_param(expr) ((void)0U) -#endif /* USE_FULL_ASSERT */ - -#ifdef __cplusplus -} -#endif - -#endif /* STM32H5xx_HAL_CONF_H */ diff --git a/SAMM/Core/Inc/stm32h5xx_it.h b/SAMM/Core/Inc/stm32h5xx_it.h deleted file mode 100644 index e767e808c..000000000 --- a/SAMM/Core/Inc/stm32h5xx_it.h +++ /dev/null @@ -1,67 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_it.h - * @brief This file contains the headers of the interrupt handlers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32H5xx_IT_H -#define __STM32H5xx_IT_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Exported types ------------------------------------------------------------*/ -/* USER CODE BEGIN ET */ - -/* USER CODE END ET */ - -/* Exported constants --------------------------------------------------------*/ -/* USER CODE BEGIN EC */ - -/* USER CODE END EC */ - -/* Exported macro ------------------------------------------------------------*/ -/* USER CODE BEGIN EM */ - -/* USER CODE END EM */ - -/* Exported functions prototypes ---------------------------------------------*/ -void NMI_Handler(void); -void HardFault_Handler(void); -void MemManage_Handler(void); -void BusFault_Handler(void); -void UsageFault_Handler(void); -void SVC_Handler(void); -void DebugMon_Handler(void); -void PendSV_Handler(void); -void SysTick_Handler(void); -void TIM1_UP_TIM16_IRQHandler(void); -/* USER CODE BEGIN EFP */ - -/* USER CODE END EFP */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32G4xx_IT_H */ diff --git a/SAMM/Core/Src/adc.c b/SAMM/Core/Src/adc.c deleted file mode 100644 index fbcfbe933..000000000 --- a/SAMM/Core/Src/adc.c +++ /dev/null @@ -1,148 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "adc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -ADC_HandleTypeDef hadc1; - -/* ADC1 init function */ -void MX_ADC1_Init(void) -{ - - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.GainCompensation = 0; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DMAContinuousRequests = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = ENABLE; - hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; - hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; - hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; - hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) { - Error_Handler(); - } - - /** Configure the ADC multi-mode - */ - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ -} - -void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspInit 0 */ - - /* USER CODE END ADC1_MspInit 0 */ - LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); - - /* ADC1 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* USER CODE BEGIN ADC1_MspInit 1 */ - - /* USER CODE END ADC1_MspInit 1 */ - } -} - -void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) -{ - - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ - - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); - - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - - /* USER CODE BEGIN ADC1_MspDeInit 1 */ - - /* USER CODE END ADC1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/crc.c b/SAMM/Core/Src/crc.c deleted file mode 100644 index 213510a5d..000000000 --- a/SAMM/Core/Src/crc.c +++ /dev/null @@ -1,86 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file crc.c - * @brief This file provides code for the configuration - * of the CRC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "crc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -CRC_HandleTypeDef hcrc; - -/* CRC init function */ -void MX_CRC_Init(void) -{ - - /* USER CODE BEGIN CRC_Init 0 */ - - /* USER CODE END CRC_Init 0 */ - - /* USER CODE BEGIN CRC_Init 1 */ - - /* USER CODE END CRC_Init 1 */ - hcrc.Instance = CRC; - hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; - hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; - hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; - hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; - hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; - if (HAL_CRC_Init(&hcrc) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN CRC_Init 2 */ - - /* USER CODE END CRC_Init 2 */ -} - -void HAL_CRC_MspInit(CRC_HandleTypeDef *crcHandle) -{ - - if (crcHandle->Instance == CRC) { - /* USER CODE BEGIN CRC_MspInit 0 */ - - /* USER CODE END CRC_MspInit 0 */ - /* CRC clock enable */ - __HAL_RCC_CRC_CLK_ENABLE(); - /* USER CODE BEGIN CRC_MspInit 1 */ - - /* USER CODE END CRC_MspInit 1 */ - } -} - -void HAL_CRC_MspDeInit(CRC_HandleTypeDef *crcHandle) -{ - - if (crcHandle->Instance == CRC) { - /* USER CODE BEGIN CRC_MspDeInit 0 */ - - /* USER CODE END CRC_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_CRC_CLK_DISABLE(); - /* USER CODE BEGIN CRC_MspDeInit 1 */ - - /* USER CODE END CRC_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/dma.c b/SAMM/Core/Src/dma.c deleted file mode 100644 index 0b82d0d7c..000000000 --- a/SAMM/Core/Src/dma.c +++ /dev/null @@ -1,57 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file dma.c - * @brief This file provides code for the configuration - * of all the requested memory to memory DMA transfers. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "dma.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure DMA */ -/*----------------------------------------------------------------------------*/ - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** - * Enable DMA controller clock - */ -void MX_DMA_Init(void) -{ - - /* DMA controller clock enable */ - __HAL_RCC_DMAMUX1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - - /* DMA interrupt init */ - /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); - /* DMA1_Channel2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/SAMM/Core/Src/fdcan.c b/SAMM/Core/Src/fdcan.c deleted file mode 100644 index 600df963c..000000000 --- a/SAMM/Core/Src/fdcan.c +++ /dev/null @@ -1,213 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file fdcan.c - * @brief This file provides code for the configuration - * of the FDCAN instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "fdcan.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -FDCAN_HandleTypeDef hfdcan1; -FDCAN_HandleTypeDef hfdcan2; - -/* FDCAN1 init function */ -void MX_FDCAN1_Init(void) -{ - - /* USER CODE BEGIN FDCAN1_Init 0 */ - - /* USER CODE END FDCAN1_Init 0 */ - - /* USER CODE BEGIN FDCAN1_Init 1 */ - - /* USER CODE END FDCAN1_Init 1 */ - hfdcan1.Instance = FDCAN1; - hfdcan1.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan1.Init.AutoRetransmission = DISABLE; - hfdcan1.Init.TransmitPause = DISABLE; - hfdcan1.Init.ProtocolException = DISABLE; - hfdcan1.Init.NominalPrescaler = 16; - hfdcan1.Init.NominalSyncJumpWidth = 1; - hfdcan1.Init.NominalTimeSeg1 = 1; - hfdcan1.Init.NominalTimeSeg2 = 1; - hfdcan1.Init.DataPrescaler = 1; - hfdcan1.Init.DataSyncJumpWidth = 1; - hfdcan1.Init.DataTimeSeg1 = 1; - hfdcan1.Init.DataTimeSeg2 = 1; - hfdcan1.Init.StdFiltersNbr = 0; - hfdcan1.Init.ExtFiltersNbr = 0; - hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN1_Init 2 */ - - /* USER CODE END FDCAN1_Init 2 */ -} -/* FDCAN2 init function */ -void MX_FDCAN2_Init(void) -{ - - /* USER CODE BEGIN FDCAN2_Init 0 */ - - /* USER CODE END FDCAN2_Init 0 */ - - /* USER CODE BEGIN FDCAN2_Init 1 */ - - /* USER CODE END FDCAN2_Init 1 */ - hfdcan2.Instance = FDCAN2; - hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; - hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; - hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; - hfdcan2.Init.AutoRetransmission = DISABLE; - hfdcan2.Init.TransmitPause = DISABLE; - hfdcan2.Init.ProtocolException = DISABLE; - hfdcan2.Init.NominalPrescaler = 16; - hfdcan2.Init.NominalSyncJumpWidth = 1; - hfdcan2.Init.NominalTimeSeg1 = 1; - hfdcan2.Init.NominalTimeSeg2 = 1; - hfdcan2.Init.DataPrescaler = 1; - hfdcan2.Init.DataSyncJumpWidth = 1; - hfdcan2.Init.DataTimeSeg1 = 1; - hfdcan2.Init.DataTimeSeg2 = 1; - hfdcan2.Init.StdFiltersNbr = 0; - hfdcan2.Init.ExtFiltersNbr = 0; - hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; - if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN FDCAN2_Init 2 */ - - /* USER CODE END FDCAN2_Init 2 */ -} - -static uint32_t HAL_RCC_FDCAN_CLK_ENABLED = 0; - -void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspInit 0 */ - - /* USER CODE END FDCAN1_MspInit 0 */ - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN1 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN1_MspInit 1 */ - - /* USER CODE END FDCAN1_MspInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspInit 0 */ - - /* USER CODE END FDCAN2_MspInit 0 */ - - LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - /* FDCAN2 clock enable */ - HAL_RCC_FDCAN_CLK_ENABLED++; - if (HAL_RCC_FDCAN_CLK_ENABLED == 1) { - __HAL_RCC_FDCAN_CLK_ENABLE(); - } - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_13 | GPIO_PIN_5; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN FDCAN2_MspInit 1 */ - - /* USER CODE END FDCAN2_MspInit 1 */ - } -} - -void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) -{ - - if (fdcanHandle->Instance == FDCAN1) { - /* USER CODE BEGIN FDCAN1_MspDeInit 0 */ - - /* USER CODE END FDCAN1_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN1 GPIO Configuration - PA11 ------> FDCAN1_RX - PA12 ------> FDCAN1_TX - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11 | GPIO_PIN_12); - - /* USER CODE BEGIN FDCAN1_MspDeInit 1 */ - - /* USER CODE END FDCAN1_MspDeInit 1 */ - } else if (fdcanHandle->Instance == FDCAN2) { - /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ - - /* USER CODE END FDCAN2_MspDeInit 0 */ - /* Peripheral clock disable */ - HAL_RCC_FDCAN_CLK_ENABLED--; - if (HAL_RCC_FDCAN_CLK_ENABLED == 0) { - __HAL_RCC_FDCAN_CLK_DISABLE(); - } - - /**FDCAN2 GPIO Configuration - PB13 ------> FDCAN2_TX - PB5 ------> FDCAN2_RX - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13 | GPIO_PIN_5); - - /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ - - /* USER CODE END FDCAN2_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/gpio.c b/SAMM/Core/Src/gpio.c deleted file mode 100644 index 2711a3604..000000000 --- a/SAMM/Core/Src/gpio.c +++ /dev/null @@ -1,104 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file gpio.c - * @brief This file provides code for the configuration - * of all used GPIO pins. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "gpio.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/*----------------------------------------------------------------------------*/ -/* Configure GPIO */ -/*----------------------------------------------------------------------------*/ -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI - PC8 ------> I2C3_SCL - PC9 ------> I2C3_SDA -*/ -void MX_GPIO_Init(void) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - // HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin : PF1 */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - */ - - /*Configure GPIO pin : PB1 */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /*Configure GPIO pin : PB12 */ - /* corresponds to SPI - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PC8 PC9 */ - /* corresponds to tiretemp i2c - GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PB4 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); -} - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/SAMM/Core/Src/i2c.c b/SAMM/Core/Src/i2c.c deleted file mode 100644 index 7119f062b..000000000 --- a/SAMM/Core/Src/i2c.c +++ /dev/null @@ -1,129 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file i2c.c - * @brief This file provides code for the configuration - * of the I2C instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "i2c.h" - -/* USER CODE BEGIN 0 */ -extern uint32_t I2C_Freq; -/* USER CODE END 0 */ - -I2C_HandleTypeDef hi2c1; - -/* I2C1 init function */ -void MX_I2C1_Init(void) -{ - - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.Timing = 0x10B30F25; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { - Error_Handler(); - } - - /** I2C Fast mode Plus enable - */ - HAL_I2CEx_EnableFastModePlus(I2C_FASTMODEPLUS_I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (i2cHandle->Instance == I2C1) { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - } -} - -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) -{ - - if (i2cHandle->Instance == I2C1) { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ - - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); - - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB8-BOOT0 ------> I2C1_SCL - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8); - - /* USER CODE BEGIN I2C1_MspDeInit 1 */ - - /* USER CODE END I2C1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/main.c b/SAMM/Core/Src/main.c deleted file mode 100644 index 64aafa64f..000000000 --- a/SAMM/Core/Src/main.c +++ /dev/null @@ -1,284 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file : main.c - * @brief : Main program body - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -#include "crc.h" -#include "fdcan.h" -#include "gpio.h" -#include "i2c.h" -#include "spi.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -#include - -#include "VL53L4ED_api.h" -// #include "circularBuffer.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ -#ifdef __GNUC__ -#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) -#else -#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) -#endif -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ -PUTCHAR_PROTOTYPE -{ - ITM_SendChar(ch); - return ch; -} -// CircularBuffer *cb; -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ -// FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -void SystemClock_Config(void); -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ -/* -I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations - - still need to fully test but ideally implmentation is done - - - */ -/* USER CODE END 0 */ - -/** - * @brief The application entry point. - * @retval int - */ -int main(void) -{ - - /* USER CODE BEGIN 1 */ - // cb = circular_buffer_init(64, 68 * sizeof(uint8_t)); - /* USER CODE END 1 */ - - /* MCU Configuration--------------------------------------------------------*/ - - /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ - HAL_Init(); - - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* Configure the system clock */ - SystemClock_Config(); - - /* USER CODE BEGIN SysInit */ - - /* USER CODE END SysInit */ - - /* Initialize all configured peripherals */ - MX_GPIO_Init(); - MX_CRC_Init(); - MX_FDCAN1_Init(); - MX_FDCAN2_Init(); - MX_I2C1_Init(); - MX_SPI3_Init(); - /* USER CODE BEGIN 2 */ - - // HAL_FDCAN_Start(&hfdcan1); - // HAL_FDCAN_Start(&hfdcan2); - // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - - // static uint16_t eeMLX90640[832]; - // static paramsMLX90640 mlx90640; - // #define MLX90640_ADDRESS 0x33<<1 - // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); - - // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); - - // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); - - // MLX90640_SynchFrame(MLX90640_ADDRESS); - // MLX90640_SetRefreshRate(0x33, 0x05); - /* USER CODE END 2 */ - - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to power up the device - - uint16_t status = 0; - - uint16_t sensor_id = 0; - VL53L4ED_ResultsData_t results; - uint8_t p_data_ready; - - int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); - status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); - status = VL53L4ED_StartRanging(TOF_ID); - status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing - - while (1) { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - /* USER CODE BEGIN 3 */ - status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - if (p_data_ready) { - - /* (Mandatory) Clear HW interrupt to restart measurements */ - VL53L4ED_ClearInterrupt(TOF_ID); - - /* Read measured distance. RangeStatus = 0 means valid data */ - VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); - } else { - HAL_Delay(10); - __disable_irq(); - __enable_irq(); - } - } - /* USER CODE END 3 */ -} - -/** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) -{ - LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); - while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} - LL_PWR_EnableRange1BoostMode(); - LL_RCC_HSE_EnableBypass(); - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while (LL_RCC_HSE_IsReady() != 1) {} - - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 40, LL_RCC_PLLR_DIV_2); - LL_RCC_PLL_EnableDomain_SYS(); - LL_RCC_PLL_Enable(); - /* Wait till PLL is ready */ - while (LL_RCC_PLL_IsReady() != 1) {} - - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - /* Wait till System clock is ready */ - while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} - - /* Insure 1us transition state at intermediate medium speed clock*/ - for (__IO uint32_t i = (170 >> 1); i != 0; i--) - ; - - /* Set AHB prescaler*/ - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_SetSystemCoreClock(160000000); - - /* Update the time base */ - if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { - Error_Handler(); - } -} - -/* USER CODE BEGIN 4 */ -// void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs) -// { -// uint8_t RxData[64]; -// HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, &RxHeader_FDCAN2, RxData); -// printf("got messgae\n"); -// //circularBufferPush(cb, RxData, sizeof(RxData)); - -// } -/* USER CODE END 4 */ - -/** - * @brief Period elapsed callback in non blocking mode - * @note This function is called when TIM1 interrupt took place, inside - * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment - * a global variable "uwTick" used as application time base. - * @param htim : TIM handle - * @retval None - */ -void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) -{ - /* USER CODE BEGIN Callback 0 */ - - /* USER CODE END Callback 0 */ - if (htim->Instance == TIM1) { - HAL_IncTick(); - } - /* USER CODE BEGIN Callback 1 */ - - /* USER CODE END Callback 1 */ -} - -/** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) -{ - /* USER CODE BEGIN Error_Handler_Debug */ - /* User can add his own implementation to report the HAL error return state */ - __disable_irq(); - while (1) {} - /* USER CODE END Error_Handler_Debug */ -} - -#ifdef USE_FULL_ASSERT -/** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) -{ - /* USER CODE BEGIN 6 */ - /* User can add his own implementation to report the file name and line number, - ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ - /* USER CODE END 6 */ -} -#endif /* USE_FULL_ASSERT */ diff --git a/SAMM/Core/Src/spi.c b/SAMM/Core/Src/spi.c deleted file mode 100644 index 665ad89d5..000000000 --- a/SAMM/Core/Src/spi.c +++ /dev/null @@ -1,117 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "spi.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi3; - -/* SPI3 init function */ -void MX_SPI3_Init(void) -{ - - /* USER CODE BEGIN SPI3_Init 0 */ - - /* USER CODE END SPI3_Init 0 */ - - /* USER CODE BEGIN SPI3_Init 1 */ - - /* USER CODE END SPI3_Init 1 */ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_8BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - if (HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN SPI3_Init 2 */ - - /* USER CODE END SPI3_Init 2 */ -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - /* SPI3 clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI3_MspInit 1 */ - - /* USER CODE END SPI3_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) -{ - - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN SPI3_MspDeInit 0 */ - - /* USER CODE END SPI3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); - - /**SPI3 GPIO Configuration - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12); - - /* USER CODE BEGIN SPI3_MspDeInit 1 */ - - /* USER CODE END SPI3_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/stm32h5xx_hal_msp.c b/SAMM/Core/Src/stm32h5xx_hal_msp.c deleted file mode 100644 index c0f8bfdeb..000000000 --- a/SAMM/Core/Src/stm32h5xx_hal_msp.c +++ /dev/null @@ -1,86 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c b/SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c deleted file mode 100644 index b4332029f..000000000 --- a/SAMM/Core/Src/stm32h5xx_hal_timebase_tim.c +++ /dev/null @@ -1,121 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_hal.h" -#include "stm32h5xx_hal_tim.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM1 */ - htim1.Instance = TIM1; - - /* Initialize TIMx peripheral as follow: - - + Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - + Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - + ClockDivision = 0 - + Counter direction = Up - */ - htim1.Init.Period = (1000000U / 1000U) - 1U; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - - status = HAL_TIM_Base_Init(&htim1); - if (status == HAL_OK) { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim1); - if (status == HAL_OK) { - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } else { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); -} diff --git a/SAMM/Core/Src/stm32h5xx_it.c b/SAMM/Core/Src/stm32h5xx_it.c deleted file mode 100644 index 6c3676d49..000000000 --- a/SAMM/Core/Src/stm32h5xx_it.c +++ /dev/null @@ -1,213 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_it.c - * @brief Interrupt Service Routines. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_it.h" - -#include "main.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* Private user code ---------------------------------------------------------*/ -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -/* External variables --------------------------------------------------------*/ -extern TIM_HandleTypeDef htim1; - -/* USER CODE BEGIN EV */ - -/* USER CODE END EV */ - -/******************************************************************************/ -/* Cortex-M4 Processor Interruption and Exception Handlers */ -/******************************************************************************/ -/** - * @brief This function handles Non maskable interrupt. - */ -void NMI_Handler(void) -{ - /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ - - /* USER CODE END NonMaskableInt_IRQn 0 */ - /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ - while (1) {} - /* USER CODE END NonMaskableInt_IRQn 1 */ -} - -/** - * @brief This function handles Hard fault interrupt. - */ -void HardFault_Handler(void) -{ - /* USER CODE BEGIN HardFault_IRQn 0 */ - - /* USER CODE END HardFault_IRQn 0 */ - while (1) { - /* USER CODE BEGIN W1_HardFault_IRQn 0 */ - /* USER CODE END W1_HardFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Memory management fault. - */ -void MemManage_Handler(void) -{ - /* USER CODE BEGIN MemoryManagement_IRQn 0 */ - - /* USER CODE END MemoryManagement_IRQn 0 */ - while (1) { - /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ - /* USER CODE END W1_MemoryManagement_IRQn 0 */ - } -} - -/** - * @brief This function handles Prefetch fault, memory access fault. - */ -void BusFault_Handler(void) -{ - /* USER CODE BEGIN BusFault_IRQn 0 */ - - /* USER CODE END BusFault_IRQn 0 */ - while (1) { - /* USER CODE BEGIN W1_BusFault_IRQn 0 */ - /* USER CODE END W1_BusFault_IRQn 0 */ - } -} - -/** - * @brief This function handles Undefined instruction or illegal state. - */ -void UsageFault_Handler(void) -{ - /* USER CODE BEGIN UsageFault_IRQn 0 */ - - /* USER CODE END UsageFault_IRQn 0 */ - while (1) { - /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ - /* USER CODE END W1_UsageFault_IRQn 0 */ - } -} - -/** - * @brief This function handles System service call via SWI instruction. - */ -void SVC_Handler(void) -{ - /* USER CODE BEGIN SVCall_IRQn 0 */ - - /* USER CODE END SVCall_IRQn 0 */ - /* USER CODE BEGIN SVCall_IRQn 1 */ - - /* USER CODE END SVCall_IRQn 1 */ -} - -/** - * @brief This function handles Debug monitor. - */ -void DebugMon_Handler(void) -{ - /* USER CODE BEGIN DebugMonitor_IRQn 0 */ - - /* USER CODE END DebugMonitor_IRQn 0 */ - /* USER CODE BEGIN DebugMonitor_IRQn 1 */ - - /* USER CODE END DebugMonitor_IRQn 1 */ -} - -/** - * @brief This function handles Pendable request for system service. - */ -void PendSV_Handler(void) -{ - /* USER CODE BEGIN PendSV_IRQn 0 */ - - /* USER CODE END PendSV_IRQn 0 */ - /* USER CODE BEGIN PendSV_IRQn 1 */ - - /* USER CODE END PendSV_IRQn 1 */ -} - -/** - * @brief This function handles System tick timer. - */ -void SysTick_Handler(void) -{ - /* USER CODE BEGIN SysTick_IRQn 0 */ - - /* USER CODE END SysTick_IRQn 0 */ - - /* USER CODE BEGIN SysTick_IRQn 1 */ - - /* USER CODE END SysTick_IRQn 1 */ -} - -/******************************************************************************/ -/* STM32G4xx Peripheral Interrupt Handlers */ -/* Add here the Interrupt Handlers for the used peripherals. */ -/* For the available peripheral interrupt handler names, */ -/* please refer to the startup file (startup_stm32g4xx.s). */ -/******************************************************************************/ - -/** - * @brief This function handles TIM1 update interrupt and TIM16 global interrupt. - */ -void TIM1_UP_TIM16_IRQHandler(void) -{ - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */ - - /* USER CODE END TIM1_UP_TIM16_IRQn 0 */ - HAL_TIM_IRQHandler(&htim1); - /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */ - - /* USER CODE END TIM1_UP_TIM16_IRQn 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/Core/Src/syscalls.c b/SAMM/Core/Src/syscalls.c deleted file mode 100644 index a59a7d089..000000000 --- a/SAMM/Core/Src/syscalls.c +++ /dev/null @@ -1,168 +0,0 @@ -/** - ****************************************************************************** - * @file syscalls.c - * @author Auto-generated by STM32CubeMX - * @brief Minimal System calls file - * - * For more information about which c-functions - * need which of these lowlevel functions - * please consult the Newlib libc-manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2020-2024 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. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* Variables */ -extern int __io_putchar(int ch) __attribute__((weak)); -extern int __io_getchar(void) __attribute__((weak)); - -char *__env[1] = {0}; -char **environ = __env; - -/* Functions */ -void initialise_monitor_handles() {} - -int _getpid(void) -{ - return 1; -} - -int _kill(int pid, int sig) -{ - (void)pid; - (void)sig; - errno = EINVAL; - return -1; -} - -void _exit(int status) -{ - _kill(status, -1); - while (1) {} /* Make sure we hang here */ -} - -__attribute__((weak)) int _read(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) { - *ptr++ = __io_getchar(); - } - - return len; -} - -__attribute__((weak)) int _write(int file, char *ptr, int len) -{ - (void)file; - int DataIdx; - - for (DataIdx = 0; DataIdx < len; DataIdx++) { - __io_putchar(*ptr++); - } - return len; -} - -int _close(int file) -{ - (void)file; - return -1; -} - -int _fstat(int file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _isatty(int file) -{ - (void)file; - return 1; -} - -int _lseek(int file, int ptr, int dir) -{ - (void)file; - (void)ptr; - (void)dir; - return 0; -} - -int _open(char *path, int flags, ...) -{ - (void)path; - (void)flags; - /* Pretend like we always fail */ - return -1; -} - -int _wait(int *status) -{ - (void)status; - errno = ECHILD; - return -1; -} - -int _unlink(char *name) -{ - (void)name; - errno = ENOENT; - return -1; -} - -int _times(struct tms *buf) -{ - (void)buf; - return -1; -} - -int _stat(char *file, struct stat *st) -{ - (void)file; - st->st_mode = S_IFCHR; - return 0; -} - -int _link(char *old, char *new) -{ - (void)old; - (void)new; - errno = EMLINK; - return -1; -} - -int _fork(void) -{ - errno = EAGAIN; - return -1; -} - -int _execve(char *name, char **argv, char **env) -{ - (void)name; - (void)argv; - (void)env; - errno = ENOMEM; - return -1; -} diff --git a/SAMM/Core/Src/sysmem.c b/SAMM/Core/Src/sysmem.c deleted file mode 100644 index 00c397937..000000000 --- a/SAMM/Core/Src/sysmem.c +++ /dev/null @@ -1,77 +0,0 @@ -/** - ****************************************************************************** - * @file sysmem.c - * @author Generated by STM32CubeMX - * @brief System Memory calls file - * - * For more information about which C functions - * need which of these lowlevel functions - * please consult the newlib libc manual - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ - -/* Includes */ -#include -#include - -/** - * Pointer to the current high watermark of the heap usage - */ -static uint8_t *__sbrk_heap_end = NULL; - -/** - * @brief _sbrk() allocates memory to the newlib heap and is used by malloc - * and others from the C library - * - * @verbatim - * ############################################################################ - * # .data # .bss # newlib heap # MSP stack # - * # # # # Reserved by _Min_Stack_Size # - * ############################################################################ - * ^-- RAM start ^-- _end _estack, RAM end --^ - * @endverbatim - * - * This implementation starts allocating at the '_end' linker symbol - * The '_Min_Stack_Size' linker symbol reserves a memory for the MSP stack - * The implementation considers '_estack' linker symbol to be RAM end - * NOTE: If the MSP stack, at any point during execution, grows larger than the - * reserved size, please increase the '_Min_Stack_Size'. - * - * @param incr Memory size - * @return Pointer to allocated memory - */ -void *_sbrk(ptrdiff_t incr) -{ - extern uint8_t _end; /* Symbol defined in the linker script */ - extern uint8_t _estack; /* Symbol defined in the linker script */ - extern uint32_t _Min_Stack_Size; /* Symbol defined in the linker script */ - const uint32_t stack_limit = (uint32_t)&_estack - (uint32_t)&_Min_Stack_Size; - const uint8_t *max_heap = (uint8_t *)stack_limit; - uint8_t *prev_heap_end; - - /* Initialize heap end at first call */ - if (NULL == __sbrk_heap_end) { - __sbrk_heap_end = &_end; - } - - /* Protect heap from growing into the reserved MSP stack */ - if (__sbrk_heap_end + incr > max_heap) { - errno = ENOMEM; - return (void *)-1; - } - - prev_heap_end = __sbrk_heap_end; - __sbrk_heap_end += incr; - - return (void *)prev_heap_end; -} diff --git a/SAMM/Core/Src/system_stm32h5xx.c b/SAMM/Core/Src/system_stm32h5xx.c deleted file mode 100644 index 5aa62f144..000000000 --- a/SAMM/Core/Src/system_stm32h5xx.c +++ /dev/null @@ -1,284 +0,0 @@ -/** - ****************************************************************************** - * @file system_stm32h5xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32g4xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * After each device reset the HSI (16 MHz) is used as system clock source. - * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to - * configure the system clock before to branch to main program. - * - * This file configures the system clock as follows: - *============================================================================= - *----------------------------------------------------------------------------- - * System Clock source | HSI - *----------------------------------------------------------------------------- - * SYSCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * HCLK(Hz) | 16000000 - *----------------------------------------------------------------------------- - * AHB Prescaler | 1 - *----------------------------------------------------------------------------- - * APB1 Prescaler | 1 - *----------------------------------------------------------------------------- - * APB2 Prescaler | 1 - *----------------------------------------------------------------------------- - * PLL_M | 1 - *----------------------------------------------------------------------------- - * PLL_N | 16 - *----------------------------------------------------------------------------- - * PLL_P | 7 - *----------------------------------------------------------------------------- - * PLL_Q | 2 - *----------------------------------------------------------------------------- - * PLL_R | 2 - *----------------------------------------------------------------------------- - * Require 48MHz for RNG | Disabled - *----------------------------------------------------------------------------- - *============================================================================= - ****************************************************************************** - * @attention - * - * Copyright (c) 2019 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. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32h5xx_system - * @{ - */ - -/** @addtogroup STM32H5xx_System_Private_Includes - * @{ - */ - -#include "stm32g4xx.h" - -#if !defined(HSE_VALUE) -#define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSI_VALUE) -#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32H5xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32H5xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ -/* Note: Following vector table addresses must be defined in line with linker - configuration. */ -/*!< Uncomment the following line if you need to relocate the vector table - anywhere in Flash or Sram, else the vector table is kept at the automatic - remap of boot address selected */ -#define USER_VECT_TAB_ADDRESS - -#if defined(USER_VECT_TAB_ADDRESS) -/*!< Uncomment the following line if you need to relocate your vector Table - in Sram else user remap will be done in Flash. */ -/* #define VECT_TAB_SRAM */ -#if defined(VECT_TAB_SRAM) -#define VECT_TAB_BASE_ADDRESS \ - SRAM_BASE /*!< Vector Table base address field. \ - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET \ - 0x00000000U /*!< Vector Table base offset field. \ - This value must be a multiple of 0x200. */ -#else -#define VECT_TAB_BASE_ADDRESS \ - FLASH_BASE /*!< Vector Table base address field. \ - This value must be a multiple of 0x200. */ -#define VECT_TAB_OFFSET \ - 0x00000000U /*!< Vector Table base offset field. \ - This value must be a multiple of 0x200. */ -#endif /* VECT_TAB_SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ - /******************************************************************************/ - /** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32G4xx_System_Private_Variables - * @{ - */ -/* The SystemCoreClock variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. -*/ -uint32_t SystemCoreClock = HSI_VALUE; - -const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; -const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; - -/** - * @} - */ - -/** @addtogroup STM32H5xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32H5xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system. - * @param None - * @retval None - */ - -void SystemInit(void) -{ -/* FPU settings ------------------------------------------------------------*/ -#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << (10 * 2)) | (3UL << (11 * 2))); /* set CP10 and CP11 Full Access */ -#endif - - /* Configure the Vector Table location add offset address ------------------*/ -#if defined(USER_VECT_TAB_ADDRESS) - SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#endif /* USER_VECT_TAB_ADDRESS */ -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (**) HSI_VALUE is a constant defined in stm32h5xx_hal.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (***) HSE_VALUE is a constant defined in stm32h5xx_hal.h file (default value - * 24 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp, pllvco, pllr, pllsource, pllm; - - /* Get SYSCLK source -------------------------------------------------------*/ - switch (RCC->CFGR & RCC_CFGR_SWS) { - case 0x04: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - - case 0x08: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - - case 0x0C: /* PLL used as system clock source */ - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN - SYSCLK = PLL_VCO / PLLR - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); - pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U; - if (pllsource == 0x02UL) /* HSI used as PLL clock source */ - { - pllvco = (HSI_VALUE / pllm); - } else /* HSE used as PLL clock source */ - { - pllvco = (HSE_VALUE / pllm); - } - pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); - pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; - SystemCoreClock = pllvco / pllr; - break; - - default: - break; - } - /* Compute HCLK clock frequency --------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK clock frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/SAMM/IMU/Inc/IMU/bmi323.h b/SAMM/IMU/Inc/bmi323.h similarity index 99% rename from SAMM/IMU/Inc/IMU/bmi323.h rename to SAMM/IMU/Inc/bmi323.h index 9fd308cf2..d2059fad9 100644 --- a/SAMM/IMU/Inc/IMU/bmi323.h +++ b/SAMM/IMU/Inc/bmi323.h @@ -6,6 +6,7 @@ #include "main.h" #include "spi.h" #include "stm32h5xx.h" +#include // BMI323 register defines diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index c80331abe..8a0bac786 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -1,8 +1,7 @@ -#include "bmi323.h" - #include -#include "stm32h574xx.h" +#include "bmi323.h" +#include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" // init spi port before calling this function diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index eb5e952f8..a38272a86 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -34,8 +34,6 @@ target_sources( Src/mag.c Src/main.c Src/spi.c - Src/stm32h5xx_hal_msp.c - Src/stm32h5xx_hal_timebase_tim.c Src/stm32h5xx_it.c # TODO ) diff --git a/SAMM/SAMM_Mag/Inc/can_cfg.h b/SAMM/SAMM_Mag/Inc/can_cfg.h new file mode 100644 index 000000000..37703a8c5 --- /dev/null +++ b/SAMM/SAMM_Mag/Inc/can_cfg.h @@ -0,0 +1,10 @@ +#ifndef CAN_CFG_H +#define CAN_CFG_H + +#define USECAN1 +#define TX_BUFFER_1_SIZE 16 + +#define USECAN2 +#define TX_BUFFER_2_SIZE 16 + +#endif diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 75434a64e..18b74e920 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -26,10 +26,16 @@ uint8_t mag_calib_abort(mag *mag_dev); float mag_read_encoder_angle(mag *mag_dev); +bool mag_read_device_status(mag *mag_dev); + +float mag_read_temp(mag *mag_dev); + bool check_status(mag *mag_dev); uint16_t mag_read_turns(mag *mag_dev); float mag_read_HANG(mag *mag_dev); +void mag_write_error(mag *mag_dev); + #endif diff --git a/SAMM/SAMM_Mag/Inc/spi.h b/SAMM/SAMM_Mag/Inc/spi.h index db79d4558..44fa80cf5 100644 --- a/SAMM/SAMM_Mag/Inc/spi.h +++ b/SAMM/SAMM_Mag/Inc/spi.h @@ -1,9 +1,9 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file spi.h - * @brief This file contains all the function prototypes for - * the spi.c file + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. ****************************************************************************** * @attention * @@ -17,36 +17,149 @@ ****************************************************************************** */ /* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __SPI_H__ -#define __SPI_H__ +/* Includes ------------------------------------------------------------------*/ -#ifdef __cplusplus -extern "C" { -#endif -/* Includes ------------------------------------------------------------------*/ -#include "main.h" +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi3; -/* USER CODE BEGIN Includes */ +/* SPI1 Init function -> used for IMU */ +void MX_SPI1_Init(void) +{ -/* USER CODE END Includes */ + /* USER CODE BEGIN spi1_Init 0 */ -extern SPI_HandleTypeDef hspi3; + /* USER CODE END spi1_Init 0 */ -/* USER CODE BEGIN Private defines */ + /* USER CODE BEGIN spi1_Init 1 */ + + /* USER CODE END spi1_Init 1 */ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_16BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi1_Init 2 */ + + /* USER CODE END spi1_Init 2 */ +} -/* USER CODE END Private defines */ +/* SPI3 init function -> used for MAG encoder */ +void MX_SPI3_Init(void) +{ -void MX_SPI1_Init(void); -void MX_SPI3_Init(void); + /* USER CODE BEGIN spi3_Init 0 */ -/* USER CODE BEGIN Prototypes */ + /* USER CODE END spi3_Init 0 */ -/* USER CODE END Prototypes */ + /* USER CODE BEGIN spi3_Init 1 */ -#ifdef __cplusplus + /* USER CODE END spi3_Init 1 */ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_16BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN spi3_Init 2 */ + + /* USER CODE END spi3_Init 2 */ } -#endif -#endif /* __SPI_H__ */ +void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (spiHandle->Instance == SPI3) { + /* USER CODE BEGIN spi3_MspInit 0 */ + + /* USER CODE END spi3_MspInit 0 */ + /* spi3 clock enable */ + __HAL_RCC_spi3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**spi3 GPIO Configuration + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN spi3_MspInit 1 */ + + /* USER CODE END spi3_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) +{ + + if (spiHandle->Instance == SPI3) { + /* USER CODE BEGIN spi3_MspDeInit 0 */ + + /* USER CODE END spi3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_spi3_CLK_DISABLE(); + + /**spi3 GPIO Configuration + PB1 ------> SPI3_SCK + PB0 ------> SPI3_MISO + PB2 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + + /* USER CODE BEGIN spi3_MspDeInit 1 */ + + /* USER CODE END spi3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h index 4a8ddf5a6..03f6fef64 100644 --- a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h @@ -115,8 +115,8 @@ extern "C" { * (when HSE is used as system clock source, directly or through the PLL). */ #if !defined(HSE_VALUE) -#define HSE_VALUE (25000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ +#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ #if !defined(HSE_STARTUP_TIMEOUT) #define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ @@ -136,7 +136,7 @@ extern "C" { * (when HSI is used as system clock source, directly or through the PLL). */ #if !defined(HSI_VALUE) -#define HSI_VALUE (64000000UL) /*!< Value of the Internal oscillator in Hz*/ +#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ #endif /* HSI_VALUE */ /** diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index f60741a5e..3fc999982 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -77,7 +77,7 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = (data & mag_msb) >> 8 | ((uint16_t(reg) & mag_addr_mask) << 8) | 0x4000; mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; // increment from 0x22 to 0x23 for lsb - uint16_t lsb = (data & mag_lsb) | ((uint16_t(reg) & mag_addr_mask) << 8)) | 0x4000; + uint16_t lsb = ((data & mag_lsb) | ((uint16_t(reg) & mag_addr_mask) << 8)) | 0x4000; mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; } @@ -144,7 +144,7 @@ bool check_status(mag *mag_dev) // fix-me add LOGOMATIC - return true; + return (voltage_error && magnetic_err && angle_error && invalid_spi_len && temp_out_of_range && turn_counter_saturated && excessive_magnet_vel); } int16_t mag_read_turns(mag *mag_dev) @@ -160,8 +160,12 @@ int16_t mag_read_turns(mag *mag_dev) float mag_read_HANG(mag *mag_dev) { int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value - return ((uint16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) + return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } // Address 0x1E:0x1F (CTRL)—Device Control +void mag_write_error(mag *mag_dev) { + mag_write(mag_dev, 0x1E, 0x0300); + return; +} // FIXME: add error flag handling diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 802b92bdd..58b01456b 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -176,11 +176,15 @@ int main(void) float temp = mag_read_temp(mag_dev); float angle = mag_read_encoder_angle(mag_dev); int16_t turns = mag_read_turns(mag_dev); - float hang = mag_read_HANG(mag_dev); - check_status(mag_dev); + //float hang = mag_read_HANG(mag_dev); + bool bad = check_status(mag_dev); printf("Temperature is %f\n", temp); printf("Angle is %f\n", angle); - printf("Number of turns is ") + printf("Number of turns is %d\n", turns); + if(!bad){ + printf("67 69 420 something is cooked"); + mag_write_error(mag_dev); + } } /* USER CODE END 3 */ } diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c deleted file mode 100644 index 4257acb5a..000000000 --- a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_msp.c +++ /dev/null @@ -1,86 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - // there should be an error here- like in TOF - __HAL_RCC_SYSCFG_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c b/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c deleted file mode 100644 index c63b85dfd..000000000 --- a/SAMM/SAMM_Mag/Src/stm32h5xx_hal_timebase_tim.c +++ /dev/null @@ -1,120 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_hal.h" -#include "stm32h5xx_hal_tim.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM1 */ - htim1.Instance = TIM1; - - /* Initialize TIMx peripheral as follow: - * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - * ClockDivision = 0 - * Counter direction = Up - */ - htim1.Init.Period = (1000000U / 1000U) - 1U; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - - status = HAL_TIM_Base_Init(&htim1); - if (status == HAL_OK) { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim1); - if (status == HAL_OK) { - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } else { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); -} diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index 7461b5f1f..51c4da134 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -34,8 +34,6 @@ target_sources( Src/i2c.c Src/main.c Src/spi.c - Src/stm32h5xx_hal_msp.c - Src/stm32h5xx_hal_timebase_tim.c Src/stm32h5xx_it.c # TODO ) diff --git a/SAMM/SAMM_TOF/Inc/can_cfg.h b/SAMM/SAMM_TOF/Inc/can_cfg.h new file mode 100644 index 000000000..37703a8c5 --- /dev/null +++ b/SAMM/SAMM_TOF/Inc/can_cfg.h @@ -0,0 +1,10 @@ +#ifndef CAN_CFG_H +#define CAN_CFG_H + +#define USECAN1 +#define TX_BUFFER_1_SIZE 16 + +#define USECAN2 +#define TX_BUFFER_2_SIZE 16 + +#endif diff --git a/SAMM/SAMM_TOF/Inc/i2c.h b/SAMM/SAMM_TOF/Inc/i2c.h index 64f5543e6..31bd4ef1d 100644 --- a/SAMM/SAMM_TOF/Inc/i2c.h +++ b/SAMM/SAMM_TOF/Inc/i2c.h @@ -32,7 +32,6 @@ extern "C" { /* USER CODE END Includes */ -extern I2C_HandleTypeDef hi2c1; /* USER CODE BEGIN Private defines */ diff --git a/SAMM/SAMM_TOF/Inc/spi.h b/SAMM/SAMM_TOF/Inc/spi.h index db79d4558..795f9dd81 100644 --- a/SAMM/SAMM_TOF/Inc/spi.h +++ b/SAMM/SAMM_TOF/Inc/spi.h @@ -32,14 +32,13 @@ extern "C" { /* USER CODE END Includes */ -extern SPI_HandleTypeDef hspi3; +extern SPI_HandleTypeDef hspi1; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ void MX_SPI1_Init(void); -void MX_SPI3_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index 7b42d9281..03f6fef64 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -42,7 +42,7 @@ extern "C" { #define HAL_CRC_MODULE_ENABLED /*#define HAL_CRYP_MODULE_ENABLED */ /*#define HAL_DAC_MODULE_ENABLED */ -/*#define HAL_FDCAN_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED /*#define HAL_FMAC_MODULE_ENABLED */ /*#define HAL_HRTIM_MODULE_ENABLED */ /*#define HAL_IRDA_MODULE_ENABLED */ diff --git a/SAMM/SAMM_TOF/Src/gpio.c b/SAMM/SAMM_TOF/Src/gpio.c index 1d447103f..63ac084a3 100644 --- a/SAMM/SAMM_TOF/Src/gpio.c +++ b/SAMM/SAMM_TOF/Src/gpio.c @@ -31,66 +31,33 @@ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI - PC8 ------> I2C3_SCL - PC9 ------> I2C3_SDA -*/ +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ void MX_GPIO_Init(void) { - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET); - - /*Configure GPIO pin : PF1 -> ToF not being used */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PB1 PB4 */ - GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PB12 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PC8 PC9 */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - */ + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; +/* USER CODE BEGIN MX_GPIO_Init_1 */ +/* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + + /**/ + LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_10); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +/* USER CODE BEGIN MX_GPIO_Init_2 */ +/* USER CODE END MX_GPIO_Init_2 */ } - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c index c1dfe13aa..2f34ce0cd 100644 --- a/SAMM/SAMM_TOF/Src/i2c.c +++ b/SAMM/SAMM_TOF/Src/i2c.c @@ -24,106 +24,65 @@ extern uint32_t I2C_Freq; /* USER CODE END 0 */ -I2C_HandleTypeDef hi2c1; - -/* I2C1 init function */ +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.Timing = 0x10920C1D; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { - Error_Handler(); - } - - /** I2C Fast mode Plus enable - */ - LL_I2C_EnableFastModePlus(I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ + /* USER CODE BEGIN I2C1_Init 0 */ - /* USER CODE END I2C1_Init 2 */ -} - -void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (i2cHandle->Instance == I2C1) { - /* USER CODE BEGIN I2C1_MspInit 0 */ + /* USER CODE END I2C1_Init 0 */ - /* USER CODE END I2C1_MspInit 0 */ - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + LL_I2C_InitTypeDef I2C_InitStruct = {0}; - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB6-BOOT0 ------> I2C1_SCL - */ - GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - /* I2C1 clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - /* USER CODE END I2C1_MspInit 1 */ - } -} + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); -void HAL_I2C_MspDeInit(I2C_HandleTypeDef *i2cHandle) -{ + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); - if (i2cHandle->Instance == I2C1) { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ + /* USER CODE BEGIN I2C1_Init 1 */ - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); + /* USER CODE END I2C1_Init 1 */ - /**I2C1 GPIO Configuration - PB7 ------> I2C1_SDA - PB6-BOOT0 ------> I2C1_SCL - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + /** I2C Initialization + */ + LL_I2C_EnableAutoEndMode(I2C1); + LL_I2C_DisableOwnAddress2(I2C1); + LL_I2C_DisableGeneralCall(I2C1); + LL_I2C_EnableClockStretching(I2C1); + I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; + I2C_InitStruct.Timing = 0x00100413; + I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; + I2C_InitStruct.DigitalFilter = 0; + I2C_InitStruct.OwnAddress1 = 0; + I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; + I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; + LL_I2C_Init(I2C1, &I2C_InitStruct); + LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); + /** I2C Fast mode Plus enable + */ + LL_I2C_EnableFastModePlus(I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ - /* USER CODE BEGIN I2C1_MspDeInit 1 */ + /* USER CODE END I2C1_Init 2 */ - /* USER CODE END I2C1_MspDeInit 1 */ - } } - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 31d4bcf10..d7ba11959 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -30,14 +30,14 @@ #include #include "../Extras/VL53L4ED/VL53L4ED_api.h" -#include "IMU/bmi323.h" +#include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ -#define BMI323_CS_GPIO_Port GPIOA // Uncommented 4/16/26 to fix reference errors -#define BMI323_CS_Pin GPIO_PIN_4 // Uncommented 4/16/26 to fix reference errors +#define BMI323_CS_GPIO_Port GPIOA +#define BMI323_CS_Pin GPIO_PIN_4 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -74,8 +74,6 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ /* -I2C2 - is meant for thermal sensor MLX90640 and is ran using DMA to offload CPU for calculations - - still need to fully test but ideally implmentation is done */ @@ -114,7 +112,7 @@ int main(void) // MX_FDCAN1_Init(); // MX_FDCAN2_Init(); MX_I2C1_Init(); - MX_SPI1_Init(); // TODO: change all instances of spi1 -> SPI1 + MX_SPI1_Init(); /* USER CODE BEGIN 2 */ @@ -124,7 +122,7 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, &BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: + bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index f11858f55..5f2675eeb 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -25,9 +25,12 @@ /* USER CODE END 0 */ SPI_HandleTypeDef hspi1; -SPI_HandleTypeDef hspi3; -/* SPI1 Init function -> used for IMU */ +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ void MX_SPI1_Init(void) { @@ -41,15 +44,15 @@ void MX_SPI1_Init(void) hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_16BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCPolynomial = 0x13; hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; if (HAL_SPI_Init(&hspi1) != HAL_OK) { @@ -59,107 +62,3 @@ void MX_SPI1_Init(void) /* USER CODE END spi1_Init 2 */ } - -/* SPI3 init function -> used for MAG encoder */ -void MX_SPI3_Init(void) -{ - - /* USER CODE BEGIN spi3_Init 0 */ - - /* USER CODE END spi3_Init 0 */ - - /* USER CODE BEGIN spi3_Init 1 */ - - /* USER CODE END spi3_Init 1 */ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_16BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi3_Init 2 */ - - /* USER CODE END spi3_Init 2 */ -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN spi3_MspInit 0 */ - - /* USER CODE END spi3_MspInit 0 */ - /* spi3 clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN spi3_MspInit 1 */ - - /* USER CODE END spi3_MspInit 1 */ - } -} - -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) -{ - - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN spi3_MspDeInit 0 */ - - /* USER CODE END spi3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); - - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - - /* USER CODE BEGIN spi3_MspDeInit 1 */ - - /* USER CODE END spi3_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c deleted file mode 100644 index 64d68abdf..000000000 --- a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_msp.c +++ /dev/null @@ -1,87 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32g4xx_hal_msp.c - * @brief This file provides code for the MSP Initialization - * and de-Initialization codes. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN TD */ - -/* USER CODE END TD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN Define */ - -/* USER CODE END Define */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN Macro */ - -/* USER CODE END Macro */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN PFP */ - -/* USER CODE END PFP */ - -/* External functions --------------------------------------------------------*/ -/* USER CODE BEGIN ExternalFunctions */ - -/* USER CODE END ExternalFunctions */ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ -/** - * Initializes the Global MSP. - */ -void HAL_MspInit(void) -{ - - /* USER CODE BEGIN MspInit 0 */ - - /* USER CODE END MspInit 0 */ - - //__HAL_RCC_SYS_CFG_CLK_ENABLE(); - __HAL_RCC_SBS_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral - */ - HAL_PWREx_DisableUCPDDeadBattery(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c b/SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c deleted file mode 100644 index c63b85dfd..000000000 --- a/SAMM/SAMM_TOF/Src/stm32h5xx_hal_timebase_tim.c +++ /dev/null @@ -1,120 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32h5xx_hal_timebase_tim.c - * @brief HAL time base based on the hardware TIM. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_hal.h" -#include "stm32h5xx_hal_tim.h" - -/* Private typedef -----------------------------------------------------------*/ -/* Private define ------------------------------------------------------------*/ -/* Private macro -------------------------------------------------------------*/ -/* Private variables ---------------------------------------------------------*/ -TIM_HandleTypeDef htim1; -/* Private function prototypes -----------------------------------------------*/ -/* Private functions ---------------------------------------------------------*/ - -/** - * @brief This function configures the TIM1 as a time base source. - * The time source is configured to have 1ms time base with a dedicated - * Tick interrupt priority. - * @note This function is called automatically at the beginning of program after - * reset by HAL_Init() or at any time when clock is configured, by HAL_RCC_ClockConfig(). - * @param TickPriority: Tick interrupt priority. - * @retval HAL status - */ -HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) -{ - RCC_ClkInitTypeDef clkconfig; - uint32_t uwTimclock = 0; - uint32_t uwPrescalerValue = 0; - uint32_t pFLatency; - - HAL_StatusTypeDef status; - - /* Enable TIM1 clock */ - __HAL_RCC_TIM1_CLK_ENABLE(); - - /* Get clock configuration */ - HAL_RCC_GetClockConfig(&clkconfig, &pFLatency); - - /* Compute TIM1 clock */ - uwTimclock = HAL_RCC_GetPCLK2Freq(); - - /* Compute the prescaler value to have TIM1 counter clock equal to 1MHz */ - uwPrescalerValue = (uint32_t)((uwTimclock / 1000000U) - 1U); - - /* Initialize TIM1 */ - htim1.Instance = TIM1; - - /* Initialize TIMx peripheral as follow: - * Period = [(TIM1CLK/1000) - 1]. to have a (1/1000) s time base. - * Prescaler = (uwTimclock/1000000 - 1) to have a 1MHz counter clock. - * ClockDivision = 0 - * Counter direction = Up - */ - htim1.Init.Period = (1000000U / 1000U) - 1U; - htim1.Init.Prescaler = uwPrescalerValue; - htim1.Init.ClockDivision = 0; - htim1.Init.CounterMode = TIM_COUNTERMODE_UP; - - status = HAL_TIM_Base_Init(&htim1); - if (status == HAL_OK) { - /* Start the TIM time Base generation in interrupt mode */ - status = HAL_TIM_Base_Start_IT(&htim1); - if (status == HAL_OK) { - /* Enable the TIM1 global Interrupt */ - HAL_NVIC_EnableIRQ(TIM1_UP_TIM16_IRQn); - /* Configure the SysTick IRQ priority */ - if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { - /* Configure the TIM IRQ priority */ - HAL_NVIC_SetPriority(TIM1_UP_TIM16_IRQn, TickPriority, 0U); - uwTickPrio = TickPriority; - } else { - status = HAL_ERROR; - } - } - } - - /* Return function status */ - return status; -} - -/** - * @brief Suspend Tick increment. - * @note Disable the tick increment by disabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_SuspendTick(void) -{ - /* Disable TIM1 update Interrupt */ - __HAL_TIM_DISABLE_IT(&htim1, TIM_IT_UPDATE); -} - -/** - * @brief Resume Tick increment. - * @note Enable the tick increment by Enabling TIM1 update interrupt. - * @param None - * @retval None - */ -void HAL_ResumeTick(void) -{ - /* Enable TIM1 Update interrupt */ - __HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE); -} From b18ad72b0285c9df3525dd8ce326140d1ef85485 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 05:02:45 +0000 Subject: [PATCH 043/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/IMU/Inc/bmi323.h | 3 +- SAMM/IMU/Src/bmi323.c | 3 +- SAMM/SAMM_Mag/Inc/spi.h | 1 - SAMM/SAMM_Mag/Src/mag.c | 14 ++--- SAMM/SAMM_Mag/Src/main.c | 8 +-- SAMM/SAMM_TOF/Inc/i2c.h | 1 - SAMM/SAMM_TOF/Inc/main.h | 17 +++--- SAMM/SAMM_TOF/Src/gpio.c | 52 +++++++++--------- SAMM/SAMM_TOF/Src/i2c.c | 91 ++++++++++++++++--------------- SAMM/SAMM_TOF/Src/main.c | 113 +++++++++++++++++---------------------- SAMM/SAMM_TOF/Src/spi.c | 8 +-- 11 files changed, 148 insertions(+), 163 deletions(-) diff --git a/SAMM/IMU/Inc/bmi323.h b/SAMM/IMU/Inc/bmi323.h index d2059fad9..1a6e727a1 100644 --- a/SAMM/IMU/Inc/bmi323.h +++ b/SAMM/IMU/Inc/bmi323.h @@ -3,10 +3,11 @@ // includes +#include + #include "main.h" #include "spi.h" #include "stm32h5xx.h" -#include // BMI323 register defines diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 8a0bac786..dfd34953c 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -1,6 +1,7 @@ +#include "bmi323.h" + #include -#include "bmi323.h" #include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" diff --git a/SAMM/SAMM_Mag/Inc/spi.h b/SAMM/SAMM_Mag/Inc/spi.h index 44fa80cf5..34e39fc22 100644 --- a/SAMM/SAMM_Mag/Inc/spi.h +++ b/SAMM/SAMM_Mag/Inc/spi.h @@ -19,7 +19,6 @@ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ - /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 3fc999982..88598a55c 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -98,14 +98,13 @@ float mag_read_encoder_angle(mag *mag_dev) // read bit 0 AOK [0] bool mag_read_device_status(mag *mag_dev) { - uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status - return read[0]; // read aok + uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status + return read[0]; // read aok } - float mag_read_temp(mag *mag_dev) { - uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register + uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register return ((uint16_t)(read_temp & 0x0FFF) / 8.0 + 25); // Mask to 12 bits (valid temp data) } @@ -150,7 +149,7 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_angle & 0x0FFF)); // Mask to 12 bits (valid angle data) + return ((int16_t)(read_angle & 0x0FFF)); // Mask to 12 bits (valid angle data) } // Address 0x24:0x25 (ERR)—Device Error Flags @@ -159,12 +158,13 @@ int16_t mag_read_turns(mag *mag_dev) // Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) float mag_read_HANG(mag *mag_dev) { - int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } // Address 0x1E:0x1F (CTRL)—Device Control -void mag_write_error(mag *mag_dev) { +void mag_write_error(mag *mag_dev) +{ mag_write(mag_dev, 0x1E, 0x0300); return; } diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 58b01456b..64aa0f45b 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -127,8 +127,8 @@ int main(void) // HAL_Delay(1); // Short delay after mode switch if (mag_init() != HAL_OK) { - printf("MAG initialization failed!\r\n"); - Error_Handler(); + printf("MAG initialization failed!\r\n"); + Error_Handler(); } // static uint16_t eeMLX90640[832]; @@ -176,12 +176,12 @@ int main(void) float temp = mag_read_temp(mag_dev); float angle = mag_read_encoder_angle(mag_dev); int16_t turns = mag_read_turns(mag_dev); - //float hang = mag_read_HANG(mag_dev); + // float hang = mag_read_HANG(mag_dev); bool bad = check_status(mag_dev); printf("Temperature is %f\n", temp); printf("Angle is %f\n", angle); printf("Number of turns is %d\n", turns); - if(!bad){ + if (!bad) { printf("67 69 420 something is cooked"); mag_write_error(mag_dev); } diff --git a/SAMM/SAMM_TOF/Inc/i2c.h b/SAMM/SAMM_TOF/Inc/i2c.h index 31bd4ef1d..a472c8bfe 100644 --- a/SAMM/SAMM_TOF/Inc/i2c.h +++ b/SAMM/SAMM_TOF/Inc/i2c.h @@ -32,7 +32,6 @@ extern "C" { /* USER CODE END Includes */ - /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/SAMM_TOF/Inc/main.h index 85ef7fa7f..7fe2de1cd 100644 --- a/SAMM/SAMM_TOF/Inc/main.h +++ b/SAMM/SAMM_TOF/Inc/main.h @@ -27,25 +27,24 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ -#include "stm32h5xx_hal.h" #include "stm32h5xx.h" +#include "stm32h5xx_hal.h" #include "stm32h5xx_hal_dma.h" #include "stm32h5xx_hal_i2c.h" #include "stm32h5xx_hal_rcc.h" +#include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" +#include "stm32h5xx_ll_crs.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_gpio.h" #include "stm32h5xx_ll_i2c.h" +#include "stm32h5xx_ll_lpuart.h" #include "stm32h5xx_ll_pwr.h" -#include "stm32h5xx_ll_crs.h" #include "stm32h5xx_ll_rcc.h" -#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_spi.h" #include "stm32h5xx_ll_system.h" -#include "stm32h5xx_ll_exti.h" -#include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_utils.h" -#include "stm32h5xx_ll_dma.h" -#include "stm32h5xx_ll_spi.h" -#include "stm32h5xx_ll_gpio.h" -#include "stm32h5xx_ll_lpuart.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include diff --git a/SAMM/SAMM_TOF/Src/gpio.c b/SAMM/SAMM_TOF/Src/gpio.c index 63ac084a3..6205c6ee0 100644 --- a/SAMM/SAMM_TOF/Src/gpio.c +++ b/SAMM/SAMM_TOF/Src/gpio.c @@ -32,32 +32,32 @@ /* USER CODE END 1 */ /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ + * @brief GPIO Initialization Function + * @param None + * @retval None + */ void MX_GPIO_Init(void) { - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; -/* USER CODE BEGIN MX_GPIO_Init_1 */ -/* USER CODE END MX_GPIO_Init_1 */ - - /* GPIO Ports Clock Enable */ - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); - - /**/ - LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_10); - - /**/ - GPIO_InitStruct.Pin = LL_GPIO_PIN_10; - GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - -/* USER CODE BEGIN MX_GPIO_Init_2 */ -/* USER CODE END MX_GPIO_Init_2 */ + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + /* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + + /**/ + LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_10); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + /* USER CODE END MX_GPIO_Init_2 */ } diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c index 2f34ce0cd..69e85e75e 100644 --- a/SAMM/SAMM_TOF/Src/i2c.c +++ b/SAMM/SAMM_TOF/Src/i2c.c @@ -25,64 +25,63 @@ extern uint32_t I2C_Freq; /* USER CODE END 0 */ /** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ + /* USER CODE BEGIN I2C1_Init 0 */ - LL_I2C_InitTypeDef I2C_InitStruct = {0}; + /* USER CODE END I2C1_Init 0 */ - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + LL_I2C_InitTypeDef I2C_InitStruct = {0}; - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = LL_GPIO_PIN_6|LL_GPIO_PIN_7; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_4; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - /* Peripheral clock enable */ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_7; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /* USER CODE BEGIN I2C1_Init 1 */ + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); - /* USER CODE END I2C1_Init 1 */ + /* USER CODE BEGIN I2C1_Init 1 */ - /** I2C Initialization - */ - LL_I2C_EnableAutoEndMode(I2C1); - LL_I2C_DisableOwnAddress2(I2C1); - LL_I2C_DisableGeneralCall(I2C1); - LL_I2C_EnableClockStretching(I2C1); - I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; - I2C_InitStruct.Timing = 0x00100413; - I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; - I2C_InitStruct.DigitalFilter = 0; - I2C_InitStruct.OwnAddress1 = 0; - I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; - I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; - LL_I2C_Init(I2C1, &I2C_InitStruct); - LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); + /* USER CODE END I2C1_Init 1 */ - /** I2C Fast mode Plus enable - */ - LL_I2C_EnableFastModePlus(I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ + /** I2C Initialization + */ + LL_I2C_EnableAutoEndMode(I2C1); + LL_I2C_DisableOwnAddress2(I2C1); + LL_I2C_DisableGeneralCall(I2C1); + LL_I2C_EnableClockStretching(I2C1); + I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; + I2C_InitStruct.Timing = 0x00100413; + I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; + I2C_InitStruct.DigitalFilter = 0; + I2C_InitStruct.OwnAddress1 = 0; + I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; + I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; + LL_I2C_Init(I2C1, &I2C_InitStruct); + LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); - /* USER CODE END I2C1_Init 2 */ + /** I2C Fast mode Plus enable + */ + LL_I2C_EnableFastModePlus(I2C1); + /* USER CODE BEGIN I2C1_Init 2 */ + /* USER CODE END I2C1_Init 2 */ } diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index d7ba11959..10602042c 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -206,71 +206,58 @@ int main(void) } /** - * @brief System Clock Configuration - * @retval None - */ + * @brief System Clock Configuration + * @retval None + */ void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); - while(LL_FLASH_GetLatency()!= LL_FLASH_LATENCY_1) - { - } - - LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3); - while (LL_PWR_IsActiveFlag_VOS() == 0) - { - } - LL_RCC_HSI_Enable(); - - /* Wait till HSI is ready */ - while(LL_RCC_HSI_IsReady() != 1) - { - } - - LL_RCC_HSI_SetCalibTrimming(64); - LL_RCC_HSI_SetDivider(LL_RCC_HSI_DIV_2); - LL_RCC_CSI_Enable(); - - /* Wait till CSI is ready */ - while(LL_RCC_CSI_IsReady() != 1) - { - } - - LL_RCC_CSI_SetCalibTrimming(32); - LL_RCC_PLL1_SetSource(LL_RCC_PLL1SOURCE_CSI); - LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8); - LL_RCC_PLL1_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE); - LL_RCC_PLL1_SetM(1); - LL_RCC_PLL1_SetN(32); - LL_RCC_PLL1_SetP(2); - LL_RCC_PLL1_SetQ(2); - LL_RCC_PLL1_SetR(2); - LL_RCC_PLL1Q_Enable(); - LL_RCC_PLL1_Enable(); - - /* Wait till PLL is ready */ - while(LL_RCC_PLL1_IsReady() != 1) - { - } - - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI); - - /* Wait till System clock is ready */ - while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) - { - } - - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); - LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); - LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1); - LL_SetSystemCoreClock(32000000); - - /* Update the time base */ - if (HAL_InitTick (TICK_INT_PRIORITY) != HAL_OK) - { - Error_Handler(); - } + LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1) {} + + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3); + while (LL_PWR_IsActiveFlag_VOS() == 0) {} + LL_RCC_HSI_Enable(); + + /* Wait till HSI is ready */ + while (LL_RCC_HSI_IsReady() != 1) {} + + LL_RCC_HSI_SetCalibTrimming(64); + LL_RCC_HSI_SetDivider(LL_RCC_HSI_DIV_2); + LL_RCC_CSI_Enable(); + + /* Wait till CSI is ready */ + while (LL_RCC_CSI_IsReady() != 1) {} + + LL_RCC_CSI_SetCalibTrimming(32); + LL_RCC_PLL1_SetSource(LL_RCC_PLL1SOURCE_CSI); + LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8); + LL_RCC_PLL1_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE); + LL_RCC_PLL1_SetM(1); + LL_RCC_PLL1_SetN(32); + LL_RCC_PLL1_SetP(2); + LL_RCC_PLL1_SetQ(2); + LL_RCC_PLL1_SetR(2); + LL_RCC_PLL1Q_Enable(); + LL_RCC_PLL1_Enable(); + + /* Wait till PLL is ready */ + while (LL_RCC_PLL1_IsReady() != 1) {} + + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI); + + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) {} + + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); + LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); + LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); + LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1); + LL_SetSystemCoreClock(32000000); + + /* Update the time base */ + if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { + Error_Handler(); + } } /* USER CODE BEGIN 4 */ diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index 5f2675eeb..b92973530 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -27,10 +27,10 @@ SPI_HandleTypeDef hspi1; /** - * @brief SPI1 Initialization Function - * @param None - * @retval None - */ + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ void MX_SPI1_Init(void) { From dd8bf407160d26649318fe28e679206298c47109 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 20 Apr 2026 22:15:33 -0700 Subject: [PATCH 044/158] Removed ADC files from Mag and TOF --- SAMM/SAMM_Mag/CMakeLists.txt | 1 - SAMM/SAMM_Mag/Inc/adc.h | 51 ----------- SAMM/SAMM_Mag/Src/adc.c | 148 -------------------------------- SAMM/SAMM_TOF/CMakeLists.txt | 1 - SAMM/SAMM_TOF/Inc/adc.h | 52 ------------ SAMM/SAMM_TOF/Src/adc.c | 159 ----------------------------------- 6 files changed, 412 deletions(-) delete mode 100644 SAMM/SAMM_Mag/Inc/adc.h delete mode 100644 SAMM/SAMM_Mag/Src/adc.c delete mode 100644 SAMM/SAMM_TOF/Inc/adc.h delete mode 100644 SAMM/SAMM_TOF/Src/adc.c diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index a38272a86..1b5e1a18c 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -27,7 +27,6 @@ target_sources( ${GR_PROJECT_NAME}_USER_CODE INTERFACE # Core - Src/adc.c Src/crc.c Src/dma.c Src/gpio.c diff --git a/SAMM/SAMM_Mag/Inc/adc.h b/SAMM/SAMM_Mag/Inc/adc.h deleted file mode 100644 index e65b1f6f8..000000000 --- a/SAMM/SAMM_Mag/Inc/adc.h +++ /dev/null @@ -1,51 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __ADC_H__ -#define __ADC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" - -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern ADC_HandleTypeDef hadc1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_ADC1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ADC_H__ */ diff --git a/SAMM/SAMM_Mag/Src/adc.c b/SAMM/SAMM_Mag/Src/adc.c deleted file mode 100644 index fbcfbe933..000000000 --- a/SAMM/SAMM_Mag/Src/adc.c +++ /dev/null @@ -1,148 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "adc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -ADC_HandleTypeDef hadc1; - -/* ADC1 init function */ -void MX_ADC1_Init(void) -{ - - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.GainCompensation = 0; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DMAContinuousRequests = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = ENABLE; - hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; - hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; - hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; - hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) { - Error_Handler(); - } - - /** Configure the ADC multi-mode - */ - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ -} - -void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspInit 0 */ - - /* USER CODE END ADC1_MspInit 0 */ - LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); - - /* ADC1 clock enable */ - __HAL_RCC_ADC12_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* USER CODE BEGIN ADC1_MspInit 1 */ - - /* USER CODE END ADC1_MspInit 1 */ - } -} - -void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) -{ - - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ - - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC12_CLK_DISABLE(); - - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - - /* USER CODE BEGIN ADC1_MspDeInit 1 */ - - /* USER CODE END ADC1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index 51c4da134..65d9a5465 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -27,7 +27,6 @@ target_sources( ${GR_PROJECT_NAME}_USER_CODE INTERFACE # Core - Src/adc.c Src/crc.c Src/dma.c Src/gpio.c diff --git a/SAMM/SAMM_TOF/Inc/adc.h b/SAMM/SAMM_TOF/Inc/adc.h deleted file mode 100644 index f8541e8da..000000000 --- a/SAMM/SAMM_TOF/Inc/adc.h +++ /dev/null @@ -1,52 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.h - * @brief This file contains all the function prototypes for - * the adc.c file - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __ADC_H__ -#define __ADC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "main.h" -#include "stm32h5xx_hal_adc.h" -#include "stm32h5xx_ll_adc.h" -/* USER CODE BEGIN Includes */ - -/* USER CODE END Includes */ - -extern ADC_HandleTypeDef hadc1; - -/* USER CODE BEGIN Private defines */ - -/* USER CODE END Private defines */ - -void MX_ADC1_Init(void); - -/* USER CODE BEGIN Prototypes */ - -/* USER CODE END Prototypes */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ADC_H__ */ diff --git a/SAMM/SAMM_TOF/Src/adc.c b/SAMM/SAMM_TOF/Src/adc.c deleted file mode 100644 index 75fb542e3..000000000 --- a/SAMM/SAMM_TOF/Src/adc.c +++ /dev/null @@ -1,159 +0,0 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file adc.c - * @brief This file provides code for the configuration - * of the ADC instances. - ****************************************************************************** - * @attention - * - * Copyright (c) 2024 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. - * - ****************************************************************************** - */ -/* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ -#include "adc.h" - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -ADC_HandleTypeDef hadc1; - -/* ADC1 init function */ -void MX_ADC1_Init(void) -{ - - /* USER CODE BEGIN ADC1_Init 0 */ - - /* USER CODE END ADC1_Init 0 */ - - ADC_MultiModeTypeDef multimode = {0}; - ADC_ChannelConfTypeDef sConfig = {0}; - - /* USER CODE BEGIN ADC1_Init 1 */ - - /* USER CODE END ADC1_Init 1 */ - - /** Common config - */ - hadc1.Instance = ADC1; - hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; // TODO: possibly change???? - hadc1.Init.Resolution = ADC_RESOLUTION_12B; - hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; - hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; - hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; - hadc1.Init.LowPowerAutoWait = DISABLE; - hadc1.Init.ContinuousConvMode = DISABLE; - hadc1.Init.NbrOfConversion = 1; - hadc1.Init.DiscontinuousConvMode = DISABLE; - hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; - hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; - hadc1.Init.DMAContinuousRequests = DISABLE; - hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; - hadc1.Init.OversamplingMode = ENABLE; - hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_16; - hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_NONE; - hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER; - hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE; - if (HAL_ADC_Init(&hadc1) != HAL_OK) { - Error_Handler(); - } - - /** Configure the ADC multi-mode - */ - multimode.Mode = ADC_MODE_INDEPENDENT; - if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) { - Error_Handler(); - } - - /** Configure Regular Channel - */ - sConfig.Channel = ADC_CHANNEL_7; - sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; - sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED; - sConfig.OffsetNumber = ADC_OFFSET_NONE; - sConfig.Offset = 0; - if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN ADC1_Init 2 */ - - /* USER CODE END ADC1_Init 2 */ -} - -void HAL_ADC_MspInit(ADC_HandleTypeDef *adcHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspInit 0 */ - - /* USER CODE END ADC1_MspInit 0 */ - // LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); - - /* ADC1 clock enable */ - //__HAL_RCC_ADC12_CLK_ENABLE(); - - /** Initializes the peripherals clock - */ - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC; - PeriphClkInitStruct.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HCLK; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { - Error_Handler(); - } - - /* Peripheral clock enable */ - __HAL_RCC_ADC_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* USER CODE BEGIN ADC1_MspInit 1 */ - - /* USER CODE END ADC1_MspInit 1 */ - } -} - -void HAL_ADC_MspDeInit(ADC_HandleTypeDef *adcHandle) -{ - - if (adcHandle->Instance == ADC1) { - /* USER CODE BEGIN ADC1_MspDeInit 0 */ - - /* USER CODE END ADC1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_ADC_CLK_DISABLE(); - - /**ADC1 GPIO Configuration - PC0 ------> ADC1_IN6 - PC1 ------> ADC1_IN7 - PC2 ------> ADC1_IN8 - */ - HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); - - /* USER CODE BEGIN ADC1_MspDeInit 1 */ - - /* USER CODE END ADC1_MspDeInit 1 */ - } -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ From 61002cccbc5a4dac53147d2d4663890915edaead Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Tue, 21 Apr 2026 01:35:10 -0700 Subject: [PATCH 045/158] Modified Mag peripheral files to match TOF (where appropriate) --- SAMM/SAMM_Mag/Inc/main.h | 5 +- SAMM/SAMM_Mag/Inc/spi.h | 158 ++++------------------ SAMM/SAMM_Mag/Src/dma.c | 11 +- SAMM/SAMM_Mag/Src/gpio.c | 83 ++++-------- SAMM/SAMM_Mag/Src/mag.c | 25 +++- SAMM/SAMM_Mag/Src/main.c | 73 +++++----- SAMM/SAMM_Mag/Src/spi.c | 284 ++++++++++++++++++++++++--------------- 7 files changed, 290 insertions(+), 349 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index a4629eb72..9a8e97820 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -27,26 +27,29 @@ extern "C" { #endif /* Includes ------------------------------------------------------------------*/ +#include "stm32h5xx.h" #include "stm32h5xx_hal.h" #include "stm32h5xx_hal_dma.h" #include "stm32h5xx_hal_i2c.h" #include "stm32h5xx_hal_rcc.h" -#include "stm32h5xx_ll_adc.h" #include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_crs.h" #include "stm32h5xx_ll_dma.h" #include "stm32h5xx_ll_exti.h" #include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_i2c.h" #include "stm32h5xx_ll_lpuart.h" #include "stm32h5xx_ll_pwr.h" #include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_spi.h" #include "stm32h5xx_ll_system.h" #include "stm32h5xx_ll_utils.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include +#include /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ diff --git a/SAMM/SAMM_Mag/Inc/spi.h b/SAMM/SAMM_Mag/Inc/spi.h index 34e39fc22..5e2db50b2 100644 --- a/SAMM/SAMM_Mag/Inc/spi.h +++ b/SAMM/SAMM_Mag/Inc/spi.h @@ -1,9 +1,9 @@ /* USER CODE BEGIN Header */ /** ****************************************************************************** - * @file spi.c - * @brief This file provides code for the configuration - * of the SPI instances. + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file ****************************************************************************** * @attention * @@ -17,148 +17,36 @@ ****************************************************************************** */ /* USER CODE END Header */ -/* Includes ------------------------------------------------------------------*/ - -/* USER CODE BEGIN 0 */ - -/* USER CODE END 0 */ - -SPI_HandleTypeDef hspi1; -SPI_HandleTypeDef hspi3; - -/* SPI1 Init function -> used for IMU */ -void MX_SPI1_Init(void) -{ - - /* USER CODE BEGIN spi1_Init 0 */ - - /* USER CODE END spi1_Init 0 */ - - /* USER CODE BEGIN spi1_Init 1 */ - - /* USER CODE END spi1_Init 1 */ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_16BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; - hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi1_Init 2 */ - - /* USER CODE END spi1_Init 2 */ -} - -/* SPI3 init function -> used for MAG encoder */ -void MX_SPI3_Init(void) -{ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ - /* USER CODE BEGIN spi3_Init 0 */ +#ifdef __cplusplus +extern "C" { +#endif - /* USER CODE END spi3_Init 0 */ - - /* USER CODE BEGIN spi3_Init 1 */ - - /* USER CODE END spi3_Init 1 */ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_16BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi3_Init 2 */ - - /* USER CODE END spi3_Init 2 */ -} - -void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) -{ - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN spi3_MspInit 0 */ - - /* USER CODE END spi3_MspInit 0 */ - /* spi3 clock enable */ - __HAL_RCC_spi3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +/* Includes ------------------------------------------------------------------*/ +#include "main.h" - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +/* USER CODE BEGIN Includes */ - /* USER CODE BEGIN spi3_MspInit 1 */ +/* USER CODE END Includes */ - /* USER CODE END spi3_MspInit 1 */ - } -} +extern SPI_HandleTypeDef hspi1; -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) -{ +/* USER CODE BEGIN Private defines */ - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN spi3_MspDeInit 0 */ +/* USER CODE END Private defines */ - /* USER CODE END spi3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_spi3_CLK_DISABLE(); +void MX_SPI1_Init(void); +void MX_SPI3_Init(void); - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); +/* USER CODE BEGIN Prototypes */ - /* USER CODE BEGIN spi3_MspDeInit 1 */ +/* USER CODE END Prototypes */ - /* USER CODE END spi3_MspDeInit 1 */ - } +#ifdef __cplusplus } +#endif -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ +#endif /* __SPI_H__ */ diff --git a/SAMM/SAMM_Mag/Src/dma.c b/SAMM/SAMM_Mag/Src/dma.c index 0b82d0d7c..972b9efea 100644 --- a/SAMM/SAMM_Mag/Src/dma.c +++ b/SAMM/SAMM_Mag/Src/dma.c @@ -40,16 +40,15 @@ void MX_DMA_Init(void) { /* DMA controller clock enable */ - __HAL_RCC_DMAMUX1_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); + __HAL_RCC_GPDMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn); + HAL_NVIC_SetPriority(GPDMA1_Channel1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(GPDMA1_Channel1_IRQn); /* DMA1_Channel2_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn); + HAL_NVIC_SetPriority(GPDMA1_Channel2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(GPDMA1_Channel2_IRQn); } /* USER CODE BEGIN 2 */ diff --git a/SAMM/SAMM_Mag/Src/gpio.c b/SAMM/SAMM_Mag/Src/gpio.c index de043543c..6205c6ee0 100644 --- a/SAMM/SAMM_Mag/Src/gpio.c +++ b/SAMM/SAMM_Mag/Src/gpio.c @@ -31,66 +31,33 @@ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ - -/** Configure pins as - * Analog - * Input - * Output - * EVENT_OUT - * EXTI - PC8 ------> I2C3_SCL - PC9 ------> I2C3_SDA -*/ +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ void MX_GPIO_Init(void) { - - GPIO_InitTypeDef GPIO_InitStruct = {0}; + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* USER CODE BEGIN MX_GPIO_Init_1 */ + /* USER CODE END MX_GPIO_Init_1 */ /* GPIO Ports Clock Enable */ - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - /*Configure GPIO pin Output Level */ - // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); - - /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 | GPIO_PIN_4, GPIO_PIN_RESET); - - /*Configure GPIO pin : PF1 -> ToF not being used */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); - */ - - /*Configure GPIO pins : PB1 PB4 */ - GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_4; - GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PB12 PB6 */ - GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_6; - GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /*Configure GPIO pins : PC8 PC9 */ - /* - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF8_I2C3; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + + /**/ + LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_10); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN MX_GPIO_Init_2 */ + /* USER CODE END MX_GPIO_Init_2 */ } - -/* USER CODE BEGIN 2 */ - -/* USER CODE END 2 */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 88598a55c..804848613 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -2,7 +2,7 @@ #include -#include "stdbool.h" +#include "main.h" #include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" @@ -75,10 +75,21 @@ crc (4 bits -- optional) uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { - uint16_t msb = (data & mag_msb) >> 8 | ((uint16_t(reg) & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb) reg += 1; // increment from 0x22 to 0x23 for lsb - uint16_t lsb = ((data & mag_lsb) | ((uint16_t(reg) & mag_addr_mask) << 8)) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb) return 0; + uint16_t msb = ((data & mag_msb) >> 8) | + (((uint16_t)reg & mag_addr_mask) << 8) | + 0x4000; + + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb); + + reg += 1; // increment from 0x22 to 0x23 for lsb + + uint16_t lsb = (data & mag_lsb) | + (((uint16_t)reg & mag_addr_mask) << 8) | + 0x4000; + + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb); + + return 0; } uint8_t mag_calib_abort(mag *mag_dev) @@ -143,13 +154,13 @@ bool check_status(mag *mag_dev) // fix-me add LOGOMATIC - return (voltage_error && magnetic_err && angle_error && invalid_spi_len && temp_out_of_range && turn_counter_saturated && excessive_magnet_vel); + return (voltage_err && magnetic_err && angle_error && invalid_spi_len && temp_out_of_range && turn_counter_saturated && excessive_magnet_vel); } int16_t mag_read_turns(mag *mag_dev) { int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_angle & 0x0FFF)); // Mask to 12 bits (valid angle data) + return ((int16_t)(read_turns & 0x0FFF)); // Mask to 12 bits (valid angle data) } // Address 0x24:0x25 (ERR)—Device Error Flags diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 64aa0f45b..615f6012c 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -106,8 +106,7 @@ int main(void) // MX_CRC_Init(); // MX_FDCAN1_Init(); // MX_FDCAN2_Init(); - MX_I2C1_Init(); - MX_SPI3_Init(); // TODO: change all instances of spi1 -> SPI1 + MX_SPI3_Init(); /* USER CODE BEGIN 2 */ // HAL_FDCAN_Start(&hfdcan1); @@ -117,7 +116,7 @@ int main(void) // bmi323 bmi323_dev; mag mag_dev; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); - mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin); + mag_init(&mag_dev, SPI3, MAG_CS_GPIO_Port, MAG_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; @@ -126,7 +125,7 @@ int main(void) // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); // HAL_Delay(1); // Short delay after mode switch - if (mag_init() != HAL_OK) { + if (mag_init(&mag_dev, SPI3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { printf("MAG initialization failed!\r\n"); Error_Handler(); } @@ -173,17 +172,17 @@ int main(void) // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); /* USER CODE END WHILE */ - float temp = mag_read_temp(mag_dev); - float angle = mag_read_encoder_angle(mag_dev); - int16_t turns = mag_read_turns(mag_dev); + float temp = mag_read_temp(&mag_dev); + float angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); - bool bad = check_status(mag_dev); + bool bad = check_status(&mag_dev); printf("Temperature is %f\n", temp); printf("Angle is %f\n", angle); printf("Number of turns is %d\n", turns); if (!bad) { printf("67 69 420 something is cooked"); - mag_write_error(mag_dev); + mag_write_error(&mag_dev); } } /* USER CODE END 3 */ @@ -195,34 +194,48 @@ int main(void) */ void SystemClock_Config(void) { - LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); - while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) {} - LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); - LL_RCC_HSE_EnableBypass(); - LL_RCC_HSE_Enable(); - /* Wait till HSE is ready */ - while (LL_RCC_HSE_IsReady() != 1) {} - - LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_1, 32, LL_RCC_PLLR_DIV_2); - LL_RCC_PLL_EnableDomain_SYS(); - LL_RCC_PLL_Enable(); + LL_FLASH_SetLatency(LL_FLASH_LATENCY_1); + while (LL_FLASH_GetLatency() != LL_FLASH_LATENCY_1) {} + + LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE3); + while (LL_PWR_IsActiveFlag_VOS() == 0) {} + LL_RCC_HSI_Enable(); + + /* Wait till HSI is ready */ + while (LL_RCC_HSI_IsReady() != 1) {} + + LL_RCC_HSI_SetCalibTrimming(64); + LL_RCC_HSI_SetDivider(LL_RCC_HSI_DIV_2); + LL_RCC_CSI_Enable(); + + /* Wait till CSI is ready */ + while (LL_RCC_CSI_IsReady() != 1) {} + + LL_RCC_CSI_SetCalibTrimming(32); + LL_RCC_PLL1_SetSource(LL_RCC_PLL1SOURCE_CSI); + LL_RCC_PLL1_SetVCOInputRange(LL_RCC_PLLINPUTRANGE_4_8); + LL_RCC_PLL1_SetVCOOutputRange(LL_RCC_PLLVCORANGE_WIDE); + LL_RCC_PLL1_SetM(1); + LL_RCC_PLL1_SetN(32); + LL_RCC_PLL1_SetP(2); + LL_RCC_PLL1_SetQ(2); + LL_RCC_PLL1_SetR(2); + LL_RCC_PLL1Q_Enable(); + LL_RCC_PLL1_Enable(); + /* Wait till PLL is ready */ - while (LL_RCC_PLL_IsReady() != 1) {} + while (LL_RCC_PLL1_IsReady() != 1) {} - LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); - LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); - /* Wait till System clock is ready */ - while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) {} + LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_HSI); - /* Insure 1us transition state at intermediate medium speed clock*/ - for (__IO uint32_t i = (170 >> 1); i != 0; i--) - ; + /* Wait till System clock is ready */ + while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) {} - /* Set AHB prescaler*/ LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1); - LL_SetSystemCoreClock(128000000); + LL_RCC_SetAPB3Prescaler(LL_RCC_APB3_DIV_1); + LL_SetSystemCoreClock(32000000); /* Update the time base */ if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { diff --git a/SAMM/SAMM_Mag/Src/spi.c b/SAMM/SAMM_Mag/Src/spi.c index bc7c80f1d..83b324922 100644 --- a/SAMM/SAMM_Mag/Src/spi.c +++ b/SAMM/SAMM_Mag/Src/spi.c @@ -25,139 +25,199 @@ /* USER CODE END 0 */ SPI_HandleTypeDef hspi1; -SPI_HandleTypeDef hspi3; -/* SPI1 Init function -> used for IMU */ +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ void MX_SPI1_Init(void) { - /* USER CODE BEGIN spi1_Init 0 */ - - /* USER CODE END spi1_Init 0 */ - - /* USER CODE BEGIN spi1_Init 1 */ - - /* USER CODE END spi1_Init 1 */ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_16BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 7; - hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi1_Init 2 */ - - /* USER CODE END spi1_Init 2 */ + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 0x13; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; + hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; + hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; + hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + } -/* SPI3 init function -> used for MAG encoder */ +/** + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ void MX_SPI3_Init(void) { - /* USER CODE BEGIN spi3_Init 0 */ - - /* USER CODE END spi3_Init 0 */ - - /* USER CODE BEGIN spi3_Init 1 */ - - /* USER CODE END spi3_Init 1 */ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_16BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 7; - hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - if (HAL_SPI_Init(&hspi3) != HAL_OK) { - Error_Handler(); - } - /* USER CODE BEGIN spi3_Init 2 */ - - /* USER CODE END spi3_Init 2 */ + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + LL_SPI_InitTypeDef SPI_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_5; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_1; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; + SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; + SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT; + SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH; + SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; + SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; + SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; + SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; + SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + SPI_InitStruct.CRCPoly = 0x13; + LL_SPI_Init(SPI3, &SPI_InitStruct); + LL_SPI_SetStandard(SPI3, LL_SPI_PROTOCOL_MOTOROLA); + LL_SPI_DisableNSSPulseMgt(SPI3); + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + } -void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHandle) +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + + } - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (spiHandle->Instance == spi3) { - /* USER CODE BEGIN spi3_MspInit 0 */ - - /* USER CODE END spi3_MspInit 0 */ - /* spi3 clock enable */ - __HAL_RCC_spi3_CLK_ENABLE(); - - __HAL_RCC_GPIOC_CLK_ENABLE(); - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN spi3_MspInit 1 */ - - /* USER CODE END spi3_MspInit 1 */ - } } -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *spiHandle) +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) { + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ - if (spiHandle->Instance == SPI3) { - /* USER CODE BEGIN spi3_MspDeInit 0 */ + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); - /* USER CODE END spi3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_spi3_CLK_DISABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); - /**spi3 GPIO Configuration - PB1 ------> SPI3_SCK - PB0 ------> SPI3_MISO - PB2 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + /* USER CODE BEGIN SPI1_MspDeInit 1 */ - /* USER CODE BEGIN spi3_MspDeInit 1 */ + /* USER CODE END SPI1_MspDeInit 1 */ + } - /* USER CODE END spi3_MspDeInit 1 */ - } } /* USER CODE BEGIN 1 */ From a438b130c48a3ef565c7c4201d0bd3d677faa976 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 08:36:31 +0000 Subject: [PATCH 046/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Inc/main.h | 2 +- SAMM/SAMM_Mag/Src/mag.c | 16 +- SAMM/SAMM_Mag/Src/spi.c | 332 +++++++++++++++++++-------------------- 3 files changed, 169 insertions(+), 181 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index 9a8e97820..235ec53d2 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -48,8 +48,8 @@ extern "C" { /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include #include +#include /* USER CODE END Includes */ /* Exported types ------------------------------------------------------------*/ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 804848613..e5768fbd1 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -75,21 +75,17 @@ crc (4 bits -- optional) uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { - uint16_t msb = ((data & mag_msb) >> 8) | - (((uint16_t)reg & mag_addr_mask) << 8) | - 0x4000; + uint16_t msb = ((data & mag_msb) >> 8) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb); + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb); - reg += 1; // increment from 0x22 to 0x23 for lsb + reg += 1; // increment from 0x22 to 0x23 for lsb - uint16_t lsb = (data & mag_lsb) | - (((uint16_t)reg & mag_addr_mask) << 8) | - 0x4000; + uint16_t lsb = (data & mag_lsb) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb); + mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb); - return 0; + return 0; } uint8_t mag_calib_abort(mag *mag_dev) diff --git a/SAMM/SAMM_Mag/Src/spi.c b/SAMM/SAMM_Mag/Src/spi.c index 83b324922..240653667 100644 --- a/SAMM/SAMM_Mag/Src/spi.c +++ b/SAMM/SAMM_Mag/Src/spi.c @@ -27,197 +27,189 @@ SPI_HandleTypeDef hspi1; /** - * @brief SPI1 Initialization Function - * @param None - * @retval None - */ + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ void MX_SPI1_Init(void) { - /* USER CODE BEGIN SPI1_Init 0 */ - - /* USER CODE END SPI1_Init 0 */ - - /* USER CODE BEGIN SPI1_Init 1 */ - - /* USER CODE END SPI1_Init 1 */ - /* SPI1 parameter configuration*/ - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_4BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 0x13; - hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; - hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; - hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; - hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; - hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; - hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; - hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; - hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; - hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; - hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; - if (HAL_SPI_Init(&hspi1) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI1_Init 2 */ - - /* USER CODE END SPI1_Init 2 */ - + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 0x13; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + hspi1.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi1.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi1.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi1.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi1.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; + hspi1.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi1.Init.IOSwap = SPI_IO_SWAP_DISABLE; + hspi1.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; + hspi1.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ } /** - * @brief SPI3 Initialization Function - * @param None - * @retval None - */ + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ void MX_SPI3_Init(void) { - /* USER CODE BEGIN SPI3_Init 0 */ - - /* USER CODE END SPI3_Init 0 */ - - LL_SPI_InitTypeDef SPI_InitStruct = {0}; - - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - - LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3); - - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); - /**SPI3 GPIO Configuration - PB0 ------> SPI3_MISO - PB1 ------> SPI3_SCK - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_5; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = LL_GPIO_PIN_1; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_4; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = LL_GPIO_PIN_2; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_7; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI3_Init 1 */ - - /* USER CODE END SPI3_Init 1 */ - /* SPI3 parameter configuration*/ - SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; - SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; - SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT; - SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH; - SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; - SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; - SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; - SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; - SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; - SPI_InitStruct.CRCPoly = 0x13; - LL_SPI_Init(SPI3, &SPI_InitStruct); - LL_SPI_SetStandard(SPI3, LL_SPI_PROTOCOL_MOTOROLA); - LL_SPI_DisableNSSPulseMgt(SPI3); - /* USER CODE BEGIN SPI3_Init 2 */ - - /* USER CODE END SPI3_Init 2 */ - + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + LL_SPI_InitTypeDef SPI_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_5; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_1; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; + SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; + SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT; + SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH; + SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; + SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; + SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; + SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; + SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + SPI_InitStruct.CRCPoly = 0x13; + LL_SPI_Init(SPI3, &SPI_InitStruct); + LL_SPI_SetStandard(SPI3, LL_SPI_PROTOCOL_MOTOROLA); + LL_SPI_DisableNSSPulseMgt(SPI3); + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ } /** -* @brief SPI MSP Initialization -* This function configures the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) + * @brief SPI MSP Initialization + * This function configures the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ - LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - __HAL_RCC_SPI1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - - } - + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } } /** -* @brief SPI MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) + * @brief SPI MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) { - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI1_CLK_DISABLE(); + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); - /* USER CODE BEGIN SPI1_MspDeInit 1 */ + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); - /* USER CODE END SPI1_MspDeInit 1 */ - } + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + /* USER CODE END SPI1_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ From 6be39c001a9a47b66550588a5276403b18447401 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Thu, 23 Apr 2026 02:51:48 -0700 Subject: [PATCH 047/158] Copy logomatic fixes from `CanOnH5` #440 Signed-off-by: Daniel Hansen --- Lib/Utils/Logomatic/Inc/Logomatic.h | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Lib/Utils/Logomatic/Inc/Logomatic.h b/Lib/Utils/Logomatic/Inc/Logomatic.h index d291f296a..2b08827c4 100644 --- a/Lib/Utils/Logomatic/Inc/Logomatic.h +++ b/Lib/Utils/Logomatic/Inc/Logomatic.h @@ -8,14 +8,28 @@ #if defined(ITM) && defined(LL_GPIO_MODE_ALTERNATE) typedef enum { +#if defined(STM32G4) LOGOMATIC_PCLK1 = LL_RCC_LPUART1_CLKSOURCE_PCLK1, LOGOMATIC_SYSCLK = LL_RCC_LPUART1_CLKSOURCE_SYSCLK, +#elif defined(STM32H5) + LOGOMATIC_PCLK3 = LL_RCC_LPUART1_CLKSOURCE_PCLK3, + LOGOMATIC_PLL2Q = LL_RCC_LPUART1_CLKSOURCE_PLL2Q, + LOGOMATIC_PLL3Q = LL_RCC_LPUART1_CLKSOURCE_PLL3Q, + LOGOMATIC_CSI = LL_RCC_LPUART1_CLKSOURCE_CSI, +#else +#error "Unsupported STM32 series. Please define the appropriate clock source for LPUART1." +#endif LOGOMATIC_HSI = LL_RCC_LPUART1_CLKSOURCE_HSI, LOGOMATIC_LSE = LL_RCC_LPUART1_CLKSOURCE_LSE } LPUART_Clock_Source; - typedef enum { +#if defined(STM32G4) LOGOMATIC_BUS = LL_APB1_GRP2_PERIPH_LPUART1, +#elif defined(STM32H5) + LOGOMATIC_BUS = LL_APB3_GRP1_PERIPH_LPUART1, +#else +#error "Unsupported STM32 series. Please define the appropriate bus for LPUART1." +#endif } LPUART_Bus; typedef enum { From c49e76af12faae96f18831bea826ecdb2062c86e Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Thu, 23 Apr 2026 02:53:54 -0700 Subject: [PATCH 048/158] Manually patch i2s to compile without warnings Signed-off-by: Daniel Hansen --- Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c index 99a6cc20f..266409076 100644 --- a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c +++ b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c @@ -19,6 +19,8 @@ ****************************************************************************** */ +typedef int make_iso_compilers_happy_by_providing_a_dummy_declaration; // Resolve compiler warnings about no symbols being defined in this file + /** ****************************************************************************** ===== I2S FULL DUPLEX FEATURE ===== From 6e31b29e3c2e5801a5d398106ec6a74fb32a316a Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 09:55:09 +0000 Subject: [PATCH 049/158] Automatic Clang-Format: Standardized formatting automatically --- Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c index 266409076..660ddc4cf 100644 --- a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c +++ b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_i2s_ex.c @@ -19,7 +19,7 @@ ****************************************************************************** */ -typedef int make_iso_compilers_happy_by_providing_a_dummy_declaration; // Resolve compiler warnings about no symbols being defined in this file +typedef int make_iso_compilers_happy_by_providing_a_dummy_declaration; // Resolve compiler warnings about no symbols being defined in this file /** ****************************************************************************** From 90471536f338e3892e3732cfcfba560fc580e15b Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Thu, 23 Apr 2026 02:59:06 -0700 Subject: [PATCH 050/158] Copy manual hal/ll patches from #440 for compilation Signed-off-by: Daniel Hansen --- Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_pwr.c | 4 ++++ Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_rcc.c | 3 +++ Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_ll_dac.c | 2 ++ 3 files changed, 9 insertions(+) diff --git a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_pwr.c b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_pwr.c index 8bd37e077..dcaeb5e7a 100644 --- a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_pwr.c +++ b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_pwr.c @@ -524,6 +524,8 @@ __weak void HAL_PWR_PVDCallback(void) */ void HAL_PWR_ConfigAttributes(uint32_t Item, uint32_t Attributes) { + UNUSED(Item); // Resolve compiler warnings on unused parameters + /* Check the parameters */ assert_param(IS_PWR_ATTRIBUTES(Attributes)); @@ -591,6 +593,8 @@ void HAL_PWR_ConfigAttributes(uint32_t Item, uint32_t Attributes) */ HAL_StatusTypeDef HAL_PWR_GetConfigAttributes(uint32_t Item, uint32_t *pAttributes) { + UNUSED(Item); // Resolve compiler warnings on unused parameters + uint32_t attributes; /* Check attribute pointer */ diff --git a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_rcc.c b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_rcc.c index 3cd83f66e..58893327a 100644 --- a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_rcc.c +++ b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_hal_rcc.c @@ -1552,6 +1552,7 @@ __weak void HAL_RCC_CSSCallback(void) */ void HAL_RCC_ConfigAttributes(uint32_t Item, uint32_t Attributes) { + UNUSED(Item); // Resolve compiler warnings on unused parameters /* Check the parameters */ assert_param(IS_RCC_ATTRIBUTES(Attributes)); @@ -1630,6 +1631,8 @@ void HAL_RCC_ConfigAttributes(uint32_t Item, uint32_t Attributes) */ HAL_StatusTypeDef HAL_RCC_GetConfigAttributes(uint32_t Item, uint32_t *pAttributes) { + UNUSED(Item); // Resolve compiler warnings on unused parameters + uint32_t attributes; /* Check null pointer */ diff --git a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_ll_dac.c b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_ll_dac.c index 4114494c4..274222ede 100644 --- a/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_ll_dac.c +++ b/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Src/stm32h5xx_ll_dac.c @@ -122,6 +122,8 @@ */ ErrorStatus LL_DAC_DeInit(const DAC_TypeDef *DACx) { + UNUSED(DACx); // Resolve compiler warnings on unused parameters + /* Check the parameters */ assert_param(IS_DAC_ALL_INSTANCE(DACx)); From f5051e24ef4f5029c9e130d32fad23efea6c4616 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 12:49:43 -0700 Subject: [PATCH 051/158] Removed unnecessary files in Extras folder under SAMM_TOF --- SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c | 70 ------------------- SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h | 22 ------ SAMM/SAMM_TOF/Extras/extra.c | 57 --------------- SAMM/SAMM_TOF/Extras/extra.h | 19 ----- 4 files changed, 168 deletions(-) delete mode 100644 SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c delete mode 100644 SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h delete mode 100644 SAMM/SAMM_TOF/Extras/extra.c delete mode 100644 SAMM/SAMM_TOF/Extras/extra.h diff --git a/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c b/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c deleted file mode 100644 index 4b0eaeaca..000000000 --- a/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.c +++ /dev/null @@ -1,70 +0,0 @@ -#include "circularBuffer.h" -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size) -{ - CircularBuffer *cb = malloc(sizeof(CircularBuffer)); - if (!cb) { - return NULL; - } - - cb->buffer = malloc(capacity * sizeof(void *)); - if (!cb->buffer) { - free(cb); - return NULL; - } - - for (size_t i = 0; i < capacity; i++) { - cb->buffer[i] = malloc(max_array_size); - if (!cb->buffer[i]) { - for (size_t j = 0; j < i; j++) { - free(cb->buffer[j]); - } - free(cb->buffer); - free(cb); - return NULL; - } - } - cb->capacity = capacity; - cb->max_arr_size = max_array_size; - cb->head = 0; - cb->tail = 0; - cb->size = 0; - return cb; -} - -void circularBufferDestroy(CircularBuffer *cb) -{ - if (!cb) { - return; - } - - for (size_t i = 0; i < cb->capacity; i++) { - free(cb->buffer[i]); - } - free(cb->buffer); - free(cb); -} - -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size) -{ - if (!cb || cb->size == cb->capacity || array_size > cb->max_arr_size) { - return -1; // Buffer is full or array is too large - } - - // Copy the array into the buffer - memcpy(cb->buffer[cb->head], array, array_size); - cb->head = (cb->head + 1) % cb->capacity; - cb->size++; - return 0; -} - -void *circularBufferPop(CircularBuffer *cb) -{ - if (!cb || cb->size == 0) { - return NULL; // Buffer is empty - } - - void *array = cb->buffer[cb->tail]; - cb->tail = (cb->tail + 1) % cb->capacity; - cb->size--; - return array; -} diff --git a/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h b/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h deleted file mode 100644 index 861792535..000000000 --- a/SAMM/SAMM_TOF/Extras/CircBuF/circularBuffer.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef __circularBuffer_h__ -#define __circularBuffer_h__ - -#include -#include -#include -#include - -typedef struct { - void **buffer; // Array of void pointers - uint8_t capacity; // Maximum number of elements in the buffer - uint8_t head; // Index of the next element to write - uint8_t tail; // Index of the next element to read - uint8_t size; // Current number of elements in the buffer - uint8_t max_arr_size; // Maximum size of the array -} CircularBuffer; - -CircularBuffer *circular_buffer_init(size_t capacity, size_t max_array_size); -void circularBufferDestroy(CircularBuffer *cb); -int circularBufferPush(CircularBuffer *cb, void *array, size_t array_size); -void *circularBufferPop(CircularBuffer *cb); -#endif \ No newline at end of file diff --git a/SAMM/SAMM_TOF/Extras/extra.c b/SAMM/SAMM_TOF/Extras/extra.c deleted file mode 100644 index 25519615c..000000000 --- a/SAMM/SAMM_TOF/Extras/extra.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "extra.h" - -#include - -#include "i2c.h" -#include "main.h" - -void MLX90640_I2CInit(void) -{ - MX_I2C2_Init(); - return; -} - -int MLX90640_I2CGeneralReset(void) -{ - uint8_t data = 0x06; - return HAL_I2C_Master_Transmit(&hi2c2, 0x00, &data, 1, 1000); -} - -int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) -{ - // HAL_I2C_Master_Receive(&hi2c2, slaveAddr, data, 2*nMemAddressRead, 1000); - // HAL_I2C_Master_Receive_DMA(&hi2c2, slaveAddr, data, nMemAddressRead); - /* - HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, - uint16_t MemAddSize, uint8_t *pData, uint16_t Size) - */ - // return HAL_I2C_Mem_Read_DMA(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, nMemAddressRead); - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 10000); -} - -int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) -{ - // union - // { - // uint8_t bytes[2]; - // uint16_t data; - // }extra = {.data = data}; - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 10000); - // return HAL_I2C_Master_Transmit_DMA(&hi2c2, writeAddress, extra.bytes, 2); -} - -void MLX90640_I2CFreqSet(int freq) -{ - return; -} - -uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data) -{ - return HAL_I2C_Mem_Read(&hi2c2, slaveAddr, startAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)data, 2 * nMemAddressRead, 500); -} - -uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data) -{ - - return HAL_I2C_Mem_Write(&hi2c2, slaveAddr, writeAddress, I2C_MEMADD_SIZE_16BIT, (uint8_t *)&data, 2, 500); -} diff --git a/SAMM/SAMM_TOF/Extras/extra.h b/SAMM/SAMM_TOF/Extras/extra.h deleted file mode 100644 index f032f86ab..000000000 --- a/SAMM/SAMM_TOF/Extras/extra.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef __EXTRA_H__ -#define __EXTRA_H__ -#include -/* -This is for some xtra fucntions that would be needed later on - - -*/ - -void MLX90640_I2CInit(void); -int MLX90640_I2CGeneralReset(void); -int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); -void MLX90640_I2CFreqSet(int freq); - -uint8_t I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddressRead, uint16_t *data); -uint8_t I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data); - -#endif /* __EXTRA_H__ */ \ No newline at end of file From 71552a4eb740194ec6b67df636219eb0fbfa891d Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 14:51:03 -0700 Subject: [PATCH 052/158] Switched I2C1 and SPI3 back to HAL, moved ToF files out of Extras folder, general debugging of mag files --- ERRORS.txt | 56 ++++ SAMM/SAMM_Mag/Inc/mag.h | 2 +- SAMM/SAMM_Mag/Inc/main.h | 1 + SAMM/SAMM_Mag/Inc/spi.h | 1 + SAMM/SAMM_Mag/Src/mag.c | 24 +- SAMM/SAMM_Mag/Src/main.c | 5 +- SAMM/SAMM_Mag/Src/spi.c | 290 ++++++++++-------- SAMM/SAMM_TOF/CMakeLists.txt | 3 + .../{Extras/VL53L4ED => Inc}/VL53L4ED_api.h | 0 .../VL53L4ED => Inc}/VL53L4ED_calibration.h | 0 SAMM/SAMM_TOF/Inc/i2c.h | 2 + .../{Extras/VL53L4ED => Inc}/platform.h | 0 .../{Extras/VL53L4ED => Src}/VL53L4ED_api.c | 0 .../VL53L4ED => Src}/VL53L4ED_calibration.c | 0 SAMM/SAMM_TOF/Src/i2c.c | 176 +++++++---- SAMM/SAMM_TOF/Src/main.c | 2 +- .../{Extras/VL53L4ED => Src}/platform.c | 0 SAMM/SAMM_TOF/Src/spi.c | 72 +++++ 18 files changed, 435 insertions(+), 199 deletions(-) create mode 100644 ERRORS.txt rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Inc}/VL53L4ED_api.h (100%) rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Inc}/VL53L4ED_calibration.h (100%) rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Inc}/platform.h (100%) rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Src}/VL53L4ED_api.c (100%) rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Src}/VL53L4ED_calibration.c (100%) rename SAMM/SAMM_TOF/{Extras/VL53L4ED => Src}/platform.c (100%) diff --git a/ERRORS.txt b/ERRORS.txt new file mode 100644 index 000000000..db2946565 --- /dev/null +++ b/ERRORS.txt @@ -0,0 +1,56 @@ +cmake --preset Debug +Preset CMake variables: + + CMAKE_BUILD_TYPE="Debug" + CMAKE_PRESET_NAME="Debug" + CMAKE_TOOLCHAIN_FILE:FILEPATH="/Users/Shravya/Firmware/Lib/cmake/gcc-arm-none-eabi.cmake" + TARGET_TYPE="Embedded" + +-- Build type: Debug +-- Target type: Embedded +-- Active CMake Preset: Debug +-- Not using ccache: ccache not found in PATH +-- Configuring done (0.1s) +-- Generating done (0.4s) +-- Build files have been written to: /Users/Shravya/Firmware/build/Debug +cmake --build --preset Debug +[1/2272] Building C object CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/mag.c.obj +FAILED: CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/mag.c.obj + +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_transmit': +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:39:14: warning: unused variable 'res' [-Wunused-variable] + 39 | bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + | ^~~ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_read_device_status': +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:103:20: error: subscripted value is neither array nor pointer nor vector + 103 | return read[0]; // read aok + | ^ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:102:18: warning: variable 'read' set but not used [-Wunused-but-set-variable] + 102 | uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status + | ^~~~ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: At top level: +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:150:9: error: conflicting types for 'mag_read_turns'; have 'int16_t(mag *)' {aka 'short int(mag *)'} + 150 | int16_t mag_read_turns(mag *mag_dev) + | ^~~~~~~~~~~~~~ +In file included from /Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:1: +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Inc/mag.h:35:10: note: previous declaration of 'mag_read_turns' with type 'uint16_t(mag *)' {aka 'short unsigned int(mag *)'} + 35 | uint16_t mag_read_turns(mag *mag_dev); + | ^~~~~~~~~~~~~~ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_read_device_status': +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:104:1: warning: control reaches end of non-void function [-Wreturn-type] + 104 | } + | ^ + +[4/2272] Building C object CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj +FAILED: CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj +/Applications/ArmGNUToolchain/14.2.rel1/arm-none-eabi/bin/arm-none-eabi-gcc -DLOGOMATIC_ENABLED -DSTM32H5 -DSTM32H523xx -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER -I/Users/Shravya/Firmware/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Inc -I/Users/Shravya/Firmware/Lib/Vendor/STM32_HAL_LL/Common/Inc -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32G4xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32L4xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32U5xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32H5xx -I/Users/Shravya/Firmware/SAMM/SAMM_Mag/Inc -I/Users/Shravya/Firmware/Autogen/CAN/Inc -I/Users/Shravya/Firmware/Lib/Peripherals/CAN/Inc -I/Users/Shravya/Firmware/Lib/Peripherals/CAN/Test -I/Users/Shravya/Firmware/Lib/Utils/CircularBuffer/Inc -I/Users/Shravya/Firmware/Lib/Utils/BitManipulations/Inc -I/Users/Shravya/Firmware/SAMM/IMU/Inc -I/Users/Shravya/Firmware/Lib/Utils/Logomatic/Inc -I/Users/Shravya/Firmware/Lib/GlobalShare/Inc -Wall -Wextra -Wpedantic -Wvla -Wdouble-promotion -fshort-enums -fdata-sections -ffunction-sections -fstack-usage -O0 -g3 -std=gnu11 -u _printf_float -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -MD -MT CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -MF CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj.d -o CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -c /Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c: In function 'main': +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:129:13: error: void value not ignored as it ought to be + 129 | if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { + | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:181:47: warning: implicit conversion from 'float' to 'double' when passing argument to function [-Wdouble-promotion] + 181 | printf("Temperature is %f\n", temp); + | ^~~~ +/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:182:41: warning: implicit conversion from 'float' to 'double' when passing argument to function [-Wdouble-promotion] + 182 | printf("Angle is %f\n", angle); + | ^~~~~ diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 18b74e920..b9541a2f1 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -14,7 +14,7 @@ typedef struct { /* data */ } mag; -void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin); +HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin); uint16_t mag_transmit(mag *mag_dev, uint16_t data); diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SAMM_Mag/Inc/main.h index 235ec53d2..0734b16e0 100644 --- a/SAMM/SAMM_Mag/Inc/main.h +++ b/SAMM/SAMM_Mag/Inc/main.h @@ -32,6 +32,7 @@ extern "C" { #include "stm32h5xx_hal_dma.h" #include "stm32h5xx_hal_i2c.h" #include "stm32h5xx_hal_rcc.h" +#include "stm32h5xx_hal_spi.h" #include "stm32h5xx_ll_bus.h" #include "stm32h5xx_ll_cortex.h" #include "stm32h5xx_ll_crs.h" diff --git a/SAMM/SAMM_Mag/Inc/spi.h b/SAMM/SAMM_Mag/Inc/spi.h index 5e2db50b2..1aab1cb91 100644 --- a/SAMM/SAMM_Mag/Inc/spi.h +++ b/SAMM/SAMM_Mag/Inc/spi.h @@ -33,6 +33,7 @@ extern "C" { /* USER CODE END Includes */ extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef hspi3; /* USER CODE BEGIN Private defines */ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index e5768fbd1..dcc59cc80 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -4,7 +4,6 @@ #include "main.h" #include "stm32h5xx.h" -#include "stm32h5xx_hal_spi.h" #define mag_write_address_msb 22 #define mag_write_address_lsb 23 @@ -13,14 +12,17 @@ #define mag_msb 0xFF00 #define mag_lsb 0x00FF -void mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) +HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDef *port, uint16_t pin) { mag_dev->spi_port = spi_port; mag_dev->port = port; mag_dev->pin = pin; - uint16_t sta = mag_read(mag_dev, 0x22); - if (!(sta & 0x0001)) { + uint16_t status = mag_read(mag_dev, 0x22); + + // Check AOK=1 (bit 0) and BIP=0 (bit 1) + // If either not true, return error + if (!(status & 0x0001) || (status & 0x0002)) { return HAL_ERROR; } @@ -36,7 +38,7 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data) // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // disable - bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); // fix-me add error handling HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); @@ -77,23 +79,17 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = ((data & mag_msb) >> 8) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, msb); + mag_transmit(mag_dev, msb); reg += 1; // increment from 0x22 to 0x23 for lsb uint16_t lsb = (data & mag_lsb) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; - mag_transmit(mag_dev, mag_dev->spi_port, mag_dev->port, mag_dev->pin, lsb); + mag_transmit(mag_dev, lsb); return 0; } -uint8_t mag_calib_abort(mag *mag_dev) -{ - mag_write(mag_dev, mag_CMD, mag_CMD_CALIB_ABORT); - return 1; -} - // Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) float mag_read_encoder_angle(mag *mag_dev) { @@ -112,7 +108,7 @@ bool mag_read_device_status(mag *mag_dev) float mag_read_temp(mag *mag_dev) { uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register - return ((uint16_t)(read_temp & 0x0FFF) / 8.0 + 25); // Mask to 12 bits (valid temp data) + return ((uint16_t)(read_temp & 0x0FFF) / 8.0f + 25); // Mask to 12 bits (valid temp data) } /* diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 615f6012c..41723d02d 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -106,6 +106,7 @@ int main(void) // MX_CRC_Init(); // MX_FDCAN1_Init(); // MX_FDCAN2_Init(); + MX_SPI1_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ @@ -116,7 +117,7 @@ int main(void) // bmi323 bmi323_dev; mag mag_dev; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); - mag_init(&mag_dev, SPI3, MAG_CS_GPIO_Port, MAG_CS_Pin); + mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; @@ -125,7 +126,7 @@ int main(void) // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); // HAL_Delay(1); // Short delay after mode switch - if (mag_init(&mag_dev, SPI3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { + if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { printf("MAG initialization failed!\r\n"); Error_Handler(); } diff --git a/SAMM/SAMM_Mag/Src/spi.c b/SAMM/SAMM_Mag/Src/spi.c index 240653667..6ecb4e8b2 100644 --- a/SAMM/SAMM_Mag/Src/spi.c +++ b/SAMM/SAMM_Mag/Src/spi.c @@ -73,143 +73,183 @@ void MX_SPI1_Init(void) } /** - * @brief SPI3 Initialization Function - * @param None - * @retval None - */ + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ void MX_SPI3_Init(void) { - /* USER CODE BEGIN SPI3_Init 0 */ - - /* USER CODE END SPI3_Init 0 */ - - LL_SPI_InitTypeDef SPI_InitStruct = {0}; - - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - - LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3); - - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); - /**SPI3 GPIO Configuration - PB0 ------> SPI3_MISO - PB1 ------> SPI3_SCK - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = LL_GPIO_PIN_0; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_5; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = LL_GPIO_PIN_1; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_4; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = LL_GPIO_PIN_2; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_7; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI3_Init 1 */ - - /* USER CODE END SPI3_Init 1 */ - /* SPI3 parameter configuration*/ - SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; - SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; - SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT; - SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_HIGH; - SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; - SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; - SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV8; - SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; - SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; - SPI_InitStruct.CRCPoly = 0x13; - LL_SPI_Init(SPI3, &SPI_InitStruct); - LL_SPI_SetStandard(SPI3, LL_SPI_PROTOCOL_MOTOROLA); - LL_SPI_DisableNSSPulseMgt(SPI3); - /* USER CODE BEGIN SPI3_Init 2 */ - - /* USER CODE END SPI3_Init 2 */ + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_4BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 0x13; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + hspi3.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi3.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi3.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi3.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi3.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; + hspi3.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi3.Init.IOSwap = SPI_IO_SWAP_DISABLE; + hspi3.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; + hspi3.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + } /** - * @brief SPI MSP Initialization - * This function configures the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if (hspi->Instance == SPI1) { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ - LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - __HAL_RCC_SPI1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - } + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + + LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } + } /** - * @brief SPI MSP De-Initialization - * This function freeze the hardware resources used in this example - * @param hspi: SPI handle pointer - * @retval None - */ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) { - if (hspi->Instance == SPI1) { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI1_CLK_DISABLE(); + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); - - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ - } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/SAMM_TOF/CMakeLists.txt index 65d9a5465..ef937db61 100644 --- a/SAMM/SAMM_TOF/CMakeLists.txt +++ b/SAMM/SAMM_TOF/CMakeLists.txt @@ -34,6 +34,9 @@ target_sources( Src/main.c Src/spi.c Src/stm32h5xx_it.c + Src/platform.c + Src/VL53L4ED_api.c + Src/VL53L4ED_calibration.c # TODO ) diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.h b/SAMM/SAMM_TOF/Inc/VL53L4ED_api.h similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.h rename to SAMM/SAMM_TOF/Inc/VL53L4ED_api.h diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.h b/SAMM/SAMM_TOF/Inc/VL53L4ED_calibration.h similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.h rename to SAMM/SAMM_TOF/Inc/VL53L4ED_calibration.h diff --git a/SAMM/SAMM_TOF/Inc/i2c.h b/SAMM/SAMM_TOF/Inc/i2c.h index a472c8bfe..64f5543e6 100644 --- a/SAMM/SAMM_TOF/Inc/i2c.h +++ b/SAMM/SAMM_TOF/Inc/i2c.h @@ -32,6 +32,8 @@ extern "C" { /* USER CODE END Includes */ +extern I2C_HandleTypeDef hi2c1; + /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/platform.h b/SAMM/SAMM_TOF/Inc/platform.h similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/platform.h rename to SAMM/SAMM_TOF/Inc/platform.h diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.c b/SAMM/SAMM_TOF/Src/VL53L4ED_api.c similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_api.c rename to SAMM/SAMM_TOF/Src/VL53L4ED_api.c diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.c b/SAMM/SAMM_TOF/Src/VL53L4ED_calibration.c similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/VL53L4ED_calibration.c rename to SAMM/SAMM_TOF/Src/VL53L4ED_calibration.c diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c index 69e85e75e..ce63fc393 100644 --- a/SAMM/SAMM_TOF/Src/i2c.c +++ b/SAMM/SAMM_TOF/Src/i2c.c @@ -24,64 +24,128 @@ extern uint32_t I2C_Freq; /* USER CODE END 0 */ +I2C_HandleTypeDef hi2c1; + /** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - LL_I2C_InitTypeDef I2C_InitStruct = {0}; - - LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; - - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - - LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = LL_GPIO_PIN_6 | LL_GPIO_PIN_7; - GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; - GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; - GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; - GPIO_InitStruct.Alternate = LL_GPIO_AF_4; - LL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C1); - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - - /** I2C Initialization - */ - LL_I2C_EnableAutoEndMode(I2C1); - LL_I2C_DisableOwnAddress2(I2C1); - LL_I2C_DisableGeneralCall(I2C1); - LL_I2C_EnableClockStretching(I2C1); - I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; - I2C_InitStruct.Timing = 0x00100413; - I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; - I2C_InitStruct.DigitalFilter = 0; - I2C_InitStruct.OwnAddress1 = 0; - I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; - I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; - LL_I2C_Init(I2C1, &I2C_InitStruct); - LL_I2C_SetOwnAddress2(I2C1, 0, LL_I2C_OWNADDRESS2_NOMASK); - - /** I2C Fast mode Plus enable - */ - LL_I2C_EnableFastModePlus(I2C1); - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x00100413; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + if (HAL_I2CEx_ConfigFastModePlus(&hi2c1, I2C_FASTMODEPLUS_ENABLE) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + } diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/SAMM_TOF/Src/main.c index 10602042c..0877d825f 100644 --- a/SAMM/SAMM_TOF/Src/main.c +++ b/SAMM/SAMM_TOF/Src/main.c @@ -29,7 +29,7 @@ /* USER CODE BEGIN Includes */ #include -#include "../Extras/VL53L4ED/VL53L4ED_api.h" +#include "VL53L4ED_api.h" #include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ diff --git a/SAMM/SAMM_TOF/Extras/VL53L4ED/platform.c b/SAMM/SAMM_TOF/Src/platform.c similarity index 100% rename from SAMM/SAMM_TOF/Extras/VL53L4ED/platform.c rename to SAMM/SAMM_TOF/Src/platform.c diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index b92973530..b81b1dbaf 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -62,3 +62,75 @@ void MX_SPI1_Init(void) /* USER CODE END spi1_Init 2 */ } + + +/** + * @brief SPI MSP Initialization + * This function configures the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } +} + +/** + * @brief SPI MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) +{ + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ From cee41be0882fbc0136e753904e4967b6233dbbbd Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 16:17:17 -0700 Subject: [PATCH 053/158] More fixes in mag.c for mag_init, mag_transmit, and mag_read_device_status STILL WIP --- ERRORS.txt | 56 ----------------------------------------- SAMM/SAMM_Mag/Src/mag.c | 16 ++++++------ 2 files changed, 9 insertions(+), 63 deletions(-) delete mode 100644 ERRORS.txt diff --git a/ERRORS.txt b/ERRORS.txt deleted file mode 100644 index db2946565..000000000 --- a/ERRORS.txt +++ /dev/null @@ -1,56 +0,0 @@ -cmake --preset Debug -Preset CMake variables: - - CMAKE_BUILD_TYPE="Debug" - CMAKE_PRESET_NAME="Debug" - CMAKE_TOOLCHAIN_FILE:FILEPATH="/Users/Shravya/Firmware/Lib/cmake/gcc-arm-none-eabi.cmake" - TARGET_TYPE="Embedded" - --- Build type: Debug --- Target type: Embedded --- Active CMake Preset: Debug --- Not using ccache: ccache not found in PATH --- Configuring done (0.1s) --- Generating done (0.4s) --- Build files have been written to: /Users/Shravya/Firmware/build/Debug -cmake --build --preset Debug -[1/2272] Building C object CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/mag.c.obj -FAILED: CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/mag.c.obj - -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_transmit': -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:39:14: warning: unused variable 'res' [-Wunused-variable] - 39 | bool res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - | ^~~ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_read_device_status': -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:103:20: error: subscripted value is neither array nor pointer nor vector - 103 | return read[0]; // read aok - | ^ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:102:18: warning: variable 'read' set but not used [-Wunused-but-set-variable] - 102 | uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status - | ^~~~ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: At top level: -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:150:9: error: conflicting types for 'mag_read_turns'; have 'int16_t(mag *)' {aka 'short int(mag *)'} - 150 | int16_t mag_read_turns(mag *mag_dev) - | ^~~~~~~~~~~~~~ -In file included from /Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:1: -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Inc/mag.h:35:10: note: previous declaration of 'mag_read_turns' with type 'uint16_t(mag *)' {aka 'short unsigned int(mag *)'} - 35 | uint16_t mag_read_turns(mag *mag_dev); - | ^~~~~~~~~~~~~~ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c: In function 'mag_read_device_status': -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/mag.c:104:1: warning: control reaches end of non-void function [-Wreturn-type] - 104 | } - | ^ - -[4/2272] Building C object CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -FAILED: CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -/Applications/ArmGNUToolchain/14.2.rel1/arm-none-eabi/bin/arm-none-eabi-gcc -DLOGOMATIC_ENABLED -DSTM32H5 -DSTM32H523xx -DUSE_FULL_LL_DRIVER -DUSE_HAL_DRIVER -I/Users/Shravya/Firmware/Lib/Vendor/STM32_HAL_LL/STM32H5xx/Inc -I/Users/Shravya/Firmware/Lib/Vendor/STM32_HAL_LL/Common/Inc -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32G4xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32L4xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32U5xx -I/Users/Shravya/Firmware/Lib/Vendor/CMSIS_5/Core/Inc/STM32H5xx -I/Users/Shravya/Firmware/SAMM/SAMM_Mag/Inc -I/Users/Shravya/Firmware/Autogen/CAN/Inc -I/Users/Shravya/Firmware/Lib/Peripherals/CAN/Inc -I/Users/Shravya/Firmware/Lib/Peripherals/CAN/Test -I/Users/Shravya/Firmware/Lib/Utils/CircularBuffer/Inc -I/Users/Shravya/Firmware/Lib/Utils/BitManipulations/Inc -I/Users/Shravya/Firmware/SAMM/IMU/Inc -I/Users/Shravya/Firmware/Lib/Utils/Logomatic/Inc -I/Users/Shravya/Firmware/Lib/GlobalShare/Inc -Wall -Wextra -Wpedantic -Wvla -Wdouble-promotion -fshort-enums -fdata-sections -ffunction-sections -fstack-usage -O0 -g3 -std=gnu11 -u _printf_float -mcpu=cortex-m33 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -mthumb -MD -MT CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -MF CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj.d -o CMakeFiles/SAMM_Mag.dir/SAMM/SAMM_Mag/Src/main.c.obj -c /Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c: In function 'main': -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:129:13: error: void value not ignored as it ought to be - 129 | if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { - | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:181:47: warning: implicit conversion from 'float' to 'double' when passing argument to function [-Wdouble-promotion] - 181 | printf("Temperature is %f\n", temp); - | ^~~~ -/Users/Shravya/Firmware/SAMM/SAMM_Mag/Src/main.c:182:41: warning: implicit conversion from 'float' to 'double' when passing argument to function [-Wdouble-promotion] - 182 | printf("Angle is %f\n", angle); - | ^~~~~ diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index dcc59cc80..fa48cf8b9 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -33,15 +33,17 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD uint16_t mag_transmit(mag *mag_dev, uint16_t data) { - uint8_t tx_word[2] = {data >> 8, data & 0xFF}; + uint8_t tx_word[2] = {data >> 8, data & 0xFF}; // Separate into two bytes uint8_t rx_word[2] = {0}; - // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); //A1113 chip select active low - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // disable + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // A1113 chip select active low + HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - // fix-me add error handling - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); - // HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // Release chip select back to high + + if (res != HAL_OK) { + return 0xFFFF; // TODO: Find appropriate error indicator + } return ((uint16_t)rx_word[0] << 8) | rx_word[1]; } @@ -102,7 +104,7 @@ float mag_read_encoder_angle(mag *mag_dev) bool mag_read_device_status(mag *mag_dev) { uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status - return read[0]; // read aok + return (read & 0x0001); // read aok } float mag_read_temp(mag *mag_dev) From 88dda05167917a6269f2eaf5e8530a68a0ce3b9f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:23:36 +0000 Subject: [PATCH 054/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 4 +- SAMM/SAMM_Mag/Src/spi.c | 318 +++++++++++++++++++--------------------- SAMM/SAMM_TOF/Src/i2c.c | 200 ++++++++++++------------- SAMM/SAMM_TOF/Src/spi.c | 1 - 4 files changed, 251 insertions(+), 272 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index fa48cf8b9..d9f32c85f 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -104,12 +104,12 @@ float mag_read_encoder_angle(mag *mag_dev) bool mag_read_device_status(mag *mag_dev) { uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status - return (read & 0x0001); // read aok + return (read & 0x0001); // read aok } float mag_read_temp(mag *mag_dev) { - uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register + uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register return ((uint16_t)(read_temp & 0x0FFF) / 8.0f + 25); // Mask to 12 bits (valid temp data) } diff --git a/SAMM/SAMM_Mag/Src/spi.c b/SAMM/SAMM_Mag/Src/spi.c index 6ecb4e8b2..35f545ddd 100644 --- a/SAMM/SAMM_Mag/Src/spi.c +++ b/SAMM/SAMM_Mag/Src/spi.c @@ -73,183 +73,173 @@ void MX_SPI1_Init(void) } /** - * @brief SPI3 Initialization Function - * @param None - * @retval None - */ + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ void MX_SPI3_Init(void) { - /* USER CODE BEGIN SPI3_Init 0 */ - - /* USER CODE END SPI3_Init 0 */ - - /* USER CODE BEGIN SPI3_Init 1 */ - - /* USER CODE END SPI3_Init 1 */ - /* SPI3 parameter configuration*/ - hspi3.Instance = SPI3; - hspi3.Init.Mode = SPI_MODE_MASTER; - hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_4BIT; - hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi3.Init.NSS = SPI_NSS_SOFT; - hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; - hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi3.Init.TIMode = SPI_TIMODE_DISABLE; - hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi3.Init.CRCPolynomial = 0x13; - hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; - hspi3.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; - hspi3.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; - hspi3.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; - hspi3.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; - hspi3.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; - hspi3.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; - hspi3.Init.IOSwap = SPI_IO_SWAP_DISABLE; - hspi3.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; - hspi3.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; - if (HAL_SPI_Init(&hspi3) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN SPI3_Init 2 */ - - /* USER CODE END SPI3_Init 2 */ + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_4BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 0x13; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + hspi3.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; + hspi3.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA; + hspi3.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE; + hspi3.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE; + hspi3.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE; + hspi3.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE; + hspi3.Init.IOSwap = SPI_IO_SWAP_DISABLE; + hspi3.Init.ReadyMasterManagement = SPI_RDY_MASTER_MANAGEMENT_INTERNALLY; + hspi3.Init.ReadyPolarity = SPI_RDY_POLARITY_HIGH; + if (HAL_SPI_Init(&hspi3) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + /* USER CODE END SPI3_Init 2 */ } /** -* @brief SPI MSP Initialization -* This function configures the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) + * @brief SPI MSP Initialization + * This function configures the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspInit 0 */ - - /* USER CODE END SPI1_MspInit 0 */ - LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - __HAL_RCC_SPI1_CLK_ENABLE(); - - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - } - else if(hspi->Instance==SPI3) - { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - - LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); - - /* Peripheral clock enable */ - __HAL_RCC_SPI3_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI3 GPIO Configuration - PB0 ------> SPI3_MISO - PB1 ------> SPI3_SCK - PB2 ------> SPI3_MOSI - */ - GPIO_InitStruct.Pin = GPIO_PIN_0; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_1; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI3_MspInit 1 */ - - /* USER CODE END SPI3_MspInit 1 */ - } - + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + LL_RCC_SetSPIClockSource(LL_RCC_SPI1_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } else if (hspi->Instance == SPI3) { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + + LL_RCC_SetSPIClockSource(LL_RCC_SPI3_CLKSOURCE_PLL1Q); + + /* Peripheral clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } } /** -* @brief SPI MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hspi: SPI handle pointer -* @retval None -*/ -void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) + * @brief SPI MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hspi: SPI handle pointer + * @retval None + */ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef *hspi) { - if(hspi->Instance==SPI1) - { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ - - /* USER CODE END SPI1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI1_CLK_DISABLE(); - - /**SPI1 GPIO Configuration - PA4 ------> SPI1_NSS - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); - - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ - } - else if(hspi->Instance==SPI3) - { - /* USER CODE BEGIN SPI3_MspDeInit 0 */ - - /* USER CODE END SPI3_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI3_CLK_DISABLE(); - - /**SPI3 GPIO Configuration - PB0 ------> SPI3_MISO - PB1 ------> SPI3_SCK - PB2 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2); - - /* USER CODE BEGIN SPI3_MspDeInit 1 */ - - /* USER CODE END SPI3_MspDeInit 1 */ - } + if (hspi->Instance == SPI1) { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA4 ------> SPI1_NSS + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } else if (hspi->Instance == SPI3) { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PB0 ------> SPI3_MISO + PB1 ------> SPI3_SCK + PB2 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } } /* USER CODE BEGIN 1 */ diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/SAMM_TOF/Src/i2c.c index ce63fc393..f4ddeb4f8 100644 --- a/SAMM/SAMM_TOF/Src/i2c.c +++ b/SAMM/SAMM_TOF/Src/i2c.c @@ -27,125 +27,115 @@ extern uint32_t I2C_Freq; I2C_HandleTypeDef hi2c1; /** - * @brief I2C1 Initialization Function - * @param None - * @retval None - */ + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ void MX_I2C1_Init(void) { - /* USER CODE BEGIN I2C1_Init 0 */ - - /* USER CODE END I2C1_Init 0 */ - - /* USER CODE BEGIN I2C1_Init 1 */ - - /* USER CODE END I2C1_Init 1 */ - hi2c1.Instance = I2C1; - hi2c1.Init.Timing = 0x00100413; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Analogue filter - */ - if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) - { - Error_Handler(); - } - - /** Configure Digital filter - */ - if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) - { - Error_Handler(); - } - - /** I2C Fast mode Plus enable - */ - if (HAL_I2CEx_ConfigFastModePlus(&hi2c1, I2C_FASTMODEPLUS_ENABLE) != HAL_OK) - { - Error_Handler(); - } - /* USER CODE BEGIN I2C1_Init 2 */ - - /* USER CODE END I2C1_Init 2 */ - + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x00100413; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) { + Error_Handler(); + } + + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) { + Error_Handler(); + } + + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) { + Error_Handler(); + } + + /** I2C Fast mode Plus enable + */ + if (HAL_I2CEx_ConfigFastModePlus(&hi2c1, I2C_FASTMODEPLUS_ENABLE) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ } /** -* @brief I2C MSP Initialization -* This function configures the hardware resources used in this example -* @param hi2c: I2C handle pointer -* @retval None -*/ -void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) + * @brief I2C MSP Initialization + * This function configures the hardware resources used in this example + * @param hi2c: I2C handle pointer + * @retval None + */ +void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(hi2c->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspInit 0 */ - - /* USER CODE END I2C1_MspInit 0 */ - LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_I2C1_CLK_ENABLE(); - /* USER CODE BEGIN I2C1_MspInit 1 */ - - /* USER CODE END I2C1_MspInit 1 */ - - } - + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if (hi2c->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + LL_RCC_SetI2CClockSource(LL_RCC_I2C1_CLKSOURCE_PCLK1); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } } /** -* @brief I2C MSP De-Initialization -* This function freeze the hardware resources used in this example -* @param hi2c: I2C handle pointer -* @retval None -*/ -void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) + * @brief I2C MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param hi2c: I2C handle pointer + * @retval None + */ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c) { - if(hi2c->Instance==I2C1) - { - /* USER CODE BEGIN I2C1_MspDeInit 0 */ - - /* USER CODE END I2C1_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C1_CLK_DISABLE(); + if (hi2c->Instance == I2C1) { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); - HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); - /* USER CODE BEGIN I2C1_MspDeInit 1 */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); - /* USER CODE END I2C1_MspDeInit 1 */ - } + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + /* USER CODE END I2C1_MspDeInit 1 */ + } } diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/SAMM_TOF/Src/spi.c index b81b1dbaf..f8bf9a352 100644 --- a/SAMM/SAMM_TOF/Src/spi.c +++ b/SAMM/SAMM_TOF/Src/spi.c @@ -63,7 +63,6 @@ void MX_SPI1_Init(void) /* USER CODE END spi1_Init 2 */ } - /** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example From ce28a76f3d865c9bb5410522f20581585df02c87 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 18:47:04 -0700 Subject: [PATCH 055/158] Fixed errors in mag files --- SAMM/SAMM_Mag/Inc/mag.h | 2 +- SAMM/SAMM_Mag/Src/main.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index b9541a2f1..1455c6dc7 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -32,7 +32,7 @@ float mag_read_temp(mag *mag_dev); bool check_status(mag *mag_dev); -uint16_t mag_read_turns(mag *mag_dev); +int16_t mag_read_turns(mag *mag_dev); float mag_read_HANG(mag *mag_dev); diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 41723d02d..b1a618d14 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -178,11 +178,11 @@ int main(void) int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); bool bad = check_status(&mag_dev); - printf("Temperature is %f\n", temp); - printf("Angle is %f\n", angle); + printf("Temperature is %d\n", (double)temp); + printf("Angle is %d\n", (double)angle); printf("Number of turns is %d\n", turns); if (!bad) { - printf("67 69 420 something is cooked"); + printf("something is cooked"); mag_write_error(&mag_dev); } } From 959ab058af86671129c80e9d9045e58969cbff90 Mon Sep 17 00:00:00 2001 From: Daniel Hansen <105574022+dchansen06@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:42:19 -0700 Subject: [PATCH 056/158] Add CAN Support For STM32H523 (#440) # CAN on STM32H523 ## Problem and Scope SAMM boards use the STM32H523 chipset but currently the CAN peripheral does not have support for CAN ## Description Adds support and testing for CAN on the STM32H5 ## Gotchas and Limitations May not have had hardware to test prior to merge, to be determined sadly ## Testing - [x] HOOTL testing - [ ] HITL testing - [ ] Human tested ### Testing Details Hopefully will have boards but as of now no testing is possible ## Larger Impact Allows SAMM boards to talk on CAN ## Additional Context and Ticket Resolves #350 --------- Signed-off-by: Daniel Hansen Co-authored-by: vihanjay@gmail.com <55373538+VihanJ@users.noreply.github.com> Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Kiran Duriseti --- .vscode/launch.json | 31 ++ .vscode/tasks.json | 9 + CMakeLists.txt | 2 + .../Core/Inc/FancyCAN_LoopbackTest.h | 6 + H523xx_CAN_TESTING/Core/Inc/adc.h | 49 ++ H523xx_CAN_TESTING/Core/Inc/crc.h | 51 ++ H523xx_CAN_TESTING/Core/Inc/dma.h | 51 ++ H523xx_CAN_TESTING/Core/Inc/fdcan.h | 51 ++ H523xx_CAN_TESTING/Core/Inc/gpio.h | 48 ++ H523xx_CAN_TESTING/Core/Inc/i2c.h | 49 ++ H523xx_CAN_TESTING/Core/Inc/main.h | 115 +++++ H523xx_CAN_TESTING/Core/Inc/spi.h | 49 ++ .../Core/Inc/stm32h5xx_hal_conf.h | 473 ++++++++++++++++++ H523xx_CAN_TESTING/Core/Inc/stm32h5xx_it.h | 66 +++ H523xx_CAN_TESTING/Core/Inc/tim.h | 49 ++ H523xx_CAN_TESTING/Core/Inc/usart.h | 50 ++ .../Core/Src/FancyCAN_LoopbackTest.c | 419 ++++++++++++++++ H523xx_CAN_TESTING/Core/Src/adc.c | 186 +++++++ H523xx_CAN_TESTING/Core/Src/crc.c | 86 ++++ H523xx_CAN_TESTING/Core/Src/dma.c | 50 ++ H523xx_CAN_TESTING/Core/Src/fdcan.c | 135 +++++ H523xx_CAN_TESTING/Core/Src/gpio.c | 260 ++++++++++ H523xx_CAN_TESTING/Core/Src/i2c.c | 92 ++++ H523xx_CAN_TESTING/Core/Src/spi.c | 95 ++++ .../Core/Src/stm32h5xx_hal_msp.c | 79 +++ H523xx_CAN_TESTING/Core/Src/stm32h5xx_it.c | 198 ++++++++ H523xx_CAN_TESTING/Core/Src/tim.c | 79 +++ H523xx_CAN_TESTING/Core/Src/usart.c | 184 +++++++ .../H523xx_CAN_BASIC_TEST/CMakeLists.txt | 63 +++ .../H523xx_CAN_BASIC_TEST/can_cfg.h | 8 + .../can_external_test_cfg.h | 6 + .../H523xx_CAN_BASIC_TEST/main.c | 272 ++++++++++ H523xx_CAN_TESTING/README.md | 5 + .../GRCAN/Inc/GRCAN_FancyLayer.h | 1 + .../GRCAN/Inc/grcan_utils.h | 8 + .../GRCAN/Src/grcan_utils.c | 39 +- .../GRCAN/grcan_fancylayer.cmake | 3 - .../CAN/Inc/STM32H5_hal_fdcan_defines.h | 61 +++ Lib/Peripherals/CAN/Inc/can.h | 14 + Lib/Peripherals/CAN/Inc/can_platform_deps.h | 9 + Lib/Peripherals/CAN/Src/can.c | 75 ++- Lib/Peripherals/CAN/Src/can_cfg_helpers.c | 88 ++++ Lib/Peripherals/CAN/Src/can_dma.c | 8 +- Lib/Peripherals/CAN/Test/can_basic_test.c | 2 +- Lib/Peripherals/CAN/Test/can_filter_test.c | 2 +- Lib/Peripherals/CAN/Test/can_lost_rx_test.c | 2 +- Lib/Peripherals/CAN/Test/can_release_test.c | 2 +- Lib/Peripherals/CAN/Test/can_stress_test.c | 2 +- Lib/Peripherals/CAN/common.cmake | 14 +- 49 files changed, 3678 insertions(+), 18 deletions(-) create mode 100644 H523xx_CAN_TESTING/Core/Inc/FancyCAN_LoopbackTest.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/adc.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/crc.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/dma.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/fdcan.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/gpio.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/i2c.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/main.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/spi.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/stm32h5xx_hal_conf.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/stm32h5xx_it.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/tim.h create mode 100644 H523xx_CAN_TESTING/Core/Inc/usart.h create mode 100644 H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c create mode 100644 H523xx_CAN_TESTING/Core/Src/adc.c create mode 100644 H523xx_CAN_TESTING/Core/Src/crc.c create mode 100644 H523xx_CAN_TESTING/Core/Src/dma.c create mode 100644 H523xx_CAN_TESTING/Core/Src/fdcan.c create mode 100644 H523xx_CAN_TESTING/Core/Src/gpio.c create mode 100644 H523xx_CAN_TESTING/Core/Src/i2c.c create mode 100644 H523xx_CAN_TESTING/Core/Src/spi.c create mode 100644 H523xx_CAN_TESTING/Core/Src/stm32h5xx_hal_msp.c create mode 100644 H523xx_CAN_TESTING/Core/Src/stm32h5xx_it.c create mode 100644 H523xx_CAN_TESTING/Core/Src/tim.c create mode 100644 H523xx_CAN_TESTING/Core/Src/usart.c create mode 100644 H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/CMakeLists.txt create mode 100644 H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_cfg.h create mode 100644 H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_external_test_cfg.h create mode 100644 H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c create mode 100644 H523xx_CAN_TESTING/README.md create mode 100644 Lib/Peripherals/CAN/Inc/STM32H5_hal_fdcan_defines.h diff --git a/.vscode/launch.json b/.vscode/launch.json index 3eb115d7a..76bd5636a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -746,6 +746,37 @@ } ] } + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/H523xx_CAN_BASIC_TEST.elf", + "name": "H523xx_CAN_BASIC_TEST", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32h5x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build H523xx_CAN_BASIC_TEST", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + "swoConfig": { + "enabled": true, + "cpuFrequency": 170000000, + "swoFrequency": 2000000, + "source": "probe", + "decoders": [ + { + "type": "console", + "label": "ITM", + "showOnStartup": true, + "port": 0, + "encoding": "ascii" + } + ] + } } ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ce04cdcea..c39239714 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -242,6 +242,15 @@ "CMake: configure" ], "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target G431x8_CAN_BASIC_TEST" + }, + { + "label": "CMake: configure and build H523xx_CAN_BASIC_TEST", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target H523xx_CAN_BASIC_TEST" } ] } diff --git a/CMakeLists.txt b/CMakeLists.txt index f5b0ac49d..88947a00f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -125,7 +125,9 @@ add_gr_project(STM32G474xE G474xE_CAN_TESTING CAN_STRESS_TEST) add_gr_project(STM32G474xE G474xE_CAN_TESTING CAN_LOST_RX_TEST) add_gr_project(STM32G474xE G474xE_CAN_TESTING CAN_FILTER_TEST) add_gr_project(STM32G474xE G474xE_CAN_TESTING PROFILER_TEST) + add_gr_project(STM32G431x8 G431x8_CAN_TESTING G431x8_CAN_BASIC_TEST) +add_gr_project(STM32H523xE H523xx_CAN_TESTING H523xx_CAN_BASIC_TEST) add_gr_project(STM32G474xE G4FANCYCANTESTING CAN_LOOPBACK_TEST) diff --git a/H523xx_CAN_TESTING/Core/Inc/FancyCAN_LoopbackTest.h b/H523xx_CAN_TESTING/Core/Inc/FancyCAN_LoopbackTest.h new file mode 100644 index 000000000..9a2ba9a26 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/FancyCAN_LoopbackTest.h @@ -0,0 +1,6 @@ +#ifndef FANCYCAN_LOOPBACKTEST_H +#define FANCYCAN_LOOPBACKTEST_H + +int FancyCAN_LoopbackTest(void); + +#endif // FANCYCAN_LOOPBACKTEST_H diff --git a/H523xx_CAN_TESTING/Core/Inc/adc.h b/H523xx_CAN_TESTING/Core/Inc/adc.h new file mode 100644 index 000000000..41154538b --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/adc.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.h + * @brief This file contains all the function prototypes for + * the adc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __ADC_H__ +#define __ADC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_ADC1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __ADC_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/crc.h b/H523xx_CAN_TESTING/Core/Inc/crc.h new file mode 100644 index 000000000..133957e92 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/crc.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.h + * @brief This file contains all the function prototypes for + * the crc.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __CRC_H__ +#define __CRC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern CRC_HandleTypeDef hcrc; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_CRC_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __CRC_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/dma.h b/H523xx_CAN_TESTING/Core/Inc/dma.h new file mode 100644 index 000000000..ae819cab4 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/dma.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.h + * @brief This file contains all the function prototypes for + * the dma.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DMA_H__ +#define __DMA_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* DMA memory to memory transfer handles -------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_DMA_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/fdcan.h b/H523xx_CAN_TESTING/Core/Inc/fdcan.h new file mode 100644 index 000000000..56c4a8adb --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/fdcan.h @@ -0,0 +1,51 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file fdcan.h + * @brief This file contains all the function prototypes for + * the fdcan.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __FDCAN_H__ +#define __FDCAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern FDCAN_HandleTypeDef hfdcan2; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_FDCAN2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __FDCAN_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/gpio.h b/H523xx_CAN_TESTING/Core/Inc/gpio.h new file mode 100644 index 000000000..843d4e9e7 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/gpio.h @@ -0,0 +1,48 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.h + * @brief This file contains all the function prototypes for + * the gpio.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GPIO_H__ +#define __GPIO_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ GPIO_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/i2c.h b/H523xx_CAN_TESTING/Core/Inc/i2c.h new file mode 100644 index 000000000..0a0a50803 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/i2c.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.h + * @brief This file contains all the function prototypes for + * the i2c.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __I2C_H__ +#define __I2C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_I2C2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __I2C_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/main.h b/H523xx_CAN_TESTING/Core/Inc/main.h new file mode 100644 index 000000000..e8511a935 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/main.h @@ -0,0 +1,115 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h5xx_hal.h" +#include "stm32h5xx_ll_adc.h" +#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_cortex.h" +#include "stm32h5xx_ll_crs.h" +#include "stm32h5xx_ll_dma.h" +#include "stm32h5xx_ll_exti.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_i2c.h" +#include "stm32h5xx_ll_lpuart.h" +#include "stm32h5xx_ll_pwr.h" +#include "stm32h5xx_ll_rcc.h" +#include "stm32h5xx_ll_spi.h" +#include "stm32h5xx_ll_system.h" +#include "stm32h5xx_ll_tim.h" +#include "stm32h5xx_ll_usart.h" +#include "stm32h5xx_ll_utils.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define BSPD_SIGNAL_Pin LL_GPIO_PIN_1 +#define BSPD_SIGNAL_GPIO_Port GPIOC +#define APPS1_SIGNAL_Pin LL_GPIO_PIN_2 +#define APPS1_SIGNAL_GPIO_Port GPIOC +#define APPS2_SIGNAL_Pin LL_GPIO_PIN_3 +#define APPS2_SIGNAL_GPIO_Port GPIOC +#define BLINKY_Pin LL_GPIO_PIN_5 +#define BLINKY_GPIO_Port GPIOA +#define IMD_SENSE_Pin LL_GPIO_PIN_6 +#define IMD_SENSE_GPIO_Port GPIOA +#define AMS_SENSE_Pin LL_GPIO_PIN_7 +#define AMS_SENSE_GPIO_Port GPIOA +#define BRAKE_F_SIGNAL_Pin LL_GPIO_PIN_0 +#define BRAKE_F_SIGNAL_GPIO_Port GPIOB +#define BRAKE_R_SIGNAL_Pin LL_GPIO_PIN_1 +#define BRAKE_R_SIGNAL_GPIO_Port GPIOB +#define LED_TEST_Pin LL_GPIO_PIN_11 +#define LED_TEST_GPIO_Port GPIOB +#define AUX_SIGNAL_Pin LL_GPIO_PIN_14 +#define AUX_SIGNAL_GPIO_Port GPIOB +#define STEERING_ANGLE_Pin LL_GPIO_PIN_15 +#define STEERING_ANGLE_GPIO_Port GPIOB +#define BRAKE_LIGHT_Pin LL_GPIO_PIN_4 +#define BRAKE_LIGHT_GPIO_Port GPIOB +#define TSSI_G_CONTROL_Pin LL_GPIO_PIN_5 +#define TSSI_G_CONTROL_GPIO_Port GPIOB +#define AUX_CONTROL_Pin LL_GPIO_PIN_8 +#define AUX_CONTROL_GPIO_Port GPIOB +#define SOFTWARE_OK_CONTROL_Pin LL_GPIO_PIN_9 +#define SOFTWARE_OK_CONTROL_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/H523xx_CAN_TESTING/Core/Inc/spi.h b/H523xx_CAN_TESTING/Core/Inc/spi.h new file mode 100644 index 000000000..74bed003b --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/spi.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.h + * @brief This file contains all the function prototypes for + * the spi.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __SPI_H__ +#define __SPI_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SPI_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_hal_conf.h b/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_hal_conf.h new file mode 100644 index 000000000..8c03cc07d --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_hal_conf.h @@ -0,0 +1,473 @@ +/* USER CODE BEGIN Header */ +/** + ********************************************************************************************************************** + + * @file stm32h5xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ********************************************************************************************************************** + + * @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. + * + ********************************************************************************************************************** + + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -----------------------------------------------------------------------------*/ + +#ifndef STM32H5xx_HAL_CONF_H +#define STM32H5xx_HAL_CONF_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Exported types ----------------------------------------------------------------------------------------------------*/ +/* Exported constants ------------------------------------------------------------------------------------------------*/ + +/* ########################################### Module Selection ##################################################### */ + +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CEC_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCACHE_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DTS_MODULE_ENABLED */ +#define HAL_FDCAN_MODULE_ENABLED +/*#define HAL_GTZC_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_I2C_MODULE_ENABLED */ +/*#define HAL_I3C_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_XSPI_MODULE_ENABLED */ +/*#define HAL_OTFDEC_MODULE_ENABLED */ +/*#define HAL_PKA_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_RAMCFG_MODULE_ENABLED */ +/*#define HAL_UART_MODULE_ENABLED */ +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_PSSI_MODULE_ENABLED */ +/*#define HAL_ICACHE_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ####################################### Oscillator Values adaptation ##############################################*/ + +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined(HSE_VALUE) +#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined(HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined(CSI_VALUE) +#define CSI_VALUE 4000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined(HSI_VALUE) +#define HSI_VALUE 64000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined(HSI48_VALUE) +#define HSI48_VALUE \ + 48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. \ + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined(LSI_VALUE) +#define LSI_VALUE 32000UL /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz \ + The real value may vary depending on the variations \ + in voltage and temperature.*/ + +#if !defined(LSI_STARTUP_TIME) +#define LSI_STARTUP_TIME 130UL /*!< Time out for LSI start up, in us */ +#endif /* LSI_STARTUP_TIME */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined(LSE_VALUE) +#define LSE_VALUE 32768UL /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined(LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT 5000UL /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ +/** + * @brief External clock source for SPI peripheral + * This value is used by the SPI HAL module to compute the SPI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + + */ +#if !defined(EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ############################################ System Configuration ################################################ */ + +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE 3300UL /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U /*!< Enable prefetch */ + +/* ############################################ Assert Selection #################################################### */ + +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ + +/* #define USE_FULL_ASSERT 1U */ + +/* ############################################ Register callback feature configuration ############################# */ + +/** + * @brief Set below the peripheral configuration to "1U" to add the support + * of HAL callback registration/unregistration feature for the HAL + * driver(s). This allows user application to provide specific callback + * functions thanks to HAL_PPP_RegisterCallback() rather than overwriting + * the default weak callback functions (see each stm32h5xx_hal_ppp.h file + * for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef + * for each PPP peripheral). + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DTS_REGISTER_CALLBACKS 0U /* DTS register callback disabled */ +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_I3C_REGISTER_CALLBACKS 0U /* I3C register callback disabled */ +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */ +#define USE_HAL_IWDG_REGISTER_CALLBACKS 0U /* IWDG register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_OTFDEC_REGISTER_CALLBACKS 0U /* OTFDEC register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_PKA_REGISTER_CALLBACKS 0U /* PKA register callback disabled */ +#define USE_HAL_RAMCFG_REGISTER_CALLBACKS 0U /* RAMCFG register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */ +#define USE_HAL_SDIO_REGISTER_CALLBACKS 0U /* SDIO register callback disabled */ +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */ +#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ +#define USE_HAL_XSPI_REGISTER_CALLBACKS 0U /* XSPI register callback disabled */ + +/* ############################################ SPI peripheral configuration ######################################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ +#define USE_SPI_CRC 0U + +/* ################## SDMMC peripheral configuration ######################### */ + +#define USE_SD_TRANSCEIVER 0U + +/* ################## SDIO peripheral configuration ######################### */ + +#define USE_SDIO_TRANSCEIVER 0U +#define SDIO_MAX_IO_NUMBER 7U + +/* Includes ----------------------------------------------------------------------------------------------------------*/ + +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32h5xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32h5xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_ICACHE_MODULE_ENABLED +#include "stm32h5xx_hal_icache.h" +#endif /* HAL_ICACHE_MODULE_ENABLED */ + +#ifdef HAL_DCACHE_MODULE_ENABLED +#include "stm32h5xx_hal_dcache.h" +#endif /* HAL_DCACHE_MODULE_ENABLED */ + +#ifdef HAL_GTZC_MODULE_ENABLED +#include "stm32h5xx_hal_gtzc.h" +#endif /* HAL_GTZC_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32h5xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DTS_MODULE_ENABLED +#include "stm32h5xx_hal_dts.h" +#endif /* HAL_DTS_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32h5xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_PKA_MODULE_ENABLED +#include "stm32h5xx_hal_pka.h" +#endif /* HAL_PKA_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32h5xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32h5xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32h5xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32h5xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32h5xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED +#include "stm32h5xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32h5xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_SDIO_MODULE_ENABLED +#include "stm32h5xx_hal_sdio.h" +#endif /* HAL_SDIO_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED +#include "stm32h5xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32h5xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32h5xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32h5xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32h5xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_I3C_MODULE_ENABLED +#include "stm32h5xx_hal_i3c.h" +#endif /* HAL_I3C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32h5xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32h5xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32h5xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_XSPI_MODULE_ENABLED +#include "stm32h5xx_hal_xspi.h" +#endif /* HAL_XSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32h5xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32h5xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED +#include "stm32h5xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32h5xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32h5xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32h5xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32h5xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32h5xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32h5xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32h5xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32h5xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32h5xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED +#include "stm32h5xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED +#include "stm32h5xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32h5xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32h5xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32h5xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_OTFDEC_MODULE_ENABLED +#include "stm32h5xx_hal_otfdec.h" +#endif /* HAL_OTFDEC_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED +#include "stm32h5xx_hal_pssi.h" +#endif /* HAL_PSSI_MODULE_ENABLED */ + +#ifdef HAL_RAMCFG_MODULE_ENABLED +#include "stm32h5xx_hal_ramcfg.h" +#endif /* HAL_RAMCFG_MODULE_ENABLED */ + +/* Exported macro ----------------------------------------------------------------------------------------------------*/ + +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ +#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ----------------------------------------------------------------------------------------------- */ + +void assert_failed(uint8_t *file, uint32_t line); +#else +#define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* STM32H5xx_HAL_CONF_H */ diff --git a/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_it.h b/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_it.h new file mode 100644 index 000000000..3ceea5ce8 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/stm32h5xx_it.h @@ -0,0 +1,66 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2026 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32H5xx_IT_H +#define __STM32H5xx_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32H5xx_IT_H */ diff --git a/H523xx_CAN_TESTING/Core/Inc/tim.h b/H523xx_CAN_TESTING/Core/Inc/tim.h new file mode 100644 index 000000000..c19e6cc71 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/tim.h @@ -0,0 +1,49 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.h + * @brief This file contains all the function prototypes for + * the tim.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __TIM_H__ +#define __TIM_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_TIM2_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __TIM_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Inc/usart.h b/H523xx_CAN_TESTING/Core/Inc/usart.h new file mode 100644 index 000000000..daefd73e6 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Inc/usart.h @@ -0,0 +1,50 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.h + * @brief This file contains all the function prototypes for + * the usart.c file + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USART_H__ +#define __USART_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_LPUART1_UART_Init(void); +void MX_USART1_UART_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* __USART_H__ */ diff --git a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c new file mode 100644 index 000000000..f9eca982a --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -0,0 +1,419 @@ +#include +#include +#include + +#include "GRCAN_FancyLayer.h" +#include "Logomatic.h" +#include "stdlib.h" + +static volatile uint32_t rx_received = 0; +static volatile bool data_valid = false; +static uint8_t expected_data[TX_BUFFER_2_SIZE]; +static volatile uint32_t expected_size = 0; +static volatile uint32_t expected_id = 0; +static volatile bool id_valid = false; + +static void can_test_rx_callback(uint32_t id, void *data, uint32_t size) +{ + rx_received++; + if (size > sizeof(expected_data)) { + data_valid = false; + return; + } + data_valid = (size == expected_size) && (memcmp(data, expected_data, size) == 0); + id_valid = (id == expected_id); + + LOGOMATIC("\nCallback triggered: ID=%" PRIu32 ", Size=%lu, Data[0]=0x%x\n", id, (unsigned long)size, *(uint8_t *)data); +} + +// TODO - allow user to send data without needing to construct a header for the buffer +// TODO: G4 tests are dependent on the System clock configuration?? + +int GRCAN_Validate_InitBus(GRCAN_BUS_ID bus, GRCAN_OperatingMode mode, FDCAN_GlobalTypeDef *fdcan_instance) +{ + GRCAN_BusConfig bus_config; + GRCAN_SetDefaultBusConfig(&bus_config, bus); + bus_config.operating_mode = mode; // GRCAN_OPMODE_INTERNAL_LOOPBACK is only one tested so far + bus_config.fdcan_instance = fdcan_instance; + bus_config.rx_callback = can_test_rx_callback; // test loopback + + LOGOMATIC("Testing GRCAN_InitBus...\n"); + bool result = GRCAN_InitBus(&bus_config); + + if (result == true) { + LOGOMATIC("GRCAN_InitBus PASSED.\n"); + return 1; + } else { + LOGOMATIC("GRCAN_InitBus FAILED.\n"); + return 0; + } +} + +// GRCAN_ALL = 0xFF, +// GRCAN_BCU = 0x03, +// GRCAN_ECU = 0x02, +// GRCAN_CCU = 0x02, +// GRCAN_Charger = 0x00, +// GRCAN_Charging_SDC = 0x0C, +// GRCAN_DGPS = 0x30, +// GRCAN_Dash_Panel = 0x05, +// GRCAN_Debugger = 0x01, +// GRCAN_Fan_Controller_1 = 0x0D, +// GRCAN_Fan_Controller_2 = 0x0E, +// GRCAN_Fan_Controller_3 = 0x0F, +// GRCAN_GR_Inverter = 0x08, +// GRCAN_TCM = 0x04, + +GRCAN_NODE_ID get_nodeID(GRCAN_BUS_ID bus) +{ + switch (bus) { + case GRCAN_BUS_PRIMARY: + return GRCAN_BCU; + case GRCAN_BUS_DATA: + return GRCAN_ECU; + case GRCAN_BUS_TESTING: + return GRCAN_Debugger; + case GRCAN_BUS_CHARGER: + return GRCAN_Charger; + default: + return GRCAN_ALL; // All causes error + } +} + +// typedef enum { +// GRCAN_DEBUG_2_0 = 0x000, +// GRCAN_DEBUG_FD = 0x001, +// GRCAN_PING = 0x002, +// GRCAN_ECU_STATUS_1 = 0x003, +// GRCAN_ECU_STATUS_2 = 0x004, +// GRCAN_ECU_STATUS_3 = 0x005, +// GRCAN_ECU_CONFIG = 0x006, +// GRCAN_BCU_STATUS_1 = 0x007, +// GRCAN_BCU_STATUS_2 = 0x008, +// GRCAN_BCU_STATUS_3 = 0x009, +// GRCAN_BCU_PRECHARGE = 0x00A, +// GRCAN_BCU_CONFIG_CHARGE_PARAMETERS = 0x00B, +// GRCAN_BCU_CONFIG_OPERATIONAL_PARAMETERS = 0x00C, +// GRCAN_BCU_CELL_DATA_1 = 0x00D, +// GRCAN_BCU_CELL_DATA_2 = 0x00E, +// GRCAN_BCU_CELL_DATA_3 = 0x00F, +// GRCAN_BCU_CELL_DATA_4 = 0x010, +// GRCAN_BCU_CELL_DATA_5 = 0x011, +// GRCAN_INVERTER_STATUS_1 = 0x013, +// GRCAN_INVERTER_STATUS_2 = 0x014, +// GRCAN_INVERTER_STATUS_3 = 0x015, +// GRCAN_INVERTER_CONFIG = 0x016, +// GRCAN_INVERTER_COMMAND = 0x017, +// GRCAN_FAN_STATUS = 0x018, +// GRCAN_FAN_COMMAND = 0x019, +// GRCAN_DASH_STATUS = 0x01A, +// GRCAN_DASH_CONFIG = 0x01B, +// GRCAN_TCM_STATUS = 0x029, +// GRCAN_TCM_RESOURCE_UTILIZATION = 0x02A, +// GRCAN_DASH_WARNING_FLAGS = 0x02B, +// GRCAN_ECU_ANALOG_DATA = 0x02E, +// GRCAN_GPS_LAT = 0x031, +// GRCAN_GPS_LON = 0x032, +// GRCAN_GPS_ALT = 0x033, +// GRCAN_GPS_PX = 0x034, +// GRCAN_GPS_QY = 0x035, +// GRCAN_GPS_RZ = 0x036, +// GRCAN_UVW_DGPS = 0x030, +// GRCAN_ECU_PERFORMANCE = 0x123, +// } GRCAN_MSG_ID; + +GRCAN_MSG_ID get_messageID(GRCAN_BUS_ID bus) +{ + switch (bus) { + case GRCAN_BUS_PRIMARY: + return GRCAN_BCU_STATUS_1; + case GRCAN_BUS_DATA: + return GRCAN_ECU_STATUS_1; + case GRCAN_BUS_TESTING: + return GRCAN_DEBUG_2_0; + case GRCAN_BUS_CHARGER: + return GRCAN_BCU_CONFIG_CHARGE_PARAMETERS; + default: + return (GRCAN_MSG_ID)0xFF; // Invalid message ID + } +} + +int GRCAN_SendReceive(GRCAN_BUS_ID bus, GRCAN_NODE_ID nodeID, GRCAN_NODE_ID dest_nodeID, GRCAN_MSG_ID messageID, void *data, uint32_t size) +{ + if (data == NULL) { + data = "Hello"; + size = sizeof("Hello"); + } + + if (size > sizeof(expected_data)) { + LOGOMATIC("Data size exceeds expected_data buffer size. Test cannot proceed.\n"); + return 0; + } + + // typedef struct { + // GRCAN_NODE_ID srcID; + // GRCAN_NODE_ID destNode; + // GRCAN_MSG_ID messageID; + // } GRCAN_Fancy_ID; + + expected_size = size; + GRCAN_Fancy_ID GRCAN_Fancy_ID; + GRCAN_Fancy_ID.srcID = nodeID; + GRCAN_Fancy_ID.destNode = dest_nodeID; + GRCAN_Fancy_ID.messageID = messageID; + expected_id = GRCAN_Fancy_EncodeID(&GRCAN_Fancy_ID); + + rx_received = 0; + data_valid = false; + id_valid = false; + + GRCAN_SetLocalNodeID(nodeID); + + memcpy(expected_data, data, size); + bool send_result = GRCAN_Fancy_Send(bus, dest_nodeID, messageID, data, size); + + if (!send_result) { + LOGOMATIC("GRCAN_Fancy_Send failed to send message on bus %d\n", bus); + return 0; + } + + HAL_Delay(1); + + if (rx_received > 0 && data_valid && id_valid) { + LOGOMATIC("GRCAN_Fancy_Send PASSED. Callback verified and data is valid.\n"); + return 1; + } else { + LOGOMATIC("GRCAN_Fancy_Send FAILED. Callback not triggered or data is invalid.\n"); + return 0; + } +} + +int GRCAN_ErrorHandling() +{ + GRCAN_BusConfig invalid_config = {0}; + + LOGOMATIC("\nTesting GRCAN_InitBus with invalid config...\n"); + bool result = GRCAN_InitBus(&invalid_config); + if (result == false) { + LOGOMATIC("GRCAN_InitBus error handling PASSED.\n"); + return 1; + } else { + LOGOMATIC("GRCAN_InitBus error handling FAILED.\n"); + return 0; + } +} + +void get_test_payload(int idx, void **data, uint32_t *size) +{ + static uint8_t msg1[] = "Hello"; + static uint8_t msg2[] = "World"; + static uint8_t msg3[] = {12}; + static uint8_t msg4[] = {23}; + static uint8_t msg5[] = {0x00, 0x00, 0x00, 0x00}; + static uint8_t msg6[] = {0xFF, 0xFF, 0xFF, 0xFF}; + static uint8_t msg7[] = {0xAA, 0x55, 0xAA, 0x55}; + static uint8_t msg8[] = {0, 1, 2, 3, 4, 5, 6, 7}; + + switch (idx) { + case 0: + *data = msg1; + *size = sizeof(msg1); + break; + case 1: + *data = msg2; + *size = sizeof(msg2); + break; + case 2: + *data = msg3; + *size = sizeof(msg3); + break; + case 3: + *data = msg4; + *size = sizeof(msg4); + break; + case 4: + *data = msg5; + *size = sizeof(msg5); + break; + case 5: + *data = msg6; + *size = sizeof(msg6); + break; + case 6: + *data = msg7; + *size = sizeof(msg7); + break; + case 7: + *data = msg8; + *size = sizeof(msg8); + break; + default: + *data = NULL; + *size = 0; + break; + } +} + +int GRCAN_BurstSendTest(GRCAN_BUS_ID bus, GRCAN_NODE_ID nodeID, GRCAN_NODE_ID dest_nodeID, GRCAN_MSG_ID messageID, uint32_t count) +{ + uint8_t burst_msg[] = {0x10, 0x20, 0x30, 0x40}; + + LOGOMATIC("Starting burst send test on bus %d with %lu messages...\n", bus, (unsigned long)count); + + for (uint32_t i = 0; i < count; i++) { + if (!GRCAN_SendReceive(bus, nodeID, dest_nodeID, messageID, burst_msg, sizeof(burst_msg))) { + LOGOMATIC("Burst send test FAILED on iteration %lu.\n", (unsigned long)i); + return 0; + } + } + + LOGOMATIC("Burst send test PASSED on bus %d.\n", bus); + return 1; +} + +int GRCAN_InitDeactivateStressTest(GRCAN_BUS_ID bus, GRCAN_NODE_ID nodeID, GRCAN_NODE_ID dest_nodeID, GRCAN_MSG_ID messageID, FDCAN_GlobalTypeDef *fdcan_instance, uint32_t iterations) +{ + uint8_t stress_msg[] = "Stress"; + + LOGOMATIC("Starting init/deactivate stress test on bus %d for %lu iterations...\n", bus, (unsigned long)iterations); + + for (uint32_t i = 0; i < iterations; i++) { + if (!GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, fdcan_instance)) { + LOGOMATIC("Stress test FAILED during init on iteration %lu.\n", (unsigned long)i); + return 0; + } + + if (!GRCAN_SendReceive(bus, nodeID, dest_nodeID, messageID, stress_msg, sizeof(stress_msg))) { + LOGOMATIC("Stress test FAILED during send/receive on iteration %lu.\n", (unsigned long)i); + GRCAN_DeactivateBus(bus); + return 0; + } + + if (!GRCAN_DeactivateBus(bus)) { + LOGOMATIC("Stress test FAILED during deactivate on iteration %lu.\n", (unsigned long)i); + return 0; + } + } + + LOGOMATIC("Init/deactivate stress test PASSED on bus %d.\n", bus); + return 1; +} + +int FancyCAN_LoopbackTest(void) +{ + GRCAN_BUS_ID bus; + + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + LOGOMATIC("\n--- Testing bus %d ---\n", bus); + int res1 = GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); + // GRCAN_OPMODE_EXTERNAL_LOOPBACK needs to be tested, can change FDCAN: make sure to #define USECANx + GRCAN_NODE_ID nodeID = get_nodeID(bus); + GRCAN_MSG_ID messageID = get_messageID(bus); + GRCAN_NODE_ID dest_nodeID = nodeID; // Loopback to self for internal + int res2 = 1; + for (int i = 0; i < 8; i++) { + void *data; + uint32_t size; + get_test_payload(i, &data, &size); + + LOGOMATIC("\nTesting GRCAN_SendReceive on bus %d...\n", bus); + res2 = GRCAN_SendReceive(bus, nodeID, dest_nodeID, messageID, data, size); // + if (res2 == 0) { + uint8_t data_value = *(uint8_t *)data; + switch (bus) { + case GRCAN_BUS_PRIMARY: + LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; + case GRCAN_BUS_DATA: + LOGOMATIC("Testing Bus:DATA Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; + case GRCAN_BUS_CHARGER: + LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; + case GRCAN_BUS_TESTING: + LOGOMATIC("Testing Bus:TESTING Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; + default: + LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; + } + break; + } + } + + bool res4 = GRCAN_DeactivateBus(bus); + + if (!res1 || !res2) { + switch (bus) { + case GRCAN_BUS_PRIMARY: + LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during initialization or send/receive test.\n"); + break; + case GRCAN_BUS_DATA: + LOGOMATIC("Testing Bus:DATA Loopback Test FAILED during initialization or send/receive test.\n"); + break; + case GRCAN_BUS_TESTING: + LOGOMATIC("Testing Bus:TESTING Loopback Test FAILED during initialization or send/receive test.\n"); + break; + case GRCAN_BUS_CHARGER: + LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during initialization or send/receive test.\n"); + break; + default: + LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during initialization or send/receive test.\n"); + break; + } + } + if (!res4) { + switch (bus) { + case GRCAN_BUS_PRIMARY: + LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during bus deactivation.\n"); + break; + case GRCAN_BUS_DATA: + LOGOMATIC("Testing Bus:DATA Loopback Test FAILED during bus deactivation.\n"); + break; + case GRCAN_BUS_TESTING: + LOGOMATIC("Testing Bus:TESTING Loopback Test FAILED during bus deactivation.\n"); + break; + case GRCAN_BUS_CHARGER: + LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during bus deactivation.\n"); + break; + default: + LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during bus deactivation.\n"); + break; + } + } + } + + if (bus < 4) { + LOGOMATIC("\nLoopback Test FAILED. Not all buses were tested.\n"); + return 0; + } + + // The next tests takes a while, completely fine to remove + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + LOGOMATIC("\n--- Testing burst send on bus %d ---\n", bus); + GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); + int burst_result = GRCAN_BurstSendTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), 100); + if (!burst_result) { + LOGOMATIC("\nLoopback Test FAILED during burst send test on bus %d.\n", bus); + return 0; + } + GRCAN_DeactivateBus(bus); + } + + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + LOGOMATIC("\n--- Testing init/deactivate stress test on bus %d ---\n", bus); + int stress_result = GRCAN_InitDeactivateStressTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), FDCAN2, 50); + if (!stress_result) { + LOGOMATIC("\nLoopback Test FAILED during init/deactivate stress test on bus %d.\n", bus); + return 0; + } + } + + int res3 = GRCAN_ErrorHandling(); + if (!res3) { + LOGOMATIC("\nLoopback Test FAILED during error handling test.\n"); + return 0; + } + + return 1; +} diff --git a/H523xx_CAN_TESTING/Core/Src/adc.c b/H523xx_CAN_TESTING/Core/Src/adc.c new file mode 100644 index 000000000..f3dbff8ed --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/adc.c @@ -0,0 +1,186 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file adc.c + * @brief This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + LL_ADC_InitTypeDef ADC_InitStruct = {0}; + LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0}; + LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetADCClockSource(LL_RCC_ADC12_CLKSOURCE_SYSCLK); + + /* Peripheral clock enable */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_ADC12); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**ADC1 GPIO Configuration + PC1 ------> ADC1_IN7 + PC2 ------> ADC1_IN8 + PC3 ------> ADC1_IN9 + PB0 ------> ADC1_IN15 + PB1 ------> ADC1_IN12 + PB14 ------> ADC1_IN5 + */ + GPIO_InitStruct.Pin = BSPD_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(BSPD_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = APPS1_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(APPS1_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = APPS2_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(APPS2_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = BRAKE_F_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(BRAKE_F_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = BRAKE_R_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(BRAKE_R_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = AUX_SIGNAL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(AUX_SIGNAL_GPIO_Port, &GPIO_InitStruct); + + /* ADC1 DMA Init */ + + /* ADC1 Init */ + LL_DMA_SetPeriphRequest(DMA1, LL_DMA_CHANNEL_1, LL_DMAMUX_REQ_ADC1); + + LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY); + + LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_LOW); + + LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR); + + LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT); + + LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT); + + LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_HALFWORD); + + LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD); + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + + /** Common config + */ + ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B; + ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; + ADC_InitStruct.LowPowerMode = LL_ADC_LP_MODE_NONE; + LL_ADC_Init(ADC1, &ADC_InitStruct); + ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE; + ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS; + ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE; + ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS; + ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED; + ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_PRESERVED; + LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct); + LL_ADC_SetGainCompensation(ADC1, 0); + LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_DISABLE); + ADC_CommonInitStruct.CommonClock = LL_ADC_CLOCK_ASYNC_DIV256; + ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT; + LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct); + + /* Disable ADC deep power down (enabled by default after reset state) */ + LL_ADC_DisableDeepPowerDown(ADC1); + /* Enable ADC internal voltage regulator */ + LL_ADC_EnableInternalRegulator(ADC1); + /* Delay for ADC internal voltage regulator stabilization. */ + /* Compute number of CPU cycles to wait for, from delay in us. */ + /* Note: Variable divided by 2 to compensate partially */ + /* CPU processing cycles (depends on compilation optimization). */ + /* Note: If system core clock frequency is below 200kHz, wait time */ + /* is only a few CPU processing cycles. */ + uint32_t wait_loop_index; + wait_loop_index = ((LL_ADC_DELAY_INTERNAL_REGUL_STAB_US * (SystemCoreClock / (100000 * 2))) / 10); + while (wait_loop_index != 0) { + wait_loop_index--; + } + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_5); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_5, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_5, LL_ADC_SINGLE_ENDED); + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_7); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_7, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_7, LL_ADC_SINGLE_ENDED); + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3, LL_ADC_CHANNEL_8); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_8, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_8, LL_ADC_SINGLE_ENDED); + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_4, LL_ADC_CHANNEL_9); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_9, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_9, LL_ADC_SINGLE_ENDED); + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_5, LL_ADC_CHANNEL_12); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_12, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_12, LL_ADC_SINGLE_ENDED); + + /** Configure Regular Channel + */ + LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_6, LL_ADC_CHANNEL_15); + LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_15, LL_ADC_SAMPLINGTIME_92CYCLES_5); + LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_15, LL_ADC_SINGLE_ENDED); + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/crc.c b/H523xx_CAN_TESTING/Core/Src/crc.c new file mode 100644 index 000000000..213510a5d --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/crc.c @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file crc.c + * @brief This file provides code for the configuration + * of the CRC instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "crc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +CRC_HandleTypeDef hcrc; + +/* CRC init function */ +void MX_CRC_Init(void) +{ + + /* USER CODE BEGIN CRC_Init 0 */ + + /* USER CODE END CRC_Init 0 */ + + /* USER CODE BEGIN CRC_Init 1 */ + + /* USER CODE END CRC_Init 1 */ + hcrc.Instance = CRC; + hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE; + hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE; + hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE; + hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE; + hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES; + if (HAL_CRC_Init(&hcrc) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN CRC_Init 2 */ + + /* USER CODE END CRC_Init 2 */ +} + +void HAL_CRC_MspInit(CRC_HandleTypeDef *crcHandle) +{ + + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspInit 0 */ + + /* USER CODE END CRC_MspInit 0 */ + /* CRC clock enable */ + __HAL_RCC_CRC_CLK_ENABLE(); + /* USER CODE BEGIN CRC_MspInit 1 */ + + /* USER CODE END CRC_MspInit 1 */ + } +} + +void HAL_CRC_MspDeInit(CRC_HandleTypeDef *crcHandle) +{ + + if (crcHandle->Instance == CRC) { + /* USER CODE BEGIN CRC_MspDeInit 0 */ + + /* USER CODE END CRC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CRC_CLK_DISABLE(); + /* USER CODE BEGIN CRC_MspDeInit 1 */ + + /* USER CODE END CRC_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/dma.c b/H523xx_CAN_TESTING/Core/Src/dma.c new file mode 100644 index 000000000..491e3889d --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/dma.c @@ -0,0 +1,50 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file dma.c + * @brief This file provides code for the configuration + * of all the requested memory to memory DMA transfers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "dma.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure DMA */ +/*----------------------------------------------------------------------------*/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** + * Enable DMA controller clock + */ +void MX_DMA_Init(void) +{ + + /* Init with LL driver */ + /* DMA controller clock enable */ + LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMAMUX1); + LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/H523xx_CAN_TESTING/Core/Src/fdcan.c b/H523xx_CAN_TESTING/Core/Src/fdcan.c new file mode 100644 index 000000000..ebc13ea73 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/fdcan.c @@ -0,0 +1,135 @@ +// #include "unused.h" +// /* USER CODE BEGIN Header */ +// /** +// ****************************************************************************** +// * @file fdcan.c +// * @brief This file provides code for the configuration +// * of the FDCAN instances. +// ****************************************************************************** +// * @attention +// * +// * Copyright (c) 2024 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. +// * +// ****************************************************************************** +// */ +// /* USER CODE END Header */ +// /* Includes ------------------------------------------------------------------*/ +// #include "fdcan.h" + +// /* USER CODE BEGIN 0 */ + +// /* USER CODE END 0 */ + +// FDCAN_HandleTypeDef hfdcan2; + +// /* FDCAN2 init function */ +// void MX_FDCAN2_Init(void) +// { + +// /* USER CODE BEGIN FDCAN2_Init 0 */ + +// /* USER CODE END FDCAN2_Init 0 */ + +// /* USER CODE BEGIN FDCAN2_Init 1 */ + +// /* USER CODE END FDCAN2_Init 1 */ +// hfdcan2.Instance = FDCAN2; +// hfdcan2.Init.ClockDivider = FDCAN_CLOCK_DIV1; +// hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC; +// hfdcan2.Init.Mode = FDCAN_MODE_NORMAL; +// hfdcan2.Init.AutoRetransmission = ENABLE; +// hfdcan2.Init.TransmitPause = DISABLE; +// hfdcan2.Init.ProtocolException = ENABLE; +// hfdcan2.Init.NominalPrescaler = 1; +// hfdcan2.Init.NominalSyncJumpWidth = 16; +// hfdcan2.Init.NominalTimeSeg1 = 119; +// hfdcan2.Init.NominalTimeSeg2 = 40; +// hfdcan2.Init.DataPrescaler = 8; +// hfdcan2.Init.DataSyncJumpWidth = 16; +// hfdcan2.Init.DataTimeSeg1 = 14; +// hfdcan2.Init.DataTimeSeg2 = 5; +// hfdcan2.Init.StdFiltersNbr = 0; +// hfdcan2.Init.ExtFiltersNbr = 2; +// hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; +// if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK) { +// Error_Handler(); +// } +// /* USER CODE BEGIN FDCAN2_Init 2 */ + +// /* USER CODE END FDCAN2_Init 2 */ +// } + +// void HAL_FDCAN_MspInit(FDCAN_HandleTypeDef *fdcanHandle) +// { + +// GPIO_InitTypeDef GPIO_InitStruct = {0}; +// if (fdcanHandle->Instance == FDCAN2) { +// /* USER CODE BEGIN FDCAN2_MspInit 0 */ + +// /* USER CODE END FDCAN2_MspInit 0 */ +// LL_RCC_SetFDCANClockSource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + +// /* FDCAN2 clock enable */ +// __HAL_RCC_FDCAN_CLK_ENABLE(); + +// __HAL_RCC_GPIOB_CLK_ENABLE(); +// /**FDCAN2 GPIO Configuration +// PB12 ------> FDCAN2_RX +// PB13 ------> FDCAN2_TX +// */ +// GPIO_InitStruct.Pin = GPIO_PIN_12; +// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; +// GPIO_InitStruct.Pull = GPIO_PULLUP; +// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; +// GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; +// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +// GPIO_InitStruct.Pin = GPIO_PIN_13; +// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; +// GPIO_InitStruct.Pull = GPIO_NOPULL; +// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; +// GPIO_InitStruct.Alternate = GPIO_AF9_FDCAN2; +// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + +// /* FDCAN2 interrupt Init */ +// HAL_NVIC_SetPriority(FDCAN2_IT0_IRQn, 0, 0); +// HAL_NVIC_EnableIRQ(FDCAN2_IT0_IRQn); +// /* USER CODE BEGIN FDCAN2_MspInit 1 */ + +// /* USER CODE END FDCAN2_MspInit 1 */ +// } +// } + +// /*void HAL_FDCAN_MspDeInit(FDCAN_HandleTypeDef *fdcanHandle) +// { + +// if (fdcanHandle->Instance == FDCAN2) { +// /* USER CODE BEGIN FDCAN2_MspDeInit 0 */ + +// /* USER CODE END FDCAN2_MspDeInit 0 */ +// /* Peripheral clock disable */ +// __HAL_RCC_FDCAN_CLK_DISABLE(); + +// /**FDCAN2 GPIO Configuration +// PB12 ------> FDCAN2_RX +// PB13 ------> FDCAN2_TX +// */ +// HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12 | GPIO_PIN_13); + +// /* FDCAN2 interrupt Deinit */ +// HAL_NVIC_DisableIRQ(FDCAN2_IT0_IRQn); +// /* USER CODE BEGIN FDCAN2_MspDeInit 1 */ + +// /* USER CODE END FDCAN2_MspDeInit 1 */ +// } +// } + +// /* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +// UNUSED(5); diff --git a/H523xx_CAN_TESTING/Core/Src/gpio.c b/H523xx_CAN_TESTING/Core/Src/gpio.c new file mode 100644 index 000000000..d36e6eca6 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/gpio.c @@ -0,0 +1,260 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file gpio.c + * @brief This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI + * Free pins are configured automatically as Analog (this feature is + enabled through + * the Code Generation settings) + PA6 ------> ADC2_IN3 + PA7 ------> ADC2_IN4 + PB15 ------> ADC2_IN15 + PB7 ------> UART4_CTS +*/ +void MX_GPIO_Init(void) +{ + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOF); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOG); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOD); + + /**/ + LL_GPIO_ResetOutputPin(BLINKY_GPIO_Port, BLINKY_Pin); + + /**/ + LL_GPIO_ResetOutputPin(LED_TEST_GPIO_Port, LED_TEST_Pin); + + /**/ + LL_GPIO_ResetOutputPin(BRAKE_LIGHT_GPIO_Port, BRAKE_LIGHT_Pin); + + /**/ + LL_GPIO_ResetOutputPin(TSSI_G_CONTROL_GPIO_Port, TSSI_G_CONTROL_Pin); + + /**/ + LL_GPIO_ResetOutputPin(AUX_CONTROL_GPIO_Port, AUX_CONTROL_Pin); + + /**/ + LL_GPIO_ResetOutputPin(SOFTWARE_OK_CONTROL_GPIO_Port, SOFTWARE_OK_CONTROL_Pin); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_13; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_14; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_15; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_1; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_4; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = BLINKY_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(BLINKY_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = IMD_SENSE_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(IMD_SENSE_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = AMS_SENSE_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(AMS_SENSE_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LED_TEST_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(LED_TEST_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = STEERING_ANGLE_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(STEERING_ANGLE_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_6; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_7; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_8; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_9; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_9; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_15; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = BRAKE_LIGHT_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(BRAKE_LIGHT_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = TSSI_G_CONTROL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(TSSI_G_CONTROL_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = LL_GPIO_PIN_7; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_14; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = AUX_CONTROL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(AUX_CONTROL_GPIO_Port, &GPIO_InitStruct); + + /**/ + GPIO_InitStruct.Pin = SOFTWARE_OK_CONTROL_Pin; + GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + LL_GPIO_Init(SOFTWARE_OK_CONTROL_GPIO_Port, &GPIO_InitStruct); +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ diff --git a/H523xx_CAN_TESTING/Core/Src/i2c.c b/H523xx_CAN_TESTING/Core/Src/i2c.c new file mode 100644 index 000000000..bfb4e0153 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/i2c.c @@ -0,0 +1,92 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file i2c.c + * @brief This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* I2C2 init function */ +void MX_I2C2_Init(void) +{ + + /* USER CODE BEGIN I2C2_Init 0 */ + + /* USER CODE END I2C2_Init 0 */ + + LL_I2C_InitTypeDef I2C_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetI2CClockSource(LL_RCC_I2C2_CLKSOURCE_PCLK1); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + /**I2C2 GPIO Configuration + PC4 ------> I2C2_SCL + PA8 ------> I2C2_SDA + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_4; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_8; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_OPENDRAIN; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_4; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_I2C2); + + /* USER CODE BEGIN I2C2_Init 1 */ + + /* USER CODE END I2C2_Init 1 */ + + /** I2C Initialization + */ + I2C_InitStruct.PeripheralMode = LL_I2C_MODE_I2C; + I2C_InitStruct.Timing = 0x30D29DE4; + I2C_InitStruct.AnalogFilter = LL_I2C_ANALOGFILTER_ENABLE; + I2C_InitStruct.DigitalFilter = 0; + I2C_InitStruct.OwnAddress1 = 0; + I2C_InitStruct.TypeAcknowledge = LL_I2C_ACK; + I2C_InitStruct.OwnAddrSize = LL_I2C_OWNADDRESS1_7BIT; + LL_I2C_Init(I2C2, &I2C_InitStruct); + LL_I2C_EnableAutoEndMode(I2C2); + LL_I2C_SetOwnAddress2(I2C2, 0, LL_I2C_OWNADDRESS2_NOMASK); + LL_I2C_DisableOwnAddress2(I2C2); + LL_I2C_DisableGeneralCall(I2C2); + LL_I2C_EnableClockStretching(I2C2); + /* USER CODE BEGIN I2C2_Init 2 */ + + /* USER CODE END I2C2_Init 2 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/spi.c b/H523xx_CAN_TESTING/Core/Src/spi.c new file mode 100644 index 000000000..66459f2ec --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/spi.c @@ -0,0 +1,95 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file spi.c + * @brief This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* SPI3 init function */ +void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + LL_SPI_InitTypeDef SPI_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI3); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_10; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_6; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_11; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_6; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_12; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_6; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; + SPI_InitStruct.Mode = LL_SPI_MODE_MASTER; + SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_4BIT; + SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW; + SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE; + SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; + SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV32; + SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST; + SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE; + SPI_InitStruct.CRCPoly = 7; + LL_SPI_Init(SPI3, &SPI_InitStruct); + LL_SPI_SetStandard(SPI3, LL_SPI_PROTOCOL_MOTOROLA); + LL_SPI_EnableNSSPulseMgt(SPI3); + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/stm32h5xx_hal_msp.c b/H523xx_CAN_TESTING/Core/Src/stm32h5xx_hal_msp.c new file mode 100644 index 000000000..08ba6fe07 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/stm32h5xx_hal_msp.c @@ -0,0 +1,79 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2026 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/stm32h5xx_it.c b/H523xx_CAN_TESTING/Core/Src/stm32h5xx_it.c new file mode 100644 index 000000000..7ab0795f9 --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/stm32h5xx_it.c @@ -0,0 +1,198 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32h5xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2026 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32h5xx_it.h" + +#include "main.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (1) {} + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32H5xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32h5xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/tim.c b/H523xx_CAN_TESTING/Core/Src/tim.c new file mode 100644 index 000000000..7f521c3bf --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/tim.c @@ -0,0 +1,79 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file tim.c + * @brief This file provides code for the configuration + * of the TIM instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "tim.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* TIM2 init function */ +void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + LL_TIM_InitTypeDef TIM_InitStruct = {0}; + LL_TIM_OC_InitTypeDef TIM_OC_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + /* Peripheral clock enable */ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + TIM_InitStruct.Prescaler = 0; + TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP; + TIM_InitStruct.Autoreload = 4294967295; + TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1; + LL_TIM_Init(TIM2, &TIM_InitStruct); + LL_TIM_DisableARRPreload(TIM2); + LL_TIM_SetClockSource(TIM2, LL_TIM_CLOCKSOURCE_INTERNAL); + TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_FORCED_ACTIVE; + TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE; + TIM_OC_InitStruct.CompareValue = 0; + TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH; + LL_TIM_OC_Init(TIM2, LL_TIM_CHANNEL_CH1, &TIM_OC_InitStruct); + LL_TIM_OC_DisableFast(TIM2, LL_TIM_CHANNEL_CH1); + LL_TIM_SetTriggerOutput(TIM2, LL_TIM_TRGO_RESET); + LL_TIM_DisableMasterSlaveMode(TIM2); + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + /**TIM2 GPIO Configuration + PA0 ------> TIM2_CH1 + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_0; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_1; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/Core/Src/usart.c b/H523xx_CAN_TESTING/Core/Src/usart.c new file mode 100644 index 000000000..ed1d3db0f --- /dev/null +++ b/H523xx_CAN_TESTING/Core/Src/usart.c @@ -0,0 +1,184 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file usart.c + * @brief This file provides code for the configuration + * of the USART instances. + ****************************************************************************** + * @attention + * + * Copyright (c) 2025 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "usart.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* LPUART1 init function */ + +void MX_LPUART1_UART_Init(void) +{ + + /* USER CODE BEGIN LPUART1_Init 0 */ + + /* USER CODE END LPUART1_Init 0 */ + + LL_LPUART_InitTypeDef LPUART_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetLPUARTClockSource(LL_RCC_LPUART1_CLKSOURCE_HSI); + + /* Peripheral clock enable */ + LL_APB3_GRP1_EnableClock(LL_APB3_GRP1_PERIPH_LPUART1); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + /**LPUART1 GPIO Configuration + PA2 ------> LPUART1_TX + PA3 ------> LPUART1_RX + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_2; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_12; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_3; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_12; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN LPUART1_Init 1 */ + + /* USER CODE END LPUART1_Init 1 */ + LPUART_InitStruct.PrescalerValue = LL_LPUART_PRESCALER_DIV1; + LPUART_InitStruct.BaudRate = 115200; + LPUART_InitStruct.DataWidth = LL_LPUART_DATAWIDTH_8B; + LPUART_InitStruct.StopBits = LL_LPUART_STOPBITS_1; + LPUART_InitStruct.Parity = LL_LPUART_PARITY_NONE; + LPUART_InitStruct.TransferDirection = LL_LPUART_DIRECTION_TX_RX; + LPUART_InitStruct.HardwareFlowControl = LL_LPUART_HWCONTROL_NONE; + LL_LPUART_Init(LPUART1, &LPUART_InitStruct); + LL_LPUART_SetTXFIFOThreshold(LPUART1, LL_LPUART_FIFOTHRESHOLD_1_8); + LL_LPUART_SetRXFIFOThreshold(LPUART1, LL_LPUART_FIFOTHRESHOLD_1_8); + LL_LPUART_DisableFIFO(LPUART1); + + /* USER CODE BEGIN WKUPType LPUART1 */ + + /* USER CODE END WKUPType LPUART1 */ + + LL_LPUART_Enable(LPUART1); + + /* Polling LPUART1 initialisation */ + while ((!(LL_LPUART_IsActiveFlag_TEACK(LPUART1))) || (!(LL_LPUART_IsActiveFlag_REACK(LPUART1)))) {} + /* USER CODE BEGIN LPUART1_Init 2 */ + + /* USER CODE END LPUART1_Init 2 */ +} +/* USART1 init function */ + +void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + LL_USART_InitTypeDef USART_InitStruct = {0}; + + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + + LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_PCLK2); + + /* Peripheral clock enable */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); + + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + /**USART1 GPIO Configuration + PC5 ------> USART1_RX + PA11 ------> USART1_CTS + PA12 ------> USART1_RTS + PB6 ------> USART1_TX + */ + GPIO_InitStruct.Pin = LL_GPIO_PIN_5; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_11; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_12; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = LL_GPIO_PIN_6; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_7; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + USART_InitStruct.PrescalerValue = LL_USART_PRESCALER_DIV1; + USART_InitStruct.BaudRate = 115200; + USART_InitStruct.DataWidth = LL_USART_DATAWIDTH_8B; + USART_InitStruct.StopBits = LL_USART_STOPBITS_1; + USART_InitStruct.Parity = LL_USART_PARITY_NONE; + USART_InitStruct.TransferDirection = LL_USART_DIRECTION_TX_RX; + USART_InitStruct.HardwareFlowControl = LL_USART_HWCONTROL_RTS_CTS; + USART_InitStruct.OverSampling = LL_USART_OVERSAMPLING_16; + LL_USART_Init(USART1, &USART_InitStruct); + LL_USART_SetTXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); + LL_USART_SetRXFIFOThreshold(USART1, LL_USART_FIFOTHRESHOLD_1_8); + LL_USART_DisableFIFO(USART1); + LL_USART_ConfigAsyncMode(USART1); + + /* USER CODE BEGIN WKUPType USART1 */ + + /* USER CODE END WKUPType USART1 */ + + LL_USART_Enable(USART1); + + /* Polling USART1 initialisation */ + while ((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) {} + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/CMakeLists.txt b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/CMakeLists.txt new file mode 100644 index 000000000..2c5104d86 --- /dev/null +++ b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/CMakeLists.txt @@ -0,0 +1,63 @@ +cmake_minimum_required(VERSION 3.25) + +# Setup compiler settings +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_C_EXTENSIONS ON) + +# Define the build type +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +# Enable compile command to ease indexing with e.g. clangd +set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) + +# Enable CMake support for ASM and C languages +enable_language( + C + ASM +) + +# Core project settings +project(${CMAKE_PROJECT_NAME}) + +# what, does in fact not get the filename of somthing but rather the name of the project from the path +get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) + +add_library(${PROJECT_NAME}_USER_CODE INTERFACE) + +target_sources( + ${PROJECT_NAME}_USER_CODE + INTERFACE + #../Core/Src/adc.c + #../Core/Src/crc.c + #../Core/Src/dma.c + #../Core/Src/gpio.c + #../Core/Src/i2c.c + main.c + #../Core/Src/spi.c + ../Core/Src/stm32h5xx_hal_msp.c + ../Core/Src/stm32h5xx_it.c + ../Core/Src/FancyCAN_LoopbackTest.c + #../Core/Src/tim.c + #../Core/Src/usart.c +) + +set_target_properties( + ${NAME} + PROPERTIES + OUTPUT_NAME + "CAN_${NAME}" +) + +target_link_libraries(${PROJECT_NAME}_USER_CODE INTERFACE PERIPHERAL_CAN_LIB) + +target_include_directories( + ${PROJECT_NAME}_USER_CODE + INTERFACE + ../Core/Inc + . +) + +target_link_libraries(${PROJECT_NAME}_USER_CODE INTERFACE GRCAN_FANCYLAYER) diff --git a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_cfg.h b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_cfg.h new file mode 100644 index 000000000..4b4ce9582 --- /dev/null +++ b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_cfg.h @@ -0,0 +1,8 @@ +#ifndef CAN_CFG_H +#define CAN_CFG_H + +#define USECAN1 +#define TX_BUFFER_1_SIZE 10 +#define TX_BUFFER_2_SIZE 10 + +#endif diff --git a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_external_test_cfg.h b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_external_test_cfg.h new file mode 100644 index 000000000..0b7e7a815 --- /dev/null +++ b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/can_external_test_cfg.h @@ -0,0 +1,6 @@ +#ifndef CAN_BASIC_TEST_CFG_H +#define CAN_BASIC_TEST_CFG_H + +#define NODE_ID 1 + +#endif diff --git a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c new file mode 100644 index 000000000..ea63de8e1 --- /dev/null +++ b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c @@ -0,0 +1,272 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2024 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. + * + ****************************************************************************** + */ +/* USER CODE END Header */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +#include "adc.h" +#include "can.h" // Assume this works +#include "can_tests.h" +#include "dma.h" +#include "fdcan.h" +#include "gpio.h" +#include "i2c.h" +#include "spi.h" +#include "tim.h" +#include "usart.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +#include "Logomatic.h" +#include "GRCAN_FancyLayer.h" +#include "FancyCAN_LoopbackTest.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE BEGIN PV */ +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ +/* Enable ITM for SWO output */ +LogomaticConfig logomatic_config = { + .baud_rate = 115200, + .clock_source = LOGOMATIC_PCLK3, + .data_width = LOGOMATIC_DATAWIDTH_8B, + .gpio_pin_rx_tx_mask = LL_GPIO_PIN_6 | LL_GPIO_PIN_7, + .gpio_port = LOGOMATIC_GPIOB, + .hardware_flow_control = LOGOMATIC_HWCONTROL_NONE, + .parity = LOGOMATIC_PARITY_NONE, + .prescaler = LOGOMATIC_PRESCALER_DIV1, + .stop_bits = LOGOMATIC_STOPBITS_1, + .transfer_direction = LOGOMATIC_DIRECTION_TX, + .tx_fifo_threshold = LOGOMATIC_FIFOTHRESHOLD_1_8, + .rx_fifo_threshold = LOGOMATIC_FIFOTHRESHOLD_1_8, + .bus = LOGOMATIC_BUS, +}; + +static void ITM_Enable(void) +{ + LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB); + LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = LL_GPIO_PIN_3; + GPIO_InitStruct.Mode = LL_GPIO_MODE_ALTERNATE; + GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL; + GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; + GPIO_InitStruct.Alternate = LL_GPIO_AF_0; + LL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + // DBGMCU->CR |= DBGMCU_CR_TRACE_IOEN; + + /* Enable TRC (Trace) */ + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; + + /* Configure TPI for SWO output (set prescaler for 2MHz SWO clock) */ + TPI->SPPR = 2U; /* 2 = Manchester/async UART mode */ + TPI->ACPR = 84U; /* Prescaler: (250 MHz / (84+1) / 2) ≈ 1MHz SWO */ + + ITM->TER |= (1UL << 0); + ITM->TCR |= (ITM_TCR_ITMENA_Msk | ITM_TCR_SWOENA_Msk); +} +// static int toggleze = 0; +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU + * Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the + * Systick. */ + HAL_Init(); + /* USER CODE BEGIN Init */ + ITM_Enable(); + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + // MX_GPIO_Init(); + // MX_DMA_Init(); + // MX_FDCAN2_Init(); + // MX_ADC1_Init(); + + // MX_LPUART1_UART_Init(); + Setup_Logomatic(&logomatic_config); + // MX_I2C2_Init(); + // MX_USART1_UART_Init(); + // MX_SPI3_Init(); + // MX_TIM2_Init(); + int result = FancyCAN_LoopbackTest(); + LOGOMATIC("\n"); + if (result) { + LOGOMATIC("CAN Loopback Test PASSED!\n"); + } else { + LOGOMATIC("CAN Loopback Test FAILED!\n"); + } + + /* USER CODE BEGIN 2 */ + + LOGOMATIC("Booted!\n"); + + // LOGOMATIC("running can_basic_test:\n"); + can_basic_test(); + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) { + /* USER CODE END WHILE */ + LOGOMATIC("Main Loop\n"); + LL_mDelay(10000); + + // Receive on GPIOs + // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, toggleze ? GPIO_PIN_SET + // : GPIO_PIN_RESET); HAL_Delay(1000); msg.data[0] = toggleze ? + // 0x00 : 0x80; can_send(data_can, &msg); + + // RCC->CFGR |= RCC_CFGR_SW; + /* USER CODE BEGIN 3 */ + } +} + +/** + * @brief System Clock Configuration + * @retval None + */ + +// For 250 MHz +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); + + while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSI; // 64 MHz initially + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV4; // 16 MHz + RCC_OscInitStruct.PLL.PLLM = 4; // 4 MHz + RCC_OscInitStruct.PLL.PLLN = 90; // 360 MHz + RCC_OscInitStruct.PLL.PLLP = 2; // 180 MHz + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_2; + RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE; + RCC_OscInitStruct.PLL.PLLFRACN = 0; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK3; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { + Error_Handler(); + } + + /** Configure the programming delay + */ + __HAL_FLASH_SET_PROGRAM_DELAY(FLASH_PROGRAMMING_DELAY_2); +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return + * state */ + __disable_irq(); + while (1) {} + /* USER CODE END Error_Handler_Debug */ +} +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line + number, ex: printf("Wrong parameters value: file %s on line %d\r\n", + file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/H523xx_CAN_TESTING/README.md b/H523xx_CAN_TESTING/README.md new file mode 100644 index 000000000..c347af3e2 --- /dev/null +++ b/H523xx_CAN_TESTING/README.md @@ -0,0 +1,5 @@ +# STM32H523xx CAN +STM32H523xx + +Plug in the board following ST-LINK pinout +Compile and flash H523xx_CAN_TESTING.elf diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h index 2974cc3c9..46f0224c7 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/GRCAN_FancyLayer.h @@ -9,6 +9,7 @@ #include "can.h" #include "can_cfg.h" #include "grcan_utils.h" +#include "main.h" #ifndef GRCAN_FANCYLAYER_H #define GRCAN_FANCYLAYER_H diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h index c469dedae..86d6fa5eb 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h @@ -31,8 +31,16 @@ typedef enum { } GRCAN_FrameFormat; typedef enum { +#if defined(STM32G4) || defined(STM32L4) || defined(STM32U5) GRCAN_CLKSRC_PCLK1, GRCAN_CLKSRC_PLL, +#endif + +#if defined(STM32H5) + GRCAN_CLKSRC_PLL1Q, + GRCAN_CLKSRC_PLL2Q, +#endif + GRCAN_CLKSRC_HSE } GRCAN_ClockSource; diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c index e1fea0096..4cb000a58 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c @@ -26,17 +26,43 @@ GRCAN_BusMode GRCAN_BusModeForBus(GRCAN_BUS_ID bus) uint32_t GRCAN_ToHAL_ClockSource(GRCAN_ClockSource src) { +#if defined(STM32H5) + + switch (src) { + case GRCAN_CLKSRC_PLL1Q: + return LL_RCC_FDCAN_CLKSOURCE_PLL1Q; + + case GRCAN_CLKSRC_PLL2Q: + return LL_RCC_FDCAN_CLKSOURCE_PLL2Q; + + case GRCAN_CLKSRC_HSE: + return LL_RCC_FDCAN_CLKSOURCE_HSE; + + default: + LOGOMATIC("GRCAN_ToHAL_ClockSource: default source %d, defaulting to PLL2Q\n", src); + return LL_RCC_FDCAN_CLKSOURCE_PLL2Q; + } + +#elif defined(STM32G4) || defined(STM32L4) || defined(STM32U5) + switch (src) { case GRCAN_CLKSRC_PCLK1: return LL_RCC_FDCAN_CLKSOURCE_PCLK1; + case GRCAN_CLKSRC_PLL: return LL_RCC_FDCAN_CLKSOURCE_PLL; + case GRCAN_CLKSRC_HSE: return LL_RCC_FDCAN_CLKSOURCE_HSE; + default: LOGOMATIC("GRCAN_ToHAL_ClockSource: default source %d, defaulting to PCLK1\n", src); return LL_RCC_FDCAN_CLKSOURCE_PCLK1; } + +#else +#error "Unsupported STM32 Family" +#endif } uint32_t GRCAN_ToHAL_ClockDivider(GRCAN_ClockDivider div) @@ -124,6 +150,17 @@ uint32_t GRCAN_ToHAL_FeatureState(GRCAN_FeatureState state) } } +GRCAN_ClockSource GRCAN_DefaultClockSource(void) +{ +#if defined(STM32H5) + return GRCAN_CLKSRC_PLL2Q; +#elif defined(STM32G4) || defined(STM32L4) || defined(STM32U5) + return GRCAN_CLKSRC_PCLK1; +#else +#error "Unsupported STM32 Family" +#endif +} + void GRCAN_SetDefaultBusConfig(GRCAN_BusConfig *busCfg, GRCAN_BUS_ID bus) { if (busCfg == NULL) { @@ -137,7 +174,7 @@ void GRCAN_SetDefaultBusConfig(GRCAN_BusConfig *busCfg, GRCAN_BUS_ID bus) busCfg->bus = bus; - busCfg->clock_source = GRCAN_CLKSRC_PCLK1; + busCfg->clock_source = GRCAN_DefaultClockSource(); busCfg->clock_divider = GRCAN_CLK_DIV1; busCfg->frame_format = GRCAN_FRAME_FD_NO_BRS; busCfg->operating_mode = GRCAN_OPMODE_NORMAL; diff --git a/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake index eb82067ff..228d77bce 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake +++ b/Lib/FancyLayers-RENAME/GRCAN/grcan_fancylayer.cmake @@ -24,9 +24,6 @@ target_link_libraries( CANfigurator CircularBuffer_Lib PERIPHERAL_CAN_LIB - #GR_OLD_CAN_MESSAGES - STM32_HAL_LL_G4xx - #GRCAN_LIB #maybe add back ) if(CMAKE_PRESET_NAME STREQUAL "HOOTLTest") diff --git a/Lib/Peripherals/CAN/Inc/STM32H5_hal_fdcan_defines.h b/Lib/Peripherals/CAN/Inc/STM32H5_hal_fdcan_defines.h new file mode 100644 index 000000000..062570e0a --- /dev/null +++ b/Lib/Peripherals/CAN/Inc/STM32H5_hal_fdcan_defines.h @@ -0,0 +1,61 @@ +#ifndef STM32H5_HAL_FDCAN_DEFINES_H +#define STM32H5_HAL_FDCAN_DEFINES_H + +#ifdef HAL_FDCAN_MODULE_ENABLED + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/** @addtogroup FDCAN_Private_Constants + * @{ + */ +#define FDCAN_TIMEOUT_VALUE 10U + +#define FDCAN_TX_EVENT_FIFO_MASK (FDCAN_IR_TEFL | FDCAN_IR_TEFF | FDCAN_IR_TEFN) +#define FDCAN_RX_FIFO0_MASK (FDCAN_IR_RF0L | FDCAN_IR_RF0F | FDCAN_IR_RF0N) +#define FDCAN_RX_FIFO1_MASK (FDCAN_IR_RF1L | FDCAN_IR_RF1F | FDCAN_IR_RF1N) +#define FDCAN_ERROR_MASK (FDCAN_IR_ELO | FDCAN_IR_WDI | FDCAN_IR_PEA | FDCAN_IR_PED | FDCAN_IR_ARA) +#define FDCAN_ERROR_STATUS_MASK (FDCAN_IR_EP | FDCAN_IR_EW | FDCAN_IR_BO) + +#define FDCAN_ELEMENT_MASK_STDID ((uint32_t)0x1FFC0000U) /* Standard Identifier */ +#define FDCAN_ELEMENT_MASK_EXTID ((uint32_t)0x1FFFFFFFU) /* Extended Identifier */ +#define FDCAN_ELEMENT_MASK_RTR ((uint32_t)0x20000000U) /* Remote Transmission Request */ +#define FDCAN_ELEMENT_MASK_XTD ((uint32_t)0x40000000U) /* Extended Identifier */ +#define FDCAN_ELEMENT_MASK_ESI ((uint32_t)0x80000000U) /* Error State Indicator */ +#define FDCAN_ELEMENT_MASK_TS ((uint32_t)0x0000FFFFU) /* Timestamp */ +#define FDCAN_ELEMENT_MASK_DLC ((uint32_t)0x000F0000U) /* Data Length Code */ +#define FDCAN_ELEMENT_MASK_BRS ((uint32_t)0x00100000U) /* Bit Rate Switch */ +#define FDCAN_ELEMENT_MASK_FDF ((uint32_t)0x00200000U) /* FD Format */ +#define FDCAN_ELEMENT_MASK_EFC ((uint32_t)0x00800000U) /* Event FIFO Control */ +#define FDCAN_ELEMENT_MASK_MM ((uint32_t)0xFF000000U) /* Message Marker */ +#define FDCAN_ELEMENT_MASK_FIDX ((uint32_t)0x7F000000U) /* Filter Index */ +#define FDCAN_ELEMENT_MASK_ANMF ((uint32_t)0x80000000U) /* Accepted Non-matching Frame */ +#define FDCAN_ELEMENT_MASK_ET ((uint32_t)0x00C00000U) /* Event type */ + +#define SRAMCAN_FLS_NBR (28U) /* Max. Filter List Standard Number */ +#define SRAMCAN_FLE_NBR (8U) /* Max. Filter List Extended Number */ +#define SRAMCAN_RF0_NBR (3U) /* RX FIFO 0 Elements Number */ +#define SRAMCAN_RF1_NBR (3U) /* RX FIFO 1 Elements Number */ +#define SRAMCAN_TEF_NBR (3U) /* TX Event FIFO Elements Number */ +#define SRAMCAN_TFQ_NBR (3U) /* TX FIFO/Queue Elements Number */ + +#define SRAMCAN_FLS_SIZE (1U * 4U) /* Filter Standard Element Size in bytes */ +#define SRAMCAN_FLE_SIZE (2U * 4U) /* Filter Extended Element Size in bytes */ +#define SRAMCAN_RF0_SIZE (18U * 4U) /* RX FIFO 0 Elements Size in bytes */ +#define SRAMCAN_RF1_SIZE (18U * 4U) /* RX FIFO 1 Elements Size in bytes */ +#define SRAMCAN_TEF_SIZE (2U * 4U) /* TX Event FIFO Elements Size in bytes */ +#define SRAMCAN_TFQ_SIZE (18U * 4U) /* TX FIFO/Queue Elements Size in bytes */ + +#define SRAMCAN_FLSSA ((uint32_t)0) /* Filter List Standard Start Address */ +#define SRAMCAN_FLESA ((uint32_t)(SRAMCAN_FLSSA + (SRAMCAN_FLS_NBR * SRAMCAN_FLS_SIZE))) /* Filter List Extended Start Address */ +#define SRAMCAN_RF0SA ((uint32_t)(SRAMCAN_FLESA + (SRAMCAN_FLE_NBR * SRAMCAN_FLE_SIZE))) /* Rx FIFO 0 Start Address */ +#define SRAMCAN_RF1SA ((uint32_t)(SRAMCAN_RF0SA + (SRAMCAN_RF0_NBR * SRAMCAN_RF0_SIZE))) /* Rx FIFO 1 Start Address */ +#define SRAMCAN_TEFSA ((uint32_t)(SRAMCAN_RF1SA + (SRAMCAN_RF1_NBR * SRAMCAN_RF1_SIZE))) /* Tx Event FIFO Start Address */ +#define SRAMCAN_TFQSA ((uint32_t)(SRAMCAN_TEFSA + (SRAMCAN_TEF_NBR * SRAMCAN_TEF_SIZE))) /* Tx FIFO/Queue Start Address */ +#define SRAMCAN_SIZE ((uint32_t)(SRAMCAN_TFQSA + (SRAMCAN_TFQ_NBR * SRAMCAN_TFQ_SIZE))) /* Message RAM size */ + +/** + * @} + */ +#endif + +#endif diff --git a/Lib/Peripherals/CAN/Inc/can.h b/Lib/Peripherals/CAN/Inc/can.h index 9b6efbeb9..90cde968e 100644 --- a/Lib/Peripherals/CAN/Inc/can.h +++ b/Lib/Peripherals/CAN/Inc/can.h @@ -3,8 +3,10 @@ // Supported STM32 Families #ifdef STM32G4 +#elif defined(STM32H5) #elif defined(STM32L4) #elif defined(STM32U5) +#else #error "Unsupported STM32 Family" #endif @@ -13,6 +15,10 @@ // #include "circularBuffer.h" #include +#if defined(STM32H523xx) && defined(USECAN3) +#error "STM32H523xx supports only FDCAN1/FDCAN2. Remove USECAN3." +#endif + // RX Callback must perform a deep copy of the data // typedef void (*CAN_RXCallback)(uint32_t ID, void *data, uint32_t size); @@ -88,7 +94,9 @@ CANHandle *can_init(const CANConfig *config); // user must supply an rx callback CAN_STATUS can_start(CANHandle *handle); CAN_STATUS can_stop(CANHandle *handle); CAN_STATUS can_send(CANHandle *handle, FDCANTxMessage *buffer); + CAN_STATUS can_release(CANHandle *handle); // deinit circular buffer and turn off can peripheral and gpios + CAN_STATUS can_add_filter(CANHandle *handle, FDCAN_FilterTypeDef *filter); // pass in a buffer to store the status string @@ -106,6 +114,8 @@ CAN_STATUS can_add_filter(CANHandle *handle, FDCAN_FilterTypeDef *filter); __HAL_RCC_GPIOB_CLK_ENABLE(); \ else if (GPIOX == GPIOD) \ __HAL_RCC_GPIOD_CLK_ENABLE(); \ + else if (GPIOX == GPIOE) \ + __HAL_RCC_GPIOE_CLK_ENABLE(); \ else \ LOGOMATIC("BAD FDCAN GPIO Port"); \ } while (0) @@ -118,6 +128,8 @@ CAN_STATUS can_add_filter(CANHandle *handle, FDCAN_FilterTypeDef *filter); __HAL_RCC_GPIOB_CLK_DISABLE(); \ else if (GPIOX == GPIOD) \ __HAL_RCC_GPIOD_CLK_DISABLE(); \ + else if (GPIOX == GPIOE) \ + __HAL_RCC_GPIOE_CLK_DISABLE(); \ else \ LOGOMATIC("BAD FDCAN GPIO Port"); \ } while (0) @@ -133,6 +145,8 @@ void can_set_clksource(uint32_t clksource); // ex. LL_RCC_FDCAN_CLKSOURCE_PCLK1 // default Configuration helpers int get_cfg(FDCAN_GlobalTypeDef *instance, CAN_RXCallback callback, CANConfig *out_cfg, uint32_t FDCAN_Mode, uint32_t numStdFilters, uint32_t numExtFilters); +void set_default_can_clksource(); + // converts CAN FD TxHeader DataLength Field static const uint8_t CANFD_DLCtoBytes[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64}; diff --git a/Lib/Peripherals/CAN/Inc/can_platform_deps.h b/Lib/Peripherals/CAN/Inc/can_platform_deps.h index 3958adbc9..2f8ff3c9d 100644 --- a/Lib/Peripherals/CAN/Inc/can_platform_deps.h +++ b/Lib/Peripherals/CAN/Inc/can_platform_deps.h @@ -9,6 +9,15 @@ #include "stm32g4xx_hal_rcc.h" #include "stm32g4xx_ll_gpio.h" #include "stm32g4xx_ll_rcc.h" +#elif defined(STM32H5) +#include "stm32h5xx_hal.h" +#include "stm32h5xx_hal_fdcan.h" +#include "stm32h5xx_hal_gpio.h" +#include "stm32h5xx_hal_gpio_ex.h" +#include "stm32h5xx_hal_rcc.h" +#include "stm32h5xx_hal_rcc_ex.h" +#include "stm32h5xx_ll_gpio.h" +#include "stm32h5xx_ll_rcc.h" // #elif defined(STM32L4) // #elif defined(STM32U5) #else diff --git a/Lib/Peripherals/CAN/Src/can.c b/Lib/Peripherals/CAN/Src/can.c index 6664f6a11..afd65272a 100644 --- a/Lib/Peripherals/CAN/Src/can.c +++ b/Lib/Peripherals/CAN/Src/can.c @@ -5,12 +5,18 @@ #include #include +#ifdef STM32G4 +#include "STM32G4_hal_fdcan_defines.h" #include "stm32g4xx_ll_bus.h" #include "stm32g4xx_ll_dma.h" +#elif defined(STM32H5) +#include "STM32H5_hal_fdcan_defines.h" +#include "stm32h5xx_ll_bus.h" +#include "stm32h5xx_ll_dma.h" +#endif // TODO: make the profiler cleaner #include "Logomatic.h" -#include "STM32G4_hal_fdcan_defines.h" #include "profile.h" // TODO: define DMA usage in a better way @@ -172,6 +178,30 @@ CANHandle *can_init(const CANConfig *config) } #endif +#elif defined(STM32H523xx) +#ifdef USECAN1 + if (config->fdcan_instance == FDCAN1) { + if (CAN1.init) { + LOGOMATIC("CAN: CAN1 is already initialized\n"); + return CAN_SUCCESS; + } else { + canHandle = &CAN1; + canHandle->tx_capacity = TX_BUFFER_1_SIZE; + } + } +#endif +#ifdef USECAN2 + if (config->fdcan_instance == FDCAN2) { + if (CAN2.init) { + LOGOMATIC("CAN: CAN2 is already initialized\n"); + return CAN_SUCCESS; + } else { + canHandle = &CAN2; + canHandle->tx_capacity = TX_BUFFER_2_SIZE; + } + } +#endif + #endif // #elif defined(STM32L476xx) @@ -717,6 +747,17 @@ static CAN_STATUS can_get_irqs(FDCAN_GlobalTypeDef *instance, IRQn_Type *it0, IR *it1 = FDCAN1_IT1_IRQn; return CAN_SUCCESS; } +#elif defined(STM32H523xx) + if (instance == FDCAN1) { + *it0 = FDCAN1_IT0_IRQn; + *it1 = FDCAN1_IT1_IRQn; + return CAN_SUCCESS; + } + if (instance == FDCAN2) { + *it0 = FDCAN2_IT0_IRQn; + *it1 = FDCAN2_IT1_IRQn; + return CAN_SUCCESS; + } #endif LOGOMATIC("can_get_irqs: could not obtain irq #s\n"); @@ -741,6 +782,17 @@ static CANHandle *can_get_handle(FDCAN_HandleTypeDef *hfdcan) return &CAN3; } #endif +#elif defined(STM32H5) +#ifdef USECAN1 + if (hfdcan->Instance == FDCAN1) { + return &CAN1; + } +#endif +#ifdef USECAN2 + if (hfdcan->Instance == FDCAN2) { + return &CAN2; + } +#endif #endif LOGOMATIC("CAN_get_handle: was given invalid FDCAN instance\n"); @@ -772,6 +824,17 @@ static CAN_STATUS validate_can_handle(CANHandle *canHandle) return CAN_SUCCESS; } #endif +#elif defined(STM32H5) +#ifdef USECAN1 + if (canHandle == &CAN1) { + return CAN_SUCCESS; + } +#endif +#ifdef USECAN2 + if (canHandle == &CAN2) { + return CAN_SUCCESS; + } +#endif #endif LOGOMATIC("can.c: invalid can handle\n"); @@ -901,7 +964,6 @@ static void FDCAN_InstanceDeInit(FDCAN_HandleTypeDef *hfdcan) static const char *can_get_instance_name(FDCAN_GlobalTypeDef *instance) { #ifdef STM32G474xx - if (instance == FDCAN1) { return "FDCAN1"; } else if (instance == FDCAN2) { @@ -913,6 +975,12 @@ static const char *can_get_instance_name(FDCAN_GlobalTypeDef *instance) if (instance == FDCAN1) { return "FDCAN1"; } +#elif defined(STM32H523xx) + if (instance == FDCAN1) { + return "FDCAN1"; + } else if (instance == FDCAN2) { + return "FDCAN2"; + } #endif return "UNKNOWN"; } @@ -945,6 +1013,7 @@ void FDCAN2_IT1_IRQHandler(void) #endif } +#ifdef STM32G4 void FDCAN3_IT0_IRQHandler(void) { #ifdef USECAN3 @@ -957,3 +1026,5 @@ void FDCAN3_IT1_IRQHandler(void) HAL_FDCAN_IRQHandler(&hal_fdcan3); #endif } + +#endif diff --git a/Lib/Peripherals/CAN/Src/can_cfg_helpers.c b/Lib/Peripherals/CAN/Src/can_cfg_helpers.c index 88d5c242a..8c589f558 100644 --- a/Lib/Peripherals/CAN/Src/can_cfg_helpers.c +++ b/Lib/Peripherals/CAN/Src/can_cfg_helpers.c @@ -18,12 +18,27 @@ static can_cfg_helper defaultSTM32G431x8_CANCfg; static can_cfg_helper defaultSTM32G474xE_CANCfg; #endif +#ifdef STM32H523xx +static can_cfg_helper defaultSTM32H523xx_CANCfg; +#endif + +void set_default_can_clksource() +{ +#ifdef STM32G4 + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); +#elif defined(STM32H5) + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); +#endif +} + int get_cfg(FDCAN_GlobalTypeDef *instance, CAN_RXCallback callback, CANConfig *out_cfg, uint32_t Mode, uint32_t numStdFilters, uint32_t numExtFilters) { #ifdef STM32G474xx return defaultSTM32G474xE_CANCfg(instance, callback, out_cfg, Mode, numStdFilters, numExtFilters); #elif defined(STM32G431xx) return defaultSTM32G431x8_CANCfg(instance, callback, out_cfg, Mode, numStdFilters, numExtFilters); +#elif defined(STM32H523xx) + return defaultSTM32H523xx_CANCfg(instance, callback, out_cfg, Mode, numStdFilters, numExtFilters); #elif defined(STM32L4) #error "STM32L4 is untested" #elif defined(STM32U5) @@ -192,3 +207,76 @@ CAN_STATUS defaultSTM32G431x8_CANCfg(FDCAN_GlobalTypeDef *instance, CAN_RXCallba return CAN_ERROR; } #endif + +#ifdef STM32H523xx +CAN_STATUS defaultSTM32H523xx_CANCfg(FDCAN_GlobalTypeDef *instance, CAN_RXCallback callback, CANConfig *out_cfg, uint32_t Mode, uint32_t numStdFilters, uint32_t numExtFilters) +{ + CANConfig canCfg; + + canCfg.hal_fdcan_init.ClockDivider = FDCAN_CLOCK_DIV1; + canCfg.hal_fdcan_init.FrameFormat = FDCAN_FRAME_FD_BRS; + canCfg.hal_fdcan_init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; + canCfg.hal_fdcan_init.Mode = Mode; + canCfg.hal_fdcan_init.AutoRetransmission = ENABLE; + canCfg.hal_fdcan_init.TransmitPause = DISABLE; + canCfg.hal_fdcan_init.ProtocolException = ENABLE; + canCfg.hal_fdcan_init.NominalPrescaler = 1; + canCfg.hal_fdcan_init.NominalSyncJumpWidth = 16; + canCfg.hal_fdcan_init.NominalTimeSeg1 = 134; // at 180 MHz, a 75% sampling time leads to (134+1)/(1+134+45) ~ 0.75 + canCfg.hal_fdcan_init.NominalTimeSeg2 = 45; + canCfg.hal_fdcan_init.DataPrescaler = 1; + canCfg.hal_fdcan_init.DataSyncJumpWidth = 16; + canCfg.hal_fdcan_init.DataTimeSeg1 = 26; // at 180 MHz, for 5 MbPs, (26+1)/(26 + 1 + 9) + canCfg.hal_fdcan_init.DataTimeSeg2 = 9; + canCfg.hal_fdcan_init.StdFiltersNbr = numStdFilters; + canCfg.hal_fdcan_init.ExtFiltersNbr = numExtFilters; + + canCfg.rx_callback = NULL; + canCfg.rx_interrupt_priority = 14; + canCfg.tx_interrupt_priority = 14; + + canCfg.init_rx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_rx_gpio.Pull = GPIO_PULLUP; + canCfg.init_rx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + canCfg.init_tx_gpio.Mode = GPIO_MODE_AF_PP; + canCfg.init_tx_gpio.Pull = GPIO_NOPULL; + canCfg.init_tx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + + canCfg.rx_callback = callback; + +#ifdef USECAN1 + if (instance == FDCAN1) { + canCfg.fdcan_instance = FDCAN1; + canCfg.rx_gpio = GPIOA; + canCfg.init_rx_gpio.Pin = GPIO_PIN_11; + canCfg.init_rx_gpio.Alternate = GPIO_AF9_FDCAN1; + + canCfg.tx_gpio = GPIOA; + canCfg.init_tx_gpio.Pin = GPIO_PIN_12; + canCfg.init_tx_gpio.Alternate = GPIO_AF9_FDCAN1; + + *out_cfg = canCfg; + return CAN_SUCCESS; + } +#endif + +#ifdef USECAN2 + if (instance == FDCAN2) { + canCfg.fdcan_instance = FDCAN2; + canCfg.rx_gpio = GPIOA; + canCfg.init_rx_gpio.Pin = GPIO_PIN_0; + canCfg.init_rx_gpio.Alternate = GPIO_AF9_FDCAN2; + + canCfg.tx_gpio = GPIOA; + canCfg.init_tx_gpio.Pin = GPIO_PIN_10; + canCfg.init_tx_gpio.Alternate = GPIO_AF9_FDCAN2; + + *out_cfg = canCfg; + return CAN_SUCCESS; + } +#endif + + return CAN_ERROR; +} +#endif diff --git a/Lib/Peripherals/CAN/Src/can_dma.c b/Lib/Peripherals/CAN/Src/can_dma.c index 2ed89e76e..8d29a6b00 100644 --- a/Lib/Peripherals/CAN/Src/can_dma.c +++ b/Lib/Peripherals/CAN/Src/can_dma.c @@ -3,14 +3,16 @@ #include -#include "stm32g4xx_ll_bus.h" -#include "stm32g4xx_ll_dma.h" +// #include "stm32g4xx_ll_bus.h" +// #include "stm32g4xx_ll_dma.h" -// #include "can_platform_deps.h" #include "Logomatic.h" +#include "can_platform_deps.h" #ifdef STM32G4 #include "STM32G4_hal_fdcan_defines.h" +#elif defined(STM32H5) +#include "STM32H5_hal_fdcan_defines.h" #else #error "CAN with DMA not yet supported for this family" #endif diff --git a/Lib/Peripherals/CAN/Test/can_basic_test.c b/Lib/Peripherals/CAN/Test/can_basic_test.c index 9646c4ea5..700f08deb 100644 --- a/Lib/Peripherals/CAN/Test/can_basic_test.c +++ b/Lib/Peripherals/CAN/Test/can_basic_test.c @@ -143,7 +143,7 @@ int can_basic_test(void) cfg2.init_tx_gpio.Alternate = GPIO_AF9_FDCAN2; #endif - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + set_default_can_clksource(); //============================================================================================= if ((primary_can = can_init(&cfg1)) == NULL) { diff --git a/Lib/Peripherals/CAN/Test/can_filter_test.c b/Lib/Peripherals/CAN/Test/can_filter_test.c index 6f749e6b8..cf4e06795 100644 --- a/Lib/Peripherals/CAN/Test/can_filter_test.c +++ b/Lib/Peripherals/CAN/Test/can_filter_test.c @@ -54,7 +54,7 @@ int can_filter_test(void) primary_can = data_can = NULL; CANConfig cfg1; - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + set_default_can_clksource(); if (get_cfg(FDCAN1, can_filter_test_rx_callback, &cfg1, FDCAN_MODE_INTERNAL_LOOPBACK, 1, 0)) { LOGOMATIC("can_filter_test: FAIL, could not get config for FDCAN1\n"); diff --git a/Lib/Peripherals/CAN/Test/can_lost_rx_test.c b/Lib/Peripherals/CAN/Test/can_lost_rx_test.c index 6c85b47e4..33b37ae2a 100644 --- a/Lib/Peripherals/CAN/Test/can_lost_rx_test.c +++ b/Lib/Peripherals/CAN/Test/can_lost_rx_test.c @@ -31,7 +31,7 @@ int can_lost_rx_test(void) return ERROR; } - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + set_default_can_clksource(); // TODO: Make the stress test more stressful FDCAN_TxHeaderTypeDef TxHeader = { diff --git a/Lib/Peripherals/CAN/Test/can_release_test.c b/Lib/Peripherals/CAN/Test/can_release_test.c index cb0e9d5e5..0d6652745 100644 --- a/Lib/Peripherals/CAN/Test/can_release_test.c +++ b/Lib/Peripherals/CAN/Test/can_release_test.c @@ -22,7 +22,7 @@ int can_release_test() CANHandle *can = NULL; - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + set_default_can_clksource(); //============================================================================================= LOGOMATIC("can_release_test: initializing handle\n"); diff --git a/Lib/Peripherals/CAN/Test/can_stress_test.c b/Lib/Peripherals/CAN/Test/can_stress_test.c index 70c11fce0..08548e677 100644 --- a/Lib/Peripherals/CAN/Test/can_stress_test.c +++ b/Lib/Peripherals/CAN/Test/can_stress_test.c @@ -58,7 +58,7 @@ int can_stress_test(void) return ERROR; } - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + set_default_can_clksource(); // TODO: Make the stress test more stressful FDCAN_TxHeaderTypeDef TxHeader = { diff --git a/Lib/Peripherals/CAN/common.cmake b/Lib/Peripherals/CAN/common.cmake index ad9709a07..118d8b6a1 100644 --- a/Lib/Peripherals/CAN/common.cmake +++ b/Lib/Peripherals/CAN/common.cmake @@ -11,7 +11,6 @@ target_sources( PERIPHERAL_CAN_LIB INTERFACE ${CMAKE_CURRENT_LIST_DIR}/Src/can.c - ${CMAKE_CURRENT_LIST_DIR}/Src/can_dma.c ${CMAKE_CURRENT_LIST_DIR}/Src/can_cfg_helpers.c ) @@ -22,7 +21,7 @@ target_include_directories( ${CMAKE_CURRENT_LIST_DIR}/Inc ) -#tests +# Tests add_library(PERIPHERAL_CAN_TEST_LIB INTERFACE) target_sources( PERIPHERAL_CAN_TEST_LIB @@ -33,8 +32,6 @@ target_sources( ${CMAKE_CURRENT_LIST_DIR}/Test/can_filter_test.c ${CMAKE_CURRENT_LIST_DIR}/Test/can_lost_rx_test.c ${CMAKE_CURRENT_LIST_DIR}/Test/profile.c - #${CMAKE_CURRENT_LIST_DIR}/Test/can.c - #${CMAKE_CURRENT_LIST_DIR}/Test/can_tests.c ) target_include_directories( PERIPHERAL_CAN_TEST_LIB @@ -42,6 +39,15 @@ target_include_directories( ${CMAKE_CURRENT_LIST_DIR}/Test ) +# CAN with DMA +add_library(PERIPHERAL_CAN_DMA INTERFACE) +target_sources( + PERIPHERAL_CAN_DMA + INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/Src/can_dma.c +) +target_link_libraries(PERIPHERAL_CAN_DMA INTERFACE PERIPHERAL_CAN_LIB) + # link test to this library #if(CMAKE_BUILD_TYPE STREQUAL "Test") # Initialization From 72d8e5de7dd9a96e19cbcc951942bd575dff6ff5 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 03:44:37 +0000 Subject: [PATCH 057/158] Automatic Clang-Format: Standardized formatting automatically --- H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c index ea63de8e1..c8eeba1e4 100644 --- a/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c +++ b/H523xx_CAN_TESTING/H523xx_CAN_BASIC_TEST/main.c @@ -32,9 +32,9 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include "Logomatic.h" -#include "GRCAN_FancyLayer.h" #include "FancyCAN_LoopbackTest.h" +#include "GRCAN_FancyLayer.h" +#include "Logomatic.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ From 732c4b2ad2b37dbb8a41c20929a7a0e195b42d1e Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 21:45:45 -0700 Subject: [PATCH 058/158] Added can_mag files, minor changes to mag.h and mag.c to convert floats to int output --- SAMM/SAMM_Mag/Inc/can_mag.h | 0 SAMM/SAMM_Mag/Inc/mag.h | 2 +- SAMM/SAMM_Mag/Src/can_mag.c | 0 SAMM/SAMM_Mag/Src/mag.c | 19 ++-- SAMM/SAMM_Mag/Src/main.c | 4 +- SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 127 +++++++++++++------------ 6 files changed, 79 insertions(+), 73 deletions(-) create mode 100644 SAMM/SAMM_Mag/Inc/can_mag.h create mode 100644 SAMM/SAMM_Mag/Src/can_mag.c diff --git a/SAMM/SAMM_Mag/Inc/can_mag.h b/SAMM/SAMM_Mag/Inc/can_mag.h new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 1455c6dc7..1602555af 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -24,7 +24,7 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data); uint8_t mag_calib_abort(mag *mag_dev); -float mag_read_encoder_angle(mag *mag_dev); +uint16_t mag_read_encoder_angle(mag *mag_dev); bool mag_read_device_status(mag *mag_dev); diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c new file mode 100644 index 000000000..e69de29bb diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index d9f32c85f..cf3965cb5 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -93,24 +93,25 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) } // Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) -float mag_read_encoder_angle(mag *mag_dev) +uint16_t mag_read_encoder_angle(mag *mag_dev) { - uint16_t read_angle = mag_transmit(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF) * 360.0f / 32768); // Mask to 15 bits (valid angle data) + uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) } // Address 0x22:0x23 (STA)—Device Status // read bit 0 AOK [0] bool mag_read_device_status(mag *mag_dev) { - uint16_t read = mag_transmit(mag_dev, 0x22); // 0x22 is device status + uint16_t read = mag_read(mag_dev, 0x22); // 0x22 is device status return (read & 0x0001); // read aok } -float mag_read_temp(mag *mag_dev) +uint8_t mag_read_temp(mag *mag_dev) { - uint16_t read_temp = mag_transmit(mag_dev, 0x28); // 0x28 is temp register - return ((uint16_t)(read_temp & 0x0FFF) / 8.0f + 25); // Mask to 12 bits (valid temp data) + uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register + float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) + return ((uint8_t)masked_temp / 16); // } /* @@ -153,7 +154,7 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { - int16_t read_turns = mag_transmit(mag_dev, 0x2C); // 0x2C is turn counter + int16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter return ((int16_t)(read_turns & 0x0FFF)); // Mask to 12 bits (valid angle data) } @@ -163,7 +164,7 @@ int16_t mag_read_turns(mag *mag_dev) // Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) float mag_read_HANG(mag *mag_dev) { - int16_t read_HANG = mag_transmit(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index b1a618d14..c3bcb7a36 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -174,12 +174,12 @@ int main(void) // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); /* USER CODE END WHILE */ float temp = mag_read_temp(&mag_dev); - float angle = mag_read_encoder_angle(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); bool bad = check_status(&mag_dev); printf("Temperature is %d\n", (double)temp); - printf("Angle is %d\n", (double)angle); + printf("Angle is %d\n", angle); printf("Number of turns is %d\n", turns); if (!bad) { printf("something is cooked"); diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index 03f6fef64..c60413145 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -108,78 +108,83 @@ extern "C" { #define USE_HAL_USART_REGISTER_CALLBACKS 0U #define USE_HAL_WWDG_REGISTER_CALLBACKS 0U -/* ########################## Oscillator Values adaptation ####################*/ -/** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined(HSE_VALUE) -#define HSE_VALUE (8000000UL) /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined(HSE_STARTUP_TIMEOUT) -#define HSE_STARTUP_TIMEOUT (100UL) /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ +/* ####################################### Oscillator Values adaptation ##############################################*/ /** - * @brief Internal Core Speed oscillator (CSI) default value. - * This value is the default CSI range value after Reset. - */ -#if !defined(CSI_VALUE) -#define CSI_VALUE (4000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ /** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined(HSI_VALUE) -#define HSI_VALUE (16000000UL) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined (CSI_VALUE) + #define CSI_VALUE 4000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ /** - * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined(HSI48_VALUE) -#define HSI48_VALUE \ - (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. \ - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE 64000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined(LSI_VALUE) -/*!< Value of the Internal Low Speed oscillator in Hz -The real value may vary depending on the variations in voltage and temperature.*/ -#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ -/** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined(LSE_VALUE) -#define LSE_VALUE (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ -#endif /* LSE_VALUE */ + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE 48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ -#if !defined(LSE_STARTUP_TIMEOUT) -#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000UL /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +#if !defined (LSI_STARTUP_TIME) + #define LSI_STARTUP_TIME 130UL /*!< Time out for LSI start up, in us */ +#endif /* LSI_STARTUP_TIME */ /** - * @brief External clock source for I2S and SAI peripherals - * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source - * frequency, this source is inserted directly through I2S_CKIN pad. - */ -#if !defined(EXTERNAL_CLOCK_VALUE) -#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768UL /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT 5000UL /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ +/** + * @brief External clock source for SPI peripheral + * This value is used by the SPI HAL module to compute the SPI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, === you can define the HSE value in your toolchain compiler preprocessor. */ From deb18a2bf3979015d4bb8048fae0868e2292d338 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 04:46:52 +0000 Subject: [PATCH 059/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 14 ++-- SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h | 111 +++++++++++++------------ 2 files changed, 63 insertions(+), 62 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index cf3965cb5..00169c99c 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -95,8 +95,8 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) // Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) uint16_t mag_read_encoder_angle(mag *mag_dev) { - uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) + uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) } // Address 0x22:0x23 (STA)—Device Status @@ -104,14 +104,14 @@ uint16_t mag_read_encoder_angle(mag *mag_dev) bool mag_read_device_status(mag *mag_dev) { uint16_t read = mag_read(mag_dev, 0x22); // 0x22 is device status - return (read & 0x0001); // read aok + return (read & 0x0001); // read aok } uint8_t mag_read_temp(mag *mag_dev) { - uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register + uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) - return ((uint8_t)masked_temp / 16); // + return ((uint8_t)masked_temp / 16); // } /* @@ -155,7 +155,7 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { int16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_turns & 0x0FFF)); // Mask to 12 bits (valid angle data) + return ((int16_t)(read_turns & 0x0FFF)); // Mask to 12 bits (valid angle data) } // Address 0x24:0x25 (ERR)—Device Error Flags @@ -164,7 +164,7 @@ int16_t mag_read_turns(mag *mag_dev) // Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) float mag_read_HANG(mag *mag_dev) { - int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) } diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h index c60413145..c27ed6a0d 100644 --- a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h +++ b/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h @@ -111,80 +111,81 @@ extern "C" { /* ####################################### Oscillator Values adaptation ##############################################*/ /** - * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSE is used as system clock source, directly or through the PLL). - */ -#if !defined (HSE_VALUE) - #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined(HSE_VALUE) +#define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ -#if !defined (HSE_STARTUP_TIMEOUT) - #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ -#endif /* HSE_STARTUP_TIMEOUT */ +#if !defined(HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ /** - * @brief Internal Core Speed oscillator (CSI) default value. - * This value is the default CSI range value after Reset. - */ -#if !defined (CSI_VALUE) - #define CSI_VALUE 4000000UL /*!< Value of the Internal oscillator in Hz*/ -#endif /* CSI_VALUE */ + * @brief Internal Core Speed oscillator (CSI) default value. + * This value is the default CSI range value after Reset. + */ +#if !defined(CSI_VALUE) +#define CSI_VALUE 4000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* CSI_VALUE */ /** - * @brief Internal High Speed oscillator (HSI) value. - * This value is used by the RCC HAL module to compute the system frequency - * (when HSI is used as system clock source, directly or through the PLL). - */ -#if !defined (HSI_VALUE) - #define HSI_VALUE 64000000UL /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined(HSI_VALUE) +#define HSI_VALUE 64000000UL /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ /** - * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. - * This internal oscillator is mainly dedicated to provide a high precision clock to - * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. - * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency - * which is subject to manufacturing process variations. - */ -#if !defined (HSI48_VALUE) - #define HSI48_VALUE 48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. - The real value my vary depending on manufacturing process variations.*/ -#endif /* HSI48_VALUE */ + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined(HSI48_VALUE) +#define HSI48_VALUE \ + 48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. \ + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ /** - * @brief Internal Low Speed oscillator (LSI) value. - */ -#if !defined (LSI_VALUE) - #define LSI_VALUE 32000UL /*!< LSI Typical Value in Hz*/ -#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz - The real value may vary depending on the variations - in voltage and temperature.*/ + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined(LSI_VALUE) +#define LSI_VALUE 32000UL /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz \ + The real value may vary depending on the variations \ + in voltage and temperature.*/ -#if !defined (LSI_STARTUP_TIME) - #define LSI_STARTUP_TIME 130UL /*!< Time out for LSI start up, in us */ -#endif /* LSI_STARTUP_TIME */ +#if !defined(LSI_STARTUP_TIME) +#define LSI_STARTUP_TIME 130UL /*!< Time out for LSI start up, in us */ +#endif /* LSI_STARTUP_TIME */ /** - * @brief External Low Speed oscillator (LSE) value. - * This value is used by the UART, RTC HAL module to compute the system frequency - */ -#if !defined (LSE_VALUE) - #define LSE_VALUE 32768UL /*!< Value of the External oscillator in Hz*/ -#endif /* LSE_VALUE */ + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined(LSE_VALUE) +#define LSE_VALUE 32768UL /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ -#if !defined (LSE_STARTUP_TIMEOUT) - #define LSE_STARTUP_TIMEOUT 5000UL /*!< Time out for LSE start up, in ms */ -#endif /* LSE_STARTUP_TIMEOUT */ +#if !defined(LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT 5000UL /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ /** * @brief External clock source for SPI peripheral * This value is used by the SPI HAL module to compute the SPI clock source * frequency, this source is inserted directly through I2S_CKIN pad. */ -#if !defined (EXTERNAL_CLOCK_VALUE) - #define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ -#endif /* EXTERNAL_CLOCK_VALUE */ +#if !defined(EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE 12288000UL /*!< Value of the External clock in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ /* Tip: To avoid modifying this file each time you need to use different HSE, === you can define the HSE value in your toolchain compiler preprocessor. */ From 40496d0b1722cce717deac014e4456b07cb7233d Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 23 Apr 2026 21:55:43 -0700 Subject: [PATCH 060/158] Added can init and sending for mag and changed cmake --- SAMM/SAMM_Mag/CMakeLists.txt | 3 ++ SAMM/SAMM_Mag/Inc/can_mag.h | 14 +++++++++ SAMM/SAMM_Mag/Src/can_mag.c | 61 ++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SAMM_Mag/CMakeLists.txt index 1b5e1a18c..f1640ecc7 100644 --- a/SAMM/SAMM_Mag/CMakeLists.txt +++ b/SAMM/SAMM_Mag/CMakeLists.txt @@ -34,6 +34,7 @@ target_sources( Src/main.c Src/spi.c Src/stm32h5xx_it.c + Src/can_mag.c # TODO ) @@ -44,11 +45,13 @@ target_link_libraries( PERIPHERAL_CAN_LIB BitManipulations_Lib SAMM_IMU_Lib + GRCAN_FANCYLAYER ) target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc + . #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/SAMM_Mag/Inc/can_mag.h b/SAMM/SAMM_Mag/Inc/can_mag.h index e69de29bb..e8e9c4a47 100644 --- a/SAMM/SAMM_Mag/Inc/can_mag.h +++ b/SAMM/SAMM_Mag/Inc/can_mag.h @@ -0,0 +1,14 @@ +#ifndef CAN_MAG_H +#define CAN_MAG_H + +#include + +#include "GRCAN_FancyLayer.h" +#include "Logomatic.h" + +#define CAN_MAG_DEFAULT_MSG_ID 0x2C + +int can_mag_init(GRCAN_NODE_ID mag_ID); +int can_mag_send(unsigned int *data); + +#endif diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index e69de29bb..c2463cce9 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -0,0 +1,61 @@ +#include "can_mag.h" + +static GRCAN_NODE_ID destNode = GRCAN_TCM; +static GRCAN_NODE_ID localNode = GRCAN_ALL; +static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; +static GRCAN_MSG_ID msgID = CAN_MAG_DEFAULT_MSG_ID; + +int can_mag_init(GRCAN_NODE_ID mag_ID) +{ + if (localNode != GRCAN_ALL) { + LOGOMATIC("CAN MAG already initialized\n"); + return 0; + } + + GRCAN_BusConfig busCfg = {0}; + GRCAN_SetDefaultBusConfig(&busCfg, busMode); + +#if defined(STM32H5) + busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; +#endif + + if (mag_ID == GRCAN_SAMM_Mag_1) { + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); + localNode = GRCAN_SAMM_Mag_1; + } else if (mag_ID == GRCAN_SAMM_Mag_2) { + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_2); + localNode = GRCAN_SAMM_Mag_2; + } else { + LOGOMATIC("Mag number not defined, defaulting to Mag 1\n"); + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); + localNode = GRCAN_SAMM_Mag_1; + } + + if (!GRCAN_InitBus(&busCfg)) { + LOGOMATIC("CAN MAG bus init failed\n"); + localNode = GRCAN_ALL; + return 0; + } + + return 1; +} + +int can_mag_send(unsigned int *data) +{ + if (data == NULL) { + LOGOMATIC("can_mag_send: NULL data\n"); + return 0; + } + + if (localNode == GRCAN_ALL) { + LOGOMATIC("can_mag_send: CAN MAG not initialized\n"); + return 0; + } + + if (!GRCAN_Fancy_Send(busMode, destNode, msgID, (void *)data, 64)) { + LOGOMATIC("can_mag_send failed\n"); + return 0; + } + + return 1; +} From 73ea2e9835a2b38b3224ebe662d4ebad7ac6bf77 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 04:57:07 +0000 Subject: [PATCH 061/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/can_mag.c | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index c2463cce9..56ecca6e8 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -7,55 +7,55 @@ static GRCAN_MSG_ID msgID = CAN_MAG_DEFAULT_MSG_ID; int can_mag_init(GRCAN_NODE_ID mag_ID) { - if (localNode != GRCAN_ALL) { - LOGOMATIC("CAN MAG already initialized\n"); - return 0; - } + if (localNode != GRCAN_ALL) { + LOGOMATIC("CAN MAG already initialized\n"); + return 0; + } - GRCAN_BusConfig busCfg = {0}; - GRCAN_SetDefaultBusConfig(&busCfg, busMode); + GRCAN_BusConfig busCfg = {0}; + GRCAN_SetDefaultBusConfig(&busCfg, busMode); #if defined(STM32H5) - busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; + busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; #endif - if (mag_ID == GRCAN_SAMM_Mag_1) { - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); - localNode = GRCAN_SAMM_Mag_1; - } else if (mag_ID == GRCAN_SAMM_Mag_2) { - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_2); - localNode = GRCAN_SAMM_Mag_2; - } else { - LOGOMATIC("Mag number not defined, defaulting to Mag 1\n"); - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); - localNode = GRCAN_SAMM_Mag_1; - } - - if (!GRCAN_InitBus(&busCfg)) { - LOGOMATIC("CAN MAG bus init failed\n"); - localNode = GRCAN_ALL; - return 0; - } - - return 1; + if (mag_ID == GRCAN_SAMM_Mag_1) { + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); + localNode = GRCAN_SAMM_Mag_1; + } else if (mag_ID == GRCAN_SAMM_Mag_2) { + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_2); + localNode = GRCAN_SAMM_Mag_2; + } else { + LOGOMATIC("Mag number not defined, defaulting to Mag 1\n"); + GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); + localNode = GRCAN_SAMM_Mag_1; + } + + if (!GRCAN_InitBus(&busCfg)) { + LOGOMATIC("CAN MAG bus init failed\n"); + localNode = GRCAN_ALL; + return 0; + } + + return 1; } int can_mag_send(unsigned int *data) { - if (data == NULL) { - LOGOMATIC("can_mag_send: NULL data\n"); - return 0; - } - - if (localNode == GRCAN_ALL) { - LOGOMATIC("can_mag_send: CAN MAG not initialized\n"); - return 0; - } - - if (!GRCAN_Fancy_Send(busMode, destNode, msgID, (void *)data, 64)) { - LOGOMATIC("can_mag_send failed\n"); - return 0; - } - - return 1; + if (data == NULL) { + LOGOMATIC("can_mag_send: NULL data\n"); + return 0; + } + + if (localNode == GRCAN_ALL) { + LOGOMATIC("can_mag_send: CAN MAG not initialized\n"); + return 0; + } + + if (!GRCAN_Fancy_Send(busMode, destNode, msgID, (void *)data, 64)) { + LOGOMATIC("can_mag_send failed\n"); + return 0; + } + + return 1; } From ff9ab5519022abad72fe6f2f150517f2bb788e04 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 23 Apr 2026 21:57:44 -0700 Subject: [PATCH 062/158] Truncated mag value to be uint8 --- SAMM/SAMM_Mag/Src/mag.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 00169c99c..6a1971345 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -111,7 +111,8 @@ uint8_t mag_read_temp(mag *mag_dev) { uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) - return ((uint8_t)masked_temp / 16); // + float offset_temp = masked_temp + 60.0f; + return (uint8_t)offset_temp; } /* From ce829ccaed88a223f3246a31629db0055d933ce5 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 23 Apr 2026 22:07:25 -0700 Subject: [PATCH 063/158] Updated can for mag --- SAMM/SAMM_Mag/Inc/can_mag.h | 6 +++++- SAMM/SAMM_Mag/Src/can_mag.c | 24 +++++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/can_mag.h b/SAMM/SAMM_Mag/Inc/can_mag.h index e8e9c4a47..de4d9feaa 100644 --- a/SAMM/SAMM_Mag/Inc/can_mag.h +++ b/SAMM/SAMM_Mag/Inc/can_mag.h @@ -6,7 +6,11 @@ #include "GRCAN_FancyLayer.h" #include "Logomatic.h" -#define CAN_MAG_DEFAULT_MSG_ID 0x2C +typedef enum { + CAN_MAG_MSG_DATA = 0x2C, + CAN_MAG_MSG_STATUS = 0x2D, + CAN_MAG_MSG_FAULT = 0x2F +} CAN_MAG_MSG_ID; //change with updates <- fixme int can_mag_init(GRCAN_NODE_ID mag_ID); int can_mag_send(unsigned int *data); diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index c2463cce9..5b9d418f8 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -3,20 +3,38 @@ static GRCAN_NODE_ID destNode = GRCAN_TCM; static GRCAN_NODE_ID localNode = GRCAN_ALL; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_MSG_ID msgID = CAN_MAG_DEFAULT_MSG_ID; -int can_mag_init(GRCAN_NODE_ID mag_ID) +static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; + +int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { if (localNode != GRCAN_ALL) { LOGOMATIC("CAN MAG already initialized\n"); return 0; } + switch (init_msgID) { + case CAN_MAG_MSG_DATA: + msgID = init_msgID; + break; + case CAN_MAG_MSG_STATUS: + msgID = init_msgID; + break; + case CAN_MAG_MSG_FAULT: + msgID = init_msgID; + break; + default: + LOGOMATIC("Invalid MAG message ID, defaulting to DATA\n"); + msgID = CAN_MAG_MSG_DATA; + break; + } + GRCAN_BusConfig busCfg = {0}; GRCAN_SetDefaultBusConfig(&busCfg, busMode); #if defined(STM32H5) - busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; + busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; //should be 180MHz + //defaults should work #endif if (mag_ID == GRCAN_SAMM_Mag_1) { From cd14fe2be6df10449212eebdfbb8f10669841436 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 05:10:11 +0000 Subject: [PATCH 064/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Inc/can_mag.h | 8 ++++---- SAMM/SAMM_Mag/Src/can_mag.c | 38 ++++++++++++++++++------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/can_mag.h b/SAMM/SAMM_Mag/Inc/can_mag.h index de4d9feaa..b564f9694 100644 --- a/SAMM/SAMM_Mag/Inc/can_mag.h +++ b/SAMM/SAMM_Mag/Inc/can_mag.h @@ -7,10 +7,10 @@ #include "Logomatic.h" typedef enum { - CAN_MAG_MSG_DATA = 0x2C, - CAN_MAG_MSG_STATUS = 0x2D, - CAN_MAG_MSG_FAULT = 0x2F -} CAN_MAG_MSG_ID; //change with updates <- fixme + CAN_MAG_MSG_DATA = 0x2C, + CAN_MAG_MSG_STATUS = 0x2D, + CAN_MAG_MSG_FAULT = 0x2F +} CAN_MAG_MSG_ID; // change with updates <- fixme int can_mag_init(GRCAN_NODE_ID mag_ID); int can_mag_send(unsigned int *data); diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index 49f8ee9ec..826173777 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -13,28 +13,28 @@ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) return 0; } - switch (init_msgID) { - case CAN_MAG_MSG_DATA: - msgID = init_msgID; - break; - case CAN_MAG_MSG_STATUS: - msgID = init_msgID; - break; - case CAN_MAG_MSG_FAULT: - msgID = init_msgID; - break; - default: - LOGOMATIC("Invalid MAG message ID, defaulting to DATA\n"); - msgID = CAN_MAG_MSG_DATA; - break; - } + switch (init_msgID) { + case CAN_MAG_MSG_DATA: + msgID = init_msgID; + break; + case CAN_MAG_MSG_STATUS: + msgID = init_msgID; + break; + case CAN_MAG_MSG_FAULT: + msgID = init_msgID; + break; + default: + LOGOMATIC("Invalid MAG message ID, defaulting to DATA\n"); + msgID = CAN_MAG_MSG_DATA; + break; + } - GRCAN_BusConfig busCfg = {0}; - GRCAN_SetDefaultBusConfig(&busCfg, busMode); + GRCAN_BusConfig busCfg = {0}; + GRCAN_SetDefaultBusConfig(&busCfg, busMode); #if defined(STM32H5) - busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; //should be 180MHz - //defaults should work + busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz + // defaults should work #endif if (mag_ID == GRCAN_SAMM_Mag_1) { From 16b186e375eb7167d9eca88abe4ee4380bfb7e53 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Apr 2026 05:11:29 +0000 Subject: [PATCH 065/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/can_mag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index 826173777..43cf5608c 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -34,7 +34,7 @@ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) #if defined(STM32H5) busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz - // defaults should work + // defaults should work #endif if (mag_ID == GRCAN_SAMM_Mag_1) { From e000b822aecb264bc46ca83953286addf0a7abba Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 28 Apr 2026 13:01:25 +0800 Subject: [PATCH 066/158] Starting to implement CAN --- SAMM/SAMM_Mag/Src/mag.c | 26 ++++++++++++++------------ SAMM/SAMM_Mag/Src/main.c | 17 +++++++++++++---- 2 files changed, 27 insertions(+), 16 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 6a1971345..c59264206 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -18,6 +18,8 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD mag_dev->port = port; mag_dev->pin = pin; + HAL_Delay(20); + uint16_t status = mag_read(mag_dev, 0x22); // Check AOK=1 (bit 0) and BIP=0 (bit 1) @@ -77,7 +79,7 @@ data (8 bits) crc (4 bits -- optional) */ -uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) +void mag_write(mag *mag_dev, uint8_t reg, uint16_t data) { uint16_t msb = ((data & mag_msb) >> 8) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; @@ -88,8 +90,6 @@ uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data) uint16_t lsb = (data & mag_lsb) | (((uint16_t)reg & mag_addr_mask) << 8) | 0x4000; mag_transmit(mag_dev, lsb); - - return 0; } // Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) @@ -131,11 +131,11 @@ Check the status of the acc, gyro and temp before returning the values bool check_status(mag *mag_dev) { // Device Error Flags - uint32_t error25 = mag_read(mag_dev, 0x25); - bool voltage_err = ((error25 & 0x18) > 0); + uint16_t error25 = mag_read(mag_dev, 0x24); + bool voltage_err = ((error25 & 0x0C) > 0); bool magnetic_err = ((error25 & 0x02) > 0); - uint32_t error24 = mag_read(mag_dev, 0x24); + uint16_t error24 = mag_read(mag_dev, 0x24); bool angle_error = ((error24 & 0x02) > 0); // Device Warning Flags @@ -145,18 +145,20 @@ bool check_status(mag *mag_dev) bool invalid_spi_len = ((warning26 & 0x80) > 0); bool temp_out_of_range = ((warning27 & 0x40) > 0); - bool turn_counter_saturated = ((warning27 && 0x01) > 0); - bool excessive_magnet_vel = ((warning27 && 0x08) > 0); + bool turn_counter_saturated = ((warning27 & 0x01) > 0); + bool excessive_magnet_vel = ((warning27 & 0x08) > 0); // fix-me add LOGOMATIC - return (voltage_err && magnetic_err && angle_error && invalid_spi_len && temp_out_of_range && turn_counter_saturated && excessive_magnet_vel); + return (voltage_err || magnetic_err || angle_error || invalid_spi_len || temp_out_of_range || turn_counter_saturated || excessive_magnet_vel); } int16_t mag_read_turns(mag *mag_dev) { - int16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - return ((int16_t)(read_turns & 0x0FFF)); // Mask to 12 bits (valid angle data) + uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter + int16_t turns = raw & 0x0FFF; // Mask to 12 bits (valid angle data) + if (turns & 0x0800) turns |= 0xF000; // sign extend bit 11 to bits 15:12 + return turns; } // Address 0x24:0x25 (ERR)—Device Error Flags @@ -166,7 +168,7 @@ int16_t mag_read_turns(mag *mag_dev) float mag_read_HANG(mag *mag_dev) { int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value - return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 32768); // Mask to 12 bits (valid angle data) + return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 4096.0f); // Mask to 12 bits (valid angle data) } // Address 0x1E:0x1F (CTRL)—Device Control diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index c3bcb7a36..0605f3858 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -27,6 +27,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include +#include // #include "VL53L4ED_api.h" #include "mag.h" @@ -91,7 +92,8 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - + can_init(&FDCAN1); + can_start(&FDCAN1); /* USER CODE END Init */ /* Configure the system clock */ @@ -117,7 +119,6 @@ int main(void) // bmi323 bmi323_dev; mag mag_dev; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); - mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin); // Send 2 dummy bytes to switch BMI323 to SPI mode // uint16_t dummy_byte = 0x8000; @@ -173,18 +174,26 @@ int main(void) // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); /* USER CODE END WHILE */ - float temp = mag_read_temp(&mag_dev); + + uint8_t temp = mag_read_temp(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); + FDCANTxMessage temp_can[8] = temp; + FDCANTxMessage angle_can[16] = angle; + FDCANTxMessage turns_can[16] = turns; bool bad = check_status(&mag_dev); printf("Temperature is %d\n", (double)temp); printf("Angle is %d\n", angle); printf("Number of turns is %d\n", turns); - if (!bad) { + if (bad) { printf("something is cooked"); mag_write_error(&mag_dev); } + can_send(&FDCAN1, temp_can); + can_send(&FDCAN1, angle_can); + cna_send(&FDCAN1, turns_can); + HAL_Delay(10); } /* USER CODE END 3 */ } From dbe3350b02a5325d4ff315ec2f7ae1da2cd93c79 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 05:10:40 +0000 Subject: [PATCH 067/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 10 ++++++---- SAMM/SAMM_Mag/Src/main.c | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index c59264206..557dda3b5 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -156,9 +156,11 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - int16_t turns = raw & 0x0FFF; // Mask to 12 bits (valid angle data) - if (turns & 0x0800) turns |= 0xF000; // sign extend bit 11 to bits 15:12 - return turns; + int16_t turns = raw & 0x0FFF; // Mask to 12 bits (valid angle data) + if (turns & 0x0800) { + turns |= 0xF000; // sign extend bit 11 to bits 15:12 + } + return turns; } // Address 0x24:0x25 (ERR)—Device Error Flags @@ -167,7 +169,7 @@ int16_t mag_read_turns(mag *mag_dev) // Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) float mag_read_HANG(mag *mag_dev) { - int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 4096.0f); // Mask to 12 bits (valid angle data) } diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 0605f3858..c2c154ff9 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -26,8 +26,8 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include #include +#include // #include "VL53L4ED_api.h" #include "mag.h" From 834e328dbf1b74921bcacb4576219a49d4551ee0 Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 28 Apr 2026 13:14:16 +0800 Subject: [PATCH 068/158] CAN stuff and bugs fixed hopefully --- SAMM/SAMM_Mag/Inc/mag.h | 6 ++---- SAMM/SAMM_Mag/Src/main.c | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SAMM_Mag/Inc/mag.h index 1602555af..833b4a928 100644 --- a/SAMM/SAMM_Mag/Inc/mag.h +++ b/SAMM/SAMM_Mag/Inc/mag.h @@ -20,15 +20,13 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data); uint16_t mag_read(mag *mag_dev, uint8_t reg); -uint16_t mag_write(mag *mag_dev, uint8_t reg, uint16_t data); - -uint8_t mag_calib_abort(mag *mag_dev); +void mag_write(mag *mag_dev, uint8_t reg, uint16_t data); uint16_t mag_read_encoder_angle(mag *mag_dev); bool mag_read_device_status(mag *mag_dev); -float mag_read_temp(mag *mag_dev); +uint8_t mag_read_temp(mag *mag_dev); bool check_status(mag *mag_dev); diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 0605f3858..2e986a4fd 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -92,8 +92,15 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - can_init(&FDCAN1); - can_start(&FDCAN1); + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + CANConfig my_cfg; + + get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL); + + CANHandle *h1 = can_init(&my_cfg); + + can_start(h1); /* USER CODE END Init */ /* Configure the system clock */ @@ -179,9 +186,9 @@ int main(void) uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); - FDCANTxMessage temp_can[8] = temp; - FDCANTxMessage angle_can[16] = angle; - FDCANTxMessage turns_can[16] = turns; + FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; + FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; + FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; bool bad = check_status(&mag_dev); printf("Temperature is %d\n", (double)temp); printf("Angle is %d\n", angle); @@ -190,9 +197,9 @@ int main(void) printf("something is cooked"); mag_write_error(&mag_dev); } - can_send(&FDCAN1, temp_can); - can_send(&FDCAN1, angle_can); - cna_send(&FDCAN1, turns_can); + can_send(h1, &temp_can); + can_send(h1, &angle_can); + cna_send(h1, &turns_can); HAL_Delay(10); } /* USER CODE END 3 */ From 4d55a6936eeeb5fe95bb41c9ff3566a9b90133a4 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 27 Apr 2026 22:26:05 -0700 Subject: [PATCH 069/158] Minor changes? --- SAMM/SAMM_Mag/Src/mag.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 557dda3b5..2839339ad 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -96,7 +96,7 @@ void mag_write(mag *mag_dev, uint8_t reg, uint16_t data) uint16_t mag_read_encoder_angle(mag *mag_dev) { uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) before conversion } // Address 0x22:0x23 (STA)—Device Status @@ -111,7 +111,7 @@ uint8_t mag_read_temp(mag *mag_dev) { uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) - float offset_temp = masked_temp + 60.0f; + float offset_temp = masked_temp + 60.0f; //temperature offset by 60 degrees return (uint8_t)offset_temp; } From 7e4227c9d9b383d000ca17b1d0df58ae4f571be6 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 05:38:42 +0000 Subject: [PATCH 070/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SAMM_Mag/Src/mag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SAMM_Mag/Src/mag.c index 2839339ad..ea27360a4 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SAMM_Mag/Src/mag.c @@ -111,7 +111,7 @@ uint8_t mag_read_temp(mag *mag_dev) { uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) - float offset_temp = masked_temp + 60.0f; //temperature offset by 60 degrees + float offset_temp = masked_temp + 60.0f; // temperature offset by 60 degrees return (uint8_t)offset_temp; } From ebd58e7ea0173fa00ece4d56cb509c72ec6954b6 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 27 Apr 2026 22:39:28 -0700 Subject: [PATCH 071/158] Renamed SAMM_ToF -> InboardFloor, SAMM_Mag -> SuspensionNodes --- CMakeLists.txt | 4 ++-- SAMM/{SAMM_TOF => InboardFloor}/CMakeLists.txt | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/VL53L4ED_api.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/VL53L4ED_calibration.h | 0 SAMM/{SAMM_Mag => InboardFloor}/Inc/can_cfg.h | 0 SAMM/{SAMM_Mag => InboardFloor}/Inc/crc.h | 0 SAMM/{SAMM_Mag => InboardFloor}/Inc/dma.h | 0 SAMM/{SAMM_Mag => InboardFloor}/Inc/gpio.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/i2c.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/main.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/platform.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/spi.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Inc/stm32h5xx_hal_conf.h | 0 SAMM/{SAMM_Mag => InboardFloor}/Inc/stm32h5xx_it.h | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/VL53L4ED_api.c | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/VL53L4ED_calibration.c | 0 SAMM/{SAMM_Mag => InboardFloor}/Src/crc.c | 0 SAMM/{SAMM_Mag => InboardFloor}/Src/dma.c | 0 SAMM/{SAMM_Mag => InboardFloor}/Src/gpio.c | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/i2c.c | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/main.c | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/platform.c | 0 SAMM/{SAMM_TOF => InboardFloor}/Src/spi.c | 0 SAMM/{SAMM_Mag => InboardFloor}/Src/stm32h5xx_it.c | 0 SAMM/{SAMM_Mag => SuspensionNodes}/CMakeLists.txt | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Inc/can_cfg.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Inc/can_mag.h | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Inc/crc.h | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Inc/dma.h | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Inc/gpio.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Inc/mag.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Inc/main.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Inc/spi.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Inc/stm32h5xx_hal_conf.h | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Inc/stm32h5xx_it.h | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Src/can_mag.c | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Src/crc.c | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Src/dma.c | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Src/gpio.c | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Src/mag.c | 2 +- SAMM/{SAMM_Mag => SuspensionNodes}/Src/main.c | 0 SAMM/{SAMM_Mag => SuspensionNodes}/Src/spi.c | 0 SAMM/{SAMM_TOF => SuspensionNodes}/Src/stm32h5xx_it.c | 0 43 files changed, 3 insertions(+), 3 deletions(-) rename SAMM/{SAMM_TOF => InboardFloor}/CMakeLists.txt (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/VL53L4ED_api.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/VL53L4ED_calibration.h (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Inc/can_cfg.h (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Inc/crc.h (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Inc/dma.h (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Inc/gpio.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/i2c.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/main.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/platform.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/spi.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Inc/stm32h5xx_hal_conf.h (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Inc/stm32h5xx_it.h (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/VL53L4ED_api.c (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/VL53L4ED_calibration.c (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Src/crc.c (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Src/dma.c (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Src/gpio.c (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/i2c.c (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/main.c (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/platform.c (100%) rename SAMM/{SAMM_TOF => InboardFloor}/Src/spi.c (100%) rename SAMM/{SAMM_Mag => InboardFloor}/Src/stm32h5xx_it.c (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/CMakeLists.txt (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Inc/can_cfg.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Inc/can_mag.h (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Inc/crc.h (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Inc/dma.h (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Inc/gpio.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Inc/mag.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Inc/main.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Inc/spi.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Inc/stm32h5xx_hal_conf.h (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Inc/stm32h5xx_it.h (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Src/can_mag.c (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Src/crc.c (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Src/dma.c (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Src/gpio.c (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Src/mag.c (98%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Src/main.c (100%) rename SAMM/{SAMM_Mag => SuspensionNodes}/Src/spi.c (100%) rename SAMM/{SAMM_TOF => SuspensionNodes}/Src/stm32h5xx_it.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88947a00f..25379d982 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -109,8 +109,8 @@ add_gr_project(STM32G431x8 TireTemp) # SAMM include("SAMM/samm.cmake") -add_gr_project(STM32H523xE SAMM SAMM_Mag) -add_gr_project(STM32H523xE SAMM SAMM_TOF) +add_gr_project(STM32H523xE SAMM InboardFloor) +add_gr_project(STM32H523xE SAMM SuspensionNodes) # Development add_gr_project(STM32G474xE G4PERTESTING) diff --git a/SAMM/SAMM_TOF/CMakeLists.txt b/SAMM/InboardFloor/CMakeLists.txt similarity index 100% rename from SAMM/SAMM_TOF/CMakeLists.txt rename to SAMM/InboardFloor/CMakeLists.txt diff --git a/SAMM/SAMM_TOF/Inc/VL53L4ED_api.h b/SAMM/InboardFloor/Inc/VL53L4ED_api.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/VL53L4ED_api.h rename to SAMM/InboardFloor/Inc/VL53L4ED_api.h diff --git a/SAMM/SAMM_TOF/Inc/VL53L4ED_calibration.h b/SAMM/InboardFloor/Inc/VL53L4ED_calibration.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/VL53L4ED_calibration.h rename to SAMM/InboardFloor/Inc/VL53L4ED_calibration.h diff --git a/SAMM/SAMM_Mag/Inc/can_cfg.h b/SAMM/InboardFloor/Inc/can_cfg.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/can_cfg.h rename to SAMM/InboardFloor/Inc/can_cfg.h diff --git a/SAMM/SAMM_Mag/Inc/crc.h b/SAMM/InboardFloor/Inc/crc.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/crc.h rename to SAMM/InboardFloor/Inc/crc.h diff --git a/SAMM/SAMM_Mag/Inc/dma.h b/SAMM/InboardFloor/Inc/dma.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/dma.h rename to SAMM/InboardFloor/Inc/dma.h diff --git a/SAMM/SAMM_Mag/Inc/gpio.h b/SAMM/InboardFloor/Inc/gpio.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/gpio.h rename to SAMM/InboardFloor/Inc/gpio.h diff --git a/SAMM/SAMM_TOF/Inc/i2c.h b/SAMM/InboardFloor/Inc/i2c.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/i2c.h rename to SAMM/InboardFloor/Inc/i2c.h diff --git a/SAMM/SAMM_TOF/Inc/main.h b/SAMM/InboardFloor/Inc/main.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/main.h rename to SAMM/InboardFloor/Inc/main.h diff --git a/SAMM/SAMM_TOF/Inc/platform.h b/SAMM/InboardFloor/Inc/platform.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/platform.h rename to SAMM/InboardFloor/Inc/platform.h diff --git a/SAMM/SAMM_TOF/Inc/spi.h b/SAMM/InboardFloor/Inc/spi.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/spi.h rename to SAMM/InboardFloor/Inc/spi.h diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h b/SAMM/InboardFloor/Inc/stm32h5xx_hal_conf.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/stm32h5xx_hal_conf.h rename to SAMM/InboardFloor/Inc/stm32h5xx_hal_conf.h diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_it.h b/SAMM/InboardFloor/Inc/stm32h5xx_it.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/stm32h5xx_it.h rename to SAMM/InboardFloor/Inc/stm32h5xx_it.h diff --git a/SAMM/SAMM_TOF/Src/VL53L4ED_api.c b/SAMM/InboardFloor/Src/VL53L4ED_api.c similarity index 100% rename from SAMM/SAMM_TOF/Src/VL53L4ED_api.c rename to SAMM/InboardFloor/Src/VL53L4ED_api.c diff --git a/SAMM/SAMM_TOF/Src/VL53L4ED_calibration.c b/SAMM/InboardFloor/Src/VL53L4ED_calibration.c similarity index 100% rename from SAMM/SAMM_TOF/Src/VL53L4ED_calibration.c rename to SAMM/InboardFloor/Src/VL53L4ED_calibration.c diff --git a/SAMM/SAMM_Mag/Src/crc.c b/SAMM/InboardFloor/Src/crc.c similarity index 100% rename from SAMM/SAMM_Mag/Src/crc.c rename to SAMM/InboardFloor/Src/crc.c diff --git a/SAMM/SAMM_Mag/Src/dma.c b/SAMM/InboardFloor/Src/dma.c similarity index 100% rename from SAMM/SAMM_Mag/Src/dma.c rename to SAMM/InboardFloor/Src/dma.c diff --git a/SAMM/SAMM_Mag/Src/gpio.c b/SAMM/InboardFloor/Src/gpio.c similarity index 100% rename from SAMM/SAMM_Mag/Src/gpio.c rename to SAMM/InboardFloor/Src/gpio.c diff --git a/SAMM/SAMM_TOF/Src/i2c.c b/SAMM/InboardFloor/Src/i2c.c similarity index 100% rename from SAMM/SAMM_TOF/Src/i2c.c rename to SAMM/InboardFloor/Src/i2c.c diff --git a/SAMM/SAMM_TOF/Src/main.c b/SAMM/InboardFloor/Src/main.c similarity index 100% rename from SAMM/SAMM_TOF/Src/main.c rename to SAMM/InboardFloor/Src/main.c diff --git a/SAMM/SAMM_TOF/Src/platform.c b/SAMM/InboardFloor/Src/platform.c similarity index 100% rename from SAMM/SAMM_TOF/Src/platform.c rename to SAMM/InboardFloor/Src/platform.c diff --git a/SAMM/SAMM_TOF/Src/spi.c b/SAMM/InboardFloor/Src/spi.c similarity index 100% rename from SAMM/SAMM_TOF/Src/spi.c rename to SAMM/InboardFloor/Src/spi.c diff --git a/SAMM/SAMM_Mag/Src/stm32h5xx_it.c b/SAMM/InboardFloor/Src/stm32h5xx_it.c similarity index 100% rename from SAMM/SAMM_Mag/Src/stm32h5xx_it.c rename to SAMM/InboardFloor/Src/stm32h5xx_it.c diff --git a/SAMM/SAMM_Mag/CMakeLists.txt b/SAMM/SuspensionNodes/CMakeLists.txt similarity index 100% rename from SAMM/SAMM_Mag/CMakeLists.txt rename to SAMM/SuspensionNodes/CMakeLists.txt diff --git a/SAMM/SAMM_TOF/Inc/can_cfg.h b/SAMM/SuspensionNodes/Inc/can_cfg.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/can_cfg.h rename to SAMM/SuspensionNodes/Inc/can_cfg.h diff --git a/SAMM/SAMM_Mag/Inc/can_mag.h b/SAMM/SuspensionNodes/Inc/can_mag.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/can_mag.h rename to SAMM/SuspensionNodes/Inc/can_mag.h diff --git a/SAMM/SAMM_TOF/Inc/crc.h b/SAMM/SuspensionNodes/Inc/crc.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/crc.h rename to SAMM/SuspensionNodes/Inc/crc.h diff --git a/SAMM/SAMM_TOF/Inc/dma.h b/SAMM/SuspensionNodes/Inc/dma.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/dma.h rename to SAMM/SuspensionNodes/Inc/dma.h diff --git a/SAMM/SAMM_TOF/Inc/gpio.h b/SAMM/SuspensionNodes/Inc/gpio.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/gpio.h rename to SAMM/SuspensionNodes/Inc/gpio.h diff --git a/SAMM/SAMM_Mag/Inc/mag.h b/SAMM/SuspensionNodes/Inc/mag.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/mag.h rename to SAMM/SuspensionNodes/Inc/mag.h diff --git a/SAMM/SAMM_Mag/Inc/main.h b/SAMM/SuspensionNodes/Inc/main.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/main.h rename to SAMM/SuspensionNodes/Inc/main.h diff --git a/SAMM/SAMM_Mag/Inc/spi.h b/SAMM/SuspensionNodes/Inc/spi.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/spi.h rename to SAMM/SuspensionNodes/Inc/spi.h diff --git a/SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h b/SAMM/SuspensionNodes/Inc/stm32h5xx_hal_conf.h similarity index 100% rename from SAMM/SAMM_Mag/Inc/stm32h5xx_hal_conf.h rename to SAMM/SuspensionNodes/Inc/stm32h5xx_hal_conf.h diff --git a/SAMM/SAMM_TOF/Inc/stm32h5xx_it.h b/SAMM/SuspensionNodes/Inc/stm32h5xx_it.h similarity index 100% rename from SAMM/SAMM_TOF/Inc/stm32h5xx_it.h rename to SAMM/SuspensionNodes/Inc/stm32h5xx_it.h diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SuspensionNodes/Src/can_mag.c similarity index 100% rename from SAMM/SAMM_Mag/Src/can_mag.c rename to SAMM/SuspensionNodes/Src/can_mag.c diff --git a/SAMM/SAMM_TOF/Src/crc.c b/SAMM/SuspensionNodes/Src/crc.c similarity index 100% rename from SAMM/SAMM_TOF/Src/crc.c rename to SAMM/SuspensionNodes/Src/crc.c diff --git a/SAMM/SAMM_TOF/Src/dma.c b/SAMM/SuspensionNodes/Src/dma.c similarity index 100% rename from SAMM/SAMM_TOF/Src/dma.c rename to SAMM/SuspensionNodes/Src/dma.c diff --git a/SAMM/SAMM_TOF/Src/gpio.c b/SAMM/SuspensionNodes/Src/gpio.c similarity index 100% rename from SAMM/SAMM_TOF/Src/gpio.c rename to SAMM/SuspensionNodes/Src/gpio.c diff --git a/SAMM/SAMM_Mag/Src/mag.c b/SAMM/SuspensionNodes/Src/mag.c similarity index 98% rename from SAMM/SAMM_Mag/Src/mag.c rename to SAMM/SuspensionNodes/Src/mag.c index ea27360a4..4729d9e13 100644 --- a/SAMM/SAMM_Mag/Src/mag.c +++ b/SAMM/SuspensionNodes/Src/mag.c @@ -156,7 +156,7 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - int16_t turns = raw & 0x0FFF; // Mask to 12 bits (valid angle data) + int16_t turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) if (turns & 0x0800) { turns |= 0xF000; // sign extend bit 11 to bits 15:12 } diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SuspensionNodes/Src/main.c similarity index 100% rename from SAMM/SAMM_Mag/Src/main.c rename to SAMM/SuspensionNodes/Src/main.c diff --git a/SAMM/SAMM_Mag/Src/spi.c b/SAMM/SuspensionNodes/Src/spi.c similarity index 100% rename from SAMM/SAMM_Mag/Src/spi.c rename to SAMM/SuspensionNodes/Src/spi.c diff --git a/SAMM/SAMM_TOF/Src/stm32h5xx_it.c b/SAMM/SuspensionNodes/Src/stm32h5xx_it.c similarity index 100% rename from SAMM/SAMM_TOF/Src/stm32h5xx_it.c rename to SAMM/SuspensionNodes/Src/stm32h5xx_it.c From 6d756f1a1fea63c377cdd88cb5ddda245d7bd881 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 05:41:17 +0000 Subject: [PATCH 072/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNodes/Src/mag.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SuspensionNodes/Src/mag.c b/SAMM/SuspensionNodes/Src/mag.c index 4729d9e13..445387d96 100644 --- a/SAMM/SuspensionNodes/Src/mag.c +++ b/SAMM/SuspensionNodes/Src/mag.c @@ -156,7 +156,7 @@ bool check_status(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - int16_t turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) + int16_t turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) if (turns & 0x0800) { turns |= 0xF000; // sign extend bit 11 to bits 15:12 } From 359fb752dc4d8510a8e0881eb4b4b9421a905e70 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 28 Apr 2026 04:36:31 -0700 Subject: [PATCH 073/158] Fix suspected mispelling of can as cna Signed-off-by: Daniel Hansen --- SAMM/SuspensionNodes/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SuspensionNodes/Src/main.c b/SAMM/SuspensionNodes/Src/main.c index 41412b205..a578138fa 100644 --- a/SAMM/SuspensionNodes/Src/main.c +++ b/SAMM/SuspensionNodes/Src/main.c @@ -199,7 +199,7 @@ int main(void) } can_send(h1, &temp_can); can_send(h1, &angle_can); - cna_send(h1, &turns_can); + can_send(h1, &turns_can); HAL_Delay(10); } /* USER CODE END 3 */ From 6b86f16d9f467be53855b413be4af57b40210466 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 28 Apr 2026 04:56:28 -0700 Subject: [PATCH 074/158] Migrate to singular form of suspension node Signed-off-by: Daniel Hansen --- CMakeLists.txt | 2 +- SAMM/{SuspensionNodes => SuspensionNode}/CMakeLists.txt | 2 +- SAMM/{SuspensionNodes => SuspensionNode}/Inc/can_cfg.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/can_mag.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/crc.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/dma.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/gpio.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/mag.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/main.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/spi.h | 0 .../Inc/stm32h5xx_hal_conf.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Inc/stm32h5xx_it.h | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/can_mag.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/crc.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/dma.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/gpio.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/mag.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/main.c | 1 + SAMM/{SuspensionNodes => SuspensionNode}/Src/spi.c | 0 SAMM/{SuspensionNodes => SuspensionNode}/Src/stm32h5xx_it.c | 0 20 files changed, 3 insertions(+), 2 deletions(-) rename SAMM/{SuspensionNodes => SuspensionNode}/CMakeLists.txt (99%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/can_cfg.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/can_mag.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/crc.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/dma.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/gpio.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/mag.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/main.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/spi.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/stm32h5xx_hal_conf.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Inc/stm32h5xx_it.h (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/can_mag.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/crc.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/dma.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/gpio.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/mag.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/main.c (99%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/spi.c (100%) rename SAMM/{SuspensionNodes => SuspensionNode}/Src/stm32h5xx_it.c (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25379d982..bdd8e12b0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,7 +110,7 @@ add_gr_project(STM32G431x8 TireTemp) # SAMM include("SAMM/samm.cmake") add_gr_project(STM32H523xE SAMM InboardFloor) -add_gr_project(STM32H523xE SAMM SuspensionNodes) +add_gr_project(STM32H523xE SAMM SuspensionNode) # Development add_gr_project(STM32G474xE G4PERTESTING) diff --git a/SAMM/SuspensionNodes/CMakeLists.txt b/SAMM/SuspensionNode/CMakeLists.txt similarity index 99% rename from SAMM/SuspensionNodes/CMakeLists.txt rename to SAMM/SuspensionNode/CMakeLists.txt index f1640ecc7..4000986f1 100644 --- a/SAMM/SuspensionNodes/CMakeLists.txt +++ b/SAMM/SuspensionNode/CMakeLists.txt @@ -52,6 +52,6 @@ target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc - . + GRCAN #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/SuspensionNodes/Inc/can_cfg.h b/SAMM/SuspensionNode/Inc/can_cfg.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/can_cfg.h rename to SAMM/SuspensionNode/Inc/can_cfg.h diff --git a/SAMM/SuspensionNodes/Inc/can_mag.h b/SAMM/SuspensionNode/Inc/can_mag.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/can_mag.h rename to SAMM/SuspensionNode/Inc/can_mag.h diff --git a/SAMM/SuspensionNodes/Inc/crc.h b/SAMM/SuspensionNode/Inc/crc.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/crc.h rename to SAMM/SuspensionNode/Inc/crc.h diff --git a/SAMM/SuspensionNodes/Inc/dma.h b/SAMM/SuspensionNode/Inc/dma.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/dma.h rename to SAMM/SuspensionNode/Inc/dma.h diff --git a/SAMM/SuspensionNodes/Inc/gpio.h b/SAMM/SuspensionNode/Inc/gpio.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/gpio.h rename to SAMM/SuspensionNode/Inc/gpio.h diff --git a/SAMM/SuspensionNodes/Inc/mag.h b/SAMM/SuspensionNode/Inc/mag.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/mag.h rename to SAMM/SuspensionNode/Inc/mag.h diff --git a/SAMM/SuspensionNodes/Inc/main.h b/SAMM/SuspensionNode/Inc/main.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/main.h rename to SAMM/SuspensionNode/Inc/main.h diff --git a/SAMM/SuspensionNodes/Inc/spi.h b/SAMM/SuspensionNode/Inc/spi.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/spi.h rename to SAMM/SuspensionNode/Inc/spi.h diff --git a/SAMM/SuspensionNodes/Inc/stm32h5xx_hal_conf.h b/SAMM/SuspensionNode/Inc/stm32h5xx_hal_conf.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/stm32h5xx_hal_conf.h rename to SAMM/SuspensionNode/Inc/stm32h5xx_hal_conf.h diff --git a/SAMM/SuspensionNodes/Inc/stm32h5xx_it.h b/SAMM/SuspensionNode/Inc/stm32h5xx_it.h similarity index 100% rename from SAMM/SuspensionNodes/Inc/stm32h5xx_it.h rename to SAMM/SuspensionNode/Inc/stm32h5xx_it.h diff --git a/SAMM/SuspensionNodes/Src/can_mag.c b/SAMM/SuspensionNode/Src/can_mag.c similarity index 100% rename from SAMM/SuspensionNodes/Src/can_mag.c rename to SAMM/SuspensionNode/Src/can_mag.c diff --git a/SAMM/SuspensionNodes/Src/crc.c b/SAMM/SuspensionNode/Src/crc.c similarity index 100% rename from SAMM/SuspensionNodes/Src/crc.c rename to SAMM/SuspensionNode/Src/crc.c diff --git a/SAMM/SuspensionNodes/Src/dma.c b/SAMM/SuspensionNode/Src/dma.c similarity index 100% rename from SAMM/SuspensionNodes/Src/dma.c rename to SAMM/SuspensionNode/Src/dma.c diff --git a/SAMM/SuspensionNodes/Src/gpio.c b/SAMM/SuspensionNode/Src/gpio.c similarity index 100% rename from SAMM/SuspensionNodes/Src/gpio.c rename to SAMM/SuspensionNode/Src/gpio.c diff --git a/SAMM/SuspensionNodes/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c similarity index 100% rename from SAMM/SuspensionNodes/Src/mag.c rename to SAMM/SuspensionNode/Src/mag.c diff --git a/SAMM/SuspensionNodes/Src/main.c b/SAMM/SuspensionNode/Src/main.c similarity index 99% rename from SAMM/SuspensionNodes/Src/main.c rename to SAMM/SuspensionNode/Src/main.c index a578138fa..83c25eeb5 100644 --- a/SAMM/SuspensionNodes/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -23,6 +23,7 @@ // #include "fdcan.h" #include "gpio.h" #include "spi.h" +#include "NodeID.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/SuspensionNodes/Src/spi.c b/SAMM/SuspensionNode/Src/spi.c similarity index 100% rename from SAMM/SuspensionNodes/Src/spi.c rename to SAMM/SuspensionNode/Src/spi.c diff --git a/SAMM/SuspensionNodes/Src/stm32h5xx_it.c b/SAMM/SuspensionNode/Src/stm32h5xx_it.c similarity index 100% rename from SAMM/SuspensionNodes/Src/stm32h5xx_it.c rename to SAMM/SuspensionNode/Src/stm32h5xx_it.c From b34243a62e13652b13f7012a066d8bb1bc213204 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 28 Apr 2026 04:56:39 -0700 Subject: [PATCH 075/158] Preform CMake dark magic Signed-off-by: Daniel Hansen --- .vscode/launch.json | 64 ++++++++++++++++++++++++++++++ .vscode/tasks.json | 36 +++++++++++++++++ Autogen/CAN/Doc/GRCAN.CANdo | 36 +++++++++-------- SAMM/InboardFloor/CMakeLists.txt | 1 + SAMM/InboardFloor/GRCAN/NodeID.h | 16 ++++++++ SAMM/InboardFloor/Src/main.c | 1 + SAMM/SuspensionNode/GRCAN/NodeID.h | 16 ++++++++ 7 files changed, 154 insertions(+), 16 deletions(-) create mode 100644 SAMM/InboardFloor/GRCAN/NodeID.h create mode 100644 SAMM/SuspensionNode/GRCAN/NodeID.h diff --git a/.vscode/launch.json b/.vscode/launch.json index 078f5e18d..6e4ea5f6b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -280,6 +280,70 @@ ] } }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", + "name": "InboardFloor FL", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32g4x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build InboardFloor FL", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", + "name": "InboardFloor FR", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32g4x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build InboardFloor FR", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", + "name": "InboardFloor RL", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32g4x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build InboardFloor RL", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", + "name": "InboardFloor RR", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32g4x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build InboardFloor RR", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + }, { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/G4HELLO.elf", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 424efcf03..b716dcf3e 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -101,6 +101,42 @@ ], "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target TireTemp" }, + { + "label": "CMake: configure and build InboardFloor FL", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=FL" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target InboardFloor" + }, + { + "label": "CMake: configure and build InboardFloor FR", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=FR" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target InboardFloor" + }, + { + "label": "CMake: configure and build InboardFloor RL", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=RL" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target InboardFloor" + }, + { + "label": "CMake: configure and build InboardFloor RR", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=RR" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target InboardFloor" + }, { "label": "CMake: configure and build AnalogCalibration", "type": "shell", diff --git a/Autogen/CAN/Doc/GRCAN.CANdo b/Autogen/CAN/Doc/GRCAN.CANdo index a54ba74f7..abb0e8b21 100644 --- a/Autogen/CAN/Doc/GRCAN.CANdo +++ b/Autogen/CAN/Doc/GRCAN.CANdo @@ -164,21 +164,21 @@ routing: TCM: - msg: ECU Analog Data - msg: ECU Performance - SAMM_Mag_1: + InboardFloor_FL: - msg: Ping - SAMM_Mag_2: + InboardFloor_FR: - msg: Ping - SAMM_ToF_1: + InboardFloor_RL: - msg: Ping - SAMM_ToF_2: + InboardFloor_RR: - msg: Ping - TireTemp_FL: + SuspensionNode_FL: - msg: Ping - TireTemp_FR: + SuspensionNode_FR: - msg: Ping - TireTemp_RL: + SuspensionNode_RL: - msg: Ping - TireTemp_RR: + SuspensionNode_RR: - msg: Ping Energy Meter: Charger: @@ -4269,12 +4269,16 @@ GR ID: Fan Controller 2: "0x0E" Fan Controller 3: "0x0F" DGPS: "0x30" - SAMM_Mag_1: "0x20" - SAMM_Mag_2: "0x21" - SAMM_ToF_1: "0x22" - SAMM_ToF_2: "0x23" - TireTemp_FL: "0x24" - TireTemp_FR: "0x25" - TireTemp_RL: "0x26" - TireTemp_RR: "0x27" + InboardFloor_FL: "0x20" + InboardFloor_FR: "0x21" + InboardFloor_RL: "0x22" + InboardFloor_RR: "0x23" + SuspensionNode_FL: "0x24" + SuspensionNode_FR: "0x25" + SuspensionNode_RL: "0x26" + SuspensionNode_RR: "0x27" + TireTemp_FL: "0x28" + TireTemp_FR: "0x29" + TireTemp_RL: "0x2A" + TireTemp_RR: "0x2B" ALL: "0xFF" diff --git a/SAMM/InboardFloor/CMakeLists.txt b/SAMM/InboardFloor/CMakeLists.txt index ef937db61..1ef78a47e 100644 --- a/SAMM/InboardFloor/CMakeLists.txt +++ b/SAMM/InboardFloor/CMakeLists.txt @@ -53,5 +53,6 @@ target_include_directories( ${GR_PROJECT_NAME}_USER_CODE INTERFACE Inc + GRCAN #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/InboardFloor/GRCAN/NodeID.h b/SAMM/InboardFloor/GRCAN/NodeID.h new file mode 100644 index 000000000..8713be57c --- /dev/null +++ b/SAMM/InboardFloor/GRCAN/NodeID.h @@ -0,0 +1,16 @@ +#include "GRCAN_NODE_ID.h" +#include "Stringification.h" + +#ifndef NODE_ID_H +#define NODE_ID_H + +#ifndef NODE +#pragma message("NODE is not defined. Please compile Inboard Floor for a specific target. Defaulting to FL.") +#define LOCAL_GR_ID GRCAN_InboardFloor_FL +#else +#define LOCAL_GR_ID CONCAT(GRCAN_InboardFloor_, NODE) +#endif + +#pragma message "Compiling Inboard Floor node as " STRINGIFY_MACRO(LOCAL_GR_ID) + +#endif diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 0877d825f..0a6b10af4 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -24,6 +24,7 @@ #include "gpio.h" #include "i2c.h" #include "spi.h" +#include "NodeID.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/SuspensionNode/GRCAN/NodeID.h b/SAMM/SuspensionNode/GRCAN/NodeID.h new file mode 100644 index 000000000..360e84eaf --- /dev/null +++ b/SAMM/SuspensionNode/GRCAN/NodeID.h @@ -0,0 +1,16 @@ +#include "GRCAN_NODE_ID.h" +#include "Stringification.h" + +#ifndef NODE_ID_H +#define NODE_ID_H + +#ifndef NODE +#pragma message("NODE is not defined. Please compile Suspension Node for a specific target. Defaulting to FL.") +#define LOCAL_GR_ID GRCAN_SuspensionNode_FL +#else +#define LOCAL_GR_ID CONCAT(GRCAN_SuspensionNode_, NODE) +#endif + +#pragma message "Compiling Suspension Node node as " STRINGIFY_MACRO(LOCAL_GR_ID) + +#endif From 6fe22821217287da5b4ed225d5cecd03a31b7a78 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 11:57:16 +0000 Subject: [PATCH 076/158] Automatic CANfigurator: Updated CAN files automatically --- Autogen/CAN/Doc/GRCAN_Data.dbc | 66 ++++++++++++++------------------- Autogen/CAN/Inc/GRCAN_NODE_ID.h | 20 ++++++---- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/Autogen/CAN/Doc/GRCAN_Data.dbc b/Autogen/CAN/Doc/GRCAN_Data.dbc index bdae6c33d..f58aebe8a 100644 --- a/Autogen/CAN/Doc/GRCAN_Data.dbc +++ b/Autogen/CAN/Doc/GRCAN_Data.dbc @@ -4,7 +4,7 @@ NS_ : BS_: -BU_: BCU DGPS Debugger ECU SAMM_Mag_1 SAMM_Mag_2 SAMM_ToF_1 SAMM_ToF_2 TCM TireTemp_FL TireTemp_FR TireTemp_RL TireTemp_RR +BU_: BCU DGPS Debugger ECU InboardFloor_FL InboardFloor_FR InboardFloor_RL InboardFloor_RR SAMM_Mag_1 SuspensionNode_FL SuspensionNode_FR SuspensionNode_RL SuspensionNode_RR TCM TireTemp_FL TireTemp_FR TireTemp_RL TireTemp_RR BO_ 2147680513 BCU_Debug_FD_to_Debugger: 64 BCU SG_ Debug : 0|64@1- (1,0) [0|0] "" Debugger @@ -382,29 +382,29 @@ BO_ 2147626500 ECU_ECU_Analog_Data_to_TCM: 16 ECU BO_ 2147626756 ECU_ECU_Performance_to_TCM: 4 ECU SG_ Elapsed_Cycles : 0|32@1+ (1,0) [0|0] "Clock Cycles" TCM -BO_ 2147615264 ECU_Ping_to_SAMM_Mag_1: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SAMM_Mag_1 +BO_ 2147615264 ECU_Ping_to_InboardFloor_FL: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FL -BO_ 2147615265 ECU_Ping_to_SAMM_Mag_2: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SAMM_Mag_2 +BO_ 2147615265 ECU_Ping_to_InboardFloor_FR: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FR -BO_ 2147615266 ECU_Ping_to_SAMM_ToF_1: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SAMM_ToF_1 +BO_ 2147615266 ECU_Ping_to_InboardFloor_RL: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RL -BO_ 2147615267 ECU_Ping_to_SAMM_ToF_2: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SAMM_ToF_2 +BO_ 2147615267 ECU_Ping_to_InboardFloor_RR: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RR -BO_ 2147615268 ECU_Ping_to_TireTemp_FL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" TireTemp_FL +BO_ 2147615268 ECU_Ping_to_SuspensionNode_FL: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FL -BO_ 2147615269 ECU_Ping_to_TireTemp_FR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" TireTemp_FR +BO_ 2147615269 ECU_Ping_to_SuspensionNode_FR: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FR -BO_ 2147615270 ECU_Ping_to_TireTemp_RL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" TireTemp_RL +BO_ 2147615270 ECU_Ping_to_SuspensionNode_RL: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RL -BO_ 2147615271 ECU_Ping_to_TireTemp_RR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" TireTemp_RR +BO_ 2147615271 ECU_Ping_to_SuspensionNode_RR: 4 ECU + SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RR BO_ 2147746305 TCM_Ping_to_Debugger: 4 TCM SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" Debugger @@ -438,28 +438,19 @@ BO_ 2150641668 DGPS_UVW_DGPS_to_TCM: 6 DGPS SG_ DGPS_V : 16|16@1- (0.01,0) [0|0] "" TCM SG_ DGPS_W : 32|16@1- (0.01,0) [0|0] "" TCM -BO_ 2149581314 SAMM_Mag_1_Ping_to_ECU: 4 SAMM_Mag_1 +BO_ 514 SAMM_Mag_1_Ping_to_ECU: 4 SAMM_Mag_1 SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2149646850 SAMM_Mag_2_Ping_to_ECU: 4 SAMM_Mag_2 +BO_ 2150105602 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2149712386 SAMM_ToF_1_Ping_to_ECU: 4 SAMM_ToF_1 +BO_ 2150171138 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2149777922 SAMM_ToF_2_Ping_to_ECU: 4 SAMM_ToF_2 +BO_ 2150236674 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2149843458 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2149908994 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2149974530 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2150040066 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR +BO_ 2150302210 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU CM_ SG_ 2147680513 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; @@ -817,11 +808,8 @@ CM_ SG_ 2150642180 LON "longitude"; CM_ SG_ 2150641668 DGPS_U "U"; CM_ SG_ 2150641668 DGPS_V "V"; CM_ SG_ 2150641668 DGPS_W "W"; -CM_ SG_ 2149581314 Timestamp "Time in millis"; -CM_ SG_ 2149646850 Timestamp "Time in millis"; -CM_ SG_ 2149712386 Timestamp "Time in millis"; -CM_ SG_ 2149777922 Timestamp "Time in millis"; -CM_ SG_ 2149843458 Timestamp "Time in millis"; -CM_ SG_ 2149908994 Timestamp "Time in millis"; -CM_ SG_ 2149974530 Timestamp "Time in millis"; -CM_ SG_ 2150040066 Timestamp "Time in millis"; +CM_ SG_ 514 Timestamp "Time in millis"; +CM_ SG_ 2150105602 Timestamp "Time in millis"; +CM_ SG_ 2150171138 Timestamp "Time in millis"; +CM_ SG_ 2150236674 Timestamp "Time in millis"; +CM_ SG_ 2150302210 Timestamp "Time in millis"; diff --git a/Autogen/CAN/Inc/GRCAN_NODE_ID.h b/Autogen/CAN/Inc/GRCAN_NODE_ID.h index 953173400..670ffe452 100644 --- a/Autogen/CAN/Inc/GRCAN_NODE_ID.h +++ b/Autogen/CAN/Inc/GRCAN_NODE_ID.h @@ -18,14 +18,18 @@ typedef enum { GRCAN_Fan_Controller_1 = 0x0D, GRCAN_Fan_Controller_2 = 0x0E, GRCAN_Fan_Controller_3 = 0x0F, - GRCAN_SAMM_Mag_1 = 0x20, - GRCAN_SAMM_Mag_2 = 0x21, - GRCAN_SAMM_ToF_1 = 0x22, - GRCAN_SAMM_ToF_2 = 0x23, - GRCAN_TireTemp_FL = 0x24, - GRCAN_TireTemp_FR = 0x25, - GRCAN_TireTemp_RL = 0x26, - GRCAN_TireTemp_RR = 0x27, + GRCAN_InboardFloor_FL = 0x20, + GRCAN_InboardFloor_FR = 0x21, + GRCAN_InboardFloor_RL = 0x22, + GRCAN_InboardFloor_RR = 0x23, + GRCAN_SuspensionNode_FL = 0x24, + GRCAN_SuspensionNode_FR = 0x25, + GRCAN_SuspensionNode_RL = 0x26, + GRCAN_SuspensionNode_RR = 0x27, + GRCAN_TireTemp_FL = 0x28, + GRCAN_TireTemp_FR = 0x29, + GRCAN_TireTemp_RL = 0x2A, + GRCAN_TireTemp_RR = 0x2B, GRCAN_DGPS = 0x30, GRCAN_ALL = 0xFF, } GRCAN_NODE_ID; From 6aaa54f4e0d388a623d400d777d2e4468ef6f04f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 11:58:54 +0000 Subject: [PATCH 077/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/InboardFloor/Src/main.c | 2 +- SAMM/SuspensionNode/Src/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 0a6b10af4..a88e1b97b 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -21,10 +21,10 @@ // #include "crc.h" // #include "fdcan.h" +#include "NodeID.h" #include "gpio.h" #include "i2c.h" #include "spi.h" -#include "NodeID.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 83c25eeb5..5e5304927 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -21,9 +21,9 @@ // #include "crc.h" // #include "fdcan.h" +#include "NodeID.h" #include "gpio.h" #include "spi.h" -#include "NodeID.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ From 8554df9218ac33b2355792b21ecfe6572b750bdf Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 28 Apr 2026 05:07:08 -0700 Subject: [PATCH 078/158] Migrate NODE definition into GR Lib CMake Co-authored-by: Copilot Signed-off-by: Daniel Hansen --- Lib/cmake/gr-lib.cmake | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Lib/cmake/gr-lib.cmake b/Lib/cmake/gr-lib.cmake index b4b3d2bb1..01577beb2 100644 --- a/Lib/cmake/gr-lib.cmake +++ b/Lib/cmake/gr-lib.cmake @@ -43,5 +43,13 @@ function(add_gr_project) PRIVATE LINKER:-Map,$/$.map ) + + if (DEFINED NODE) + target_compile_definitions( + ${TARGET_NAME} + PRIVATE + NODE=${NODE} + ) + endif() endif() endfunction() From cf2c5e03ea1cf5c0f7d394e1f13ac3b3aee30ede Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Tue, 28 Apr 2026 05:07:16 -0700 Subject: [PATCH 079/158] Add a ton of launch and tasks Co-authored-by: Copilot Signed-off-by: Daniel Hansen --- .vscode/launch.json | 80 ++++++++++++++++++++++++++++++++++++++++----- .vscode/tasks.json | 36 ++++++++++++++++++++ 2 files changed, 108 insertions(+), 8 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 6e4ea5f6b..3dc2b6369 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -283,13 +283,13 @@ { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", - "name": "InboardFloor FL", + "name": "Inboard Floor FL", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "configFiles": [ "interface/stlink.cfg", - "target/stm32g4x.cfg" + "target/stm32h5x.cfg" ], "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor FL", @@ -299,13 +299,13 @@ { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", - "name": "InboardFloor FR", + "name": "Inboard Floor FR", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "configFiles": [ "interface/stlink.cfg", - "target/stm32g4x.cfg" + "target/stm32h5x.cfg" ], "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor FR", @@ -315,13 +315,13 @@ { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", - "name": "InboardFloor RL", + "name": "Inboard Floor RL", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "configFiles": [ "interface/stlink.cfg", - "target/stm32g4x.cfg" + "target/stm32h5x.cfg" ], "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor RL", @@ -331,19 +331,83 @@ { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/InboardFloor.elf", - "name": "InboardFloor RR", + "name": "Inboard Floor RR", "request": "launch", "type": "cortex-debug", "servertype": "openocd", "configFiles": [ "interface/stlink.cfg", - "target/stm32g4x.cfg" + "target/stm32h5x.cfg" ], "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor RR", "showDevDebugOutput": "raw", "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/SuspensionNode.elf", + "name": "Suspension Node FL", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32h5x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build SuspensionNode FL", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/SuspensionNode.elf", + "name": "Suspension Node FR", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32h5x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build SuspensionNode FR", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/SuspensionNode.elf", + "name": "Suspension Node RL", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32h5x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build SuspensionNode RL", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" + }, + { + "cwd": "${workspaceFolder}", + "executable": "${command:cmake.buildDirectory}/SuspensionNode.elf", + "name": "Suspension Node RR", + "request": "launch", + "type": "cortex-debug", + "servertype": "openocd", + "configFiles": [ + "interface/stlink.cfg", + "target/stm32h5x.cfg" + ], + "searchDir": [], + "preLaunchTask": "CMake: configure and build SuspensionNode RR", + "showDevDebugOutput": "raw", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" + }, { "cwd": "${workspaceFolder}", "executable": "${command:cmake.buildDirectory}/G4HELLO.elf", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b716dcf3e..f21ef391a 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -137,6 +137,42 @@ ], "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target InboardFloor" }, + { + "label": "CMake: configure and build SuspensionNode FL", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=FL" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target SuspensionNode" + }, + { + "label": "CMake: configure and build SuspensionNode FR", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=FR" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target SuspensionNode" + }, + { + "label": "CMake: configure and build SuspensionNode RL", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=RL" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target SuspensionNode" + }, + { + "label": "CMake: configure and build SuspensionNode RR", + "type": "shell", + "dependsOrder": "sequence", + "dependsOn": [ + "CMake: configure NODE=RR" + ], + "command": "cmake --build --preset ${command:cmake.activeBuildPresetName} --target SuspensionNode" + }, { "label": "CMake: configure and build AnalogCalibration", "type": "shell", From f0f19a94237086295c0215f6a60383e317c62634 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 12:07:58 +0000 Subject: [PATCH 080/158] Automatic CMake Format: Standardized formatting automatically --- Lib/cmake/gr-lib.cmake | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/cmake/gr-lib.cmake b/Lib/cmake/gr-lib.cmake index 01577beb2..888a276fe 100644 --- a/Lib/cmake/gr-lib.cmake +++ b/Lib/cmake/gr-lib.cmake @@ -44,12 +44,8 @@ function(add_gr_project) LINKER:-Map,$/$.map ) - if (DEFINED NODE) - target_compile_definitions( - ${TARGET_NAME} - PRIVATE - NODE=${NODE} - ) + if(DEFINED NODE) + target_compile_definitions(${TARGET_NAME} PRIVATE NODE=${NODE}) endif() endif() endfunction() From 6141fa25fbef5ad2db15f2f0d15a8c288c4ea1b0 Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Fri, 1 May 2026 13:13:14 +0800 Subject: [PATCH 081/158] Bug fixes for now --- SAMM/SAMM_Mag/Src/main.c | 75 +++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/SAMM/SAMM_Mag/Src/main.c b/SAMM/SAMM_Mag/Src/main.c index 41412b205..7cea9bca8 100644 --- a/SAMM/SAMM_Mag/Src/main.c +++ b/SAMM/SAMM_Mag/Src/main.c @@ -91,16 +91,7 @@ int main(void) /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); - /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); - - CANConfig my_cfg; - - get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL); - - CANHandle *h1 = can_init(&my_cfg); - can_start(h1); /* USER CODE END Init */ /* Configure the system clock */ @@ -118,6 +109,16 @@ int main(void) MX_SPI1_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ + /* USER CODE BEGIN Init */ + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + + CANConfig my_cfg; + + get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL); + + CANHandle *h1 = can_init(&my_cfg); + + can_start(h1); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); @@ -178,29 +179,39 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - // float hang = mag_read_HANG(mag_dev); - FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; - FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; - FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; - bool bad = check_status(&mag_dev); - printf("Temperature is %d\n", (double)temp); - printf("Angle is %d\n", angle); - printf("Number of turns is %d\n", turns); - if (bad) { - printf("something is cooked"); - mag_write_error(&mag_dev); - } - can_send(h1, &temp_can); - can_send(h1, &angle_can); - cna_send(h1, &turns_can); - HAL_Delay(10); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); + + printf("Temperature before conversion: %d\n", temp); + printf("Angle before conversion: %d\n", angle); + printf("Turns: %d\n", turns); + + if (bad) { + printf("Error detected\n"); + mag_clear_errors(&mag_dev); + } + + FDCANTxMessage temp_can; + temp_can.tx_header = 0; + temp_can.data[0] = temp; + + FDCANTxMessage angle_can; + angle_can.tx_header = 0; + angle_can.data[0] = (angle >> 8) & 0xFF; + angle_can.data[1] = angle & 0xFF; + + FDCANTxMessage turns_can; + turns_can.tx_header = 0; + turns_can.data[0] = (turns >> 8) & 0xFF; + turns_can.data[1] = turns & 0xFF; + + can_send(h1, &temp_can); + can_send(h1, &angle_can); + can_send(h1, &turns_can); + + HAL_Delay(10); } /* USER CODE END 3 */ } From d976d7249744dcaa2b4d3d36740e5b2725749184 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Sun, 3 May 2026 19:34:51 -0700 Subject: [PATCH 082/158] Adding MillisecondsSinceBoot() to inboardfloor to replace millis function for ToF sensor --- SAMM/IMU/Src/bmi323.c | 57 ++++++++++++++++--------------- SAMM/InboardFloor/CMakeLists.txt | 1 - SAMM/InboardFloor/Inc/main.h | 2 +- SAMM/InboardFloor/Src/main.c | 7 ++-- SAMM/SuspensionNode/Inc/can_mag.h | 2 +- 5 files changed, 34 insertions(+), 35 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index dfd34953c..d8cbe6fa1 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -2,6 +2,7 @@ #include +#include "main.h" #include "stm32h5xx.h" #include "stm32h5xx_hal_spi.h" @@ -97,23 +98,23 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // now we set the feature ctrol engine enable to 1 bmi323_write(bmi323_dev, BMI323_FEATURE_CTRL, BMI323_FEATURE_CTRL_ENGINE_EN); // now we poll the feature engine - timeout_ref = millis(); + timeout_ref = MillisecondsSinceBoot(); while ((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0b001) { - if (millis() - timeout_ref > BMI323_TIMEOUT) { - D_println("Feature engine enable timeout"); + if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { + ////D_println("Feature engine enable timeout"); return 0; } continue; } - D_println("enabled feature engine Hooray!"); + //D_println("enabled feature engine Hooray!"); } // no need for an else statement as the feature engine is already enabled and we can continue // now we need to check if a calibration is already in progress // polls the bmi323 FEATURE I01 state untill the state is 0b00, this means calibration can start. - timeout_ref = millis(); + timeout_ref = MillisecondsSinceBoot(); while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0b00) { - if (millis() - timeout_ref > BMI323_TIMEOUT) { - D_println("Calibration state timeout"); + if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { + ////D_println("Calibration state timeout"); return 0; } continue; @@ -125,7 +126,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) uint16_t data = bmi323_read(bmi323_dev, BMI323_ACC_CONF) & 0x700F; // checks if we are in the correct configuration. if not skips if statement if (((data >> 12) == HIGH_PERF) && (((data & 0x000F) >= ODR_25) && ((data & 0x000F) <= ODR_200))) { - D_println("Starting calibration"); + //D_println("Starting calibration"); // if it is, then we can start the calibration // first we check if the alernalte configuration acc mode is set to 0: if (((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000) >> 11) != 0b000) { @@ -137,7 +138,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // if it is, we set it to 0 bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); } - D_println("Alternate configurations set"); + //D_println("Alternate configurations set"); // next we can actually send the command for calibration // reset all of the gyro calibration values bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_X, BMI323_ACC_DP_DGAIN_X_RESET_VAL); @@ -147,51 +148,51 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Y, BMI323_ACC_DP_OFF_Y_RESET_VAL); bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Z, BMI323_ACC_DP_OFF_Z_RESET_VAL); // now we poll the state of the calibration untill we get 0b1 - D_println("Starting calibration"); + //D_println("Starting calibration"); bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB); - D_println("Polling calibration state"); + //D_println("Polling calibration state"); // check if the feature engine is enabled - timeout_ref = millis(); + timeout_ref = MillisecondsSinceBoot(); while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4) != 0b1) { - if (millis() - timeout_ref > BMI323_TIMEOUT) { - D_println("Feature engine enable timeout"); + if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { + //D_println("Feature engine enable timeout"); return 0; } continue; } - D_println("Calibration complete"); + //D_println("Calibration complete"); if (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1) { - // D_println("Calibration successful"); - // D_println("reseting values to original configuration"); + // //D_println("Calibration successful"); + // //D_println("reseting values to original configuration"); // cycle the acc bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); bmi323_write(bmi323_dev, BMI323_ACC_CONF, acc_conf); // cycle the gyro bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); - // D_println(gyro_conf); + // //D_println(gyro_conf); bmi323_write(bmi323_dev, BMI323_GYR_CONF, gyro_conf); // display the calibration values - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_X), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Y), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Z), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_X), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Y), HEX); - // D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Z), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_X), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Y), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_DGAIN_Z), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_X), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Y), HEX); + // //D_println(bmi323_read(bmi323_dev, BMI323_ACC_DP_OFF_Z), HEX); return 1; } else { - // D_println("Calibration failed"); + // //D_println("Calibration failed"); return 0; } } - // D_println("Calibration failed"); - // D_println("reseting values trying again"); + // //D_println("Calibration failed"); + // //D_println("reseting values trying again"); // turns off the acc bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); // turn on the acc bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL | 0x7000); // jumps to the calibration sequence - goto calibrate; + goto calibrate; // TODO Goto are evil but we did not write this so leave it be until it breaks things because it is evil return 1; } diff --git a/SAMM/InboardFloor/CMakeLists.txt b/SAMM/InboardFloor/CMakeLists.txt index 1ef78a47e..7b11922c5 100644 --- a/SAMM/InboardFloor/CMakeLists.txt +++ b/SAMM/InboardFloor/CMakeLists.txt @@ -54,5 +54,4 @@ target_include_directories( INTERFACE Inc GRCAN - #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/InboardFloor/Inc/main.h b/SAMM/InboardFloor/Inc/main.h index 7fe2de1cd..ea2a1bcbd 100644 --- a/SAMM/InboardFloor/Inc/main.h +++ b/SAMM/InboardFloor/Inc/main.h @@ -69,7 +69,7 @@ extern "C" { void Error_Handler(void); /* USER CODE BEGIN EFP */ - +uint32_t MillisecondsSinceBoot(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index a88e1b97b..90818128f 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -74,10 +74,9 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -/* - - - */ +uint32_t MillisecondsSinceBoot(void) { + return HAL_GetTick() * HAL_GetTickFreq(); +} /* USER CODE END 0 */ /** diff --git a/SAMM/SuspensionNode/Inc/can_mag.h b/SAMM/SuspensionNode/Inc/can_mag.h index b564f9694..34d55f078 100644 --- a/SAMM/SuspensionNode/Inc/can_mag.h +++ b/SAMM/SuspensionNode/Inc/can_mag.h @@ -12,7 +12,7 @@ typedef enum { CAN_MAG_MSG_FAULT = 0x2F } CAN_MAG_MSG_ID; // change with updates <- fixme -int can_mag_init(GRCAN_NODE_ID mag_ID); +int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID); int can_mag_send(unsigned int *data); #endif From 14ccb946b613d7703e6b713cccc6414df48f7e20 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 02:36:11 +0000 Subject: [PATCH 083/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/IMU/Src/bmi323.c | 24 ++++++++++++------------ SAMM/InboardFloor/Src/main.c | 3 ++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index d8cbe6fa1..9f5a1f7b3 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -106,7 +106,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) } continue; } - //D_println("enabled feature engine Hooray!"); + // D_println("enabled feature engine Hooray!"); } // no need for an else statement as the feature engine is already enabled and we can continue // now we need to check if a calibration is already in progress @@ -126,9 +126,9 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) uint16_t data = bmi323_read(bmi323_dev, BMI323_ACC_CONF) & 0x700F; // checks if we are in the correct configuration. if not skips if statement if (((data >> 12) == HIGH_PERF) && (((data & 0x000F) >= ODR_25) && ((data & 0x000F) <= ODR_200))) { - //D_println("Starting calibration"); - // if it is, then we can start the calibration - // first we check if the alernalte configuration acc mode is set to 0: + // D_println("Starting calibration"); + // if it is, then we can start the calibration + // first we check if the alernalte configuration acc mode is set to 0: if (((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000) >> 11) != 0b000) { // if it is, we set it to 0 bmi323_write(bmi323_dev, BMI323_ALT_ACC_CONF, 0x0206); @@ -138,9 +138,9 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // if it is, we set it to 0 bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); } - //D_println("Alternate configurations set"); - // next we can actually send the command for calibration - // reset all of the gyro calibration values + // D_println("Alternate configurations set"); + // next we can actually send the command for calibration + // reset all of the gyro calibration values bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_X, BMI323_ACC_DP_DGAIN_X_RESET_VAL); bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Y, BMI323_ACC_DP_DGAIN_Y_RESET_VAL); bmi323_write(bmi323_dev, BMI323_GYR_DP_DGAIN_Z, BMI323_ACC_DP_DGAIN_Z_RESET_VAL); @@ -148,20 +148,20 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Y, BMI323_ACC_DP_OFF_Y_RESET_VAL); bmi323_write(bmi323_dev, BMI323_GYR_DP_OFF_Z, BMI323_ACC_DP_OFF_Z_RESET_VAL); // now we poll the state of the calibration untill we get 0b1 - //D_println("Starting calibration"); + // D_println("Starting calibration"); bmi323_write(bmi323_dev, BMI323_CMD, BMI323_CMD_CALIB); - //D_println("Polling calibration state"); - // check if the feature engine is enabled + // D_println("Polling calibration state"); + // check if the feature engine is enabled timeout_ref = MillisecondsSinceBoot(); while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4) != 0b1) { if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { - //D_println("Feature engine enable timeout"); + // D_println("Feature engine enable timeout"); return 0; } continue; } - //D_println("Calibration complete"); + // D_println("Calibration complete"); if (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1) { // //D_println("Calibration successful"); // //D_println("reseting values to original configuration"); diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 90818128f..07c3e9e32 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -74,7 +74,8 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -uint32_t MillisecondsSinceBoot(void) { +uint32_t MillisecondsSinceBoot(void) +{ return HAL_GetTick() * HAL_GetTickFreq(); } /* USER CODE END 0 */ From b33bb920b38aca535669627d668de00d0f063921 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 09:31:01 +0000 Subject: [PATCH 084/158] Automatic CANfigurator: Updated CAN files automatically --- Autogen/CAN/Doc/GRCAN_Data.dbc | 421 ++------------------------------- 1 file changed, 17 insertions(+), 404 deletions(-) diff --git a/Autogen/CAN/Doc/GRCAN_Data.dbc b/Autogen/CAN/Doc/GRCAN_Data.dbc index f13c49302..ba1bcf459 100644 --- a/Autogen/CAN/Doc/GRCAN_Data.dbc +++ b/Autogen/CAN/Doc/GRCAN_Data.dbc @@ -382,28 +382,28 @@ BO_ 2149592580 ECU_ECU_Analog_Data_to_TCM: 16 ECU BO_ 2149592836 ECU_ECU_Performance_to_TCM: 4 ECU SG_ Elapsed_Cycles : 0|32@1+ (1,0) [0|0] "Clock Cycles" TCM -BO_ 2147615264 ECU_Ping_to_InboardFloor_FL: 4 ECU +BO_ 2149581344 ECU_Ping_to_InboardFloor_FL: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FL -BO_ 2147615265 ECU_Ping_to_InboardFloor_FR: 4 ECU +BO_ 2149581345 ECU_Ping_to_InboardFloor_FR: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FR -BO_ 2147615266 ECU_Ping_to_InboardFloor_RL: 4 ECU +BO_ 2149581346 ECU_Ping_to_InboardFloor_RL: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RL -BO_ 2147615267 ECU_Ping_to_InboardFloor_RR: 4 ECU +BO_ 2149581347 ECU_Ping_to_InboardFloor_RR: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RR -BO_ 2147615268 ECU_Ping_to_SuspensionNode_FL: 4 ECU +BO_ 2149581348 ECU_Ping_to_SuspensionNode_FL: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FL -BO_ 2147615269 ECU_Ping_to_SuspensionNode_FR: 4 ECU +BO_ 2149581349 ECU_Ping_to_SuspensionNode_FR: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FR -BO_ 2147615270 ECU_Ping_to_SuspensionNode_RL: 4 ECU +BO_ 2149581350 ECU_Ping_to_SuspensionNode_RL: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RL -BO_ 2147615271 ECU_Ping_to_SuspensionNode_RR: 4 ECU +BO_ 2149581351 ECU_Ping_to_SuspensionNode_RR: 4 ECU SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RR BO_ 2151678465 TCM_Ping_to_Debugger: 4 TCM @@ -441,400 +441,16 @@ BO_ 2197827588 DGPS_UVW_DGPS_to_TCM: 6 DGPS BO_ 514 SAMM_Mag_1_Ping_to_ECU: 4 SAMM_Mag_1 SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2150105602 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL +BO_ 2189427202 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2150171138 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR +BO_ 2190475778 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2150236674 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL +BO_ 2191524354 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU -BO_ 2150302210 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -CM_ SG_ 2147680513 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; -CM_ SG_ 2147680769 Timestamp "Time in millis"; -CM_ SG_ 2147680770 Timestamp "Time in millis"; -CM_ SG_ 2147683586 Cell_0_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_0_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_1_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_1_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_2_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_2_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_3_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_3_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_4_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_4_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_5_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_5_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_6_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_6_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_7_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_7_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_8_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_8_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_9_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_9_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_10_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_10_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_11_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_11_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_12_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_12_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_13_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_13_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_14_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_14_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_15_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_15_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_16_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_16_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_17_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_17_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_18_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_18_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_19_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_19_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_20_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_20_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_21_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_21_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_22_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_22_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_23_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_23_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_24_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_24_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_25_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_25_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_26_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_26_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_27_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_27_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_28_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_28_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_29_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_29_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_30_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_30_Temp "Cell n temperature"; -CM_ SG_ 2147683586 Cell_31_Voltage "Cell n voltage"; -CM_ SG_ 2147683586 Cell_31_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_32_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_32_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_33_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_33_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_34_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_34_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_35_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_35_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_36_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_36_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_37_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_37_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_38_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_38_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_39_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_39_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_40_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_40_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_41_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_41_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_42_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_42_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_43_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_43_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_44_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_44_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_45_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_45_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_46_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_46_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_47_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_47_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_48_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_48_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_49_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_49_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_50_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_50_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_51_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_51_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_52_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_52_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_53_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_53_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_54_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_54_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_55_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_55_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_56_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_56_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_57_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_57_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_58_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_58_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_59_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_59_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_60_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_60_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_61_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_61_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_62_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_62_Temp "Cell n temperature"; -CM_ SG_ 2147683842 Cell_63_Voltage "Cell n voltage"; -CM_ SG_ 2147683842 Cell_63_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_64_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_64_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_65_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_65_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_66_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_66_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_67_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_67_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_68_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_68_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_69_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_69_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_70_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_70_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_71_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_71_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_72_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_72_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_73_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_73_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_74_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_74_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_75_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_75_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_76_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_76_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_77_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_77_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_78_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_78_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_79_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_79_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_80_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_80_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_81_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_81_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_82_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_82_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_83_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_83_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_84_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_84_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_85_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_85_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_86_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_86_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_87_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_87_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_88_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_88_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_89_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_89_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_90_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_90_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_91_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_91_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_92_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_92_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_93_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_93_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_94_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_94_Temp "Cell n temperature"; -CM_ SG_ 2147684098 Cell_95_Voltage "Cell n voltage"; -CM_ SG_ 2147684098 Cell_95_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_96_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_96_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_97_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_97_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_98_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_98_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_99_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_99_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_100_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_100_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_101_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_101_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_102_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_102_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_103_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_103_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_104_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_104_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_105_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_105_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_106_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_106_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_107_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_107_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_108_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_108_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_109_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_109_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_110_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_110_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_111_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_111_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_112_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_112_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_113_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_113_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_114_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_114_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_115_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_115_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_116_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_116_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_117_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_117_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_118_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_118_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_119_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_119_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_120_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_120_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_121_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_121_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_122_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_122_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_123_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_123_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_124_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_124_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_125_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_125_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_126_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_126_Temp "Cell n temperature"; -CM_ SG_ 2147684354 Cell_127_Voltage "Cell n voltage"; -CM_ SG_ 2147684354 Cell_127_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_128_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_128_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_129_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_129_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_130_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_130_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_131_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_131_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_132_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_132_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_133_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_133_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_134_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_134_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_135_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_135_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_136_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_136_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_137_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_137_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_138_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_138_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_139_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_139_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_140_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_140_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_141_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_141_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_142_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_142_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_143_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_143_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_144_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_144_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_145_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_145_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_146_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_146_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_147_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_147_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_148_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_148_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_149_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_149_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_150_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_150_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_151_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_151_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_152_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_152_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_153_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_153_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_154_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_154_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_155_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_155_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_156_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_156_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_157_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_157_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_158_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_158_Temp "Cell n temperature"; -CM_ SG_ 2147684610 Cell_159_Voltage "Cell n voltage"; -CM_ SG_ 2147684610 Cell_159_Temp "Cell n temperature"; -CM_ SG_ 2147549442 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; -CM_ SG_ 2147549698 Timestamp "Time in millis"; -CM_ SG_ 2147549443 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; -CM_ SG_ 2147549699 Timestamp "Time in millis"; -CM_ SG_ 2147549444 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; -CM_ SG_ 2147549700 Timestamp "Time in millis"; -CM_ SG_ 2147614977 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; -CM_ SG_ 2147615233 Timestamp "Time in millis"; -CM_ SG_ 2147626500 BSPD_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 BSE_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 APPS_1_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 APPS_2_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 Brakeline_F_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 Brakeline_R_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 Steering_Angle_Signal "4-20 mA signal"; -CM_ SG_ 2147626500 AUX_Signal "4-20 mA signal"; -CM_ SG_ 2147626756 Elapsed_Cycles "Represents the total number of clock cycles elapsed for 10 iterations of the main loop"; -CM_ SG_ 2147615264 Timestamp "Time in millis"; -CM_ SG_ 2147615265 Timestamp "Time in millis"; -CM_ SG_ 2147615266 Timestamp "Time in millis"; -CM_ SG_ 2147615267 Timestamp "Time in millis"; -CM_ SG_ 2147615268 Timestamp "Time in millis"; -CM_ SG_ 2147615269 Timestamp "Time in millis"; -CM_ SG_ 2147615270 Timestamp "Time in millis"; -CM_ SG_ 2147615271 Timestamp "Time in millis"; -CM_ SG_ 2147746305 Timestamp "Time in millis"; -CM_ SG_ 2150642436 ALT "altitude"; -CM_ SG_ 2150641924 LAT "lattitude"; -CM_ SG_ 2150642180 LON "longitude"; -CM_ SG_ 2150641668 DGPS_U "U"; -CM_ SG_ 2150641668 DGPS_V "V"; -CM_ SG_ 2150641668 DGPS_W "W"; -CM_ SG_ 514 Timestamp "Time in millis"; -CM_ SG_ 2150105602 Timestamp "Time in millis"; -CM_ SG_ 2150171138 Timestamp "Time in millis"; -CM_ SG_ 2150236674 Timestamp "Time in millis"; -CM_ SG_ 2150302210 Timestamp "Time in millis"; -BO_ 2181038594 SAMM_Mag_1_Ping_to_ECU: 4 SAMM_Mag_1 - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2182087170 SAMM_Mag_2_Ping_to_ECU: 4 SAMM_Mag_2 - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2183135746 SAMM_ToF_1_Ping_to_ECU: 4 SAMM_ToF_1 - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2184184322 SAMM_ToF_2_Ping_to_ECU: 4 SAMM_ToF_2 - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2185232898 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2186281474 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2187330050 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2188378626 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR +BO_ 2192572930 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU CM_ SG_ 2150629633 Debug "Essentially a print statement up to 64 bytes long that whichever targeted can parse"; @@ -1192,11 +808,8 @@ CM_ SG_ 2197828100 LON "longitude"; CM_ SG_ 2197827588 DGPS_U "U"; CM_ SG_ 2197827588 DGPS_V "V"; CM_ SG_ 2197827588 DGPS_W "W"; -CM_ SG_ 2181038594 Timestamp "Time in millis"; -CM_ SG_ 2182087170 Timestamp "Time in millis"; -CM_ SG_ 2183135746 Timestamp "Time in millis"; -CM_ SG_ 2184184322 Timestamp "Time in millis"; -CM_ SG_ 2185232898 Timestamp "Time in millis"; -CM_ SG_ 2186281474 Timestamp "Time in millis"; -CM_ SG_ 2187330050 Timestamp "Time in millis"; -CM_ SG_ 2188378626 Timestamp "Time in millis"; +CM_ SG_ 514 Timestamp "Time in millis"; +CM_ SG_ 2189427202 Timestamp "Time in millis"; +CM_ SG_ 2190475778 Timestamp "Time in millis"; +CM_ SG_ 2191524354 Timestamp "Time in millis"; +CM_ SG_ 2192572930 Timestamp "Time in millis"; From 87416f78ceba8a2e6a7a441062b35e16fc84115a Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 4 May 2026 02:38:46 -0700 Subject: [PATCH 085/158] Update `launch.json` to use proper JSON syntax (no commas after last object value string) Signed-off-by: Daniel Hansen --- .vscode/launch.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3dc2b6369..15d6a2e56 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -294,7 +294,7 @@ "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor FL", "showDevDebugOutput": "raw", - "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" }, { "cwd": "${workspaceFolder}", @@ -310,7 +310,7 @@ "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor FR", "showDevDebugOutput": "raw", - "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" }, { "cwd": "${workspaceFolder}", @@ -326,7 +326,7 @@ "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor RL", "showDevDebugOutput": "raw", - "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" }, { "cwd": "${workspaceFolder}", @@ -342,7 +342,7 @@ "searchDir": [], "preLaunchTask": "CMake: configure and build InboardFloor RR", "showDevDebugOutput": "raw", - "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd", + "svdPath": "${workspaceFolder}/Lib/Vendor/CMSIS_5/SVD/STM32H523.svd" }, { "cwd": "${workspaceFolder}", From 2523d22480518095c1522b739525147a7553c4db Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 4 May 2026 02:43:48 -0700 Subject: [PATCH 086/158] Print internal status in `main.c` Signed-off-by: Daniel Hansen --- SAMM/InboardFloor/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 07c3e9e32..a2af0082b 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -189,7 +189,7 @@ int main(void) VL53L4ED_ClearInterrupt(TOF_ID); /* Read measured distance. RangeStatus = 0 means valid data */ VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, results.distance_mm - 67, results.signal_per_spad_kcps); + printf("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); } else { HAL_Delay(10); __disable_irq(); From ddea00696e66ef2963800d3d30bdc8f73ffb230a Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 4 May 2026 02:45:12 -0700 Subject: [PATCH 087/158] Use `UNUSED` on `dev` in `VL53L4ED_WaitMs` Signed-off-by: Daniel Hansen --- SAMM/InboardFloor/Src/platform.c | 1 + 1 file changed, 1 insertion(+) diff --git a/SAMM/InboardFloor/Src/platform.c b/SAMM/InboardFloor/Src/platform.c index cf09e50e7..1da0466de 100644 --- a/SAMM/InboardFloor/Src/platform.c +++ b/SAMM/InboardFloor/Src/platform.c @@ -107,6 +107,7 @@ uint8_t VL53L4ED_WrDWord(uint16_t dev, uint16_t RegisterAdress, uint32_t value) uint8_t VL53L4ED_WaitMs(Dev_t dev, uint32_t time_ms) { + UNUSED(dev); HAL_Delay(time_ms); return 0; } From 7e6fa3e8d6f280c86399042be9a8e17afc2f36d7 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 4 May 2026 02:51:05 -0700 Subject: [PATCH 088/158] Fix casting of `temp` in printf Resolves https://github.com/Gaucho-Racing/Firmware/security/code-scanning/24 Signed-off-by: Daniel Hansen --- SAMM/SuspensionNode/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 5e5304927..00bc6cb6e 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -191,7 +191,7 @@ int main(void) FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; bool bad = check_status(&mag_dev); - printf("Temperature is %d\n", (double)temp); + printf("Temperature is %d\n", temp); printf("Angle is %d\n", angle); printf("Number of turns is %d\n", turns); if (bad) { From 9cbba4915f34f25bc33e242f4239267e57b68577 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Mon, 4 May 2026 03:20:16 -0700 Subject: [PATCH 089/158] Set up sus for 8 Mbps can data bus using PLL1 Signed-off-by: Daniel Hansen --- Lib/Peripherals/CAN/Src/can_cfg_helpers.c | 8 ++++---- SAMM/SuspensionNode/Src/main.c | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Lib/Peripherals/CAN/Src/can_cfg_helpers.c b/Lib/Peripherals/CAN/Src/can_cfg_helpers.c index 8c589f558..fdbaf2275 100644 --- a/Lib/Peripherals/CAN/Src/can_cfg_helpers.c +++ b/Lib/Peripherals/CAN/Src/can_cfg_helpers.c @@ -222,12 +222,12 @@ CAN_STATUS defaultSTM32H523xx_CANCfg(FDCAN_GlobalTypeDef *instance, CAN_RXCallba canCfg.hal_fdcan_init.ProtocolException = ENABLE; canCfg.hal_fdcan_init.NominalPrescaler = 1; canCfg.hal_fdcan_init.NominalSyncJumpWidth = 16; - canCfg.hal_fdcan_init.NominalTimeSeg1 = 134; // at 180 MHz, a 75% sampling time leads to (134+1)/(1+134+45) ~ 0.75 - canCfg.hal_fdcan_init.NominalTimeSeg2 = 45; + canCfg.hal_fdcan_init.NominalTimeSeg1 = 47; // 64 MHz PLL1Q clock -> (1+47+16) = 64 tq, 1 Mbps at 75% sample point + canCfg.hal_fdcan_init.NominalTimeSeg2 = 16; canCfg.hal_fdcan_init.DataPrescaler = 1; canCfg.hal_fdcan_init.DataSyncJumpWidth = 16; - canCfg.hal_fdcan_init.DataTimeSeg1 = 26; // at 180 MHz, for 5 MbPs, (26+1)/(26 + 1 + 9) - canCfg.hal_fdcan_init.DataTimeSeg2 = 9; + canCfg.hal_fdcan_init.DataTimeSeg1 = 5; // 64 MHz PLL1Q clock -> (1+5+2) = 8 tq, 8 Mbps at 75% sample point + canCfg.hal_fdcan_init.DataTimeSeg2 = 2; canCfg.hal_fdcan_init.StdFiltersNbr = numStdFilters; canCfg.hal_fdcan_init.ExtFiltersNbr = numExtFilters; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 00bc6cb6e..2fc9ffa6b 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -93,11 +93,12 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); CANConfig my_cfg; - get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL); + get_cfg(FDCAN1, on_receivee, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); + CANHandle *h1 = can_init(&my_cfg); From 7573f7ed304e9956727ebdc0398878c0fe4a1939 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 10:21:39 +0000 Subject: [PATCH 090/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 2fc9ffa6b..c6ca94508 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -99,7 +99,6 @@ int main(void) get_cfg(FDCAN1, on_receivee, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); - CANHandle *h1 = can_init(&my_cfg); can_start(h1); From 5bbb753928ef0c4243a4a3ab60862da01aeb82d5 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 12:50:57 +0000 Subject: [PATCH 091/158] Automatic CANfigurator: Updated CAN files automatically --- Autogen/CAN/Doc/GRCAN_Data.dbc | 51 --------------------------------- Autogen/CAN/Inc/GRCAN_NODE_ID.h | 13 --------- 2 files changed, 64 deletions(-) diff --git a/Autogen/CAN/Doc/GRCAN_Data.dbc b/Autogen/CAN/Doc/GRCAN_Data.dbc index 3fb0ea51e..124534151 100644 --- a/Autogen/CAN/Doc/GRCAN_Data.dbc +++ b/Autogen/CAN/Doc/GRCAN_Data.dbc @@ -4,7 +4,6 @@ NS_ : BS_: -BU_: BCU DGPS Debugger ECU InboardFloor_FL InboardFloor_FR InboardFloor_RL InboardFloor_RR SAMM_Mag_1 SuspensionNode_FL SuspensionNode_FR SuspensionNode_RL SuspensionNode_RR TCM TireTemp_FL TireTemp_FR TireTemp_RL TireTemp_RR BU_: BCU BrakeTemp_FL BrakeTemp_FR BrakeTemp_RL BrakeTemp_RR DGPS Debugger ECU InboardFloor_FL InboardFloor_FR InboardFloor_RL InboardFloor_RR Suspension_FL Suspension_FR Suspension_RL Suspension_RR TCM TireTemp_FL TireTemp_FR TireTemp_RL TireTemp_RR BO_ 2150629633 BCU_Debug_FD_to_Debugger: 64 BCU @@ -380,32 +379,6 @@ BO_ 2149592580 ECU_ECU_Analog_Data_to_TCM: 16 ECU SG_ Steering_Angle_Signal : 96|16@1+ (0.0015259,0) [0|100] "%" TCM SG_ AUX_Signal : 112|16@1+ (0.0015259,0) [0|100] "%" TCM -BO_ 2149592836 ECU_ECU_Performance_to_TCM: 4 ECU - SG_ Elapsed_Cycles : 0|32@1+ (1,0) [0|0] "Clock Cycles" TCM - -BO_ 2149581344 ECU_Ping_to_InboardFloor_FL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FL - -BO_ 2149581345 ECU_Ping_to_InboardFloor_FR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_FR - -BO_ 2149581346 ECU_Ping_to_InboardFloor_RL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RL - -BO_ 2149581347 ECU_Ping_to_InboardFloor_RR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" InboardFloor_RR - -BO_ 2149581348 ECU_Ping_to_SuspensionNode_FL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FL - -BO_ 2149581349 ECU_Ping_to_SuspensionNode_FR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_FR - -BO_ 2149581350 ECU_Ping_to_SuspensionNode_RL: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RL - -BO_ 2149581351 ECU_Ping_to_SuspensionNode_RR: 4 ECU - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" SuspensionNode_RR BO_ 2149592324 ECU_ECU_Pinging_RTT_to_TCM: 24 ECU SG_ BCU_RTT : 0|8@1+ (1,0) [0|0] "ms" TCM SG_ GR_Inverter_RTT : 8|8@1+ (1,0) [0|0] "ms" TCM @@ -518,19 +491,6 @@ BO_ 2181050372 DGPS_UVW_DGPS_to_TCM: 6 DGPS SG_ DGPS_V : 16|16@1- (0.01,0) [0|0] "" TCM SG_ DGPS_W : 32|16@1- (0.01,0) [0|0] "" TCM -BO_ 514 SAMM_Mag_1_Ping_to_ECU: 4 SAMM_Mag_1 - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2189427202 TireTemp_FL_Ping_to_ECU: 4 TireTemp_FL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2190475778 TireTemp_FR_Ping_to_ECU: 4 TireTemp_FR - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2191524354 TireTemp_RL_Ping_to_ECU: 4 TireTemp_RL - SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU - -BO_ 2192572930 TireTemp_RR_Ping_to_ECU: 4 TireTemp_RR BO_ 2168455682 Suspension_FL_Ping_to_ECU: 4 Suspension_FL SG_ Timestamp : 0|32@1+ (1,0) [0|4.29497e+09] "ms" ECU @@ -960,17 +920,6 @@ CM_ SG_ 2149581341 Timestamp "Time in millis"; CM_ SG_ 2149581342 Timestamp "Time in millis"; CM_ SG_ 2149581343 Timestamp "Time in millis"; CM_ SG_ 2151678465 Timestamp "Time in millis"; -CM_ SG_ 2197828356 ALT "altitude"; -CM_ SG_ 2197827844 LAT "lattitude"; -CM_ SG_ 2197828100 LON "longitude"; -CM_ SG_ 2197827588 DGPS_U "U"; -CM_ SG_ 2197827588 DGPS_V "V"; -CM_ SG_ 2197827588 DGPS_W "W"; -CM_ SG_ 514 Timestamp "Time in millis"; -CM_ SG_ 2189427202 Timestamp "Time in millis"; -CM_ SG_ 2190475778 Timestamp "Time in millis"; -CM_ SG_ 2191524354 Timestamp "Time in millis"; -CM_ SG_ 2192572930 Timestamp "Time in millis"; CM_ SG_ 2181038594 Timestamp "Time in millis"; CM_ SG_ 2181051140 ALT "altitude"; CM_ SG_ 2181050628 LAT "lattitude"; diff --git a/Autogen/CAN/Inc/GRCAN_NODE_ID.h b/Autogen/CAN/Inc/GRCAN_NODE_ID.h index 6cee47802..04d5bf6af 100644 --- a/Autogen/CAN/Inc/GRCAN_NODE_ID.h +++ b/Autogen/CAN/Inc/GRCAN_NODE_ID.h @@ -19,19 +19,6 @@ typedef enum { GRCAN_Fan_Controller_1 = 0x0D, GRCAN_Fan_Controller_2 = 0x0E, GRCAN_Fan_Controller_3 = 0x0F, - GRCAN_InboardFloor_FL = 0x20, - GRCAN_InboardFloor_FR = 0x21, - GRCAN_InboardFloor_RL = 0x22, - GRCAN_InboardFloor_RR = 0x23, - GRCAN_SuspensionNode_FL = 0x24, - GRCAN_SuspensionNode_FR = 0x25, - GRCAN_SuspensionNode_RL = 0x26, - GRCAN_SuspensionNode_RR = 0x27, - GRCAN_TireTemp_FL = 0x28, - GRCAN_TireTemp_FR = 0x29, - GRCAN_TireTemp_RL = 0x2A, - GRCAN_TireTemp_RR = 0x2B, - GRCAN_DGPS = 0x30, GRCAN_TireTemp_FL = 0x10, GRCAN_TireTemp_FR = 0x11, GRCAN_TireTemp_RL = 0x12, From bd96efce9ea87d2efba7a8634da086dcc6a11cf4 Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 5 May 2026 12:35:52 +0800 Subject: [PATCH 092/158] Incorporated new CAN funcs --- SAMM/SuspensionNode/Src/main.c | 69 ++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index c6ca94508..ad1acf94f 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -93,15 +93,6 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); - - CANConfig my_cfg; - - get_cfg(FDCAN1, on_receivee, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); - - CANHandle *h1 = can_init(&my_cfg); - - can_start(h1); /* USER CODE END Init */ /* Configure the system clock */ @@ -118,8 +109,9 @@ int main(void) // MX_FDCAN2_Init(); MX_SPI1_Init(); MX_SPI3_Init(); - /* USER CODE BEGIN 2 */ + /* USER CODE BEGIN 2 */ + can_mag_init(GRCAN_SAMM_Mag_1, CAN_MAG_MSG_DATA); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); @@ -179,29 +171,40 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - // float hang = mag_read_HANG(mag_dev); - FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; - FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; - FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; - bool bad = check_status(&mag_dev); - printf("Temperature is %d\n", temp); - printf("Angle is %d\n", angle); - printf("Number of turns is %d\n", turns); - if (bad) { - printf("something is cooked"); - mag_write_error(&mag_dev); - } - can_send(h1, &temp_can); - can_send(h1, &angle_can); - can_send(h1, &turns_can); - HAL_Delay(10); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); + + int8_t temp_test = temp - 60; + float angle_test = angle * 360.f / 4096.0f; + + printf("Temperature: %d C\n", temp_test); + printf("Angle: %f deg\n", angle_test); + printf("Turns: %d\n", turns); + + if (bad) { + printf("Something is cooked\n"); + mag_clear_errors(&mag_dev); + } + + uint8_t buffer[8] = {0}; + buffer[0] = (angle >> 8) & 0xFF; + buffer[1] = angle & 0xFF; + + buffer[2] = temp; + + buffer[3] = (turns >> 8) & 0xFF; + buffer[4] = turns & 0xFF; + + // status + buffer[5] = bad ? 0x01 : 0x00; + buffer[6] = 0x00; + buffer[7] = 0x00; + + can_mag_send((unsigned int *)buffer); + + HAL_Delay(10); } /* USER CODE END 3 */ } From f57a91eef9907bcdb77e623ada5516ac800995b4 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 04:37:13 +0000 Subject: [PATCH 093/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/InboardFloor/Src/main.c | 8 +++---- SAMM/SuspensionNode/Src/main.c | 42 +++++++++++++++++----------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 05df37933..aa0f234d9 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -187,10 +187,10 @@ int main(void) status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); /* USER CODE BEGIN 3 */ // begin VL53L4ED diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index ad1acf94f..a3a283882 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -171,40 +171,40 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); int8_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; - printf("Temperature: %d C\n", temp_test); - printf("Angle: %f deg\n", angle_test); - printf("Turns: %d\n", turns); + printf("Temperature: %d C\n", temp_test); + printf("Angle: %f deg\n", angle_test); + printf("Turns: %d\n", turns); - if (bad) { - printf("Something is cooked\n"); - mag_clear_errors(&mag_dev); - } + if (bad) { + printf("Something is cooked\n"); + mag_clear_errors(&mag_dev); + } uint8_t buffer[8] = {0}; - buffer[0] = (angle >> 8) & 0xFF; - buffer[1] = angle & 0xFF; + buffer[0] = (angle >> 8) & 0xFF; + buffer[1] = angle & 0xFF; - buffer[2] = temp; + buffer[2] = temp; - buffer[3] = (turns >> 8) & 0xFF; - buffer[4] = turns & 0xFF; + buffer[3] = (turns >> 8) & 0xFF; + buffer[4] = turns & 0xFF; - // status - buffer[5] = bad ? 0x01 : 0x00; - buffer[6] = 0x00; + // status + buffer[5] = bad ? 0x01 : 0x00; + buffer[6] = 0x00; buffer[7] = 0x00; - can_mag_send((unsigned int *)buffer); + can_mag_send((unsigned int *)buffer); - HAL_Delay(10); + HAL_Delay(10); } /* USER CODE END 3 */ } From 76fddc34543494fae43b486f5bcb82fc2a1570e8 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 21:39:52 -0700 Subject: [PATCH 094/158] Fixed merge conflict for code that was already there?? idk lol --- SAMM/SuspensionNode/CMakeLists.txt | 1 - SAMM/SuspensionNode/Src/can_mag.c | 25 +++++++++++++++++++++++++ SAMM/SuspensionNode/Src/main.c | 16 ++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/SAMM/SuspensionNode/CMakeLists.txt b/SAMM/SuspensionNode/CMakeLists.txt index 4000986f1..4f9e61b5c 100644 --- a/SAMM/SuspensionNode/CMakeLists.txt +++ b/SAMM/SuspensionNode/CMakeLists.txt @@ -53,5 +53,4 @@ target_include_directories( INTERFACE Inc GRCAN - #TODO: Figure out how to set up Extras folder ) diff --git a/SAMM/SuspensionNode/Src/can_mag.c b/SAMM/SuspensionNode/Src/can_mag.c index 43cf5608c..fd1f2181d 100644 --- a/SAMM/SuspensionNode/Src/can_mag.c +++ b/SAMM/SuspensionNode/Src/can_mag.c @@ -1,3 +1,4 @@ +#include "can_cfg.h" #include "can_mag.h" static GRCAN_NODE_ID destNode = GRCAN_TCM; @@ -6,6 +7,30 @@ static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; +static volatile bool data_valid = false; +static volatile uint32_t expected_size = TX_BUFFER_1_SIZE; +static volatile bool id_valid = false; + +void on_receive(uint32_t ID, void* data, uint32_t size) { + // GRCAN_NODE_ID sender = some bit shift; + // GRCAN_MSG_ID messageID = some bit shift; + /*switch(messageID) + { + case ??: + if (size != sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { + ReportBadMessageLength(ID, size); + } + // COPY OR CHANGE THING OR SOMETHING + break; + case ??: + // todo + break; + default: + break; + }*/ + +} + int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { if (localNode != GRCAN_ALL) { diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index a3a283882..2500678a9 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -24,6 +24,7 @@ #include "NodeID.h" #include "gpio.h" #include "spi.h" +#include "can_mag.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ @@ -74,6 +75,7 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ +void on_receive(uint32_t ID, void* data, uint32_t size); /* USER CODE END 0 */ /** @@ -93,6 +95,15 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); + + CANConfig my_cfg; + + get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); + + CANHandle *h1 = can_init(&my_cfg); + + can_start(h1); /* USER CODE END Init */ /* Configure the system clock */ @@ -174,6 +185,10 @@ int main(void) uint8_t temp = mag_read_temp(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); + // float hang = mag_read_HANG(mag_dev); + FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; + FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; + FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; bool bad = check_status(&mag_dev); int8_t temp_test = temp - 60; @@ -273,6 +288,7 @@ void SystemClock_Config(void) // //circularBufferPush(cb, RxData, sizeof(RxData)); // } + /* USER CODE END 4 */ /** From a11595407367a8ed6b9e8731709562b2665fb302 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 21:41:00 -0700 Subject: [PATCH 095/158] Fixed minor merge conflict? --- SAMM/SuspensionNode/Src/main.c | 46 +++++++++++----------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 2500678a9..e9a2e063d 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -120,9 +120,8 @@ int main(void) // MX_FDCAN2_Init(); MX_SPI1_Init(); MX_SPI3_Init(); - /* USER CODE BEGIN 2 */ - can_mag_init(GRCAN_SAMM_Mag_1, CAN_MAG_MSG_DATA); + // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); @@ -182,43 +181,28 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); + // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); + /* USER CODE END WHILE */ + uint8_t temp = mag_read_temp(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); // float hang = mag_read_HANG(mag_dev); FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; - FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = temp}; - FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = temp}; + FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = angle}; + FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = turns}; bool bad = check_status(&mag_dev); - - int8_t temp_test = temp - 60; - float angle_test = angle * 360.f / 4096.0f; - - printf("Temperature: %d C\n", temp_test); - printf("Angle: %f deg\n", angle_test); - printf("Turns: %d\n", turns); - + printf("Temperature is %d\n", temp); + printf("Angle is %d\n", angle); + printf("Number of turns is %d\n", turns); if (bad) { - printf("Something is cooked\n"); - mag_clear_errors(&mag_dev); + printf("something is cooked"); + mag_write_error(&mag_dev); } - - uint8_t buffer[8] = {0}; - buffer[0] = (angle >> 8) & 0xFF; - buffer[1] = angle & 0xFF; - - buffer[2] = temp; - - buffer[3] = (turns >> 8) & 0xFF; - buffer[4] = turns & 0xFF; - - // status - buffer[5] = bad ? 0x01 : 0x00; - buffer[6] = 0x00; - buffer[7] = 0x00; - - can_mag_send((unsigned int *)buffer); - + can_send(h1, &temp_can); + can_send(h1, &angle_can); + can_send(h1, &turns_can); HAL_Delay(10); } /* USER CODE END 3 */ From 552d4419461d8d374cf7cc8d6d82ac0f9ec95084 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 04:42:37 +0000 Subject: [PATCH 096/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/can_mag.c | 7 ++++--- SAMM/SuspensionNode/Src/main.c | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_mag.c b/SAMM/SuspensionNode/Src/can_mag.c index fd1f2181d..4c7b808bb 100644 --- a/SAMM/SuspensionNode/Src/can_mag.c +++ b/SAMM/SuspensionNode/Src/can_mag.c @@ -1,6 +1,7 @@ -#include "can_cfg.h" #include "can_mag.h" +#include "can_cfg.h" + static GRCAN_NODE_ID destNode = GRCAN_TCM; static GRCAN_NODE_ID localNode = GRCAN_ALL; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; @@ -11,7 +12,8 @@ static volatile bool data_valid = false; static volatile uint32_t expected_size = TX_BUFFER_1_SIZE; static volatile bool id_valid = false; -void on_receive(uint32_t ID, void* data, uint32_t size) { +void on_receive(uint32_t ID, void *data, uint32_t size) +{ // GRCAN_NODE_ID sender = some bit shift; // GRCAN_MSG_ID messageID = some bit shift; /*switch(messageID) @@ -28,7 +30,6 @@ void on_receive(uint32_t ID, void* data, uint32_t size) { default: break; }*/ - } int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index e9a2e063d..20ee49465 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -22,9 +22,9 @@ // #include "crc.h" // #include "fdcan.h" #include "NodeID.h" +#include "can_mag.h" #include "gpio.h" #include "spi.h" -#include "can_mag.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ @@ -75,7 +75,7 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -void on_receive(uint32_t ID, void* data, uint32_t size); +void on_receive(uint32_t ID, void *data, uint32_t size); /* USER CODE END 0 */ /** From 25f8862bcd4305f94dc94ecd57df03badd69aad1 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 21:46:49 -0700 Subject: [PATCH 097/158] Included can.h and removed redundant mag code in inboardfloor main file --- SAMM/InboardFloor/Src/main.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index aa0f234d9..5afe91129 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -29,6 +29,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include +#include #include "VL53L4ED_api.h" #include "bmi323.h" @@ -117,7 +118,7 @@ int main(void) /* USER CODE BEGIN 2 */ /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PCLK1); + can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); CANConfig my_cfg; @@ -187,11 +188,6 @@ int main(void) status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); - /* USER CODE BEGIN 3 */ // begin VL53L4ED status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); From a85e1775cf448b9c583ee19b397e91deefa3beff Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 5 May 2026 12:47:25 +0800 Subject: [PATCH 098/158] Why is mag here --- SAMM/InboardFloor/Src/main.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 05df37933..fd0f81683 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -187,10 +187,6 @@ int main(void) status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); /* USER CODE BEGIN 3 */ // begin VL53L4ED From af709c784da0979e123af3f1184a8afe21d98bd6 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 04:48:13 +0000 Subject: [PATCH 099/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/InboardFloor/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 5afe91129..ec53ce786 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -28,8 +28,8 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include #include +#include #include "VL53L4ED_api.h" #include "bmi323.h" From ad18c8cda132c4af025b4c94d2b8b7c39c88c467 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 21:49:33 -0700 Subject: [PATCH 100/158] Renamed can_mag to can_sus for suspension node files --- SAMM/SuspensionNode/CMakeLists.txt | 2 +- SAMM/SuspensionNode/Inc/{can_mag.h => can_sus.h} | 0 SAMM/SuspensionNode/Src/{can_mag.c => can_sus.c} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename SAMM/SuspensionNode/Inc/{can_mag.h => can_sus.h} (100%) rename SAMM/SuspensionNode/Src/{can_mag.c => can_sus.c} (100%) diff --git a/SAMM/SuspensionNode/CMakeLists.txt b/SAMM/SuspensionNode/CMakeLists.txt index 4f9e61b5c..2ff932c39 100644 --- a/SAMM/SuspensionNode/CMakeLists.txt +++ b/SAMM/SuspensionNode/CMakeLists.txt @@ -34,7 +34,7 @@ target_sources( Src/main.c Src/spi.c Src/stm32h5xx_it.c - Src/can_mag.c + Src/can_sus.c # TODO ) diff --git a/SAMM/SuspensionNode/Inc/can_mag.h b/SAMM/SuspensionNode/Inc/can_sus.h similarity index 100% rename from SAMM/SuspensionNode/Inc/can_mag.h rename to SAMM/SuspensionNode/Inc/can_sus.h diff --git a/SAMM/SuspensionNode/Src/can_mag.c b/SAMM/SuspensionNode/Src/can_sus.c similarity index 100% rename from SAMM/SuspensionNode/Src/can_mag.c rename to SAMM/SuspensionNode/Src/can_sus.c From 0af454aca04895b40546d1809360ede8cf970b8c Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 21:50:53 -0700 Subject: [PATCH 101/158] Fixed silly include errors regarding can_mag -> can_sus name change whoops --- SAMM/SuspensionNode/Src/can_sus.c | 2 +- SAMM/SuspensionNode/Src/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 4c7b808bb..b883da265 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,4 +1,4 @@ -#include "can_mag.h" +#include "can_sus.h" #include "can_cfg.h" diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 20ee49465..b5f8859e1 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -22,7 +22,7 @@ // #include "crc.h" // #include "fdcan.h" #include "NodeID.h" -#include "can_mag.h" +#include "can_sus.h" #include "gpio.h" #include "spi.h" From 66a89dbe52ef9aa2885fe0c700735475ef84f79b Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 5 May 2026 12:52:32 +0800 Subject: [PATCH 102/158] Don't know why the changes were deleted --- SAMM/SuspensionNode/Src/main.c | 71 +++++++++++++++++----------------- 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 20ee49465..c17857fba 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -22,7 +22,6 @@ // #include "crc.h" // #include "fdcan.h" #include "NodeID.h" -#include "can_mag.h" #include "gpio.h" #include "spi.h" @@ -75,7 +74,6 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -void on_receive(uint32_t ID, void *data, uint32_t size); /* USER CODE END 0 */ /** @@ -95,15 +93,6 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); - - CANConfig my_cfg; - - get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); - - CANHandle *h1 = can_init(&my_cfg); - - can_start(h1); /* USER CODE END Init */ /* Configure the system clock */ @@ -121,7 +110,7 @@ int main(void) MX_SPI1_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ - + can_mag_init(GRCAN_SAMM_Mag_1, CAN_MAG_MSG_DATA); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); @@ -181,29 +170,40 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, TxData); - // HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan2, &TxHeader, TxData); - /* USER CODE END WHILE */ - - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - // float hang = mag_read_HANG(mag_dev); - FDCANTxMessage temp_can = {.tx_header = 0, .data[8] = temp}; - FDCANTxMessage angle_can = {.tx_header = 0, .data[16] = angle}; - FDCANTxMessage turns_can = {.tx_header = 0, .data[16] = turns}; - bool bad = check_status(&mag_dev); - printf("Temperature is %d\n", temp); - printf("Angle is %d\n", angle); - printf("Number of turns is %d\n", turns); - if (bad) { - printf("something is cooked"); - mag_write_error(&mag_dev); - } - can_send(h1, &temp_can); - can_send(h1, &angle_can); - can_send(h1, &turns_can); - HAL_Delay(10); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); + + int8_t temp_test = temp - 60; + float angle_test = angle * 360.f / 4096.0f; + + printf("Temperature: %d C\n", temp_test); + printf("Angle: %f deg\n", angle_test); + printf("Turns: %d\n", turns); + + if (bad) { + printf("Something is cooked\n"); + mag_clear_errors(&mag_dev); + } + + uint8_t buffer[8] = {0}; + buffer[0] = (angle >> 8) & 0xFF; + buffer[1] = angle & 0xFF; + + buffer[2] = temp; + + buffer[3] = (turns >> 8) & 0xFF; + buffer[4] = turns & 0xFF; + + // status + buffer[5] = bad ? 0x01 : 0x00; + buffer[6] = 0x00; + buffer[7] = 0x00; + + can_mag_send((unsigned int *)buffer); + + HAL_Delay(10); } /* USER CODE END 3 */ } @@ -272,7 +272,6 @@ void SystemClock_Config(void) // //circularBufferPush(cb, RxData, sizeof(RxData)); // } - /* USER CODE END 4 */ /** From 84d0e5ffb2f6ed24b6fb54e1114296c1e9d7939e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 04:56:06 +0000 Subject: [PATCH 103/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/main.c | 42 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 1b09a6e9a..2917d4183 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -171,40 +171,40 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); + uint8_t temp = mag_read_temp(&mag_dev); + uint16_t angle = mag_read_encoder_angle(&mag_dev); + int16_t turns = mag_read_turns(&mag_dev); + bool bad = check_status(&mag_dev); int8_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; - printf("Temperature: %d C\n", temp_test); - printf("Angle: %f deg\n", angle_test); - printf("Turns: %d\n", turns); + printf("Temperature: %d C\n", temp_test); + printf("Angle: %f deg\n", angle_test); + printf("Turns: %d\n", turns); - if (bad) { - printf("Something is cooked\n"); - mag_clear_errors(&mag_dev); - } + if (bad) { + printf("Something is cooked\n"); + mag_clear_errors(&mag_dev); + } uint8_t buffer[8] = {0}; - buffer[0] = (angle >> 8) & 0xFF; - buffer[1] = angle & 0xFF; + buffer[0] = (angle >> 8) & 0xFF; + buffer[1] = angle & 0xFF; - buffer[2] = temp; + buffer[2] = temp; - buffer[3] = (turns >> 8) & 0xFF; - buffer[4] = turns & 0xFF; + buffer[3] = (turns >> 8) & 0xFF; + buffer[4] = turns & 0xFF; - // status - buffer[5] = bad ? 0x01 : 0x00; - buffer[6] = 0x00; + // status + buffer[5] = bad ? 0x01 : 0x00; + buffer[6] = 0x00; buffer[7] = 0x00; - can_mag_send((unsigned int *)buffer); + can_mag_send((unsigned int *)buffer); - HAL_Delay(10); + HAL_Delay(10); } /* USER CODE END 3 */ } From c183c54e7b3c8dd93e979373efe5174273d5d281 Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 5 May 2026 13:00:31 +0800 Subject: [PATCH 104/158] test --- SAMM/InboardFloor/Src/main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index ec53ce786..4ec2c7b64 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -85,6 +85,11 @@ uint32_t MillisecondsSinceBoot(void) * @brief The application entry point. * @retval int */ + +void on_receive(CANHandle *handle, uint8_t *data, uint32_t len) +{ +} + int main(void) { @@ -122,7 +127,7 @@ int main(void) CANConfig my_cfg; - get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL); + get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); CANHandle *h1 = can_init(&my_cfg); From abd8198ea7ba1cf61ebc7cca1ad58e64312175dc Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 05:02:36 +0000 Subject: [PATCH 105/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/InboardFloor/Src/main.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 4ec2c7b64..7240d04e2 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -86,9 +86,7 @@ uint32_t MillisecondsSinceBoot(void) * @retval int */ -void on_receive(CANHandle *handle, uint8_t *data, uint32_t len) -{ -} +void on_receive(CANHandle *handle, uint8_t *data, uint32_t len) {} int main(void) { From 1c2d8c90df402f07e41f9a31a8ecacc8179fa4c0 Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Tue, 5 May 2026 13:03:11 +0800 Subject: [PATCH 106/158] I hate CAN --- SAMM/InboardFloor/Src/main.c | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 4ec2c7b64..a6890ea40 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -86,9 +86,7 @@ uint32_t MillisecondsSinceBoot(void) * @retval int */ -void on_receive(CANHandle *handle, uint8_t *data, uint32_t len) -{ -} + int main(void) { @@ -123,15 +121,7 @@ int main(void) /* USER CODE BEGIN 2 */ /* USER CODE BEGIN Init */ - can_set_clksource(LL_RCC_FDCAN_CLKSOURCE_PLL1Q); - - CANConfig my_cfg; - - get_cfg(FDCAN1, on_receive, &my_cfg, FDCAN_MODE_NORMAL, 0, 0); - - CANHandle *h1 = can_init(&my_cfg); - can_start(h1); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); From 7edd6e53528accc4e5bdb960c32b1c5972e8e2f9 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 05:06:30 +0000 Subject: [PATCH 107/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/InboardFloor/Src/main.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index a6890ea40..ef65a1b07 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -86,8 +86,6 @@ uint32_t MillisecondsSinceBoot(void) * @retval int */ - - int main(void) { @@ -122,7 +120,6 @@ int main(void) /* USER CODE BEGIN 2 */ /* USER CODE BEGIN Init */ - // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); From 0af103fe01b27c6796053e7fab1a7a859cb44b01 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 22:15:49 -0700 Subject: [PATCH 108/158] started working on sus node can handler function --- SAMM/SuspensionNode/Src/can_sus.c | 47 +++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index b883da265..7981ad237 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -8,15 +8,57 @@ static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; +void SusNode_ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + LOGOMATIC("Bad Suspension Node CAN Rx length! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + +void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + +void SusNode_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t* data, uint32_t data_length) { + switch (msg_id) { + case GRCAN_PING: + if (data_length != sizeof(GRCAN_PING_MSG)) { + SusMode_ReportBadMessageLength(bus_id, msg_id, sender_id); + break; + } + + // respond to ping + break; + } +} + + + + + + + + + + + + + + + + + + +/* this stuff is lwk a template/ bs i'll come back to remove/fix it - shravya static volatile bool data_valid = false; static volatile uint32_t expected_size = TX_BUFFER_1_SIZE; static volatile bool id_valid = false; + void on_receive(uint32_t ID, void *data, uint32_t size) { // GRCAN_NODE_ID sender = some bit shift; // GRCAN_MSG_ID messageID = some bit shift; - /*switch(messageID) + switch(messageID) { case ??: if (size != sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { @@ -29,8 +71,9 @@ void on_receive(uint32_t ID, void *data, uint32_t size) break; default: break; - }*/ + } } +*/ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { From f8292b9f6f4be7c9847e1760e0e34cc2f8e30b98 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 4 May 2026 23:04:35 -0700 Subject: [PATCH 109/158] can now receive ping in can handler plus added enum for primary/subnet buses --- SAMM/SuspensionNode/Inc/can_sus.h | 5 +++++ SAMM/SuspensionNode/Src/can_sus.c | 35 ++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 34d55f078..64d096c65 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -12,6 +12,11 @@ typedef enum { CAN_MAG_MSG_FAULT = 0x2F } CAN_MAG_MSG_ID; // change with updates <- fixme +typedef enum { + CAN_SUBNET_BUS = 0, + CAN_DATAMAIN_BUS = 1 +} CAN_SAMM_ROUTING_BUS; + int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID); int can_mag_send(unsigned int *data); diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 7981ad237..a5ad86220 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -18,17 +18,32 @@ void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GR LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); } -void SusNode_CAN_MessageHandler(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t* data, uint32_t data_length) { - switch (msg_id) { - case GRCAN_PING: - if (data_length != sizeof(GRCAN_PING_MSG)) { - SusMode_ReportBadMessageLength(bus_id, msg_id, sender_id); - break; - } - - // respond to ping - break; +void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t* data, uint32_t data_length) { + // switch (msg_id) { + // case GRCAN_PING: + // if (data_length != sizeof(GRCAN_PING_MSG)) { + // SusMode_ReportBadMessageLength(bus_id, msg_id, sender_id); + // break; + // } + // GRCAN_Fancy_Send(bus_id, sender_id, msg_id, data, data_length); // Respond to ping + // GRCAN_Fancy_Send // send to other bus + // break; + // default: + // GRCAN_Fancy_Send // send to other bus + // } + + if (msg_id == GRCAN_PING) { + GR_Fancy_Send(CAN_DATAMAIN_BUS, msg_id, sender_id, data, data_length); } + GR_Fancy_Send(CAN_SUBNET_BUS, msg_id, sender_id, data, data_length); + /* + if (PING) + { + SEND PING ON OG BUS + } + + COPY MESSAGE TO OTHER BUS + */ } From 611a5fc78632b1d3082e0abb7f3ead5a10c95bd8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 06:05:54 +0000 Subject: [PATCH 110/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/can_sus.c | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index a5ad86220..91121333a 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -18,7 +18,8 @@ void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GR LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); } -void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t* data, uint32_t data_length) { +void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) +{ // switch (msg_id) { // case GRCAN_PING: // if (data_length != sizeof(GRCAN_PING_MSG)) { @@ -46,23 +47,6 @@ void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID */ } - - - - - - - - - - - - - - - - - /* this stuff is lwk a template/ bs i'll come back to remove/fix it - shravya static volatile bool data_valid = false; static volatile uint32_t expected_size = TX_BUFFER_1_SIZE; From a0b1ff3481aa49d86c15ad605feb36d33bed2fff Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 7 May 2026 19:50:40 -0700 Subject: [PATCH 111/158] like really minor changes brb --- SAMM/SuspensionNode/Src/can_sus.c | 58 ++++++------------------------- 1 file changed, 11 insertions(+), 47 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 91121333a..4a4e3ffe9 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -18,61 +18,25 @@ void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GR LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); } -void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, uint8_t *data, uint32_t data_length) +void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, void *data, uint32_t data_length) { - // switch (msg_id) { - // case GRCAN_PING: - // if (data_length != sizeof(GRCAN_PING_MSG)) { - // SusMode_ReportBadMessageLength(bus_id, msg_id, sender_id); - // break; - // } - // GRCAN_Fancy_Send(bus_id, sender_id, msg_id, data, data_length); // Respond to ping - // GRCAN_Fancy_Send // send to other bus - // break; - // default: - // GRCAN_Fancy_Send // send to other bus - // } - if (msg_id == GRCAN_PING) { - GR_Fancy_Send(CAN_DATAMAIN_BUS, msg_id, sender_id, data, data_length); - } - GR_Fancy_Send(CAN_SUBNET_BUS, msg_id, sender_id, data, data_length); - /* - if (PING) - { - SEND PING ON OG BUS + // Send ping back to sender on main data bus + GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); } - COPY MESSAGE TO OTHER BUS - */ + // Forward all messages to subnet bus + GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msg_id, data, data_length); } -/* this stuff is lwk a template/ bs i'll come back to remove/fix it - shravya -static volatile bool data_valid = false; -static volatile uint32_t expected_size = TX_BUFFER_1_SIZE; -static volatile bool id_valid = false; - - -void on_receive(uint32_t ID, void *data, uint32_t size) -{ - // GRCAN_NODE_ID sender = some bit shift; - // GRCAN_MSG_ID messageID = some bit shift; - switch(messageID) - { - case ??: - if (size != sizeof(GRCAN_BCU_CELL_DATA_1_MSG)) { - ReportBadMessageLength(ID, size); - } - // COPY OR CHANGE THING OR SOMETHING - break; - case ??: - // todo - break; - default: - break; +void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void* data, uint32_t data_length) { + if (data_length > FDCAN_MAX_DATA_BYTES) { + LOGOMATIC("Tried to send more than 64 bytes over suspension node CAN!"); } + + uint32_t ID = (()) } -*/ + int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { From a75503033434de7936f72a7b56b1872933fbd1aa Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 02:51:56 +0000 Subject: [PATCH 112/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/can_sus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 4a4e3ffe9..71e4b1604 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -29,7 +29,8 @@ void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msg_id, data, data_length); } -void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void* data, uint32_t data_length) { +void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void *data, uint32_t data_length) +{ if (data_length > FDCAN_MAX_DATA_BYTES) { LOGOMATIC("Tried to send more than 64 bytes over suspension node CAN!"); } @@ -37,7 +38,6 @@ void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID se uint32_t ID = (()) } - int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { if (localNode != GRCAN_ALL) { From ac21c9376958a4ebb7e337d298e00cd73d71b528 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 7 May 2026 20:29:48 -0700 Subject: [PATCH 113/158] Merging --- SAMM/SAMM_Mag/Src/can_mag.c | 1 + 1 file changed, 1 insertion(+) diff --git a/SAMM/SAMM_Mag/Src/can_mag.c b/SAMM/SAMM_Mag/Src/can_mag.c index 49f8ee9ec..41a3339e5 100644 --- a/SAMM/SAMM_Mag/Src/can_mag.c +++ b/SAMM/SAMM_Mag/Src/can_mag.c @@ -2,6 +2,7 @@ static GRCAN_NODE_ID destNode = GRCAN_TCM; static GRCAN_NODE_ID localNode = GRCAN_ALL; +static GRCAN_NODE_ID sensorNode = ;// static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; From b788a2ac2c9a3c20449b122782c3eaad723062de Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 7 May 2026 21:08:39 -0700 Subject: [PATCH 114/158] Some changes --- SAMM/SuspensionNode/Inc/can_sus.h | 2 +- SAMM/SuspensionNode/Src/can_sus.c | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 64d096c65..5a54506f5 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -2,7 +2,7 @@ #define CAN_MAG_H #include - +#include "NodeID.h" #include "GRCAN_FancyLayer.h" #include "Logomatic.h" diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 71e4b1604..a6d543079 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,12 +1,13 @@ #include "can_sus.h" - #include "can_cfg.h" static GRCAN_NODE_ID destNode = GRCAN_TCM; -static GRCAN_NODE_ID localNode = GRCAN_ALL; +//static GRCAN_NODE_ID localNode = GRCAN_ALL; +static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; - +static GRCAN_NODE_ID sensorNode = ;//tire temp static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; +static data_length = 64; void SusNode_ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) { @@ -20,13 +21,13 @@ void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GR void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, void *data, uint32_t data_length) { + // Forward all messages to subnet bus + GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msg_id, data, data_length); + if (msg_id == GRCAN_PING) { // Send ping back to sender on main data bus GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); } - - // Forward all messages to subnet bus - GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msg_id, data, data_length); } void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void *data, uint32_t data_length) From 129c7714f0e9ad15d29151cb02a43a4aa47bbcbd Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 04:09:59 +0000 Subject: [PATCH 115/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Inc/can_sus.h | 3 ++- SAMM/SuspensionNode/Src/can_sus.c | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 5a54506f5..064c20ff8 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -2,9 +2,10 @@ #define CAN_MAG_H #include -#include "NodeID.h" + #include "GRCAN_FancyLayer.h" #include "Logomatic.h" +#include "NodeID.h" typedef enum { CAN_MAG_MSG_DATA = 0x2C, diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index a6d543079..7e0303fe6 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,11 +1,12 @@ #include "can_sus.h" + #include "can_cfg.h" static GRCAN_NODE_ID destNode = GRCAN_TCM; -//static GRCAN_NODE_ID localNode = GRCAN_ALL; +// static GRCAN_NODE_ID localNode = GRCAN_ALL; static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_NODE_ID sensorNode = ;//tire temp +static GRCAN_NODE_ID sensorNode = ; // tire temp static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; static data_length = 64; From 3ccfd88d3457cf6e75e8a2c504ec21a6d7cbdb0d Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 7 May 2026 22:12:51 -0700 Subject: [PATCH 116/158] Merge conflict resolution --- .../GRCAN/Src/grcan_fancylayer.c | 1 + SAMM/SuspensionNode/Inc/can_sus.h | 25 ++++- SAMM/SuspensionNode/Src/can_sus.c | 95 +++++++++++++++++-- SAMM/SuspensionNode/Src/main.c | 8 +- 4 files changed, 112 insertions(+), 17 deletions(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 4cc460bfa..4aef26ba4 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -9,6 +9,7 @@ static CANHandle *grcan_primary = NULL; static CANHandle *grcan_data = NULL; +static CANHandle *grcan_data_subnet = NULL; static CANHandle *grcan_testing = NULL; static CANHandle *grcan_charging = NULL; diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 064c20ff8..195d98e47 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -7,11 +7,28 @@ #include "Logomatic.h" #include "NodeID.h" +static GRCAN_NODE_ID destNode = GRCAN_TCM; + typedef enum { - CAN_MAG_MSG_DATA = 0x2C, - CAN_MAG_MSG_STATUS = 0x2D, - CAN_MAG_MSG_FAULT = 0x2F -} CAN_MAG_MSG_ID; // change with updates <- fixme + CAN_SUS_MSG_DATA = 0x2C, + CAN_SUS_MSG_STATUS = 0x2D, + CAN_SUS_MSG_FAULT = 0x2F +} Sus_MSG_ID; // change with updates <- fixme + + +typedef enum { + TireTemp_FL = GRCAN_TireTemp_FL, + TireTemp_FR = GRCAN_TireTemp_FR, + TireTemp_RL = GRCAN_TireTemp_RL, + TireTemp_RR = GRCAN_TireTemp_RR +} TireTemp_Node; + +typedef enum{ + Sus_FL = GRCAN_Suspension_FL, + Sus_FR = GRCAN_Suspension_FR, + Sus_RL = GRCAN_Suspension_RL, + Sus_RR = GRCAN_Suspension_RR +} Sus_Node; typedef enum { CAN_SUBNET_BUS = 0, diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 7e0303fe6..f4f3da1f6 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -2,22 +2,88 @@ #include "can_cfg.h" -static GRCAN_NODE_ID destNode = GRCAN_TCM; // static GRCAN_NODE_ID localNode = GRCAN_ALL; +static GRCAN_NODE_ID sensorNode = GRCAN_ALL; static GRCAN_NODE_ID localNode = LOCAL_GR_ID; +static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_NODE_ID sensorNode = ; // tire temp +static GRCAN_NODE_ID sensorNode; //tire temp static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; static data_length = 64; -void SusNode_ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) -{ - LOGOMATIC("Bad Suspension Node CAN Rx length! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); + +//get rid of mag functions once their functionality added +//fix callbacks for all requried functionality +//might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) +//might be better way to do this +//check if came from tire temp or tcm in the callback-- should not interfere +//handle sensorNode logic in init, you can use enum in can_sus.h + +void TireTemp_callback(uint32_t ID, void *data, uint32_t size) { + + GRCAN_Fancy_ID GRCAN_Fancy_ID; + GRCAN_Fancy_ID.srcID = 0; + GRCAN_Fancy_ID.destNode = 0; + GRCAN_Fancy_ID.messageID = 0; + + + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); + + uint32_t forward_data = (uint32_t *)data; + + if (GRCAN_Fancy_ID.srcID == TCMNode) { + GRCAN_Fancy_Send(busMode, sensorNode, msgID, data, size); + } + } -void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) -{ - LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); + +void TCM_callback(uint32_t ID, void *data, uint32_t size) { + + GRCAN_Fancy_ID GRCAN_Fancy_ID; + GRCAN_Fancy_ID.srcID = 0; + GRCAN_Fancy_ID.destNode = 0; + GRCAN_Fancy_ID.messageID = 0; + + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); + + + + // Forward all messages to subnet bus + GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msgID, data, data_length); + + if (msg_id == GRCAN_PING) { + // Send ping back to sender on main data bus + GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); + } + +} + +int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) { + GRCAN_BusConfig bus_config; + GRCAN_SetDefaultBusConfig(&bus_config, bus); + +#if defined(STM32H5) + bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz + // defaults should work +#endif + + if (bus == CAN_SUBNET_BUS) { + bus_config.fdcan_instance = FDCAN2; + bus_config.rx_callback = TireTemp_callback; // callback + } else if (bus == CAN_DATAMAIN_BUS) { + bus_config.fdcan_instance = FDCAN1; + bus_config.rx_callback = TCM_callback; // callback + } + + bool result = GRCAN_InitBus(&bus_config); + + if (!result) { + LOGOMATIC("Failed to intialize Suspension CAN Bus"); + return 0; + } + GRCAN_SetLocalNodeID(LOCAL_GR_ID); + return 1; //success } void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, void *data, uint32_t data_length) @@ -31,13 +97,24 @@ void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID } } +/* ================================================================================================== */ + +void SusNode_ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + LOGOMATIC("Bad Suspension Node CAN Rx length! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + +void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) +{ + LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); +} + void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void *data, uint32_t data_length) { if (data_length > FDCAN_MAX_DATA_BYTES) { LOGOMATIC("Tried to send more than 64 bytes over suspension node CAN!"); } - uint32_t ID = (()) } int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 2917d4183..ca739637c 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -179,12 +179,12 @@ int main(void) int8_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; - printf("Temperature: %d C\n", temp_test); - printf("Angle: %f deg\n", angle_test); - printf("Turns: %d\n", turns); + LOGOMATIC("Temperature: %d C\n", temp_test); + LOGOMATIC("Angle: %f deg\n", angle_test); + LOGOMATIC("Turns: %d\n", turns); if (bad) { - printf("Something is cooked\n"); + LOGOMATIC("Something is cooked"); mag_clear_errors(&mag_dev); } From daa6b352206db7bb307f0057a79708f7aa211c1c Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 7 May 2026 22:13:23 -0700 Subject: [PATCH 117/158] Deleted mag message id line --- SAMM/SuspensionNode/Src/can_sus.c | 1 - 1 file changed, 1 deletion(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index f4f3da1f6..47ec41e67 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -8,7 +8,6 @@ static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static GRCAN_NODE_ID sensorNode; //tire temp -static CAN_MAG_MSG_ID msgID = CAN_MAG_MSG_DATA; static data_length = 64; From fb338e1f7dea1666e265b18786ce1db3f1acebb8 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 7 May 2026 22:10:37 -0700 Subject: [PATCH 118/158] Additional explanatory comments --- SAMM/SuspensionNode/Src/can_sus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 47ec41e67..5abca63ee 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -16,6 +16,7 @@ static data_length = 64; //might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) //might be better way to do this //check if came from tire temp or tcm in the callback-- should not interfere +//might need to get rid of TCM checking if you really want to forward everything //handle sensorNode logic in init, you can use enum in can_sus.h void TireTemp_callback(uint32_t ID, void *data, uint32_t size) { From 39657828fc4fcbb867f260885ae43b8ebdf1df72 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 8 May 2026 05:15:44 +0000 Subject: [PATCH 119/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Inc/can_sus.h | 3 +-- SAMM/SuspensionNode/Src/can_sus.c | 37 +++++++++++++------------------ 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 195d98e47..9b67b0ab3 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -15,7 +15,6 @@ typedef enum { CAN_SUS_MSG_FAULT = 0x2F } Sus_MSG_ID; // change with updates <- fixme - typedef enum { TireTemp_FL = GRCAN_TireTemp_FL, TireTemp_FR = GRCAN_TireTemp_FR, @@ -23,7 +22,7 @@ typedef enum { TireTemp_RR = GRCAN_TireTemp_RR } TireTemp_Node; -typedef enum{ +typedef enum { Sus_FL = GRCAN_Suspension_FL, Sus_FR = GRCAN_Suspension_FR, Sus_RL = GRCAN_Suspension_RL, diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 5abca63ee..d5d607a55 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -7,26 +7,25 @@ static GRCAN_NODE_ID sensorNode = GRCAN_ALL; static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_NODE_ID sensorNode; //tire temp +static GRCAN_NODE_ID sensorNode; // tire temp static data_length = 64; +// get rid of mag functions once their functionality added +// fix callbacks for all requried functionality +// might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) +// might be better way to do this +// check if came from tire temp or tcm in the callback-- should not interfere +// might need to get rid of TCM checking if you really want to forward everything +// handle sensorNode logic in init, you can use enum in can_sus.h -//get rid of mag functions once their functionality added -//fix callbacks for all requried functionality -//might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) -//might be better way to do this -//check if came from tire temp or tcm in the callback-- should not interfere -//might need to get rid of TCM checking if you really want to forward everything -//handle sensorNode logic in init, you can use enum in can_sus.h - -void TireTemp_callback(uint32_t ID, void *data, uint32_t size) { +void TireTemp_callback(uint32_t ID, void *data, uint32_t size) +{ GRCAN_Fancy_ID GRCAN_Fancy_ID; GRCAN_Fancy_ID.srcID = 0; GRCAN_Fancy_ID.destNode = 0; GRCAN_Fancy_ID.messageID = 0; - GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); uint32_t forward_data = (uint32_t *)data; @@ -34,11 +33,10 @@ void TireTemp_callback(uint32_t ID, void *data, uint32_t size) { if (GRCAN_Fancy_ID.srcID == TCMNode) { GRCAN_Fancy_Send(busMode, sensorNode, msgID, data, size); } - } - -void TCM_callback(uint32_t ID, void *data, uint32_t size) { +void TCM_callback(uint32_t ID, void *data, uint32_t size) +{ GRCAN_Fancy_ID GRCAN_Fancy_ID; GRCAN_Fancy_ID.srcID = 0; @@ -47,8 +45,6 @@ void TCM_callback(uint32_t ID, void *data, uint32_t size) { GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); - - // Forward all messages to subnet bus GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msgID, data, data_length); @@ -56,16 +52,16 @@ void TCM_callback(uint32_t ID, void *data, uint32_t size) { // Send ping back to sender on main data bus GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); } - } -int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) { +int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) +{ GRCAN_BusConfig bus_config; GRCAN_SetDefaultBusConfig(&bus_config, bus); #if defined(STM32H5) bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz - // defaults should work + // defaults should work #endif if (bus == CAN_SUBNET_BUS) { @@ -83,7 +79,7 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) { return 0; } GRCAN_SetLocalNodeID(LOCAL_GR_ID); - return 1; //success + return 1; // success } void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, void *data, uint32_t data_length) @@ -114,7 +110,6 @@ void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID se if (data_length > FDCAN_MAX_DATA_BYTES) { LOGOMATIC("Tried to send more than 64 bytes over suspension node CAN!"); } - } int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) From 2822987e28ee535703c17f53f6356f7628053b7c Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 11 May 2026 18:25:06 -0700 Subject: [PATCH 120/158] Quick fixes and some comments in can_sus --- SAMM/SuspensionNode/Src/can_sus.c | 57 +++++++++---------------------- 1 file changed, 17 insertions(+), 40 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index d5d607a55..97df47e90 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -3,11 +3,11 @@ #include "can_cfg.h" // static GRCAN_NODE_ID localNode = GRCAN_ALL; -static GRCAN_NODE_ID sensorNode = GRCAN_ALL; +static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // q from shravya: what is GRCAN_ALL? static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_NODE_ID sensorNode; // tire temp +static GRCAN_NODE_ID sensorNode; // tire temp -> q from shravya: sensorNode declared twice? static data_length = 64; // get rid of mag functions once their functionality added @@ -18,7 +18,8 @@ static data_length = 64; // might need to get rid of TCM checking if you really want to forward everything // handle sensorNode logic in init, you can use enum in can_sus.h -void TireTemp_callback(uint32_t ID, void *data, uint32_t size) +// For messages from tire temp +void TireTemp_Callback(uint32_t id, void *data, uint32_t size) { GRCAN_Fancy_ID GRCAN_Fancy_ID; @@ -26,16 +27,18 @@ void TireTemp_callback(uint32_t ID, void *data, uint32_t size) GRCAN_Fancy_ID.destNode = 0; GRCAN_Fancy_ID.messageID = 0; - GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); uint32_t forward_data = (uint32_t *)data; + // q from shravya: doesn't this send from TCM to tire temp instead of other way around? if (GRCAN_Fancy_ID.srcID == TCMNode) { - GRCAN_Fancy_Send(busMode, sensorNode, msgID, data, size); + GRCAN_Fancy_Send(busMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); } } -void TCM_callback(uint32_t ID, void *data, uint32_t size) +// For messages from TCM +void TCM_Callback(uint32_t id, void *data, uint32_t size) { GRCAN_Fancy_ID GRCAN_Fancy_ID; @@ -43,14 +46,16 @@ void TCM_callback(uint32_t ID, void *data, uint32_t size) GRCAN_Fancy_ID.destNode = 0; GRCAN_Fancy_ID.messageID = 0; - GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, ID); + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); // Forward all messages to subnet bus - GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msgID, data, data_length); + // q from shravya: busMode is just the default bus... need to indicate that it's being sent thru + // subnet bus somehow? + GRCAN_Fancy_Send(busMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); - if (msg_id == GRCAN_PING) { + if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { // Send ping back to sender on main data bus - GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); + GRCAN_Fancy_Send(busMode, GRCAN_Fancy_ID.srcID, GRCAN_Fancy_ID.messageID, data, size); } } @@ -66,10 +71,10 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) if (bus == CAN_SUBNET_BUS) { bus_config.fdcan_instance = FDCAN2; - bus_config.rx_callback = TireTemp_callback; // callback + bus_config.rx_callback = TireTemp_Callback; // callback } else if (bus == CAN_DATAMAIN_BUS) { bus_config.fdcan_instance = FDCAN1; - bus_config.rx_callback = TCM_callback; // callback + bus_config.rx_callback = TCM_Callback; // callback } bool result = GRCAN_InitBus(&bus_config); @@ -82,36 +87,8 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 1; // success } -void SusNode_CAN_MessageHandler(bool primary, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, void *data, uint32_t data_length) -{ - // Forward all messages to subnet bus - GRCAN_Fancy_Send(CAN_SUBNET_BUS, sender_id, msg_id, data, data_length); - - if (msg_id == GRCAN_PING) { - // Send ping back to sender on main data bus - GRCAN_Fancy_Send(CAN_DATAMAIN_BUS, sender_id, msg_id, data, data_length); - } -} - /* ================================================================================================== */ -void SusNode_ReportBadMessageLength(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) -{ - LOGOMATIC("Bad Suspension Node CAN Rx length! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); -} - -void SusNode_ReportUnhandledMessage(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id) -{ - LOGOMATIC("Unhandled Suspension Node CAN Rx msg! Bus: %d, Msg: %X, Sender: %X\n", bus_id, msg_id, sender_id); -} - -void SusNode_CAN_Send(GRCAN_BUS_ID bus_id, GRCAN_MSG_ID msg_id, GRCAN_NODE_ID sender_id, GRCAN_NODE_ID dest_id, void *data, uint32_t data_length) -{ - if (data_length > FDCAN_MAX_DATA_BYTES) { - LOGOMATIC("Tried to send more than 64 bytes over suspension node CAN!"); - } -} - int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { if (localNode != GRCAN_ALL) { From 1fe74c9703156f01b2a849ca55a0d8e6f305b7db Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 11 May 2026 18:48:36 -0700 Subject: [PATCH 121/158] literally just got started on the can send function --- SAMM/SuspensionNode/Inc/can_sus.h | 5 +++-- SAMM/SuspensionNode/Src/can_sus.c | 20 ++++++++++++++++---- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 9b67b0ab3..647d71034 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -34,7 +34,8 @@ typedef enum { CAN_DATAMAIN_BUS = 1 } CAN_SAMM_ROUTING_BUS; -int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID); -int can_mag_send(unsigned int *data); +void TireTemp_Callback(uint32_t id, void *data, uint32_t size); +void TCM_Callback(uint32_t id, void *data, uint32_t size); +int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus); #endif diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 97df47e90..c73d1712a 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -61,13 +61,17 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) { + if (sensorNode != GRCAN_ALL) { + LOGOMATIC("Suspension Node already initialized"); + return 0; + } + GRCAN_BusConfig bus_config; GRCAN_SetDefaultBusConfig(&bus_config, bus); -#if defined(STM32H5) - bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz - // defaults should work -#endif + #if defined(STM32H5) + bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz, defaults should work + #endif if (bus == CAN_SUBNET_BUS) { bus_config.fdcan_instance = FDCAN2; @@ -83,10 +87,18 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) LOGOMATIC("Failed to intialize Suspension CAN Bus"); return 0; } + GRCAN_SetLocalNodeID(LOCAL_GR_ID); return 1; // success } +int SusNode_CAN_Send(void *data) { + // send IMU and MAG data to TCM + typedef struct { + + } +} + /* ================================================================================================== */ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) From a266f638ccbb05a95316bd9a24f69c9b88cb5b6c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 01:50:01 +0000 Subject: [PATCH 122/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/can_sus.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index c73d1712a..9f5b522f9 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -69,9 +69,9 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) GRCAN_BusConfig bus_config; GRCAN_SetDefaultBusConfig(&bus_config, bus); - #if defined(STM32H5) - bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz, defaults should work - #endif +#if defined(STM32H5) + bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz, defaults should work +#endif if (bus == CAN_SUBNET_BUS) { bus_config.fdcan_instance = FDCAN2; @@ -92,10 +92,10 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 1; // success } -int SusNode_CAN_Send(void *data) { +int SusNode_CAN_Send(void *data) +{ // send IMU and MAG data to TCM typedef struct { - } } From a7dba1182f8caa3097c78e96cfb112ba10cfda0d Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 11 May 2026 21:49:59 -0700 Subject: [PATCH 123/158] Added function SusNode_CAN_Send + minor fixes to callback functions, also added struct IMU_Mag_Data in can_sus.h --- SAMM/IMU/Src/bmi323.c | 23 +++++++++---- SAMM/SuspensionNode/Inc/can_sus.h | 15 +++++++++ SAMM/SuspensionNode/Src/can_sus.c | 54 +++++++++++++------------------ 3 files changed, 53 insertions(+), 39 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 9f5a1f7b3..4a46e94b9 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -41,17 +41,26 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe /* TODO: VIN DO THESE FUNCYIONS */ -uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg) -{ - uint16_t data; - // i2c_read_single(BMI323_I2C_ADDR, reg, &data, bmi323_dev->i2c_port); - return data; +uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg) { + uint8_t tx_word[4] = {reg | 0x80, 0, 0, 0}; // Separate into two bytes + uint8_t rx_word[4] = {0}; + + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); // bmi323 chip select active low + HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 4, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); // Release chip select back to high + return ((uint16_t)rx_word[3] << 8) | rx_word[2]; } uint8_t bmi323_write(bmi323 *bmi323_dev, uint8_t reg, uint16_t data) { - // i2c_write(BMI323_I2C_ADDR, reg, data, bmi323_dev->i2c_port); - return 1; + uint8_t tx_word[3] = {reg, data & 0xFF, data >> 8}; // Separate into two bytes + uint8_t rx_word[3] = {0}; + + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); // bmi323 chip select active low + + HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 3, HAL_MAX_DELAY); + HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); // Release chip select back to high + return 0; } uint8_t bmi323_soft_reset(bmi323 *bmi323_dev) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 647d71034..cd04372f5 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -34,6 +34,21 @@ typedef enum { CAN_DATAMAIN_BUS = 1 } CAN_SAMM_ROUTING_BUS; +typedef struct { + uint16_t bmi323_acc_x; + uint16_t bmi323_acc_y; + uint16_t bmi323_acc_z; + uint16_t bmi323_gyro_x; + uint16_t bmi323_gyro_y; + uint16_t bmi323_gyro_z; + uint16_t bmi323_temp; + uint16_t bmi323_status; + uint16_t mag_angle; + int16_t mag_turns; + uint8_t mag_temp; + bool mag_status; +} IMU_Mag_Data; + void TireTemp_Callback(uint32_t id, void *data, uint32_t size); void TCM_Callback(uint32_t id, void *data, uint32_t size); int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus); diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 9f5b522f9..686509501 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -7,6 +7,7 @@ static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // q from shravya: what is GRCAN_AL static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; +static GRCAN_BUS_ID subnetBusMode = GRCAN_BUS_DATA_SUBNET; // still needs to be defined static GRCAN_NODE_ID sensorNode; // tire temp -> q from shravya: sensorNode declared twice? static data_length = 64; @@ -31,10 +32,7 @@ void TireTemp_Callback(uint32_t id, void *data, uint32_t size) uint32_t forward_data = (uint32_t *)data; - // q from shravya: doesn't this send from TCM to tire temp instead of other way around? - if (GRCAN_Fancy_ID.srcID == TCMNode) { - GRCAN_Fancy_Send(busMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); - } + GRCAN_Fancy_Send(busMode, TCMNode, GRCAN_Fancy_ID.messageID, data, size); } // For messages from TCM @@ -49,9 +47,7 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); // Forward all messages to subnet bus - // q from shravya: busMode is just the default bus... need to indicate that it's being sent thru - // subnet bus somehow? - GRCAN_Fancy_Send(busMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); + GRCAN_Fancy_Send(subnetBusMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { // Send ping back to sender on main data bus @@ -92,15 +88,29 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 1; // success } -int SusNode_CAN_Send(void *data) -{ - // send IMU and MAG data to TCM - typedef struct { +bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void* data) { + if (data == NULL) { + LOGOMATIC("Suspension Node CAN send: NULL data"); + } + + if (localNode == GRCAN_ALL) { + LOGOMATIC("Suspension Node not initialized"); } + + bool result = GRCAN_Fancy_Send(busMode, dest_node, msg_id, data, data_length); + + if (!result) { + LOGOMATIC("Suspension Node CAN send failed"); + return 0; + } + + return 1; } + /* ================================================================================================== */ +/* int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) { if (localNode != GRCAN_ALL) { @@ -151,24 +161,4 @@ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) } return 1; -} - -int can_mag_send(unsigned int *data) -{ - if (data == NULL) { - LOGOMATIC("can_mag_send: NULL data\n"); - return 0; - } - - if (localNode == GRCAN_ALL) { - LOGOMATIC("can_mag_send: CAN MAG not initialized\n"); - return 0; - } - - if (!GRCAN_Fancy_Send(busMode, destNode, msgID, (void *)data, 64)) { - LOGOMATIC("can_mag_send failed\n"); - return 0; - } - - return 1; -} +}*/ From a43ddbc716be72439fc4a2f6695e08129b2bdedf Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 11 May 2026 21:55:36 -0700 Subject: [PATCH 124/158] Removed old can_mag_init function --- SAMM/SuspensionNode/Src/can_sus.c | 38 +++---------------------------- 1 file changed, 3 insertions(+), 35 deletions(-) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 686509501..3c70afd8d 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -62,7 +62,7 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 0; } - GRCAN_BusConfig bus_config; + GRCAN_BusConfig bus_config = {0}; GRCAN_SetDefaultBusConfig(&bus_config, bus); #if defined(STM32H5) @@ -111,12 +111,7 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void* data) /* ================================================================================================== */ /* -int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) -{ - if (localNode != GRCAN_ALL) { - LOGOMATIC("CAN MAG already initialized\n"); - return 0; - } +todo: error checker stuff switch (init_msgID) { case CAN_MAG_MSG_DATA: @@ -134,31 +129,4 @@ int can_mag_init(GRCAN_NODE_ID mag_ID, CAN_MAG_MSG_ID init_msgID) break; } - GRCAN_BusConfig busCfg = {0}; - GRCAN_SetDefaultBusConfig(&busCfg, busMode); - -#if defined(STM32H5) - busCfg.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz - // defaults should work -#endif - - if (mag_ID == GRCAN_SAMM_Mag_1) { - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); - localNode = GRCAN_SAMM_Mag_1; - } else if (mag_ID == GRCAN_SAMM_Mag_2) { - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_2); - localNode = GRCAN_SAMM_Mag_2; - } else { - LOGOMATIC("Mag number not defined, defaulting to Mag 1\n"); - GRCAN_SetLocalNodeID(GRCAN_SAMM_Mag_1); - localNode = GRCAN_SAMM_Mag_1; - } - - if (!GRCAN_InitBus(&busCfg)) { - LOGOMATIC("CAN MAG bus init failed\n"); - localNode = GRCAN_ALL; - return 0; - } - - return 1; -}*/ +*/ From 0bb6432a608bb5fb520f07fee3d313c8e92e0dc5 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 04:56:59 +0000 Subject: [PATCH 125/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/IMU/Src/bmi323.c | 3 ++- SAMM/SuspensionNode/Src/can_sus.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 4a46e94b9..52caec72d 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -41,7 +41,8 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe /* TODO: VIN DO THESE FUNCYIONS */ -uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg) { +uint16_t bmi323_read(bmi323 *bmi323_dev, uint8_t reg) +{ uint8_t tx_word[4] = {reg | 0x80, 0, 0, 0}; // Separate into two bytes uint8_t rx_word[4] = {0}; diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 3c70afd8d..35c3b6f67 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -8,7 +8,7 @@ static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static GRCAN_BUS_ID subnetBusMode = GRCAN_BUS_DATA_SUBNET; // still needs to be defined -static GRCAN_NODE_ID sensorNode; // tire temp -> q from shravya: sensorNode declared twice? +static GRCAN_NODE_ID sensorNode; // tire temp -> q from shravya: sensorNode declared twice? static data_length = 64; // get rid of mag functions once their functionality added @@ -88,7 +88,8 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 1; // success } -bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void* data) { +bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) +{ if (data == NULL) { LOGOMATIC("Suspension Node CAN send: NULL data"); } @@ -107,7 +108,6 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void* data) return 1; } - /* ================================================================================================== */ /* From 085af869964235f0338aac8e100c9997ef96de75 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Mon, 11 May 2026 22:10:58 -0700 Subject: [PATCH 126/158] Updated Fancy Library to work with subnet, fixed charging for new ACU name convention --- G4FANCYCANTESTING/Core/Inc/can_cfg.h | 1 + .../Core/Src/FancyCAN_LoopbackTest.c | 92 +++++------------- .../Core/Src/FancyCAN_LoopbackTest.c | 97 +++++-------------- .../GRCAN/Inc/grcan_utils.h | 1 + .../GRCAN/Src/grcan_fancylayer.c | 48 +++++++-- .../GRCAN/Src/grcan_utils.c | 32 +++++- 6 files changed, 120 insertions(+), 151 deletions(-) diff --git a/G4FANCYCANTESTING/Core/Inc/can_cfg.h b/G4FANCYCANTESTING/Core/Inc/can_cfg.h index 5e7e78550..e3e479594 100644 --- a/G4FANCYCANTESTING/Core/Inc/can_cfg.h +++ b/G4FANCYCANTESTING/Core/Inc/can_cfg.h @@ -6,4 +6,5 @@ #define TX_BUFFER_2_SIZE 10 + #endif diff --git a/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c b/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c index a37f22118..6476af6a8 100644 --- a/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c +++ b/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -49,24 +49,9 @@ int GRCAN_Validate_InitBus(GRCAN_BUS_ID bus, GRCAN_OperatingMode mode, FDCAN_Glo } } -// GRCAN_ALL = 0xFF, -// GRCAN_ACU = 0x03, -// GRCAN_ECU = 0x02, -// GRCAN_CCU = 0x02, -// GRCAN_Charger = 0x00, -// GRCAN_Charging_SDC = 0x0C, -// GRCAN_DGPS = 0x30, -// GRCAN_Dash_Panel = 0x05, -// GRCAN_Debugger = 0x01, -// GRCAN_Fan_Controller_1 = 0x0D, -// GRCAN_Fan_Controller_2 = 0x0E, -// GRCAN_Fan_Controller_3 = 0x0F, -// GRCAN_GR_Inverter = 0x08, -// GRCAN_TCM = 0x04, - GRCAN_NODE_ID get_nodeID(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: return GRCAN_ACU; case GRCAN_BUS_DATA: @@ -74,57 +59,17 @@ GRCAN_NODE_ID get_nodeID(GRCAN_BUS_ID bus) case GRCAN_BUS_TESTING: return GRCAN_Debugger; case GRCAN_BUS_CHARGER: - return GRCAN_Charger; + return GRCAN_CCU; + case GRCAN_BUS_DATA_SUBNET: + return GRCAN_ECU; default: return GRCAN_ALL; // All causes error } } -// typedef enum { -// GRCAN_DEBUG_2_0 = 0x000, -// GRCAN_DEBUG_FD = 0x001, -// GRCAN_PING = 0x002, -// GRCAN_ECU_STATUS_1 = 0x003, -// GRCAN_ECU_STATUS_2 = 0x004, -// GRCAN_ECU_STATUS_3 = 0x005, -// GRCAN_ECU_CONFIG = 0x006, -// GRCAN_ACU_STATUS_1 = 0x007, -// GRCAN_ACU_STATUS_2 = 0x008, -// GRCAN_ACU_STATUS_3 = 0x009, -// GRCAN_ACU_PRECHARGE = 0x00A, -// GRCAN_ACU_CONFIG_CHARGE_PARAMETERS = 0x00B, -// GRCAN_ACU_CONFIG_OPERATIONAL_PARAMETERS = 0x00C, -// GRCAN_ACU_CELL_DATA_1 = 0x00D, -// GRCAN_ACU_CELL_DATA_2 = 0x00E, -// GRCAN_ACU_CELL_DATA_3 = 0x00F, -// GRCAN_ACU_CELL_DATA_4 = 0x010, -// GRCAN_ACU_CELL_DATA_5 = 0x011, -// GRCAN_INVERTER_STATUS_1 = 0x013, -// GRCAN_INVERTER_STATUS_2 = 0x014, -// GRCAN_INVERTER_STATUS_3 = 0x015, -// GRCAN_INVERTER_CONFIG = 0x016, -// GRCAN_INVERTER_COMMAND = 0x017, -// GRCAN_FAN_STATUS = 0x018, -// GRCAN_FAN_COMMAND = 0x019, -// GRCAN_DASH_STATUS = 0x01A, -// GRCAN_DASH_CONFIG = 0x01B, -// GRCAN_TCM_STATUS = 0x029, -// GRCAN_TCM_RESOURCE_UTILIZATION = 0x02A, -// GRCAN_DASH_WARNING_FLAGS = 0x02B, -// GRCAN_ECU_ANALOG_DATA = 0x02E, -// GRCAN_GPS_LAT = 0x031, -// GRCAN_GPS_LON = 0x032, -// GRCAN_GPS_ALT = 0x033, -// GRCAN_GPS_PX = 0x034, -// GRCAN_GPS_QY = 0x035, -// GRCAN_GPS_RZ = 0x036, -// GRCAN_UVW_DGPS = 0x030, -// GRCAN_ECU_PERFORMANCE = 0x123, -// } GRCAN_MSG_ID; - GRCAN_MSG_ID get_messageID(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: return GRCAN_ACU_STATUS_1; case GRCAN_BUS_DATA: @@ -133,6 +78,8 @@ GRCAN_MSG_ID get_messageID(GRCAN_BUS_ID bus) return GRCAN_DEBUG_2_0; case GRCAN_BUS_CHARGER: return GRCAN_ACU_CONFIG_CHARGE_PARAMETERS; + case GRCAN_BUS_DATA_SUBNET: + return GRCAN_ECU_STATUS_1; default: return (GRCAN_MSG_ID)0xFF; // Invalid message ID } @@ -303,7 +250,7 @@ int FancyCAN_LoopbackTest(void) { GRCAN_BUS_ID bus; - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing bus %d ---\n", bus); int res1 = GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); // GRCAN_OPMODE_EXTERNAL_LOOPBACK needs to be tested, can change FDCAN: make sure to #define USECANx @@ -320,7 +267,7 @@ int FancyCAN_LoopbackTest(void) res2 = GRCAN_SendReceive(bus, nodeID, dest_nodeID, messageID, data, size); // if (res2 == 0) { uint8_t data_value = *(uint8_t *)data; - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED for message with first byte: %d.\n", data_value); break; @@ -333,6 +280,9 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_TESTING: LOGOMATIC("Testing Bus:TESTING Loopback Test FAILED for message with first byte: %d.\n", data_value); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED for message with first byte: %d.\n", data_value); break; @@ -344,7 +294,7 @@ int FancyCAN_LoopbackTest(void) bool res4 = GRCAN_DeactivateBus(bus); if (!res1 || !res2) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during initialization or send/receive test.\n"); break; @@ -357,13 +307,16 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_CHARGER: LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during initialization or send/receive test.\n"); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED during initialization or send/receive test.\n"); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during initialization or send/receive test.\n"); break; } } if (!res4) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during bus deactivation.\n"); break; @@ -376,6 +329,9 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_CHARGER: LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during bus deactivation.\n"); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED during bus deactivation.\n"); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during bus deactivation.\n"); break; @@ -383,13 +339,13 @@ int FancyCAN_LoopbackTest(void) } } - if (bus < 4) { + if (bus < 5) { LOGOMATIC("\nLoopback Test FAILED. Not all buses were tested.\n"); return 0; } - // The next tests takes a while, completely fine to remove - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER+1; bus++) { LOGOMATIC("\n--- Testing burst send on bus %d ---\n", bus); GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); int burst_result = GRCAN_BurstSendTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), 100); @@ -400,7 +356,7 @@ int FancyCAN_LoopbackTest(void) GRCAN_DeactivateBus(bus); } - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing init/deactivate stress test on bus %d ---\n", bus); int stress_result = GRCAN_InitDeactivateStressTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), FDCAN2, 50); if (!stress_result) { diff --git a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c index f9eca982a..356ba85bb 100644 --- a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c +++ b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -49,90 +49,37 @@ int GRCAN_Validate_InitBus(GRCAN_BUS_ID bus, GRCAN_OperatingMode mode, FDCAN_Glo } } -// GRCAN_ALL = 0xFF, -// GRCAN_BCU = 0x03, -// GRCAN_ECU = 0x02, -// GRCAN_CCU = 0x02, -// GRCAN_Charger = 0x00, -// GRCAN_Charging_SDC = 0x0C, -// GRCAN_DGPS = 0x30, -// GRCAN_Dash_Panel = 0x05, -// GRCAN_Debugger = 0x01, -// GRCAN_Fan_Controller_1 = 0x0D, -// GRCAN_Fan_Controller_2 = 0x0E, -// GRCAN_Fan_Controller_3 = 0x0F, -// GRCAN_GR_Inverter = 0x08, -// GRCAN_TCM = 0x04, - GRCAN_NODE_ID get_nodeID(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: - return GRCAN_BCU; + return GRCAN_ACU; case GRCAN_BUS_DATA: return GRCAN_ECU; case GRCAN_BUS_TESTING: return GRCAN_Debugger; case GRCAN_BUS_CHARGER: - return GRCAN_Charger; + return GRCAN_CCU; + case GRCAN_BUS_DATA_SUBNET: + return GRCAN_ECU; default: return GRCAN_ALL; // All causes error } } -// typedef enum { -// GRCAN_DEBUG_2_0 = 0x000, -// GRCAN_DEBUG_FD = 0x001, -// GRCAN_PING = 0x002, -// GRCAN_ECU_STATUS_1 = 0x003, -// GRCAN_ECU_STATUS_2 = 0x004, -// GRCAN_ECU_STATUS_3 = 0x005, -// GRCAN_ECU_CONFIG = 0x006, -// GRCAN_BCU_STATUS_1 = 0x007, -// GRCAN_BCU_STATUS_2 = 0x008, -// GRCAN_BCU_STATUS_3 = 0x009, -// GRCAN_BCU_PRECHARGE = 0x00A, -// GRCAN_BCU_CONFIG_CHARGE_PARAMETERS = 0x00B, -// GRCAN_BCU_CONFIG_OPERATIONAL_PARAMETERS = 0x00C, -// GRCAN_BCU_CELL_DATA_1 = 0x00D, -// GRCAN_BCU_CELL_DATA_2 = 0x00E, -// GRCAN_BCU_CELL_DATA_3 = 0x00F, -// GRCAN_BCU_CELL_DATA_4 = 0x010, -// GRCAN_BCU_CELL_DATA_5 = 0x011, -// GRCAN_INVERTER_STATUS_1 = 0x013, -// GRCAN_INVERTER_STATUS_2 = 0x014, -// GRCAN_INVERTER_STATUS_3 = 0x015, -// GRCAN_INVERTER_CONFIG = 0x016, -// GRCAN_INVERTER_COMMAND = 0x017, -// GRCAN_FAN_STATUS = 0x018, -// GRCAN_FAN_COMMAND = 0x019, -// GRCAN_DASH_STATUS = 0x01A, -// GRCAN_DASH_CONFIG = 0x01B, -// GRCAN_TCM_STATUS = 0x029, -// GRCAN_TCM_RESOURCE_UTILIZATION = 0x02A, -// GRCAN_DASH_WARNING_FLAGS = 0x02B, -// GRCAN_ECU_ANALOG_DATA = 0x02E, -// GRCAN_GPS_LAT = 0x031, -// GRCAN_GPS_LON = 0x032, -// GRCAN_GPS_ALT = 0x033, -// GRCAN_GPS_PX = 0x034, -// GRCAN_GPS_QY = 0x035, -// GRCAN_GPS_RZ = 0x036, -// GRCAN_UVW_DGPS = 0x030, -// GRCAN_ECU_PERFORMANCE = 0x123, -// } GRCAN_MSG_ID; - GRCAN_MSG_ID get_messageID(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: - return GRCAN_BCU_STATUS_1; + return GRCAN_ACU_STATUS_1; case GRCAN_BUS_DATA: return GRCAN_ECU_STATUS_1; case GRCAN_BUS_TESTING: return GRCAN_DEBUG_2_0; case GRCAN_BUS_CHARGER: - return GRCAN_BCU_CONFIG_CHARGE_PARAMETERS; + return GRCAN_ACU_CONFIG_CHARGE_PARAMETERS; + case GRCAN_BUS_DATA_SUBNET: + return GRCAN_ECU_STATUS_1; default: return (GRCAN_MSG_ID)0xFF; // Invalid message ID } @@ -303,7 +250,7 @@ int FancyCAN_LoopbackTest(void) { GRCAN_BUS_ID bus; - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing bus %d ---\n", bus); int res1 = GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); // GRCAN_OPMODE_EXTERNAL_LOOPBACK needs to be tested, can change FDCAN: make sure to #define USECANx @@ -320,7 +267,7 @@ int FancyCAN_LoopbackTest(void) res2 = GRCAN_SendReceive(bus, nodeID, dest_nodeID, messageID, data, size); // if (res2 == 0) { uint8_t data_value = *(uint8_t *)data; - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED for message with first byte: %d.\n", data_value); break; @@ -333,6 +280,9 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_TESTING: LOGOMATIC("Testing Bus:TESTING Loopback Test FAILED for message with first byte: %d.\n", data_value); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED for message with first byte: %d.\n", data_value); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED for message with first byte: %d.\n", data_value); break; @@ -344,7 +294,7 @@ int FancyCAN_LoopbackTest(void) bool res4 = GRCAN_DeactivateBus(bus); if (!res1 || !res2) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during initialization or send/receive test.\n"); break; @@ -357,13 +307,16 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_CHARGER: LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during initialization or send/receive test.\n"); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED during initialization or send/receive test.\n"); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during initialization or send/receive test.\n"); break; } } if (!res4) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: LOGOMATIC("Testing Bus:PRIMARY Loopback Test FAILED during bus deactivation.\n"); break; @@ -376,6 +329,9 @@ int FancyCAN_LoopbackTest(void) case GRCAN_BUS_CHARGER: LOGOMATIC("Testing Bus:CHARGER Loopback Test FAILED during bus deactivation.\n"); break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("Testing Bus:DATA_SUBNET Loopback Test FAILED during bus deactivation.\n"); + break; default: LOGOMATIC("Testing Bus:UNKNOWN Loopback Test FAILED during bus deactivation.\n"); break; @@ -383,13 +339,12 @@ int FancyCAN_LoopbackTest(void) } } - if (bus < 4) { + if (bus < 5) { LOGOMATIC("\nLoopback Test FAILED. Not all buses were tested.\n"); return 0; } - // The next tests takes a while, completely fine to remove - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER+1; bus++) { LOGOMATIC("\n--- Testing burst send on bus %d ---\n", bus); GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); int burst_result = GRCAN_BurstSendTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), 100); @@ -400,7 +355,7 @@ int FancyCAN_LoopbackTest(void) GRCAN_DeactivateBus(bus); } - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing init/deactivate stress test on bus %d ---\n", bus); int stress_result = GRCAN_InitDeactivateStressTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), FDCAN2, 50); if (!stress_result) { diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h index 86d6fa5eb..84cfc48f8 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h @@ -11,6 +11,7 @@ #ifndef GRCAN_UTILS_H #define GRCAN_UTILS_H +#define GRCAN_BUS_DATA_SUBNET ((GRCAN_BUS_ID)4) //could be source of error typedef enum { GRCAN_MODE_CLASSIC, GRCAN_MODE_FD diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 4cc460bfa..cb5111c84 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -11,6 +11,7 @@ static CANHandle *grcan_primary = NULL; static CANHandle *grcan_data = NULL; static CANHandle *grcan_testing = NULL; static CANHandle *grcan_charging = NULL; +static CANHandle *grcan_data_subnet = NULL; // typedef struct { // FDCAN_HandleTypeDef *hal_fdcanP; @@ -42,7 +43,7 @@ bool GRCAN_ValidateBusConfig(GRCAN_BusConfig *bus_config) CANHandle *GRCAN_GetHandle(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: return grcan_primary; case GRCAN_BUS_DATA: @@ -51,6 +52,9 @@ CANHandle *GRCAN_GetHandle(GRCAN_BUS_ID bus) return grcan_testing; case GRCAN_BUS_CHARGER: return grcan_charging; + case GRCAN_BUS_DATA_SUBNET: // Subnet bus, ghost bus for SAMM boards (4) + LOGOMATIC("GRCAN_GetHandle: returning handle for subnet bus\n"); + return grcan_data_subnet; default: return NULL; } @@ -123,11 +127,6 @@ bool GRCAN_InitBus(GRCAN_BusConfig *bus_config) return false; } - if (!GRCAN_ValidateBusConfig(bus_config)) { - LOGOMATIC("GRCAN_InitBus: invalid config for bus %d\n", bus_config->bus); - return false; - } - enable_port_clock(bus_config->rx_pin.port); enable_port_clock(bus_config->tx_pin.port); @@ -174,24 +173,53 @@ bool GRCAN_InitBus(GRCAN_BusConfig *bus_config) cfg.init_tx_gpio.Speed = GPIO_SPEED_FREQ_VERY_HIGH; cfg.init_tx_gpio.Alternate = bus_config->tx_pin.alternate_function; - switch (bus_config->bus) { + switch ((int)bus_config->bus) { case GRCAN_BUS_PRIMARY: + if (grcan_primary != NULL) { + LOGOMATIC("GRCAN_InitBus: primary bus already initialized\n"); + return false; + } slot = &grcan_primary; break; case GRCAN_BUS_DATA: + if (grcan_data != NULL) { + LOGOMATIC("GRCAN_InitBus: data bus already initialized\n"); + return false; + } slot = &grcan_data; break; case GRCAN_BUS_TESTING: + if (grcan_testing != NULL) { + LOGOMATIC("GRCAN_InitBus: testing bus already initialized\n"); + return false; + } slot = &grcan_testing; break; case GRCAN_BUS_CHARGER: + if (grcan_charging != NULL) { + LOGOMATIC("GRCAN_InitBus: charging bus already initialized\n"); + return false; + } slot = &grcan_charging; break; + case GRCAN_BUS_DATA_SUBNET: + if (grcan_data_subnet != NULL) { + LOGOMATIC("GRCAN_InitBus: subnet bus already initialized\n"); + return false; + } + LOGOMATIC("GRCAN_InitBus: initializing subnet bus\n"); + slot = &grcan_data_subnet; + break; default: LOGOMATIC("GRCAN_InitBus: invalid bus %d\n", bus_config->bus); return false; } + if (!GRCAN_ValidateBusConfig(bus_config)) { + LOGOMATIC("GRCAN_InitBus: invalid config for bus %d\n", bus_config->bus); + return false; + } + handle = can_init(&cfg); if (handle == NULL) { LOGOMATIC("\nGRCAN_InitBus: can_init failed for bus %d\n", bus_config->bus); @@ -243,7 +271,7 @@ bool GRCAN_DeactivateBus(GRCAN_BUS_ID bus) deactivate_port_clock(rx); deactivate_port_clock(tx); - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: grcan_primary = NULL; break; @@ -256,6 +284,10 @@ bool GRCAN_DeactivateBus(GRCAN_BUS_ID bus) case GRCAN_BUS_CHARGER: grcan_charging = NULL; break; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("GRCAN_DeactivateBus: deactivating subnet bus\n"); + grcan_data_subnet = NULL; + break; default: LOGOMATIC("GRCAN_DeactivateBus: invalid bus %d\n", bus); return false; diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c index 4cb000a58..87fcadab3 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c @@ -9,7 +9,7 @@ GRCAN_BusMode GRCAN_BusModeForBus(GRCAN_BUS_ID bus) { - switch (bus) { + switch ((int)bus) { case GRCAN_BUS_PRIMARY: return GRCAN_MODE_FD; case GRCAN_BUS_TESTING: @@ -18,6 +18,9 @@ GRCAN_BusMode GRCAN_BusModeForBus(GRCAN_BUS_ID bus) return GRCAN_MODE_CLASSIC; case GRCAN_BUS_CHARGER: return GRCAN_MODE_CLASSIC; // update later + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("GRCAN_BusModeForBus: returning bus mode for subnet bus\n"); + return GRCAN_MODE_FD; default: LOGOMATIC("GRCAN_BusModeForBus: unknown bus %d\n", bus); return GRCAN_MODE_CLASSIC; @@ -161,6 +164,27 @@ GRCAN_ClockSource GRCAN_DefaultClockSource(void) #endif } +GRCAN_FrameFormat GRCAN_Frame_FormatForBus(GRCAN_BUS_ID bus) { + //This is an educate guess, the frame format for FD may change to GRCAN_FRAME_FD_BRS + switch ((int)bus) { + case GRCAN_BUS_PRIMARY: + return GRCAN_FRAME_FD_NO_BRS; + case GRCAN_BUS_TESTING: + return GRCAN_FRAME_FD_NO_BRS; + case GRCAN_BUS_DATA: + return GRCAN_FRAME_CLASSIC; + case GRCAN_BUS_CHARGER: + return GRCAN_FRAME_CLASSIC; + case GRCAN_BUS_DATA_SUBNET: + LOGOMATIC("GRCAN_Frame_FormatForBus: returning frame format for subnet bus\n"); + return GRCAN_FRAME_FD_NO_BRS; + default: + LOGOMATIC("GRCAN_Frame_FormatForBus: unknown bus %d\n", bus); + return GRCAN_FRAME_CLASSIC; + } +} + + void GRCAN_SetDefaultBusConfig(GRCAN_BusConfig *busCfg, GRCAN_BUS_ID bus) { if (busCfg == NULL) { @@ -168,15 +192,15 @@ void GRCAN_SetDefaultBusConfig(GRCAN_BusConfig *busCfg, GRCAN_BUS_ID bus) return; } - busCfg->fdcan_instance = FDCAN2; - memset(busCfg, 0, sizeof(*busCfg)); + busCfg->fdcan_instance = FDCAN2; + busCfg->bus = bus; busCfg->clock_source = GRCAN_DefaultClockSource(); busCfg->clock_divider = GRCAN_CLK_DIV1; - busCfg->frame_format = GRCAN_FRAME_FD_NO_BRS; + busCfg->frame_format = GRCAN_Frame_FormatForBus(bus); busCfg->operating_mode = GRCAN_OPMODE_NORMAL; busCfg->auto_retransmission = GRCAN_Feature_ENABLE; From 69f747cdcaddda0b231784660c84071a53acdb5e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 05:13:38 +0000 Subject: [PATCH 127/158] Automatic Clang-Format: Standardized formatting automatically --- G4FANCYCANTESTING/Core/Inc/can_cfg.h | 1 - G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c | 3 +-- H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c | 2 +- Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h | 2 +- Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c | 6 +++--- 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/G4FANCYCANTESTING/Core/Inc/can_cfg.h b/G4FANCYCANTESTING/Core/Inc/can_cfg.h index e3e479594..5e7e78550 100644 --- a/G4FANCYCANTESTING/Core/Inc/can_cfg.h +++ b/G4FANCYCANTESTING/Core/Inc/can_cfg.h @@ -6,5 +6,4 @@ #define TX_BUFFER_2_SIZE 10 - #endif diff --git a/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c b/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c index 6476af6a8..89cac185c 100644 --- a/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c +++ b/G4FANCYCANTESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -344,8 +344,7 @@ int FancyCAN_LoopbackTest(void) return 0; } - - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER+1; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing burst send on bus %d ---\n", bus); GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); int burst_result = GRCAN_BurstSendTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), 100); diff --git a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c index 356ba85bb..89cac185c 100644 --- a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c +++ b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -344,7 +344,7 @@ int FancyCAN_LoopbackTest(void) return 0; } - for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER+1; bus++) { + for (bus = GRCAN_BUS_TESTING; bus <= GRCAN_BUS_CHARGER + 1; bus++) { LOGOMATIC("\n--- Testing burst send on bus %d ---\n", bus); GRCAN_Validate_InitBus(bus, GRCAN_OPMODE_INTERNAL_LOOPBACK, FDCAN2); int burst_result = GRCAN_BurstSendTest(bus, get_nodeID(bus), get_nodeID(bus), get_messageID(bus), 100); diff --git a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h index 84cfc48f8..95d0b00ce 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h +++ b/Lib/FancyLayers-RENAME/GRCAN/Inc/grcan_utils.h @@ -11,7 +11,7 @@ #ifndef GRCAN_UTILS_H #define GRCAN_UTILS_H -#define GRCAN_BUS_DATA_SUBNET ((GRCAN_BUS_ID)4) //could be source of error +#define GRCAN_BUS_DATA_SUBNET ((GRCAN_BUS_ID)4) // could be source of error typedef enum { GRCAN_MODE_CLASSIC, GRCAN_MODE_FD diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c index 87fcadab3..1b9ee24cd 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_utils.c @@ -164,8 +164,9 @@ GRCAN_ClockSource GRCAN_DefaultClockSource(void) #endif } -GRCAN_FrameFormat GRCAN_Frame_FormatForBus(GRCAN_BUS_ID bus) { - //This is an educate guess, the frame format for FD may change to GRCAN_FRAME_FD_BRS +GRCAN_FrameFormat GRCAN_Frame_FormatForBus(GRCAN_BUS_ID bus) +{ + // This is an educate guess, the frame format for FD may change to GRCAN_FRAME_FD_BRS switch ((int)bus) { case GRCAN_BUS_PRIMARY: return GRCAN_FRAME_FD_NO_BRS; @@ -184,7 +185,6 @@ GRCAN_FrameFormat GRCAN_Frame_FormatForBus(GRCAN_BUS_ID bus) { } } - void GRCAN_SetDefaultBusConfig(GRCAN_BusConfig *busCfg, GRCAN_BUS_ID bus) { if (busCfg == NULL) { From 3ab8b0073b955288ed90ee803ee04f023bfc9fba Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 11 May 2026 22:13:57 -0700 Subject: [PATCH 128/158] Corrected node ID --- SAMM/SuspensionNode/GRCAN/NodeID.h | 2 +- SAMM/SuspensionNode/Src/can_sus.c | 30 +++++++++++++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/SAMM/SuspensionNode/GRCAN/NodeID.h b/SAMM/SuspensionNode/GRCAN/NodeID.h index 360e84eaf..e290a4c37 100644 --- a/SAMM/SuspensionNode/GRCAN/NodeID.h +++ b/SAMM/SuspensionNode/GRCAN/NodeID.h @@ -6,7 +6,7 @@ #ifndef NODE #pragma message("NODE is not defined. Please compile Suspension Node for a specific target. Defaulting to FL.") -#define LOCAL_GR_ID GRCAN_SuspensionNode_FL +#define LOCAL_GR_ID GRCAN_Suspension_FL #else #define LOCAL_GR_ID CONCAT(GRCAN_SuspensionNode_, NODE) #endif diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 35c3b6f67..bdc0e24f9 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,23 +1,22 @@ #include "can_sus.h" - #include "can_cfg.h" -// static GRCAN_NODE_ID localNode = GRCAN_ALL; -static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // q from shravya: what is GRCAN_ALL? +static GRCAN_NODE_ID sensorNode = GRCAN_ALL; static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; static GRCAN_BUS_ID subnetBusMode = GRCAN_BUS_DATA_SUBNET; // still needs to be defined -static GRCAN_NODE_ID sensorNode; // tire temp -> q from shravya: sensorNode declared twice? static data_length = 64; -// get rid of mag functions once their functionality added +// get rid of mag functions once their functionality added -> need to add error checking, otherwise DONE // fix callbacks for all requried functionality -// might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) +// might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) -> DONE // might be better way to do this // check if came from tire temp or tcm in the callback-- should not interfere // might need to get rid of TCM checking if you really want to forward everything -// handle sensorNode logic in init, you can use enum in can_sus.h +// handle sensorNode logic in init, you can use enum in can_sus.h -> DONE + +// lowkey change naming -> low priority, do after everything else // For messages from tire temp void TireTemp_Callback(uint32_t id, void *data, uint32_t size) @@ -32,6 +31,7 @@ void TireTemp_Callback(uint32_t id, void *data, uint32_t size) uint32_t forward_data = (uint32_t *)data; + // Forward messages to TCM via main data bus GRCAN_Fancy_Send(busMode, TCMNode, GRCAN_Fancy_ID.messageID, data, size); } @@ -46,7 +46,7 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); - // Forward all messages to subnet bus + // Forward all messages to tire temp sensor via subnet bus GRCAN_Fancy_Send(subnetBusMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { @@ -84,7 +84,19 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) return 0; } - GRCAN_SetLocalNodeID(LOCAL_GR_ID); + GRCAN_SetLocalNodeID(localNode); + + switch (localNode) { + case Sus_FL: + sensorNode = TireTemp_FL; + case Sus_FR: + sensorNode = TireTemp_FR; + case Sus_RL: + sensorNode = TireTemp_RL; + case Sus_RR: + sensorNode = TireTemp_RR; + } + return 1; // success } From 28b486dc33ca6e4eb8822cc184972a46a8b5e9af Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Mon, 11 May 2026 22:14:57 -0700 Subject: [PATCH 129/158] Merge Conflict --- Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c index 45838e7dd..cb5111c84 100644 --- a/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c +++ b/Lib/FancyLayers-RENAME/GRCAN/Src/grcan_fancylayer.c @@ -9,7 +9,6 @@ static CANHandle *grcan_primary = NULL; static CANHandle *grcan_data = NULL; -static CANHandle *grcan_data_subnet = NULL; static CANHandle *grcan_testing = NULL; static CANHandle *grcan_charging = NULL; static CANHandle *grcan_data_subnet = NULL; From cfa71d14eb46b312d58259210332127a5f3aeb1f Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 12 May 2026 05:16:51 +0000 Subject: [PATCH 130/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/SuspensionNode/Src/can_sus.c | 1 + 1 file changed, 1 insertion(+) diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index bdc0e24f9..c64422889 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,4 +1,5 @@ #include "can_sus.h" + #include "can_cfg.h" static GRCAN_NODE_ID sensorNode = GRCAN_ALL; From 98ea06a5d8b378fe6cb451ab7d95b47f35aa33aa Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 14 May 2026 20:59:52 -0700 Subject: [PATCH 131/158] can_sus.h and can_sus.c completed -- untested --- SAMM/SuspensionNode/Inc/can_sus.h | 18 +++----- SAMM/SuspensionNode/Src/can_sus.c | 75 ++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index cd04372f5..423c62fd4 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -1,13 +1,11 @@ -#ifndef CAN_MAG_H -#define CAN_MAG_H - -#include +#ifndef CAN_SUS_H +#define CAN_SUS_H #include "GRCAN_FancyLayer.h" #include "Logomatic.h" #include "NodeID.h" - -static GRCAN_NODE_ID destNode = GRCAN_TCM; +#include +#include typedef enum { CAN_SUS_MSG_DATA = 0x2C, @@ -29,11 +27,6 @@ typedef enum { Sus_RR = GRCAN_Suspension_RR } Sus_Node; -typedef enum { - CAN_SUBNET_BUS = 0, - CAN_DATAMAIN_BUS = 1 -} CAN_SAMM_ROUTING_BUS; - typedef struct { uint16_t bmi323_acc_x; uint16_t bmi323_acc_y; @@ -51,6 +44,7 @@ typedef struct { void TireTemp_Callback(uint32_t id, void *data, uint32_t size); void TCM_Callback(uint32_t id, void *data, uint32_t size); -int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus); +int SusNode_CAN_Init(GRCAN_BUS_ID busID); +bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data); #endif diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index c64422889..fe5547a43 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,14 +1,15 @@ #include "can_sus.h" - #include "can_cfg.h" static GRCAN_NODE_ID sensorNode = GRCAN_ALL; static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_BUS_ID subnetBusMode = GRCAN_BUS_DATA_SUBNET; // still needs to be defined -static data_length = 64; +static GRCAN_BUS_ID subnetBus = GRCAN_BUS_DATA_SUBNET; // still needs to be defined +static uint32_t data_length = 64; +uint32_t *forwarded_tire_temp_data = 0; +uint32_t *forwarded_TCM_data = 0; // get rid of mag functions once their functionality added -> need to add error checking, otherwise DONE // fix callbacks for all requried functionality // might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) -> DONE @@ -30,9 +31,9 @@ void TireTemp_Callback(uint32_t id, void *data, uint32_t size) GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); - uint32_t forward_data = (uint32_t *)data; + forwarded_tire_temp_data = (uint32_t *)data; - // Forward messages to TCM via main data bus + // Forward messages to TCM via main data bus -- does not filter anything right now (should only be tire temp though) GRCAN_Fancy_Send(busMode, TCMNode, GRCAN_Fancy_ID.messageID, data, size); } @@ -47,8 +48,9 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); - // Forward all messages to tire temp sensor via subnet bus - GRCAN_Fancy_Send(subnetBusMode, sensorNode, GRCAN_Fancy_ID.messageID, data, size); + forwarded_TCM_data = (uint32_t *)data; + // Forward all messages to tire temp sensor via subnet bus -- does not filter for anything right now + GRCAN_Fancy_Send(subnetBus, sensorNode, GRCAN_Fancy_ID.messageID, data, size); if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { // Send ping back to sender on main data bus @@ -56,10 +58,12 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) } } -int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) +int SusNode_CAN_Init(GRCAN_BUS_ID busID) { - if (sensorNode != GRCAN_ALL) { - LOGOMATIC("Suspension Node already initialized"); + int bus = (int)busID; //technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int + + if (bus != GRCAN_BUS_DATA && bus != GRCAN_BUS_DATA_SUBNET) { + LOGOMATIC("Invalid bus for Suspension Node CAN Init"); return 0; } @@ -70,12 +74,34 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz, defaults should work #endif - if (bus == CAN_SUBNET_BUS) { + if (bus == GRCAN_BUS_DATA_SUBNET) { bus_config.fdcan_instance = FDCAN2; bus_config.rx_callback = TireTemp_Callback; // callback - } else if (bus == CAN_DATAMAIN_BUS) { + } else if (bus == GRCAN_BUS_DATA) { bus_config.fdcan_instance = FDCAN1; bus_config.rx_callback = TCM_Callback; // callback + + Sus_Node sus_node = localNode; + TireTemp_Node tire_temp_node; + switch(sus_node){ + case Sus_FL: + tire_temp_node = TireTemp_FL; + break; + case Sus_FR: + tire_temp_node = TireTemp_FR; + break; + case Sus_RL: + tire_temp_node = TireTemp_RL; + break; + case Sus_RR: + tire_temp_node = TireTemp_RR; + break; + default: + LOGOMATIC("Invalid suspension node, defaulting to FL\n"); + tire_temp_node = TireTemp_FL; + break; + } + sensorNode = tire_temp_node; } bool result = GRCAN_InitBus(&bus_config); @@ -87,17 +113,6 @@ int SusNode_CAN_Init(CAN_SAMM_ROUTING_BUS bus) GRCAN_SetLocalNodeID(localNode); - switch (localNode) { - case Sus_FL: - sensorNode = TireTemp_FL; - case Sus_FR: - sensorNode = TireTemp_FR; - case Sus_RL: - sensorNode = TireTemp_RL; - case Sus_RR: - sensorNode = TireTemp_RR; - } - return 1; // success } @@ -105,20 +120,26 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) { if (data == NULL) { LOGOMATIC("Suspension Node CAN send: NULL data"); + return false; } - if (localNode == GRCAN_ALL) { - LOGOMATIC("Suspension Node not initialized"); + switch ((Sus_MSG_ID)msg_id) { + case CAN_SUS_MSG_DATA: break; + case CAN_SUS_MSG_STATUS: break; + case CAN_SUS_MSG_FAULT: break; + default: + LOGOMATIC("Invalid Suspension Node message ID, defaulting to DATA\n"); + msg_id = CAN_SUS_MSG_DATA; + break; } bool result = GRCAN_Fancy_Send(busMode, dest_node, msg_id, data, data_length); if (!result) { LOGOMATIC("Suspension Node CAN send failed"); - return 0; } - return 1; + return result; } /* ================================================================================================== */ From 3d4e137b7db32e0440ade5b4d58a00ee3ed63573 Mon Sep 17 00:00:00 2001 From: Kiran Duriseti Date: Thu, 14 May 2026 21:37:20 -0700 Subject: [PATCH 132/158] compiles, linker failed --- SAMM/IMU/Src/bmi323.c | 5 +++++ SAMM/SuspensionNode/Src/can_sus.c | 29 +++---------------------- SAMM/SuspensionNode/Src/main.c | 35 +++++++++++++++++++------------ 3 files changed, 30 insertions(+), 39 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 52caec72d..2be57fb0e 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -86,6 +86,11 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT 8. If successful, reset the accelerometer and gyro to their original configuration 9. Done */ + +uint32_t MillisecondsSinceBoot() +{ + return HAL_GetTick() * HAL_GetTickFreq(); +} uint8_t bmi323_calib(bmi323 *bmi323_dev) { // first we have to fucking start the feature engine diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index fe5547a43..fe2f8beb6 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -81,7 +81,7 @@ int SusNode_CAN_Init(GRCAN_BUS_ID busID) bus_config.fdcan_instance = FDCAN1; bus_config.rx_callback = TCM_Callback; // callback - Sus_Node sus_node = localNode; + Sus_Node sus_node = (Sus_Node)localNode; TireTemp_Node tire_temp_node; switch(sus_node){ case Sus_FL: @@ -101,7 +101,7 @@ int SusNode_CAN_Init(GRCAN_BUS_ID busID) tire_temp_node = TireTemp_FL; break; } - sensorNode = tire_temp_node; + sensorNode = (GRCAN_NODE_ID)tire_temp_node; } bool result = GRCAN_InitBus(&bus_config); @@ -129,7 +129,7 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) case CAN_SUS_MSG_FAULT: break; default: LOGOMATIC("Invalid Suspension Node message ID, defaulting to DATA\n"); - msg_id = CAN_SUS_MSG_DATA; + msg_id = (GRCAN_MSG_ID)CAN_SUS_MSG_DATA; break; } @@ -141,26 +141,3 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) return result; } - -/* ================================================================================================== */ - -/* -todo: error checker stuff - - switch (init_msgID) { - case CAN_MAG_MSG_DATA: - msgID = init_msgID; - break; - case CAN_MAG_MSG_STATUS: - msgID = init_msgID; - break; - case CAN_MAG_MSG_FAULT: - msgID = init_msgID; - break; - default: - LOGOMATIC("Invalid MAG message ID, defaulting to DATA\n"); - msgID = CAN_MAG_MSG_DATA; - break; - } - -*/ diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index ca739637c..048f5a4c9 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -111,7 +111,8 @@ int main(void) MX_SPI1_Init(); MX_SPI3_Init(); /* USER CODE BEGIN 2 */ - can_mag_init(GRCAN_SAMM_Mag_1, CAN_MAG_MSG_DATA); + SusNode_CAN_Init(GRCAN_BUS_DATA); + SusNode_CAN_Init(GRCAN_BUS_DATA_SUBNET); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); @@ -185,24 +186,32 @@ int main(void) if (bad) { LOGOMATIC("Something is cooked"); - mag_clear_errors(&mag_dev); + //mag_clear_errors(&mag_dev); } - uint8_t buffer[8] = {0}; - buffer[0] = (angle >> 8) & 0xFF; - buffer[1] = angle & 0xFF; + // uint8_t buffer[8] = {0}; + // buffer[0] = (angle >> 8) & 0xFF; + // buffer[1] = angle & 0xFF; - buffer[2] = temp; + // buffer[2] = temp; - buffer[3] = (turns >> 8) & 0xFF; - buffer[4] = turns & 0xFF; + // buffer[3] = (turns >> 8) & 0xFF; + // buffer[4] = turns & 0xFF; - // status - buffer[5] = bad ? 0x01 : 0x00; - buffer[6] = 0x00; - buffer[7] = 0x00; + // // status + // buffer[5] = bad ? 0x01 : 0x00; + // buffer[6] = 0x00; + // buffer[7] = 0x00; - can_mag_send((unsigned int *)buffer); + IMU_Mag_Data test_data; + test_data.mag_angle = angle; + test_data.mag_temp = temp; + test_data.mag_turns = turns; + test_data.mag_status = !bad; + + GRCAN_NODE_ID test_dest_node = GRCAN_TCM; + GRCAN_MSG_ID test_msg_id = GRCAN_TCM_RESOURCE_UTILIZATION; + SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); HAL_Delay(10); } From f71a140803f9d4c270a2143a97bc0c05d1a72738 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 14 May 2026 22:53:09 -0700 Subject: [PATCH 133/158] Minor fixes to main --- SAMM/SuspensionNode/Inc/can_sus.h | 2 +- SAMM/SuspensionNode/Inc/mag.h | 10 ++-- SAMM/SuspensionNode/Src/mag.c | 94 ++++++++++++++++++------------- SAMM/SuspensionNode/Src/main.c | 6 +- 4 files changed, 65 insertions(+), 47 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 423c62fd4..8ef5e7018 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -39,7 +39,7 @@ typedef struct { uint16_t mag_angle; int16_t mag_turns; uint8_t mag_temp; - bool mag_status; + uint8_t mag_status; } IMU_Mag_Data; void TireTemp_Callback(uint32_t id, void *data, uint32_t size); diff --git a/SAMM/SuspensionNode/Inc/mag.h b/SAMM/SuspensionNode/Inc/mag.h index 833b4a928..a2699dd45 100644 --- a/SAMM/SuspensionNode/Inc/mag.h +++ b/SAMM/SuspensionNode/Inc/mag.h @@ -22,17 +22,17 @@ uint16_t mag_read(mag *mag_dev, uint8_t reg); void mag_write(mag *mag_dev, uint8_t reg, uint16_t data); -uint16_t mag_read_encoder_angle(mag *mag_dev); - bool mag_read_device_status(mag *mag_dev); -uint8_t mag_read_temp(mag *mag_dev); +uint16_t mag_read_temp(mag *mag_dev); -bool check_status(mag *mag_dev); +uint16_t mag_read_HANG(mag *mag_dev); + +uint16_t mag_read_encoder_angle(mag *mag_dev); int16_t mag_read_turns(mag *mag_dev); -float mag_read_HANG(mag *mag_dev); +uint8_t check_status(mag *mag_dev); void mag_write_error(mag *mag_dev); diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index 445387d96..c24484259 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -63,6 +63,7 @@ addr 0x00 crc */ + uint16_t mag_read(mag *mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 @@ -92,13 +93,6 @@ void mag_write(mag *mag_dev, uint8_t reg, uint16_t data) mag_transmit(mag_dev, lsb); } -// Address 0x32:0x33 (ANG15)—Current Angle Reading (15 bits) -uint16_t mag_read_encoder_angle(mag *mag_dev) -{ - uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register - return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) before conversion -} - // Address 0x22:0x23 (STA)—Device Status // read bit 0 AOK [0] bool mag_read_device_status(mag *mag_dev) @@ -107,12 +101,42 @@ bool mag_read_device_status(mag *mag_dev) return (read & 0x0001); // read aok } -uint8_t mag_read_temp(mag *mag_dev) +// Address 0x28:0x29 (TSEN) — 12 bits +// Difference between junction (internal) temperature and room temperature +uint16_t mag_read_temp(mag *mag_dev) { uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register - float masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data) - float offset_temp = masked_temp + 60.0f; // temperature offset by 60 degrees - return (uint8_t)offset_temp; + float_t masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data), range is -60 to 180 C + float_t normalized_temp = (masked_temp + 60.0f) * (4095.0f / 240.0f); // Map to range of 0x0000 to 0x0FFF + return ((uint16_t)normalized_temp); +} + +// Address 0x30:0x31 (HANG) — 12 bits +// Hysteresis Angle Value (original range is 0 to 360 degrees) +uint16_t mag_read_HANG(mag *mag_dev) +{ + uint16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + return ((uint16_t)(read_HANG & 0x0FFF)); // Mask to 12 bits +} + +// Address 0x32:0x33 (ANG15) — 15 bits +// Current Angle Reading (original range is 0 to 360 degrees) +uint16_t mag_read_encoder_angle(mag *mag_dev) +{ + uint16_t read_angle = mag_read(mag_dev, 0x32); // 0x32 is angle register + return ((uint16_t)(read_angle & 0x7FFF)); // Mask to 15 bits (valid angle data) before conversion +} + +// Address 0x2C:02D (TURNS) – 15 bits +// Total number of turns relative to angle observed on power-up +int16_t mag_read_turns(mag *mag_dev) +{ + uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter + int16_t masked_turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) + if (masked_turns & 0x0800) { + masked_turns |= 0xF000; // sign extend bit 11 to bits 15:12 + } + return masked_turns; } /* @@ -128,50 +152,44 @@ Check the status of the acc, gyro and temp before returning the values 0x0D : extended read status */ -bool check_status(mag *mag_dev) +uint8_t check_status(mag *mag_dev) { + uint8_t errors = 0; // Device Error Flags uint16_t error25 = mag_read(mag_dev, 0x24); - bool voltage_err = ((error25 & 0x0C) > 0); - bool magnetic_err = ((error25 & 0x02) > 0); - + int voltage_err = ((error25 & 0x0C) > 0); + errors += voltage_err * 64; + int magnetic_err = ((error25 & 0x02) > 0); + errors += magnetic_err * 32; uint16_t error24 = mag_read(mag_dev, 0x24); - bool angle_error = ((error24 & 0x02) > 0); - + int angle_error = ((error24 & 0x02) > 0); + errors += angle_error * 16; // Device Warning Flags uint32_t warning27 = mag_read(mag_dev, 0x27); uint32_t warning26 = mag_read(mag_dev, 0x26); - bool invalid_spi_len = ((warning26 & 0x80) > 0); - bool temp_out_of_range = ((warning27 & 0x40) > 0); + int invalid_spi_len = ((warning26 & 0x80) > 0); + errors += invalid_spi_len * 8; + int temp_out_of_range = ((warning27 & 0x40) > 0); + errors += temp_out_of_range * 4; - bool turn_counter_saturated = ((warning27 & 0x01) > 0); - bool excessive_magnet_vel = ((warning27 & 0x08) > 0); + int turn_counter_saturated = ((warning27 & 0x01) > 0); + errors += turn_counter_saturated * 2; + int excessive_magnet_vel = ((warning27 & 0x08) > 0); + errors += excessive_magnet_vel; // fix-me add LOGOMATIC - - return (voltage_err || magnetic_err || angle_error || invalid_spi_len || temp_out_of_range || turn_counter_saturated || excessive_magnet_vel); -} - -int16_t mag_read_turns(mag *mag_dev) -{ - uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - int16_t turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) - if (turns & 0x0800) { - turns |= 0xF000; // sign extend bit 11 to bits 15:12 + if (errors != 0) { + LOGOMATIC("Something is cooked"); } - return turns; + return errors; } + // Address 0x24:0x25 (ERR)—Device Error Flags // FIXME: add error handling -// Address 0x30:0x31 (HANG)—Hysteresis Angle Value (12 bits) -float mag_read_HANG(mag *mag_dev) -{ - int16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value - return ((int16_t)(read_HANG & 0x0FFF) * 360.0f / 4096.0f); // Mask to 12 bits (valid angle data) -} + // Address 0x1E:0x1F (CTRL)—Device Control void mag_write_error(mag *mag_dev) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 048f5a4c9..4af41db21 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -175,7 +175,7 @@ int main(void) uint8_t temp = mag_read_temp(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); - bool bad = check_status(&mag_dev); + uint8_t bad = check_status(&mag_dev); int8_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; @@ -184,7 +184,7 @@ int main(void) LOGOMATIC("Angle: %f deg\n", angle_test); LOGOMATIC("Turns: %d\n", turns); - if (bad) { + if (bad != 0) { LOGOMATIC("Something is cooked"); //mag_clear_errors(&mag_dev); } @@ -199,7 +199,7 @@ int main(void) // buffer[4] = turns & 0xFF; // // status - // buffer[5] = bad ? 0x01 : 0x00; + // buffer[5] = bad; // buffer[6] = 0x00; // buffer[7] = 0x00; From 6563b20c54df102497060bfdeb393193890735b1 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Fri, 15 May 2026 02:16:05 -0700 Subject: [PATCH 134/158] Changes to can_sus and main --- SAMM/SuspensionNode/Inc/can_sus.h | 6 +++++- SAMM/SuspensionNode/Src/main.c | 18 +++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 8ef5e7018..5636f0e8e 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -28,6 +28,7 @@ typedef enum { } Sus_Node; typedef struct { + /* IMU Data */ uint16_t bmi323_acc_x; uint16_t bmi323_acc_y; uint16_t bmi323_acc_z; @@ -36,9 +37,12 @@ typedef struct { uint16_t bmi323_gyro_z; uint16_t bmi323_temp; uint16_t bmi323_status; + + /* Mag Encoder Data */ + uint16_t mag_temp; + uint16_t mag_hysteresis; uint16_t mag_angle; int16_t mag_turns; - uint8_t mag_temp; uint8_t mag_status; } IMU_Mag_Data; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 4af41db21..8f08ced42 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -172,22 +172,20 @@ int main(void) // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing while (1) { - uint8_t temp = mag_read_temp(&mag_dev); + uint16_t temp = mag_read_temp(&mag_dev); + uint16_t hysteresis = mag_read_HANG(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); int16_t turns = mag_read_turns(&mag_dev); uint8_t bad = check_status(&mag_dev); int8_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; + float hysteresis_test = hysteresis * 360.f / 4096.0f; LOGOMATIC("Temperature: %d C\n", temp_test); LOGOMATIC("Angle: %f deg\n", angle_test); LOGOMATIC("Turns: %d\n", turns); - - if (bad != 0) { - LOGOMATIC("Something is cooked"); - //mag_clear_errors(&mag_dev); - } + LOGOMATIC("Hysteresis Angle: %f\n", hysteresis_test) // uint8_t buffer[8] = {0}; // buffer[0] = (angle >> 8) & 0xFF; @@ -207,12 +205,18 @@ int main(void) test_data.mag_angle = angle; test_data.mag_temp = temp; test_data.mag_turns = turns; - test_data.mag_status = !bad; + test_data.mag_status = bad; + test_data.mag_hysteresis = hysteresis; GRCAN_NODE_ID test_dest_node = GRCAN_TCM; GRCAN_MSG_ID test_msg_id = GRCAN_TCM_RESOURCE_UTILIZATION; SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); + if (bad != 0) { + LOGOMATIC("Something is cooked"); + mag_write_error(&mag_dev); + } + HAL_Delay(10); } /* USER CODE END 3 */ From f40ea0301b25c1b418ac4e99388cccf634faf132 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 04:24:18 -0700 Subject: [PATCH 135/158] Minor naming changes to variables in can_sus.c --- SAMM/SuspensionNode/Inc/can_sus.h | 6 ------ SAMM/SuspensionNode/Inc/mag.h | 1 + SAMM/SuspensionNode/Src/can_sus.c | 29 ++++++++--------------------- SAMM/SuspensionNode/Src/main.c | 4 ++-- 4 files changed, 11 insertions(+), 29 deletions(-) diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 5636f0e8e..894408e19 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -7,12 +7,6 @@ #include #include -typedef enum { - CAN_SUS_MSG_DATA = 0x2C, - CAN_SUS_MSG_STATUS = 0x2D, - CAN_SUS_MSG_FAULT = 0x2F -} Sus_MSG_ID; // change with updates <- fixme - typedef enum { TireTemp_FL = GRCAN_TireTemp_FL, TireTemp_FR = GRCAN_TireTemp_FR, diff --git a/SAMM/SuspensionNode/Inc/mag.h b/SAMM/SuspensionNode/Inc/mag.h index a2699dd45..2288cc837 100644 --- a/SAMM/SuspensionNode/Inc/mag.h +++ b/SAMM/SuspensionNode/Inc/mag.h @@ -5,6 +5,7 @@ #include "main.h" #include "spi.h" #include "stm32h5xx.h" +#include "Logomatic.h" typedef struct { SPI_HandleTypeDef *spi_port; diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index fe2f8beb6..8dcc907b0 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,24 +1,16 @@ #include "can_sus.h" #include "can_cfg.h" -static GRCAN_NODE_ID sensorNode = GRCAN_ALL; +static GRCAN_MSG_ID CAN_SUS_MSG_DATA = 0x051; // TODO: Finalize with GRCAN viewer and use from Autogen instead +static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // Before initialization static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; -static GRCAN_BUS_ID busMode = GRCAN_BUS_DATA; -static GRCAN_BUS_ID subnetBus = GRCAN_BUS_DATA_SUBNET; // still needs to be defined +static GRCAN_BUS_ID mainBus = GRCAN_BUS_DATA; +static GRCAN_BUS_ID subnetBus = GRCAN_BUS_DATA_SUBNET; static uint32_t data_length = 64; uint32_t *forwarded_tire_temp_data = 0; uint32_t *forwarded_TCM_data = 0; -// get rid of mag functions once their functionality added -> need to add error checking, otherwise DONE -// fix callbacks for all requried functionality -// might need to implement logic for receiving and forwarding for specific sensor location (FL -> FL) -> DONE -// might be better way to do this -// check if came from tire temp or tcm in the callback-- should not interfere -// might need to get rid of TCM checking if you really want to forward everything -// handle sensorNode logic in init, you can use enum in can_sus.h -> DONE - -// lowkey change naming -> low priority, do after everything else // For messages from tire temp void TireTemp_Callback(uint32_t id, void *data, uint32_t size) @@ -34,7 +26,7 @@ void TireTemp_Callback(uint32_t id, void *data, uint32_t size) forwarded_tire_temp_data = (uint32_t *)data; // Forward messages to TCM via main data bus -- does not filter anything right now (should only be tire temp though) - GRCAN_Fancy_Send(busMode, TCMNode, GRCAN_Fancy_ID.messageID, data, size); + GRCAN_Fancy_Send(mainBus, TCMNode, GRCAN_Fancy_ID.messageID, data, size); } // For messages from TCM @@ -54,7 +46,7 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { // Send ping back to sender on main data bus - GRCAN_Fancy_Send(busMode, GRCAN_Fancy_ID.srcID, GRCAN_Fancy_ID.messageID, data, size); + GRCAN_Fancy_Send(mainBus, GRCAN_Fancy_ID.srcID, GRCAN_PING, data, size); } } @@ -123,17 +115,12 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) return false; } - switch ((Sus_MSG_ID)msg_id) { - case CAN_SUS_MSG_DATA: break; - case CAN_SUS_MSG_STATUS: break; - case CAN_SUS_MSG_FAULT: break; - default: + if (msg_id != CAN_SUS_MSG_DATA) { LOGOMATIC("Invalid Suspension Node message ID, defaulting to DATA\n"); msg_id = (GRCAN_MSG_ID)CAN_SUS_MSG_DATA; - break; } - bool result = GRCAN_Fancy_Send(busMode, dest_node, msg_id, data, data_length); + bool result = GRCAN_Fancy_Send(mainBus, dest_node, msg_id, data, data_length); if (!result) { LOGOMATIC("Suspension Node CAN send failed"); diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 8f08ced42..fd2f8c0a9 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -178,14 +178,14 @@ int main(void) int16_t turns = mag_read_turns(&mag_dev); uint8_t bad = check_status(&mag_dev); - int8_t temp_test = temp - 60; + int16_t temp_test = temp - 60; float angle_test = angle * 360.f / 4096.0f; float hysteresis_test = hysteresis * 360.f / 4096.0f; LOGOMATIC("Temperature: %d C\n", temp_test); LOGOMATIC("Angle: %f deg\n", angle_test); LOGOMATIC("Turns: %d\n", turns); - LOGOMATIC("Hysteresis Angle: %f\n", hysteresis_test) + LOGOMATIC("Hysteresis Angle: %f\n", hysteresis_test); // uint8_t buffer[8] = {0}; // buffer[0] = (angle >> 8) & 0xFF; From 40f5d957706b129604c8046ee7a9ecf6123cf103 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 04:32:48 -0700 Subject: [PATCH 136/158] Fixed some build errors, moved MillisecondsSinceBoot to bmi323.c from main.c (maybe move back?) --- SAMM/IMU/Src/bmi323.c | 1 + SAMM/InboardFloor/Src/main.c | 4 ---- SAMM/SuspensionNode/Src/spi.c | 1 + 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 2be57fb0e..fe3742b2a 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -91,6 +91,7 @@ uint32_t MillisecondsSinceBoot() { return HAL_GetTick() * HAL_GetTickFreq(); } + uint8_t bmi323_calib(bmi323 *bmi323_dev) { // first we have to fucking start the feature engine diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index ef65a1b07..984415a04 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -75,10 +75,6 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -uint32_t MillisecondsSinceBoot(void) -{ - return HAL_GetTick() * HAL_GetTickFreq(); -} /* USER CODE END 0 */ /** diff --git a/SAMM/SuspensionNode/Src/spi.c b/SAMM/SuspensionNode/Src/spi.c index 35f545ddd..a90db7823 100644 --- a/SAMM/SuspensionNode/Src/spi.c +++ b/SAMM/SuspensionNode/Src/spi.c @@ -25,6 +25,7 @@ /* USER CODE END 0 */ SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi3; /** * @brief SPI1 Initialization Function From 49af75337663f4cd57aa38554095e1f87e23c341 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 04:50:43 -0700 Subject: [PATCH 137/158] Changed binary constants in bmi323.c to hex --- SAMM/IMU/Inc/bmi323.h | 8 ++++---- SAMM/IMU/Src/bmi323.c | 18 +++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/SAMM/IMU/Inc/bmi323.h b/SAMM/IMU/Inc/bmi323.h index 1a6e727a1..1d36570bb 100644 --- a/SAMM/IMU/Inc/bmi323.h +++ b/SAMM/IMU/Inc/bmi323.h @@ -108,10 +108,10 @@ #define BMI323_FEATURE_IO1_STATUS 0x0001 // defines for acc and gyro conf -#define SUSPEND 0b000 -#define LOW_POWER 0b011 -#define HIGH_PERF 0b111 -#define NORMAL 0b100 +#define SUSPEND 0x0 +#define LOW_POWER 0x3 +#define HIGH_PERF 0x7 +#define NORMAL 0x4 // these are the values that are used for the polling frequency #define ODR_0_78 0x1 diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index fe3742b2a..75f9d5664 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -99,14 +99,14 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) uint16_t acc_conf = bmi323_read(bmi323_dev, BMI323_ACC_CONF); uint16_t gyro_conf = bmi323_read(bmi323_dev, BMI323_GYR_CONF); uint32_t timeout_ref = 0; - if ((acc_conf & 0x7000) != 0b000) { + if ((acc_conf & 0x7000) != 0x0000) { bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL); } - if ((gyro_conf & 0x7000) != 0b000) { + if ((gyro_conf & 0x7000) != 0x0000) { bmi323_write(bmi323_dev, BMI323_GYR_CONF, BMI323_GYR_CONF_RESET_VAL); } // now we need to check if the feature engine has been enabled prior - if ((bmi323_read(bmi323_dev, BMI323_FEATURE_CTRL) & 0x0001) == 0b0) { + if ((bmi323_read(bmi323_dev, BMI323_FEATURE_CTRL) & 0x0001) == 0x0000) { // then we write 0x012C to Feature Io 2 bmi323_write(bmi323_dev, BMI323_FEATURE_IO2, BMI323_FEATURE_IO2_EN); // then we write 0x0001 to Feature Io status @@ -115,7 +115,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) bmi323_write(bmi323_dev, BMI323_FEATURE_CTRL, BMI323_FEATURE_CTRL_ENGINE_EN); // now we poll the feature engine timeout_ref = MillisecondsSinceBoot(); - while ((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0b001) { + while ((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x000F) != 0x0001) { if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { ////D_println("Feature engine enable timeout"); return 0; @@ -128,7 +128,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // now we need to check if a calibration is already in progress // polls the bmi323 FEATURE I01 state untill the state is 0b00, this means calibration can start. timeout_ref = MillisecondsSinceBoot(); - while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0b00) { + while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & (0x1800)) >> 11) != 0x0000) { if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { ////D_println("Calibration state timeout"); return 0; @@ -145,12 +145,12 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // D_println("Starting calibration"); // if it is, then we can start the calibration // first we check if the alernalte configuration acc mode is set to 0: - if (((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000) >> 11) != 0b000) { + if (((bmi323_read(bmi323_dev, BMI323_ALT_ACC_CONF) & 0x7000) >> 11) != 0x0000) { // if it is, we set it to 0 bmi323_write(bmi323_dev, BMI323_ALT_ACC_CONF, 0x0206); } // next we check if the alternate configuration gyro mode is set to 0: - if (((bmi323_read(bmi323_dev, BMI323_ALT_GYR_CONF) & 0x7000) >> 11) != 0b000) { + if (((bmi323_read(bmi323_dev, BMI323_ALT_GYR_CONF) & 0x7000) >> 11) != 0x0000) { // if it is, we set it to 0 bmi323_write(bmi323_dev, BMI323_ALT_GYR_CONF, 0x0206); } @@ -170,7 +170,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // D_println("Polling calibration state"); // check if the feature engine is enabled timeout_ref = MillisecondsSinceBoot(); - while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4) != 0b1) { + while (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0010) >> 4) != 0x0001) { if (MillisecondsSinceBoot() - timeout_ref > BMI323_TIMEOUT) { // D_println("Feature engine enable timeout"); return 0; @@ -178,7 +178,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) continue; } // D_println("Calibration complete"); - if (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0b1) { + if (((bmi323_read(bmi323_dev, BMI323_FEATURE_I01) & 0x0020) >> 5) == 0x0001) { // //D_println("Calibration successful"); // //D_println("reseting values to original configuration"); // cycle the acc From e6661e4601454ed93f819917289ae7eb88ad89c8 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 04:57:16 -0700 Subject: [PATCH 138/158] literally just added (void)status in bmi323.c line 36 to get rid of unused warning --- SAMM/IMU/Src/bmi323.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 75f9d5664..351789d0b 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -32,6 +32,9 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); + + (void)status; //TODO: double check that the status does not actually need to be used + if (rx_word[3] == 0x43) { return HAL_OK; } From 322fb940577b68174c97a384dd54fc3f9a884c4b Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 05:27:48 -0700 Subject: [PATCH 139/158] Outlined inboardfloor files based on can sus files, still needs finetuning --- SAMM/IMU/Src/bmi323.c | 5 +- SAMM/InboardFloor/CMakeLists.txt | 2 + SAMM/InboardFloor/Inc/can_inboardfloor.h | 52 +++++++++ SAMM/InboardFloor/Src/can_inboardfloor.c | 132 +++++++++++++++++++++++ 4 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 SAMM/InboardFloor/Inc/can_inboardfloor.h create mode 100644 SAMM/InboardFloor/Src/can_inboardfloor.c diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 351789d0b..c4694b2f0 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -90,6 +90,7 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT 9. Done */ +// TODO: MOVE THIS FUNCTION ELSEWHERE uint32_t MillisecondsSinceBoot() { return HAL_GetTick() * HAL_GetTickFreq(); @@ -211,7 +212,7 @@ uint8_t bmi323_calib(bmi323 *bmi323_dev) // turn on the acc bmi323_write(bmi323_dev, BMI323_ACC_CONF, BMI323_ACC_CONF_RESET_VAL | 0x7000); // jumps to the calibration sequence - goto calibrate; // TODO Goto are evil but we did not write this so leave it be until it breaks things because it is evil + goto calibrate; // TODO: Goto are evil but we did not write this so leave it be until it breaks things because it is evil return 1; } @@ -222,7 +223,7 @@ uint8_t bmi323_calib_abort(bmi323 *bmi323_dev) } /* -TODO: +TODO: this todo is from last year lol Check the status of the acc, gyro and temp before returning the values if they are not ready return 0 if they are ready return 1 diff --git a/SAMM/InboardFloor/CMakeLists.txt b/SAMM/InboardFloor/CMakeLists.txt index 7b11922c5..bc5b18f65 100644 --- a/SAMM/InboardFloor/CMakeLists.txt +++ b/SAMM/InboardFloor/CMakeLists.txt @@ -37,6 +37,7 @@ target_sources( Src/platform.c Src/VL53L4ED_api.c Src/VL53L4ED_calibration.c + Src/can_inboardfloor.c # TODO ) @@ -47,6 +48,7 @@ target_link_libraries( PERIPHERAL_CAN_LIB BitManipulations_Lib SAMM_IMU_Lib + GRCAN_FANCYLAYER ) target_include_directories( diff --git a/SAMM/InboardFloor/Inc/can_inboardfloor.h b/SAMM/InboardFloor/Inc/can_inboardfloor.h new file mode 100644 index 000000000..5dc198926 --- /dev/null +++ b/SAMM/InboardFloor/Inc/can_inboardfloor.h @@ -0,0 +1,52 @@ +#ifndef CAN_SUS_H +#define CAN_SUS_H + +#include "GRCAN_FancyLayer.h" +#include "Logomatic.h" +#include "NodeID.h" +#include +#include + +typedef enum { + BrakeTemp_FL = GRCAN_BrakeTemp_FL, + BrakeTemp_FR = GRCAN_BrakeTemp_FR, + BrakeTemp_RL = GRCAN_BrakeTemp_RL, + BrakeTemp_RR = GRCAN_BrakeTemp_RR +} BrakeTemp_Node; + +typedef enum { + InboardFloor_FL = GRCAN_InboardFloor_FL, + InboardFloor_FR = GRCAN_InboardFloor_FR, + InboardFloor_RL = GRCAN_InboardFloor_RL, + InboardFloor_RR = GRCAN_InboardFloor_RR +} InboardFloor_Node; + +typedef struct { + /* IMU Data */ + uint16_t bmi323_acc_x; + uint16_t bmi323_acc_y; + uint16_t bmi323_acc_z; + uint16_t bmi323_gyro_x; + uint16_t bmi323_gyro_y; + uint16_t bmi323_gyro_z; + uint16_t bmi323_temp; + uint16_t bmi323_status; + + /* Time of Flight Data */ + // TODO: figure out how to get these values from tof results struct when more awake + uint8_t range_status; + uint16_t distance_mm; + uint16_t ambient_rate_kcps; + uint16_t ambient_per_spad_kcps; + uint16_t signal_rate_kcps; + uint16_t signal_per_spad_kcps; + uint16_t number_of_spad; + uint16_t sigma_mm; +} IMU_ToF_Data; + +void BrakeTemp_Callback(uint32_t id, void *data, uint32_t size); +void TCM_Callback(uint32_t id, void *data, uint32_t size); +int InboardFloor_CAN_Init(GRCAN_BUS_ID busID); +bool InboardFloor_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data); + +#endif diff --git a/SAMM/InboardFloor/Src/can_inboardfloor.c b/SAMM/InboardFloor/Src/can_inboardfloor.c new file mode 100644 index 000000000..24bebf775 --- /dev/null +++ b/SAMM/InboardFloor/Src/can_inboardfloor.c @@ -0,0 +1,132 @@ +#include "can_inboardfloor.h" +#include "can_cfg.h" + +static GRCAN_MSG_ID CAN_INBOARDFLOOR_MSG_DATA = 0x052; // TODO: Finalize with GRCAN viewer and use from Autogen instead +static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // Before initialization +static GRCAN_NODE_ID localNode = LOCAL_GR_ID; +static GRCAN_NODE_ID TCMNode = GRCAN_TCM; +static GRCAN_BUS_ID mainBus = GRCAN_BUS_DATA; +static GRCAN_BUS_ID subnetBus = GRCAN_BUS_DATA_SUBNET; +static uint32_t data_length = 64; + +uint32_t *forwarded_brake_temp_data = 0; +uint32_t *forwarded_TCM_data = 0; + +// For messages from brake temp +void BrakeTemp_Callback(uint32_t id, void *data, uint32_t size) +{ + + GRCAN_Fancy_ID GRCAN_Fancy_ID; + GRCAN_Fancy_ID.srcID = 0; + GRCAN_Fancy_ID.destNode = 0; + GRCAN_Fancy_ID.messageID = 0; + + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); + + forwarded_brake_temp_data = (uint32_t *)data; + + // Forward messages to TCM via main data bus -- does not filter anything right now (should only be brake temp though) + GRCAN_Fancy_Send(mainBus, TCMNode, GRCAN_Fancy_ID.messageID, data, size); +} + +// For messages from TCM +void TCM_Callback(uint32_t id, void *data, uint32_t size) +{ + + GRCAN_Fancy_ID GRCAN_Fancy_ID; + GRCAN_Fancy_ID.srcID = 0; + GRCAN_Fancy_ID.destNode = 0; + GRCAN_Fancy_ID.messageID = 0; + + GRCAN_Fancy_DecodeID(&GRCAN_Fancy_ID, id); + + forwarded_TCM_data = (uint32_t *)data; + // Forward all messages to brake temp sensor via subnet bus -- does not filter for anything right now + GRCAN_Fancy_Send(subnetBus, sensorNode, GRCAN_Fancy_ID.messageID, data, size); + + if (GRCAN_Fancy_ID.messageID == GRCAN_PING) { + // Send ping back to sender on main data bus + GRCAN_Fancy_Send(mainBus, GRCAN_Fancy_ID.srcID, GRCAN_PING, data, size); + } +} + +int InboardFloor_CAN_Init(GRCAN_BUS_ID busID) +{ + int bus = (int)busID; //technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int + + if (bus != GRCAN_BUS_DATA && bus != GRCAN_BUS_DATA_SUBNET) { + LOGOMATIC("Invalid bus for Inboard Floor Node CAN Init"); + return 0; + } + + GRCAN_BusConfig bus_config = {0}; + GRCAN_SetDefaultBusConfig(&bus_config, bus); + +#if defined(STM32H5) + bus_config.clock_source = GRCAN_CLKSRC_PLL1Q; // should be 180MHz, defaults should work +#endif + + if (bus == GRCAN_BUS_DATA_SUBNET) { + bus_config.fdcan_instance = FDCAN2; + bus_config.rx_callback = BrakeTemp_Callback; // callback + } else if (bus == GRCAN_BUS_DATA) { + bus_config.fdcan_instance = FDCAN1; + bus_config.rx_callback = TCM_Callback; // callback + + InboardFloor_Node if_node = (InboardFloor_Node)localNode; + BrakeTemp_Node braketemp_node; + + switch(if_node) { + case InboardFloor_FL: + braketemp_node = BrakeTemp_FL; + break; + case InboardFloor_FR: + braketemp_node = BrakeTemp_FR; + break; + case InboardFloor_RL: + braketemp_node = BrakeTemp_RL; + break; + case InboardFloor_RR: + braketemp_node = BrakeTemp_RR; + break; + default: + LOGOMATIC("Invalid inboard floor node, defaulting to FL\n"); + braketemp_node = BrakeTemp_FL; + break; + } + + sensorNode = (GRCAN_NODE_ID)braketemp_node; + } + + bool result = GRCAN_InitBus(&bus_config); + + if (!result) { + LOGOMATIC("Failed to intialize Inboard Floor CAN Bus"); + return 0; + } + + GRCAN_SetLocalNodeID(localNode); + + return 1; // success +} + +bool InboardFloor_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) +{ + if (data == NULL) { + LOGOMATIC("Inboard Floor Node CAN send: NULL data"); + return false; + } + + if (msg_id != CAN_INBOARDFLOOR_MSG_DATA) { + LOGOMATIC("Invalid Inboard Floor Node message ID, defaulting to DATA\n"); + msg_id = (GRCAN_MSG_ID)CAN_INBOARDFLOOR_MSG_DATA; + } + + bool result = GRCAN_Fancy_Send(mainBus, dest_node, msg_id, data, data_length); + + if (!result) { + LOGOMATIC("Inboard Floor Node CAN send failed"); + } + + return result; +} From b1c1949ce8dadb9f1adb90f255e6b2c4804363be Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 21:46:53 -0700 Subject: [PATCH 140/158] Added bmi initialization into main for sus node, still needs to be completed --- SAMM/InboardFloor/Inc/can_inboardfloor.h | 2 +- SAMM/SuspensionNode/Src/main.c | 71 ++++++++++-------------- 2 files changed, 31 insertions(+), 42 deletions(-) diff --git a/SAMM/InboardFloor/Inc/can_inboardfloor.h b/SAMM/InboardFloor/Inc/can_inboardfloor.h index 5dc198926..b8d4bf43a 100644 --- a/SAMM/InboardFloor/Inc/can_inboardfloor.h +++ b/SAMM/InboardFloor/Inc/can_inboardfloor.h @@ -34,7 +34,6 @@ typedef struct { /* Time of Flight Data */ // TODO: figure out how to get these values from tof results struct when more awake - uint8_t range_status; uint16_t distance_mm; uint16_t ambient_rate_kcps; uint16_t ambient_per_spad_kcps; @@ -42,6 +41,7 @@ typedef struct { uint16_t signal_per_spad_kcps; uint16_t number_of_spad; uint16_t sigma_mm; + uint8_t range_status; } IMU_ToF_Data; void BrakeTemp_Callback(uint32_t id, void *data, uint32_t size); diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index fd2f8c0a9..80a822aab 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -33,11 +33,14 @@ // #include "VL53L4ED_api.h" #include "mag.h" +#include "bmi323.h" // #include "circularBuffer.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ +#define BMI323_CS_GPIO_Port GPIOA +#define BMI323_CS_Pin GPIO_PIN_4 #define MAG_CS_GPIO_Port GPIOB #define MAG_CS_Pin GPIO_PIN_10 /* USER CODE END PTD */ @@ -118,60 +121,46 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // bmi323 bmi323_dev; + bmi323 bmi323_dev; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + mag mag_dev; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); + // Initialize IMU + if (bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin) != HAL_OK) { + LOGOMATIC("BMI323 initialization failed!\n"); + Error_Handler(); + } + // Send 2 dummy bytes to switch BMI323 to SPI mode - // uint16_t dummy_byte = 0x8000; - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); - // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - // HAL_Delay(1); // Short delay after mode switch + uint16_t dummy_byte = 0x0000; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + HAL_Delay(1); // Short delay after mode switch + // Initialize magnetic encoder if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { - printf("MAG initialization failed!\r\n"); + LOGOMATIC("MAG initialization failed!\n"); Error_Handler(); } - // static uint16_t eeMLX90640[832]; - // static paramsMLX90640 mlx90640; - // #define MLX90640_ADDRESS 0x33<<1 - // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); - - // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + /* USER CODE BEGIN WHILE */ - // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + while (1) { + uint16_t imu_ax = bmi323_read_acc_x(&bmi323_dev); + uint16_t imu_ay = bmi323_read_acc_y(&bmi323_dev); + uint16_t imu_az = bmi323_read_acc_z(&bmi323_dev); + uint16_t imu_gyrx = bmi323_read_gyr_x(&bmi323_dev); + uint16_t imu_gyry = bmi323_read_gyr_y(&bmi323_dev); + uint16_t imu_gyrz = bmi323_read_gyr_z(&bmi323_dev); + uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); + uint16_t imu_status = bmi323_read_status(&bmi323_dev); - // MLX90640_SynchFrame(MLX90640_ADDRESS); - // MLX90640_SetRefreshRate(0x33, 0x05); - /* USER CODE END 2 */ + - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ - // begin VL53L4ED - // HAL_Delay(100); // wait for 5ms to power up the device - // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin - // // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - // HAL_Delay(100); // wait for 5ms to reset the device - // HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin - // // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin - // HAL_Delay(100); // wait for 5ms to power up the device - - // uint16_t status = 0; - - // uint16_t sensor_id = 0; - // VL53L4ED_ResultsData_t results; - // uint8_t p_data_ready; - - // int TOF_ID = 0x52; - // HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); - // status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - // printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); - // status = VL53L4ED_StartRanging(TOF_ID); - // status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - // status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing - while (1) { uint16_t temp = mag_read_temp(&mag_dev); uint16_t hysteresis = mag_read_HANG(&mag_dev); uint16_t angle = mag_read_encoder_angle(&mag_dev); From 30c4e0ebcb8a0105cb63ac9e3563cd2eba6faccc Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Mon, 18 May 2026 22:38:39 -0700 Subject: [PATCH 141/158] Added accelerometer configuration parameters --- SAMM/SuspensionNode/Src/main.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 80a822aab..3b11d3e2e 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -52,6 +52,14 @@ #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif + +#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_ACC_RANGE 0x2 // +/- 8g +#define BMI_ACC_BITWIDTH 0x0 // Sets cut off freq to ODR/2 +#define BMI_ACC_AVGNUM 0x3 // Averaging of 8 samples +#define BMI_ACC_MODE 0x4 // Normal mode + + /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -120,7 +128,7 @@ int main(void) // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); - // bmi323 bmi323_dev; + bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); @@ -140,6 +148,8 @@ int main(void) HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); HAL_Delay(1); // Short delay after mode switch + // bmi323_enable_acc(&bmi323_dev, BMI323_ACC_CONF, ) + // Initialize magnetic encoder if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { LOGOMATIC("MAG initialization failed!\n"); @@ -158,7 +168,7 @@ int main(void) uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); uint16_t imu_status = bmi323_read_status(&bmi323_dev); - + uint16_t temp = mag_read_temp(&mag_dev); @@ -205,8 +215,12 @@ int main(void) LOGOMATIC("Something is cooked"); mag_write_error(&mag_dev); } - +/* TODO: HAL_Delay(10); + static uint32_t millis_since_last = 0 + if (millis since last < b) + only run loop every ~8-ish samples +*/ } /* USER CODE END 3 */ } From 63c2bc00703938a77cccc9fd124bca7cd657f07a Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 16:20:08 -0700 Subject: [PATCH 142/158] Added proper IMU initialization and raw data conversion for testing in susnode --- SAMM/IMU/Src/bmi323.c | 23 +++++--- SAMM/SuspensionNode/Src/main.c | 96 +++++++++++++++++++++++----------- 2 files changed, 80 insertions(+), 39 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index c4694b2f0..f78e7cc82 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -12,12 +12,16 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe uint8_t tx_word[4]; uint8_t rx_word[4] = {0}; uint8_t status = 0; + bmi323_dev->spi_port = spi_port; bmi323_dev->port = port; bmi323_dev->pin = pin; - tx_word[1] = (BMI323_CHIP_ID << 8); - tx_word[1] |= 0x80; - tx_word[0] = 0x69; + + tx_word[0] = (BMI323_CHIP_ID) | 0x80; // Read register + tx_word[1] = 0x69; // Dummy byte + tx_word[2] = 0x00; // Nothing to get back chip id low byte in rx + tx_word[3] = 0x00; // Nothing to get back chip id high byte in rx + /* Okay so for one of these transmits we need to follow the following operation:bmi323_dev 1. to read the register we want to: @@ -26,16 +30,19 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe */ // first we read do the dummy read to switch to spi mode HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 4, HAL_MAX_DELAY); HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); - // rx_word = 0; + + // actual reliable read of chip id HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_RESET); - status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + status = HAL_SPI_TransmitReceive(bmi323_dev->spi_port, tx_word, rx_word, 4, HAL_MAX_DELAY); HAL_GPIO_WritePin(bmi323_dev->port, bmi323_dev->pin, GPIO_PIN_SET); - (void)status; //TODO: double check that the status does not actually need to be used + if (status != HAL_OK) { + return HAL_ERROR; + } - if (rx_word[3] == 0x43) { + if (rx_word[2] == 0x43) { return HAL_OK; } return HAL_ERROR; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 3b11d3e2e..af6d4c9fa 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -55,10 +55,15 @@ #define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz #define BMI_ACC_RANGE 0x2 // +/- 8g -#define BMI_ACC_BITWIDTH 0x0 // Sets cut off freq to ODR/2 +#define BMI_ACC_MODE 0x7 // High performance mode +#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 #define BMI_ACC_AVGNUM 0x3 // Averaging of 8 samples -#define BMI_ACC_MODE 0x4 // Normal mode +#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) +#define BMI_GYR_MODE 0x7 // High performance mode +#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_GYR_AVGNUM 0x3 // Averaging of 8 samples /* USER CODE END PD */ @@ -141,14 +146,18 @@ int main(void) Error_Handler(); } - // Send 2 dummy bytes to switch BMI323 to SPI mode - uint16_t dummy_byte = 0x0000; + bmi323_soft_reset(&bmi323_dev); + + // Switch to IMU to SPI mode + uint8_t bmi323_mode_tx[4] = {0x00 | 0x80, 0x00, 0x00, 0x00}; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); - HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); + HAL_SPI_Transmit(&hspi1, bmi323_mode_tx, 4, HAL_MAX_DELAY); HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - HAL_Delay(1); // Short delay after mode switch + HAL_Delay(1); // Short delay after mode switch - // bmi323_enable_acc(&bmi323_dev, BMI323_ACC_CONF, ) + // Set up accelerometer and gyroscope configuration + bmi323_enable_acc(&bmi323_dev, BMI_ACC_MODE, BMI_ACC_AVGNUM, BMI_ACC_BW, BMI_ACC_RANGE, BMI_ACC_ODR); + bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); // Initialize magnetic encoder if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { @@ -168,23 +177,33 @@ int main(void) uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); uint16_t imu_status = bmi323_read_status(&bmi323_dev); - - - - uint16_t temp = mag_read_temp(&mag_dev); - uint16_t hysteresis = mag_read_HANG(&mag_dev); - uint16_t angle = mag_read_encoder_angle(&mag_dev); - int16_t turns = mag_read_turns(&mag_dev); - uint8_t bad = check_status(&mag_dev); - - int16_t temp_test = temp - 60; - float angle_test = angle * 360.f / 4096.0f; - float hysteresis_test = hysteresis * 360.f / 4096.0f; - - LOGOMATIC("Temperature: %d C\n", temp_test); - LOGOMATIC("Angle: %f deg\n", angle_test); - LOGOMATIC("Turns: %d\n", turns); - LOGOMATIC("Hysteresis Angle: %f\n", hysteresis_test); + float imu_ax_test = ((float)imu_ax) / 4096.f; + float imu_ay_test = ((float)imu_ay) / 4096.f; + float imu_az_test = ((float)imu_az) / 4096.f; + float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; + float imu_gyry_test = ((float)imu_gyry) / 16.384f; + float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; + float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; + + LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); + LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); + LOGOMATIC("IMU temperature: %f", imu_temp_test); + + uint16_t mag_temp = mag_read_temp(&mag_dev); + uint16_t mag_hysteresis = mag_read_HANG(&mag_dev); + uint16_t mag_angle = mag_read_encoder_angle(&mag_dev); + int16_t mag_turns = mag_read_turns(&mag_dev); + uint8_t mag_status = check_status(&mag_dev); + + // TODO: check these conversion formulas + int16_t mag_temp_test = mag_temp - 60; + float mag_angle_test = mag_angle * 360.f / 4096.0f; + float mag_hysteresis_test = mag_hysteresis * 360.f / 4096.0f; + + LOGOMATIC("Mag temperature: %d C\n", mag_temp_test); + LOGOMATIC("Angle: %f deg\n", mag_angle_test); + LOGOMATIC("Turns: %d\n", mag_turns); + LOGOMATIC("Hysteresis Angle: %f\n", mag_hysteresis_test); // uint8_t buffer[8] = {0}; // buffer[0] = (angle >> 8) & 0xFF; @@ -201,18 +220,33 @@ int main(void) // buffer[7] = 0x00; IMU_Mag_Data test_data; - test_data.mag_angle = angle; - test_data.mag_temp = temp; - test_data.mag_turns = turns; - test_data.mag_status = bad; - test_data.mag_hysteresis = hysteresis; + + test_data.bmi323_acc_x = imu_ax_test; + test_data.bmi323_acc_y = imu_ay_test; + test_data.bmi323_acc_z = imu_az_test; + test_data.bmi323_gyro_x = imu_gyrx_test; + test_data.bmi323_gyro_y = imu_gyry_test; + test_data.bmi323_gyro_z = imu_gyrz_test; + test_data.bmi323_temp = imu_temp_test; + test_data.bmi323_status = imu_status; + + test_data.mag_angle = mag_angle; + test_data.mag_temp = mag_temp; + test_data.mag_turns = mag_turns; + test_data.mag_status = mag_status; + test_data.mag_hysteresis = mag_hysteresis; GRCAN_NODE_ID test_dest_node = GRCAN_TCM; GRCAN_MSG_ID test_msg_id = GRCAN_TCM_RESOURCE_UTILIZATION; SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); - if (bad != 0) { - LOGOMATIC("Something is cooked"); + if (imu_status != 0) { + LOGOMATIC("IMU is cooked"); + Error_Handler(); + } + + if (mag_status != 0) { + LOGOMATIC("Mag encoder is cooked"); mag_write_error(&mag_dev); } /* TODO: From e55764453db59b1c9cc3167541f494d8bb3cbc4e Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 17:37:05 -0700 Subject: [PATCH 143/158] added hal delay at the end of while loop in main.c susnode --- SAMM/SuspensionNode/Src/main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index af6d4c9fa..f0eda3c22 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -165,6 +165,7 @@ int main(void) Error_Handler(); } + uint16_t millis_since_last = HAL_GetTick(); /* USER CODE BEGIN WHILE */ while (1) { @@ -246,11 +247,16 @@ int main(void) } if (mag_status != 0) { - LOGOMATIC("Mag encoder is cooked"); + LOGOMATIC("Mag is cooked"); mag_write_error(&mag_dev); + Error_Handler(); } -/* TODO: + HAL_Delay(10); + +/* TODO: + + AVERAGING IS NOT POSSIBLE IN HIGH PERFORMANCE MODE -> still implement? static uint32_t millis_since_last = 0 if (millis since last < b) only run loop every ~8-ish samples From d105489f123c5094e1c87a5ed4412c90c1206233 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 17:51:33 -0700 Subject: [PATCH 144/158] Changed avgnum config to no averaging, copied bmi init + test code into inboard floor --- SAMM/InboardFloor/Src/main.c | 73 ++++++++++++++++++++++++---------- SAMM/SuspensionNode/Src/main.c | 14 +++---- 2 files changed, 58 insertions(+), 29 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 984415a04..99e569530 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -22,6 +22,7 @@ // #include "crc.h" // #include "fdcan.h" #include "NodeID.h" +#include "can_inboardfloor.h" #include "gpio.h" #include "i2c.h" #include "spi.h" @@ -49,6 +50,18 @@ #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif + +#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_ACC_RANGE 0x2 // +/- 8g +#define BMI_ACC_MODE 0x7 // High performance mode +#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_ACC_AVGNUM 0x0 // No averaging + +#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) +#define BMI_GYR_MODE 0x7 // High performance mode +#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_GYR_AVGNUM 0x0 // No averaging /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -115,39 +128,36 @@ int main(void) /* USER CODE BEGIN 2 */ /* USER CODE BEGIN Init */ + InboardFloor_CAN_Init(GRCAN_BUS_DATA); + InboardFloor_CAN_Init(GRCAN_BUS_DATA_SUBNET); // HAL_FDCAN_Start(&hfdcan1); // HAL_FDCAN_Start(&hfdcan2); // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin); // TODO: - // Send 2 dummy bytes to switch BMI323 to SPI mode - // uint16_t dummy_byte = 0x8000; - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); - // HAL_SPI_Transmit(&hspi1,(uint8_t*)&dummy_byte, 1, HAL_MAX_DELAY); - // HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - // HAL_Delay(1); // Short delay after mode switch - // Initialize BMI323 sensor - - // if (BMI323_Init() != HAL_OK) { - // printf("BMI323 initialization failed!\r\n"); - // Error_Handler(); - // } + // Initialize IMU + if (bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin) != HAL_OK) { + LOGOMATIC("BMI323 initialization failed!\n"); + Error_Handler(); + } - // static uint16_t eeMLX90640[832]; - // static paramsMLX90640 mlx90640; - // #define MLX90640_ADDRESS 0x33<<1 - // MLX90640_DumpEE(MLX90640_ADDRESS, eeMLX90640); + bmi323_soft_reset(&bmi323_dev); - // MLX90640_ExtractParameters(eeMLX90640, &mlx90640); + // Switch to IMU to SPI mode + uint8_t bmi323_mode_tx[4] = {0x00 | 0x80, 0x00, 0x00, 0x00}; + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_RESET); + HAL_SPI_Transmit(&hspi1, bmi323_mode_tx, 4, HAL_MAX_DELAY); + HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); + HAL_Delay(1); // Short delay after mode switch - // MLX90640_SetRefreshRate(MLX90640_ADDRESS, 0x05); + // Set up accelerometer and gyroscope configuration + bmi323_enable_acc(&bmi323_dev, BMI_ACC_MODE, BMI_ACC_AVGNUM, BMI_ACC_BW, BMI_ACC_RANGE, BMI_ACC_ODR); + bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); - // MLX90640_SynchFrame(MLX90640_ADDRESS); - // MLX90640_SetRefreshRate(0x33, 0x05); /* USER CODE END 2 */ /* Infinite loop */ @@ -177,6 +187,27 @@ int main(void) while (1) { /* USER CODE BEGIN 3 */ + uint16_t imu_ax = bmi323_read_acc_x(&bmi323_dev); + uint16_t imu_ay = bmi323_read_acc_y(&bmi323_dev); + uint16_t imu_az = bmi323_read_acc_z(&bmi323_dev); + uint16_t imu_gyrx = bmi323_read_gyr_x(&bmi323_dev); + uint16_t imu_gyry = bmi323_read_gyr_y(&bmi323_dev); + uint16_t imu_gyrz = bmi323_read_gyr_z(&bmi323_dev); + uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); + uint16_t imu_status = bmi323_read_status(&bmi323_dev); + + float imu_ax_test = ((float)imu_ax) / 4096.f; + float imu_ay_test = ((float)imu_ay) / 4096.f; + float imu_az_test = ((float)imu_az) / 4096.f; + float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; + float imu_gyry_test = ((float)imu_gyry) / 16.384f; + float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; + float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; + + LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); + LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); + LOGOMATIC("IMU temperature: %f", imu_temp_test); + // begin VL53L4ED status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); if (p_data_ready) { diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index f0eda3c22..060290e8f 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -57,13 +57,13 @@ #define BMI_ACC_RANGE 0x2 // +/- 8g #define BMI_ACC_MODE 0x7 // High performance mode #define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 -#define BMI_ACC_AVGNUM 0x3 // Averaging of 8 samples +#define BMI_ACC_AVGNUM 0x0 // No averaging #define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz #define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) #define BMI_GYR_MODE 0x7 // High performance mode #define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 -#define BMI_GYR_AVGNUM 0x3 // Averaging of 8 samples +#define BMI_GYR_AVGNUM 0x0 // No averaging /* USER CODE END PD */ @@ -137,9 +137,6 @@ int main(void) bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); - mag mag_dev; - HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); - // Initialize IMU if (bmi323_init(&bmi323_dev, &hspi1, BMI323_CS_GPIO_Port, BMI323_CS_Pin) != HAL_OK) { LOGOMATIC("BMI323 initialization failed!\n"); @@ -159,13 +156,14 @@ int main(void) bmi323_enable_acc(&bmi323_dev, BMI_ACC_MODE, BMI_ACC_AVGNUM, BMI_ACC_BW, BMI_ACC_RANGE, BMI_ACC_ODR); bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); + mag mag_dev; + HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); + // Initialize magnetic encoder if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { LOGOMATIC("MAG initialization failed!\n"); Error_Handler(); } - - uint16_t millis_since_last = HAL_GetTick(); /* USER CODE BEGIN WHILE */ while (1) { @@ -252,7 +250,7 @@ int main(void) Error_Handler(); } - HAL_Delay(10); + HAL_Delay(50); // TODO: how long should delay be? /* TODO: From 24600e246cf4f49e493a84ceec8252cedbf80267 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 19:26:15 -0700 Subject: [PATCH 145/158] Added to inboard floor main while loop, removed some old TODO comments --- SAMM/InboardFloor/CMakeLists.txt | 1 - SAMM/InboardFloor/Inc/can_inboardfloor.h | 1 - SAMM/InboardFloor/Src/can_inboardfloor.c | 2 +- SAMM/InboardFloor/Src/main.c | 53 +++++++++++++++++++----- SAMM/SuspensionNode/CMakeLists.txt | 1 - SAMM/SuspensionNode/Src/can_sus.c | 2 +- SAMM/SuspensionNode/Src/mag.c | 2 +- SAMM/SuspensionNode/Src/main.c | 2 +- 8 files changed, 46 insertions(+), 18 deletions(-) diff --git a/SAMM/InboardFloor/CMakeLists.txt b/SAMM/InboardFloor/CMakeLists.txt index bc5b18f65..2c65f404a 100644 --- a/SAMM/InboardFloor/CMakeLists.txt +++ b/SAMM/InboardFloor/CMakeLists.txt @@ -38,7 +38,6 @@ target_sources( Src/VL53L4ED_api.c Src/VL53L4ED_calibration.c Src/can_inboardfloor.c - # TODO ) target_link_libraries( diff --git a/SAMM/InboardFloor/Inc/can_inboardfloor.h b/SAMM/InboardFloor/Inc/can_inboardfloor.h index b8d4bf43a..477ad8cf0 100644 --- a/SAMM/InboardFloor/Inc/can_inboardfloor.h +++ b/SAMM/InboardFloor/Inc/can_inboardfloor.h @@ -33,7 +33,6 @@ typedef struct { uint16_t bmi323_status; /* Time of Flight Data */ - // TODO: figure out how to get these values from tof results struct when more awake uint16_t distance_mm; uint16_t ambient_rate_kcps; uint16_t ambient_per_spad_kcps; diff --git a/SAMM/InboardFloor/Src/can_inboardfloor.c b/SAMM/InboardFloor/Src/can_inboardfloor.c index 24bebf775..1e51dc583 100644 --- a/SAMM/InboardFloor/Src/can_inboardfloor.c +++ b/SAMM/InboardFloor/Src/can_inboardfloor.c @@ -1,7 +1,7 @@ #include "can_inboardfloor.h" #include "can_cfg.h" -static GRCAN_MSG_ID CAN_INBOARDFLOOR_MSG_DATA = 0x052; // TODO: Finalize with GRCAN viewer and use from Autogen instead +static GRCAN_MSG_ID CAN_INBOARDFLOOR_MSG_DATA = GRCAN_INBOARDFLOOR_IMU_TOF_DATA; static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // Before initialization static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 99e569530..da8adab3d 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -41,6 +41,9 @@ /* USER CODE BEGIN PTD */ #define BMI323_CS_GPIO_Port GPIOA #define BMI323_CS_Pin GPIO_PIN_4 + +#define TOF_XSHUT_GPIO_Port GPIOA +#define TOF_XSHUT_Pin GPIO_PIN_1 /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -172,18 +175,18 @@ int main(void) HAL_Delay(100); // wait for 5ms to power up the device uint16_t status = 0; - uint16_t sensor_id = 0; VL53L4ED_ResultsData_t results; uint8_t p_data_ready; - int TOF_ID = 0x52; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1); + int TOF_ID = 0x52; // TODO: find where this address is from + HAL_GPIO_TogglePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin); status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); - printf("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + LOGOMATIC("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); + status = VL53L4ED_StartRanging(TOF_ID); status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); - status = VL53L4ED_SetOffset(TOF_ID, 50); // Set offset to 0 for testing + status = VL53L4ED_SetOffset(TOF_ID, 0); // Set offset to 0 for testing, 50 otherwise? while (1) { /* USER CODE BEGIN 3 */ @@ -215,19 +218,47 @@ int main(void) VL53L4ED_ClearInterrupt(TOF_ID); /* Read measured distance. RangeStatus = 0 means valid data */ VL53L4ED_GetResult(TOF_ID, &results); - printf("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); + LOGOMATIC("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); } else { HAL_Delay(10); __disable_irq(); __enable_irq(); } - // begin BMI323 - // int16_t ax, ay, az; - // if (BMI323_ReadAccel(&ax, &ay, &az) == HAL_OK) { - // printf("Accel: X=%d, Y=%d, Z=%d\r\n", ax, ay, az); - // } HAL_Delay(100); // Read every 100ms + + IMU_ToF_Data test_data; + + test_data.bmi323_acc_x = imu_ax_test; + test_data.bmi323_acc_y = imu_ay_test; + test_data.bmi323_acc_z = imu_az_test; + test_data.bmi323_gyro_x = imu_gyrx_test; + test_data.bmi323_gyro_y = imu_gyry_test; + test_data.bmi323_gyro_z = imu_gyrz_test; + test_data.bmi323_temp = imu_temp_test; + test_data.bmi323_status = imu_status; + + test_data.distance_mm = results.distance_mm; + test_data.ambient_rate_kcps = results.ambient_rate_kcps; + test_data.ambient_per_spad_kcps = results.ambient_per_spad_kcps; + test_data.signal_rate_kcps = results.signal_rate_kcps; + test_data.signal_per_spad_kcps = results.signal_per_spad_kcps; + test_data.number_of_spad = results.number_of_spad; + test_data.sigma_mm = results.sigma_mm; + test_data.range_status = results.range_status; + + GRCAN_NODE_ID dest_node = GRCAN_TCM; + GRCAN_MSG_ID msg_id = GRCAN_INBOARDFLOOR_IMU_TOF_DATA; + InboardFloor_CAN_Send(dest_node, msg_id, &test_data); + + if (imu_status != 0) { + LOGOMATIC("IMU is cooked"); + Error_Handler(); + } + if (results.range_status != 0) { + LOGOMATIC("ToF is cooked"); + Error_Handler(); + } } /* USER CODE END 3 */ } diff --git a/SAMM/SuspensionNode/CMakeLists.txt b/SAMM/SuspensionNode/CMakeLists.txt index 2ff932c39..6022096cc 100644 --- a/SAMM/SuspensionNode/CMakeLists.txt +++ b/SAMM/SuspensionNode/CMakeLists.txt @@ -35,7 +35,6 @@ target_sources( Src/spi.c Src/stm32h5xx_it.c Src/can_sus.c - # TODO ) target_link_libraries( diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 8dcc907b0..49056cca2 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,7 +1,7 @@ #include "can_sus.h" #include "can_cfg.h" -static GRCAN_MSG_ID CAN_SUS_MSG_DATA = 0x051; // TODO: Finalize with GRCAN viewer and use from Autogen instead +static GRCAN_MSG_ID CAN_SUS_MSG_DATA = GRCAN_SUSPENSION_IMU_MAG_DATA; static GRCAN_NODE_ID sensorNode = GRCAN_ALL; // Before initialization static GRCAN_NODE_ID localNode = LOCAL_GR_ID; static GRCAN_NODE_ID TCMNode = GRCAN_TCM; diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index c24484259..e00b4db60 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -44,7 +44,7 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data) HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // Release chip select back to high if (res != HAL_OK) { - return 0xFFFF; // TODO: Find appropriate error indicator + return 0xFFFF; } return ((uint16_t)rx_word[0] << 8) | rx_word[1]; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 060290e8f..bc622cd30 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -236,7 +236,7 @@ int main(void) test_data.mag_hysteresis = mag_hysteresis; GRCAN_NODE_ID test_dest_node = GRCAN_TCM; - GRCAN_MSG_ID test_msg_id = GRCAN_TCM_RESOURCE_UTILIZATION; + GRCAN_MSG_ID test_msg_id = GRCAN_SUSPENSION_IMU_MAG_DATA; SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); if (imu_status != 0) { From e664caaa50a92741911bdea63435f5240d62cca2 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 19:33:26 -0700 Subject: [PATCH 146/158] Fixed naming convention in FancyCAN_LoopbackTest bc it was causing a build error --- H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c | 2 +- SAMM/SuspensionNode/Src/main.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c index 89cac185c..347ffa071 100644 --- a/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c +++ b/H523xx_CAN_TESTING/Core/Src/FancyCAN_LoopbackTest.c @@ -77,7 +77,7 @@ GRCAN_MSG_ID get_messageID(GRCAN_BUS_ID bus) case GRCAN_BUS_TESTING: return GRCAN_DEBUG_2_0; case GRCAN_BUS_CHARGER: - return GRCAN_ACU_CONFIG_CHARGE_PARAMETERS; + return GRCAN_ACU_CONFIG_CHG_PARAMS; case GRCAN_BUS_DATA_SUBNET: return GRCAN_ECU_STATUS_1; default: diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index bc622cd30..0359857df 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -81,6 +81,7 @@ PUTCHAR_PROTOTYPE /* USER CODE BEGIN PV */ // FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; + /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ From e3a415992e067c7646273799ed9a680a71c33609 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 21 May 2026 21:31:16 -0700 Subject: [PATCH 147/158] Added EWMA for inboard floor --- SAMM/IMU/Src/bmi323.c | 6 - SAMM/InboardFloor/Src/main.c | 200 +++++++++++++++++++++------------ SAMM/SuspensionNode/Src/main.c | 30 +++-- 3 files changed, 153 insertions(+), 83 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index f78e7cc82..e90f8e5e1 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -97,12 +97,6 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT 9. Done */ -// TODO: MOVE THIS FUNCTION ELSEWHERE -uint32_t MillisecondsSinceBoot() -{ - return HAL_GetTick() * HAL_GetTickFreq(); -} - uint8_t bmi323_calib(bmi323 *bmi323_dev) { // first we have to fucking start the feature engine diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index da8adab3d..a3907dd2f 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -81,6 +81,9 @@ PUTCHAR_PROTOTYPE /* USER CODE BEGIN PV */ // FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; +const uint16_t avgcalc_interval = 100; +const uint16_t send_interval = 100; +const float alpha = 0.2; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -91,6 +94,21 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ + +// TODO: MOVE THIS FUNCTION ELSEWHERE +uint32_t MillisecondsSinceBoot() +{ + return HAL_GetTick() * HAL_GetTickFreq(); +} + + +uint16_t ema(uint16_t new_value, uint16_t old_value) { + if (old_value == 0xFFFF) { + return new_value; + } + return alpha * new_value + (1 - alpha) * old_value; +} + /* USER CODE END 0 */ /** @@ -167,10 +185,10 @@ int main(void) /* USER CODE BEGIN WHILE */ // begin VL53L4ED HAL_Delay(100); // wait for 5ms to power up the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin + HAL_GPIO_WritePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin HAL_Delay(100); // wait for 5ms to reset the device - HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // TOF_L_XSHUT_Pin + HAL_GPIO_WritePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin, GPIO_PIN_SET); // TOF_L_XSHUT_Pin // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin HAL_Delay(100); // wait for 5ms to power up the device @@ -179,7 +197,7 @@ int main(void) VL53L4ED_ResultsData_t results; uint8_t p_data_ready; - int TOF_ID = 0x52; // TODO: find where this address is from + int TOF_ID = 0x52; HAL_GPIO_TogglePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin); status = VL53L4ED_GetSensorId(TOF_ID, &sensor_id); LOGOMATIC("VL53L4ED Sensor ID: 0x%04X\n", sensor_id); @@ -188,79 +206,122 @@ int main(void) status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); status = VL53L4ED_SetOffset(TOF_ID, 0); // Set offset to 0 for testing, 50 otherwise? + uint32_t last_avgcalc_ms = MillisecondsSinceBoot(); + uint32_t last_send_ms = MillisecondsSinceBoot(); + + uint16_t imu_ax = 0xFFFF; + uint16_t imu_ay = 0xFFFF; + uint16_t imu_az = 0xFFFF; + uint16_t imu_gyrx = 0xFFFF; + uint16_t imu_gyry = 0xFFFF; + uint16_t imu_gyrz = 0xFFFF; + uint16_t imu_temp = 0xFFFF; + uint16_t imu_status = 0; + + results.distance_mm = 0xFFFF; + results.ambient_rate_kcps = 0xFFFF; + results.ambient_per_spad_kcps = 0xFFFF; + results.signal_rate_kcps = 0xFFFF; + results.signal_per_spad_kcps = 0xFFFF; + results.number_of_spad = 0xFFFF; + results.sigma_mm = 0xFFFF; + results.range_status = 0xFFFF; + while (1) { /* USER CODE BEGIN 3 */ - uint16_t imu_ax = bmi323_read_acc_x(&bmi323_dev); - uint16_t imu_ay = bmi323_read_acc_y(&bmi323_dev); - uint16_t imu_az = bmi323_read_acc_z(&bmi323_dev); - uint16_t imu_gyrx = bmi323_read_gyr_x(&bmi323_dev); - uint16_t imu_gyry = bmi323_read_gyr_y(&bmi323_dev); - uint16_t imu_gyrz = bmi323_read_gyr_z(&bmi323_dev); - uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); - uint16_t imu_status = bmi323_read_status(&bmi323_dev); - - float imu_ax_test = ((float)imu_ax) / 4096.f; - float imu_ay_test = ((float)imu_ay) / 4096.f; - float imu_az_test = ((float)imu_az) / 4096.f; - float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; - float imu_gyry_test = ((float)imu_gyry) / 16.384f; - float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; - float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; - - LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); - LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); - LOGOMATIC("IMU temperature: %f", imu_temp_test); - - // begin VL53L4ED - status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); - if (p_data_ready) { - /* (Mandatory) Clear HW interrupt to restart measurements */ - VL53L4ED_ClearInterrupt(TOF_ID); - /* Read measured distance. RangeStatus = 0 means valid data */ - VL53L4ED_GetResult(TOF_ID, &results); - LOGOMATIC("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); - } else { - HAL_Delay(10); - __disable_irq(); - __enable_irq(); - } - - HAL_Delay(100); // Read every 100ms - + uint32_t current_time = MillisecondsSinceBoot(); IMU_ToF_Data test_data; - test_data.bmi323_acc_x = imu_ax_test; - test_data.bmi323_acc_y = imu_ay_test; - test_data.bmi323_acc_z = imu_az_test; - test_data.bmi323_gyro_x = imu_gyrx_test; - test_data.bmi323_gyro_y = imu_gyry_test; - test_data.bmi323_gyro_z = imu_gyrz_test; - test_data.bmi323_temp = imu_temp_test; - test_data.bmi323_status = imu_status; - - test_data.distance_mm = results.distance_mm; - test_data.ambient_rate_kcps = results.ambient_rate_kcps; - test_data.ambient_per_spad_kcps = results.ambient_per_spad_kcps; - test_data.signal_rate_kcps = results.signal_rate_kcps; - test_data.signal_per_spad_kcps = results.signal_per_spad_kcps; - test_data.number_of_spad = results.number_of_spad; - test_data.sigma_mm = results.sigma_mm; - test_data.range_status = results.range_status; - - GRCAN_NODE_ID dest_node = GRCAN_TCM; - GRCAN_MSG_ID msg_id = GRCAN_INBOARDFLOOR_IMU_TOF_DATA; - InboardFloor_CAN_Send(dest_node, msg_id, &test_data); - - if (imu_status != 0) { - LOGOMATIC("IMU is cooked"); - Error_Handler(); + if (current_time - last_avgcalc_ms > avgcalc_interval) { + last_avgcalc_ms = current_time; + + imu_ax = ewa(bmi323_read_acc_x(&bmi323_dev), imu_ax); + imu_ay = ewa(bmi323_read_acc_x(&bmi323_dev), imu_ay); + imu_az = ewa(bmi323_read_acc_z(&bmi323_dev), imu_az); + imu_gyrx = ewa(bmi323_read_gyr_x(&bmi323_dev), imu_az); + imu_gyry = ewa(bmi323_read_gyr_y(&bmi323_dev), imu_gyry); + imu_gyrz = ewa(bmi323_read_gyr_z(&bmi323_dev), imu_gyrz); + imu_temp = ewa(bmi323_read_temp_data(&bmi323_dev), imu_temp); + imu_status = bmi323_read_status(&bmi323_dev); + + float imu_ax_test = ((float)imu_ax) / 4096.f; + float imu_ay_test = ((float)imu_ay) / 4096.f; + float imu_az_test = ((float)imu_az) / 4096.f; + float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; + float imu_gyry_test = ((float)imu_gyry) / 16.384f; + float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; + float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; + + LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); + LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); + LOGOMATIC("IMU temperature: %f", imu_temp_test); + + // begin VL53L4ED + status = VL53L4ED_CheckForDataReady(TOF_ID, &p_data_ready); + if (p_data_ready) { + /* (Mandatory) Clear HW interrupt to restart measurements */ + VL53L4ED_ClearInterrupt(TOF_ID); + + VL53L4ED_ResultsData_t old_results = results; + + /* Read measured distance. RangeStatus = 0 means valid data */ + VL53L4ED_GetResult(TOF_ID, &results); + results.distance_mm = ewa(results.distance_mm, old_results.distance_mm); + results.ambient_rate_kcps = ewa(results.ambient_rate_kcps, old_results.ambient_rate_kcps); + results.ambient_per_spad_kcps = ewa(results.ambient_per_spad_kcps, old_results.ambient_per_spad_kcps); + results.signal_rate_kcps = ewa(results.signal_rate_kcps, old_results.signal_rate_kcps); + results.signal_per_spad_kcps = ewa(results.distance_mm, old_results.distance_mm); + results.number_of_spad = ewa(results.number_of_spad, old_results.number_of_spad); + results.sigma_mm = ewa(results.sigma_mm, old_results.sigma_mm); + + LOGOMATIC("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); + } else { + HAL_Delay(10); + __disable_irq(); + __enable_irq(); + } + + HAL_Delay(100); // Read every 100ms + + test_data.bmi323_acc_x = imu_ax; + test_data.bmi323_acc_y = imu_ay; + test_data.bmi323_acc_z = imu_az; + test_data.bmi323_gyro_x = imu_gyrx; + test_data.bmi323_gyro_y = imu_gyry; + test_data.bmi323_gyro_z = imu_gyrz; + test_data.bmi323_temp = imu_temp; + test_data.bmi323_status = imu_status; + + test_data.distance_mm = results.distance_mm; + test_data.ambient_rate_kcps = results.ambient_rate_kcps; + test_data.ambient_per_spad_kcps = results.ambient_per_spad_kcps; + test_data.signal_rate_kcps = results.signal_rate_kcps; + test_data.signal_per_spad_kcps = results.signal_per_spad_kcps; + test_data.number_of_spad = results.number_of_spad; + test_data.sigma_mm = results.sigma_mm; + test_data.range_status = results.range_status; + } - if (results.range_status != 0) { - LOGOMATIC("ToF is cooked"); - Error_Handler(); + + if (current_time - last_send_ms > send_interval) { + last_send_ms = current_time; + + GRCAN_NODE_ID dest_node = GRCAN_TCM; + GRCAN_MSG_ID msg_id = GRCAN_INBOARDFLOOR_IMU_TOF_DATA; + InboardFloor_CAN_Send(dest_node, msg_id, &test_data); + + if (imu_status != 0) { + LOGOMATIC("IMU is cooked"); + Error_Handler(); + } + if (results.range_status != 0) { + LOGOMATIC("ToF is cooked"); + Error_Handler(); + } } - } + /* USER CODE END 3 */ + } } /** @@ -316,6 +377,7 @@ void SystemClock_Config(void) if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { Error_Handler(); } + } /* USER CODE BEGIN 4 */ diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 0359857df..8b3715821 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -81,7 +81,9 @@ PUTCHAR_PROTOTYPE /* USER CODE BEGIN PV */ // FDCAN_RxHeaderTypeDef RxHeader_FDCAN2; - +const uint16_t avgcalc_interval = 100; +const uint16_t send_interval = 100; +const float alpha = 0.2; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -92,6 +94,18 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ +uint32_t MillisecondsSinceBoot() +{ + return HAL_GetTick() * HAL_GetTickFreq(); +} + + +uint16_t ema(uint16_t new_value, uint16_t old_value) { + if (old_value == 0xFFFF) { + return new_value; + } + return alpha * new_value + (1 - alpha) * old_value; +} /* USER CODE END 0 */ /** @@ -221,13 +235,13 @@ int main(void) IMU_Mag_Data test_data; - test_data.bmi323_acc_x = imu_ax_test; - test_data.bmi323_acc_y = imu_ay_test; - test_data.bmi323_acc_z = imu_az_test; - test_data.bmi323_gyro_x = imu_gyrx_test; - test_data.bmi323_gyro_y = imu_gyry_test; - test_data.bmi323_gyro_z = imu_gyrz_test; - test_data.bmi323_temp = imu_temp_test; + test_data.bmi323_acc_x = imu_ax; + test_data.bmi323_acc_y = imu_ay; + test_data.bmi323_acc_z = imu_az; + test_data.bmi323_gyro_x = imu_gyrx; + test_data.bmi323_gyro_y = imu_gyry; + test_data.bmi323_gyro_z = imu_gyrz; + test_data.bmi323_temp = imu_temp; test_data.bmi323_status = imu_status; test_data.mag_angle = mag_angle; From 00bd8df6c223ab13bf2c2540b4768781626f6e4d Mon Sep 17 00:00:00 2001 From: ReginaldWang Date: Fri, 22 May 2026 13:37:03 +0800 Subject: [PATCH 148/158] added ewma for susnode and minor changes --- SAMM/InboardFloor/Src/main.c | 23 ++-- SAMM/SuspensionNode/Src/main.c | 198 +++++++++++++++++++-------------- 2 files changed, 127 insertions(+), 94 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index a3907dd2f..7b2b09da7 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -102,7 +102,7 @@ uint32_t MillisecondsSinceBoot() } -uint16_t ema(uint16_t new_value, uint16_t old_value) { +uint16_t ewa(uint16_t new_value, uint16_t old_value) { if (old_value == 0xFFFF) { return new_value; } @@ -167,6 +167,7 @@ int main(void) } bmi323_soft_reset(&bmi323_dev); + HAL_Delay(10); // Switch to IMU to SPI mode uint8_t bmi323_mode_tx[4] = {0x00 | 0x80, 0x00, 0x00, 0x00}; @@ -179,10 +180,7 @@ int main(void) bmi323_enable_acc(&bmi323_dev, BMI_ACC_MODE, BMI_ACC_AVGNUM, BMI_ACC_BW, BMI_ACC_RANGE, BMI_ACC_ODR); bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); - /* USER CODE END 2 */ - /* Infinite loop */ - /* USER CODE BEGIN WHILE */ // begin VL53L4ED HAL_Delay(100); // wait for 5ms to power up the device HAL_GPIO_WritePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin @@ -206,9 +204,6 @@ int main(void) status = VL53L4ED_SetRangeTiming(TOF_ID, 50, 70); status = VL53L4ED_SetOffset(TOF_ID, 0); // Set offset to 0 for testing, 50 otherwise? - uint32_t last_avgcalc_ms = MillisecondsSinceBoot(); - uint32_t last_send_ms = MillisecondsSinceBoot(); - uint16_t imu_ax = 0xFFFF; uint16_t imu_ay = 0xFFFF; uint16_t imu_az = 0xFFFF; @@ -227,18 +222,23 @@ int main(void) results.sigma_mm = 0xFFFF; results.range_status = 0xFFFF; + uint32_t last_avgcalc_ms = MillisecondsSinceBoot(); + uint32_t last_send_ms = MillisecondsSinceBoot(); + IMU_ToF_Data test_data = {0}; + /* USER CODE END 2 */ + + /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE BEGIN 3 */ uint32_t current_time = MillisecondsSinceBoot(); - IMU_ToF_Data test_data; if (current_time - last_avgcalc_ms > avgcalc_interval) { last_avgcalc_ms = current_time; imu_ax = ewa(bmi323_read_acc_x(&bmi323_dev), imu_ax); - imu_ay = ewa(bmi323_read_acc_x(&bmi323_dev), imu_ay); + imu_ay = ewa(bmi323_read_acc_y(&bmi323_dev), imu_ay); imu_az = ewa(bmi323_read_acc_z(&bmi323_dev), imu_az); - imu_gyrx = ewa(bmi323_read_gyr_x(&bmi323_dev), imu_az); + imu_gyrx = ewa(bmi323_read_gyr_x(&bmi323_dev), imu_gyrx); imu_gyry = ewa(bmi323_read_gyr_y(&bmi323_dev), imu_gyry); imu_gyrz = ewa(bmi323_read_gyr_z(&bmi323_dev), imu_gyrz); imu_temp = ewa(bmi323_read_temp_data(&bmi323_dev), imu_temp); @@ -270,7 +270,7 @@ int main(void) results.ambient_rate_kcps = ewa(results.ambient_rate_kcps, old_results.ambient_rate_kcps); results.ambient_per_spad_kcps = ewa(results.ambient_per_spad_kcps, old_results.ambient_per_spad_kcps); results.signal_rate_kcps = ewa(results.signal_rate_kcps, old_results.signal_rate_kcps); - results.signal_per_spad_kcps = ewa(results.distance_mm, old_results.distance_mm); + results.signal_per_spad_kcps = ewa(results.signal_per_spad_kcps, old_results.signal_per_spad_kcps); results.number_of_spad = ewa(results.number_of_spad, old_results.number_of_spad); results.sigma_mm = ewa(results.sigma_mm, old_results.sigma_mm); @@ -281,7 +281,6 @@ int main(void) __enable_irq(); } - HAL_Delay(100); // Read every 100ms test_data.bmi323_acc_x = imu_ax; test_data.bmi323_acc_y = imu_ay; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 8b3715821..7b29e83a8 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -84,6 +84,7 @@ PUTCHAR_PROTOTYPE const uint16_t avgcalc_interval = 100; const uint16_t send_interval = 100; const float alpha = 0.2; +static bool ewa_signed_initialization = false; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -100,14 +101,23 @@ uint32_t MillisecondsSinceBoot() } -uint16_t ema(uint16_t new_value, uint16_t old_value) { +uint16_t ewa_u(uint16_t new_value, uint16_t old_value) { if (old_value == 0xFFFF) { return new_value; } return alpha * new_value + (1 - alpha) * old_value; } + +int16_t ewa_i(int16_t new_value, int16_t old_value) { + if (!ewa_signed_initialization) { + ewa_signed_initialization = true; + return new_value; + } + return alpha * new_value + (1 - alpha) * old_value; +} /* USER CODE END 0 */ + /** * @brief The application entry point. * @retval int @@ -159,6 +169,7 @@ int main(void) } bmi323_soft_reset(&bmi323_dev); + HAL_Delay(10); // Switch to IMU to SPI mode uint8_t bmi323_mode_tx[4] = {0x00 | 0x80, 0x00, 0x00, 0x00}; @@ -181,92 +192,115 @@ int main(void) } /* USER CODE BEGIN WHILE */ + uint16_t imu_ax = 0xFFFF; + uint16_t imu_ay = 0xFFFF; + uint16_t imu_az = 0xFFFF; + uint16_t imu_gyrx = 0xFFFF; + uint16_t imu_gyry = 0xFFFF; + uint16_t imu_gyrz = 0xFFFF; + uint16_t imu_temp = 0xFFFF; + uint16_t imu_status = 0; + uint16_t mag_temp = 0xFFFF; + uint16_t mag_hysteresis = 0xFFFF; + uint16_t mag_angle = 0xFFFF; + int16_t mag_turns = 0; + uint8_t mag_status = 0; + + uint32_t last_avgcalc_ms = MillisecondsSinceBoot(); + uint32_t last_send_ms = MillisecondsSinceBoot(); + IMU_Mag_Data test_data = {0}; + while (1) { - uint16_t imu_ax = bmi323_read_acc_x(&bmi323_dev); - uint16_t imu_ay = bmi323_read_acc_y(&bmi323_dev); - uint16_t imu_az = bmi323_read_acc_z(&bmi323_dev); - uint16_t imu_gyrx = bmi323_read_gyr_x(&bmi323_dev); - uint16_t imu_gyry = bmi323_read_gyr_y(&bmi323_dev); - uint16_t imu_gyrz = bmi323_read_gyr_z(&bmi323_dev); - uint16_t imu_temp = bmi323_read_temp_data(&bmi323_dev); - uint16_t imu_status = bmi323_read_status(&bmi323_dev); - - float imu_ax_test = ((float)imu_ax) / 4096.f; - float imu_ay_test = ((float)imu_ay) / 4096.f; - float imu_az_test = ((float)imu_az) / 4096.f; - float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; - float imu_gyry_test = ((float)imu_gyry) / 16.384f; - float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; - float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; - - LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); - LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); - LOGOMATIC("IMU temperature: %f", imu_temp_test); - - uint16_t mag_temp = mag_read_temp(&mag_dev); - uint16_t mag_hysteresis = mag_read_HANG(&mag_dev); - uint16_t mag_angle = mag_read_encoder_angle(&mag_dev); - int16_t mag_turns = mag_read_turns(&mag_dev); - uint8_t mag_status = check_status(&mag_dev); - - // TODO: check these conversion formulas - int16_t mag_temp_test = mag_temp - 60; - float mag_angle_test = mag_angle * 360.f / 4096.0f; - float mag_hysteresis_test = mag_hysteresis * 360.f / 4096.0f; - - LOGOMATIC("Mag temperature: %d C\n", mag_temp_test); - LOGOMATIC("Angle: %f deg\n", mag_angle_test); - LOGOMATIC("Turns: %d\n", mag_turns); - LOGOMATIC("Hysteresis Angle: %f\n", mag_hysteresis_test); - - // uint8_t buffer[8] = {0}; - // buffer[0] = (angle >> 8) & 0xFF; - // buffer[1] = angle & 0xFF; - - // buffer[2] = temp; - - // buffer[3] = (turns >> 8) & 0xFF; - // buffer[4] = turns & 0xFF; - - // // status - // buffer[5] = bad; - // buffer[6] = 0x00; - // buffer[7] = 0x00; - - IMU_Mag_Data test_data; - - test_data.bmi323_acc_x = imu_ax; - test_data.bmi323_acc_y = imu_ay; - test_data.bmi323_acc_z = imu_az; - test_data.bmi323_gyro_x = imu_gyrx; - test_data.bmi323_gyro_y = imu_gyry; - test_data.bmi323_gyro_z = imu_gyrz; - test_data.bmi323_temp = imu_temp; - test_data.bmi323_status = imu_status; - - test_data.mag_angle = mag_angle; - test_data.mag_temp = mag_temp; - test_data.mag_turns = mag_turns; - test_data.mag_status = mag_status; - test_data.mag_hysteresis = mag_hysteresis; - - GRCAN_NODE_ID test_dest_node = GRCAN_TCM; - GRCAN_MSG_ID test_msg_id = GRCAN_SUSPENSION_IMU_MAG_DATA; - SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); - - if (imu_status != 0) { - LOGOMATIC("IMU is cooked"); - Error_Handler(); + uint32_t current_time = MillisecondsSinceBoot(); + + if (current_time - last_avgcalc_ms > avgcalc_interval) { + last_avgcalc_ms = current_time; + + imu_ax = ewa_u(bmi323_read_acc_x(&bmi323_dev), imu_ax); + imu_ay = ewa_u(bmi323_read_acc_y(&bmi323_dev), imu_ay); + imu_az = ewa_u(bmi323_read_acc_z(&bmi323_dev), imu_az); + imu_gyrx = ewa_u(bmi323_read_gyr_x(&bmi323_dev), imu_gyrx); + imu_gyry = ewa_u(bmi323_read_gyr_y(&bmi323_dev), imu_gyry); + imu_gyrz = ewa_u(bmi323_read_gyr_z(&bmi323_dev), imu_gyrz); + imu_temp = ewa_u(bmi323_read_temp_data(&bmi323_dev), imu_temp); + imu_status = bmi323_read_status(&bmi323_dev); + + float imu_ax_test = ((float)imu_ax) / 4096.f; + float imu_ay_test = ((float)imu_ay) / 4096.f; + float imu_az_test = ((float)imu_az) / 4096.f; + float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; + float imu_gyry_test = ((float)imu_gyry) / 16.384f; + float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; + float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; + + LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); + LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); + LOGOMATIC("IMU temperature: %f", imu_temp_test); + + mag_temp = ewa_u(mag_read_temp(&mag_dev), mag_temp); + mag_hysteresis = ewa_u(mag_read_HANG(&mag_dev), mag_hysteresis); + mag_angle = ewa_u(mag_read_encoder_angle(&mag_dev), mag_angle); + mag_turns = ewa_i(mag_read_turns(&mag_dev), mag_turns); + mag_status = check_status(&mag_dev); + + // TODO: check these conversion formulas + int16_t mag_temp_test = mag_temp - 60; + float mag_angle_test = mag_angle * 360.f / 4096.0f; + float mag_hysteresis_test = mag_hysteresis * 360.f / 4096.0f; + + LOGOMATIC("Mag temperature: %d C\n", mag_temp_test); + LOGOMATIC("Angle: %f deg\n", mag_angle_test); + LOGOMATIC("Turns: %d\n", mag_turns); + LOGOMATIC("Hysteresis Angle: %f\n", mag_hysteresis_test); + + // uint8_t buffer[8] = {0}; + // buffer[0] = (angle >> 8) & 0xFF; + // buffer[1] = angle & 0xFF; + + // buffer[2] = temp; + + // buffer[3] = (turns >> 8) & 0xFF; + // buffer[4] = turns & 0xFF; + + // // status + // buffer[5] = bad; + // buffer[6] = 0x00; + // buffer[7] = 0x00; + + test_data.bmi323_acc_x = imu_ax; + test_data.bmi323_acc_y = imu_ay; + test_data.bmi323_acc_z = imu_az; + test_data.bmi323_gyro_x = imu_gyrx; + test_data.bmi323_gyro_y = imu_gyry; + test_data.bmi323_gyro_z = imu_gyrz; + test_data.bmi323_temp = imu_temp; + test_data.bmi323_status = imu_status; + + test_data.mag_angle = mag_angle; + test_data.mag_temp = mag_temp; + test_data.mag_turns = mag_turns; + test_data.mag_status = mag_status; + test_data.mag_hysteresis = mag_hysteresis; } - if (mag_status != 0) { - LOGOMATIC("Mag is cooked"); - mag_write_error(&mag_dev); - Error_Handler(); + if (current_time - last_send_ms > send_interval) { + last_send_ms = current_time; + GRCAN_NODE_ID test_dest_node = GRCAN_TCM; + GRCAN_MSG_ID test_msg_id = GRCAN_SUSPENSION_IMU_MAG_DATA; + SusNode_CAN_Send(test_dest_node, test_msg_id, &test_data); + + if (imu_status != 0) { + LOGOMATIC("IMU is cooked"); + Error_Handler(); + } + + if (mag_status != 0) { + LOGOMATIC("Mag is cooked"); + mag_write_error(&mag_dev); + Error_Handler(); + } } - HAL_Delay(50); // TODO: how long should delay be? - /* TODO: AVERAGING IS NOT POSSIBLE IN HIGH PERFORMANCE MODE -> still implement? From 3d7375318b96c9a2feba6a3936ee3d3d4e85af27 Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 24 May 2026 12:29:04 -0700 Subject: [PATCH 149/158] Fix suspension node naming in node id Signed-off-by: Daniel Hansen --- SAMM/SuspensionNode/GRCAN/NodeID.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/SuspensionNode/GRCAN/NodeID.h b/SAMM/SuspensionNode/GRCAN/NodeID.h index e290a4c37..c4092405e 100644 --- a/SAMM/SuspensionNode/GRCAN/NodeID.h +++ b/SAMM/SuspensionNode/GRCAN/NodeID.h @@ -8,7 +8,7 @@ #pragma message("NODE is not defined. Please compile Suspension Node for a specific target. Defaulting to FL.") #define LOCAL_GR_ID GRCAN_Suspension_FL #else -#define LOCAL_GR_ID CONCAT(GRCAN_SuspensionNode_, NODE) +#define LOCAL_GR_ID CONCAT(GRCAN_Suspension_, NODE) #endif #pragma message "Compiling Suspension Node node as " STRINGIFY_MACRO(LOCAL_GR_ID) From 0da0b9136362a3319eb4b04fc5023e29e771ab4e Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 24 May 2026 12:31:20 -0700 Subject: [PATCH 150/158] Configure STM32H523CEU6 to launch using `stlink-dap` Signed-off-by: Daniel Hansen --- .vscode/launch.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index d960f8251..bd108b9fa 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -288,7 +288,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -304,7 +304,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -320,7 +320,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -336,7 +336,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -352,7 +352,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -368,7 +368,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -384,7 +384,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -400,7 +400,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], @@ -976,7 +976,7 @@ "type": "cortex-debug", "servertype": "openocd", "configFiles": [ - "interface/stlink.cfg", + "interface/stlink-dap.cfg", "target/stm32h5x.cfg" ], "searchDir": [], From e03be2aae3d268e6372b4ca14c949eef540afaea Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Sun, 24 May 2026 12:53:04 -0700 Subject: [PATCH 151/158] Change hal status variable to be a `HAL_StatusTypeDef` instead of a generic byte for better readability Signed-off-by: Daniel Hansen --- SAMM/IMU/Src/bmi323.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index e90f8e5e1..d26e41e45 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -11,7 +11,7 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe { uint8_t tx_word[4]; uint8_t rx_word[4] = {0}; - uint8_t status = 0; + HAL_StatusTypeDef status = 0; bmi323_dev->spi_port = spi_port; bmi323_dev->port = port; From 0057e7687fc1df49aba408034af572652460f385 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Tue, 26 May 2026 00:35:50 -0700 Subject: [PATCH 152/158] moved millissinceboot so that susnode builds --- SAMM/IMU/Src/bmi323.c | 5 +++++ SAMM/SuspensionNode/Inc/main.h | 2 +- SAMM/SuspensionNode/Src/main.c | 5 ----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index d26e41e45..4148ed7c8 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -97,6 +97,11 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT 9. Done */ +uint32_t MillisecondsSinceBoot() +{ + return HAL_GetTick() * HAL_GetTickFreq(); +} + uint8_t bmi323_calib(bmi323 *bmi323_dev) { // first we have to fucking start the feature engine diff --git a/SAMM/SuspensionNode/Inc/main.h b/SAMM/SuspensionNode/Inc/main.h index 0734b16e0..36168b86d 100644 --- a/SAMM/SuspensionNode/Inc/main.h +++ b/SAMM/SuspensionNode/Inc/main.h @@ -72,7 +72,7 @@ extern "C" { void Error_Handler(void); /* USER CODE BEGIN EFP */ - +uint32_t MillisecondsSinceBoot(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 7b29e83a8..8c75026fc 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -95,11 +95,6 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -uint32_t MillisecondsSinceBoot() -{ - return HAL_GetTick() * HAL_GetTickFreq(); -} - uint16_t ewa_u(uint16_t new_value, uint16_t old_value) { if (old_value == 0xFFFF) { From f3dad67b15b5274179353b37b99cac34e5802340 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Tue, 26 May 2026 14:55:39 -0700 Subject: [PATCH 153/158] just commenting out imu code for mag testing --- SAMM/InboardFloor/Src/main.c | 6 ------ SAMM/SuspensionNode/Src/main.c | 6 ++++-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index 7b2b09da7..a35c0ce72 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -96,12 +96,6 @@ void SystemClock_Config(void); /* USER CODE BEGIN 0 */ // TODO: MOVE THIS FUNCTION ELSEWHERE -uint32_t MillisecondsSinceBoot() -{ - return HAL_GetTick() * HAL_GetTickFreq(); -} - - uint16_t ewa(uint16_t new_value, uint16_t old_value) { if (old_value == 0xFFFF) { return new_value; diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index 8c75026fc..e6355d30d 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -154,6 +154,7 @@ int main(void) // HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); // HAL_FDCAN_ActivateNotification(&hfdcan2, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0); + /* bmi323 bmi323_dev; HAL_GPIO_WritePin(BMI323_CS_GPIO_Port, BMI323_CS_Pin, GPIO_PIN_SET); @@ -176,6 +177,7 @@ int main(void) // Set up accelerometer and gyroscope configuration bmi323_enable_acc(&bmi323_dev, BMI_ACC_MODE, BMI_ACC_AVGNUM, BMI_ACC_BW, BMI_ACC_RANGE, BMI_ACC_ODR); bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); + */ mag mag_dev; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); @@ -210,7 +212,7 @@ int main(void) if (current_time - last_avgcalc_ms > avgcalc_interval) { last_avgcalc_ms = current_time; - +/* imu_ax = ewa_u(bmi323_read_acc_x(&bmi323_dev), imu_ax); imu_ay = ewa_u(bmi323_read_acc_y(&bmi323_dev), imu_ay); imu_az = ewa_u(bmi323_read_acc_z(&bmi323_dev), imu_az); @@ -231,7 +233,7 @@ int main(void) LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); LOGOMATIC("IMU temperature: %f", imu_temp_test); - +*/ mag_temp = ewa_u(mag_read_temp(&mag_dev), mag_temp); mag_hysteresis = ewa_u(mag_read_HANG(&mag_dev), mag_hysteresis); mag_angle = ewa_u(mag_read_encoder_angle(&mag_dev), mag_angle); From e33af0fbc6c1ae4265fbb9902cdae473853b1a83 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Tue, 26 May 2026 22:16:50 -0700 Subject: [PATCH 154/158] trying to debug the stupid mag encoder --- .vscode/settings.json | 2 +- SAMM/SuspensionNode/Src/mag.c | 17 ++++++++++++----- SAMM/SuspensionNode/Src/main.c | 2 +- SAMM/SuspensionNode/Src/spi.c | 2 +- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 90857164e..973827be5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,5 +24,5 @@ "files.trimTrailingWhitespace": true, "files.eol": "\n", "cmake.useCMakePresets": "always", - "cortex-debug.variableUseNaturalFormat": true + "cortex-debug.variableUseNaturalFormat": false } diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index e00b4db60..1dc73f9be 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -18,7 +18,7 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD mag_dev->port = port; mag_dev->pin = pin; - HAL_Delay(20); + LL_mDelay(20); uint16_t status = mag_read(mag_dev, 0x22); @@ -35,19 +35,25 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD uint16_t mag_transmit(mag *mag_dev, uint16_t data) { - uint8_t tx_word[2] = {data >> 8, data & 0xFF}; // Separate into two bytes - uint8_t rx_word[2] = {0}; + uint8_t tx_word[4] = { + (uint8_t)(data >> 8), // Frame 1 high byte + (uint8_t)(data & 0xFF), // Frame 1 low byte + 0x00, // Frame 2 high byte (NOP) + 0x00 // Frame 2 low byte (NOP) + }; + uint8_t rx_word[4] = {0}; HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // A1113 chip select active low - + LL_mDelay(1); HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); + LL_mDelay(1); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // Release chip select back to high if (res != HAL_OK) { return 0xFFFF; } - return ((uint16_t)rx_word[0] << 8) | rx_word[1]; + return ((uint16_t)rx_word[2] << 8) | rx_word[3]; } /* @@ -71,6 +77,7 @@ uint16_t mag_read(mag *mag_dev, uint8_t reg) return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data } + /* write cycle: 0 diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index e6355d30d..bf47ca6a3 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -179,7 +179,7 @@ int main(void) bmi323_enable_gyro(&bmi323_dev, BMI_GYR_MODE, BMI_GYR_AVGNUM, BMI_GYR_BW, BMI_GYR_RANGE, BMI_GYR_ODR); */ - mag mag_dev; + mag mag_dev = {0}; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); // Initialize magnetic encoder diff --git a/SAMM/SuspensionNode/Src/spi.c b/SAMM/SuspensionNode/Src/spi.c index a90db7823..620ba2cb6 100644 --- a/SAMM/SuspensionNode/Src/spi.c +++ b/SAMM/SuspensionNode/Src/spi.c @@ -92,7 +92,7 @@ void MX_SPI3_Init(void) hspi3.Instance = SPI3; hspi3.Init.Mode = SPI_MODE_MASTER; hspi3.Init.Direction = SPI_DIRECTION_2LINES; - hspi3.Init.DataSize = SPI_DATASIZE_4BIT; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; hspi3.Init.NSS = SPI_NSS_SOFT; From f905c8444a221a34bf024bc2cda21b78b4c6c711 Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Tue, 26 May 2026 22:34:35 -0700 Subject: [PATCH 155/158] changed spi3 to 2 edge --- SAMM/SuspensionNode/Src/mag.c | 9 ++++----- SAMM/SuspensionNode/Src/spi.c | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index 1dc73f9be..84c3934de 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -24,7 +24,7 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD // Check AOK=1 (bit 0) and BIP=0 (bit 1) // If either not true, return error - if (!(status & 0x0001) || (status & 0x0002)) { + if (!((status & 0x0001) || (status & 0x0002))) { return HAL_ERROR; } @@ -44,9 +44,7 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data) uint8_t rx_word[4] = {0}; HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // A1113 chip select active low - LL_mDelay(1); HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - LL_mDelay(1); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // Release chip select back to high if (res != HAL_OK) { @@ -73,8 +71,9 @@ crc uint16_t mag_read(mag *mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 - mag_transmit(mag_dev, cmd); // frame 1: send command, discard response - return mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data + uint16_t dummy1 = mag_transmit(mag_dev, cmd); // frame 1: send command, discard response + uint16_t dummy2 = mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data + return dummy2; } diff --git a/SAMM/SuspensionNode/Src/spi.c b/SAMM/SuspensionNode/Src/spi.c index 620ba2cb6..fc7c706c7 100644 --- a/SAMM/SuspensionNode/Src/spi.c +++ b/SAMM/SuspensionNode/Src/spi.c @@ -46,7 +46,7 @@ void MX_SPI1_Init(void) hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; @@ -94,7 +94,7 @@ void MX_SPI3_Init(void) hspi3.Init.Direction = SPI_DIRECTION_2LINES; hspi3.Init.DataSize = SPI_DATASIZE_8BIT; hspi3.Init.CLKPolarity = SPI_POLARITY_HIGH; - hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.CLKPhase = SPI_PHASE_2EDGE; hspi3.Init.NSS = SPI_NSS_SOFT; hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; From b1070d003963193df2c23b1a9f1a5ac4f31231ed Mon Sep 17 00:00:00 2001 From: Daniel Hansen Date: Thu, 28 May 2026 20:23:50 -0700 Subject: [PATCH 156/158] Fix size of transmitted SPI packet Signed-off-by: Daniel Hansen --- SAMM/SuspensionNode/Src/mag.c | 39 ++++++++++++++--------------------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index 84c3934de..b9881ba65 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -35,23 +35,20 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD uint16_t mag_transmit(mag *mag_dev, uint16_t data) { - uint8_t tx_word[4] = { - (uint8_t)(data >> 8), // Frame 1 high byte - (uint8_t)(data & 0xFF), // Frame 1 low byte - 0x00, // Frame 2 high byte (NOP) - 0x00 // Frame 2 low byte (NOP) - }; - uint8_t rx_word[4] = {0}; - - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); // A1113 chip select active low - HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_word, rx_word, 2, HAL_MAX_DELAY); - HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); // Release chip select back to high + uint8_t tx_bytes[4] = {(uint8_t)(data >> 8), (uint8_t)(data & 0xFF), 0x00, 0x00}; + uint8_t rx_bytes[4] = {0}; + + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_bytes, rx_bytes, + 4, + HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); if (res != HAL_OK) { return 0xFFFF; } - return ((uint16_t)rx_word[2] << 8) | rx_word[3]; + return ((uint16_t)rx_bytes[2] << 8) | rx_bytes[3]; } /* @@ -71,12 +68,11 @@ crc uint16_t mag_read(mag *mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 - uint16_t dummy1 = mag_transmit(mag_dev, cmd); // frame 1: send command, discard response - uint16_t dummy2 = mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data + uint16_t dummy1 = mag_transmit(mag_dev, cmd); // frame 1: send command, discard response + uint16_t dummy2 = mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data return dummy2; } - /* write cycle: 0 @@ -111,9 +107,9 @@ bool mag_read_device_status(mag *mag_dev) // Difference between junction (internal) temperature and room temperature uint16_t mag_read_temp(mag *mag_dev) { - uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register + uint16_t read_temp = mag_read(mag_dev, 0x28); // 0x28 is temp register float_t masked_temp = ((uint16_t)(read_temp & 0x0FFF) / 8.0f) + 25.0f; // Mask to 12 bits (valid temp data), range is -60 to 180 C - float_t normalized_temp = (masked_temp + 60.0f) * (4095.0f / 240.0f); // Map to range of 0x0000 to 0x0FFF + float_t normalized_temp = (masked_temp + 60.0f) * (4095.0f / 240.0f); // Map to range of 0x0000 to 0x0FFF return ((uint16_t)normalized_temp); } @@ -121,8 +117,8 @@ uint16_t mag_read_temp(mag *mag_dev) // Hysteresis Angle Value (original range is 0 to 360 degrees) uint16_t mag_read_HANG(mag *mag_dev) { - uint16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value - return ((uint16_t)(read_HANG & 0x0FFF)); // Mask to 12 bits + uint16_t read_HANG = mag_read(mag_dev, 0x30); // 0x30 is Hysteresis Angle Value + return ((uint16_t)(read_HANG & 0x0FFF)); // Mask to 12 bits } // Address 0x32:0x33 (ANG15) — 15 bits @@ -138,7 +134,7 @@ uint16_t mag_read_encoder_angle(mag *mag_dev) int16_t mag_read_turns(mag *mag_dev) { uint16_t read_turns = mag_read(mag_dev, 0x2C); // 0x2C is turn counter - int16_t masked_turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) + int16_t masked_turns = read_turns & 0x0FFF; // Mask to 12 bits (valid angle data) if (masked_turns & 0x0800) { masked_turns |= 0xF000; // sign extend bit 11 to bits 15:12 } @@ -191,12 +187,9 @@ uint8_t check_status(mag *mag_dev) return errors; } - // Address 0x24:0x25 (ERR)—Device Error Flags // FIXME: add error handling - - // Address 0x1E:0x1F (CTRL)—Device Control void mag_write_error(mag *mag_dev) { From 1c7220b5e014a2f0bc45efa21fd2ee35dd15317c Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 May 2026 03:26:02 +0000 Subject: [PATCH 157/158] Automatic Clang-Format: Standardized formatting automatically --- SAMM/IMU/Src/bmi323.c | 6 +- SAMM/InboardFloor/Inc/can_inboardfloor.h | 27 ++++---- SAMM/InboardFloor/Src/can_inboardfloor.c | 49 +++++++------- SAMM/InboardFloor/Src/main.c | 31 +++++---- SAMM/SuspensionNode/Inc/can_sus.h | 5 +- SAMM/SuspensionNode/Inc/mag.h | 2 +- SAMM/SuspensionNode/Src/can_sus.c | 9 +-- SAMM/SuspensionNode/Src/mag.c | 4 +- SAMM/SuspensionNode/Src/main.c | 81 ++++++++++++------------ 9 files changed, 108 insertions(+), 106 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 4148ed7c8..50fb5738e 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -18,9 +18,9 @@ uint8_t bmi323_init(bmi323 *bmi323_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeDe bmi323_dev->pin = pin; tx_word[0] = (BMI323_CHIP_ID) | 0x80; // Read register - tx_word[1] = 0x69; // Dummy byte - tx_word[2] = 0x00; // Nothing to get back chip id low byte in rx - tx_word[3] = 0x00; // Nothing to get back chip id high byte in rx + tx_word[1] = 0x69; // Dummy byte + tx_word[2] = 0x00; // Nothing to get back chip id low byte in rx + tx_word[3] = 0x00; // Nothing to get back chip id high byte in rx /* Okay so for one of these transmits we need to follow the following operation:bmi323_dev diff --git a/SAMM/InboardFloor/Inc/can_inboardfloor.h b/SAMM/InboardFloor/Inc/can_inboardfloor.h index 477ad8cf0..8c7a3aac2 100644 --- a/SAMM/InboardFloor/Inc/can_inboardfloor.h +++ b/SAMM/InboardFloor/Inc/can_inboardfloor.h @@ -1,11 +1,12 @@ #ifndef CAN_SUS_H #define CAN_SUS_H +#include +#include + #include "GRCAN_FancyLayer.h" #include "Logomatic.h" #include "NodeID.h" -#include -#include typedef enum { BrakeTemp_FL = GRCAN_BrakeTemp_FL, @@ -15,10 +16,10 @@ typedef enum { } BrakeTemp_Node; typedef enum { - InboardFloor_FL = GRCAN_InboardFloor_FL, - InboardFloor_FR = GRCAN_InboardFloor_FR, - InboardFloor_RL = GRCAN_InboardFloor_RL, - InboardFloor_RR = GRCAN_InboardFloor_RR + InboardFloor_FL = GRCAN_InboardFloor_FL, + InboardFloor_FR = GRCAN_InboardFloor_FR, + InboardFloor_RL = GRCAN_InboardFloor_RL, + InboardFloor_RR = GRCAN_InboardFloor_RR } InboardFloor_Node; typedef struct { @@ -33,13 +34,13 @@ typedef struct { uint16_t bmi323_status; /* Time of Flight Data */ - uint16_t distance_mm; - uint16_t ambient_rate_kcps; - uint16_t ambient_per_spad_kcps; - uint16_t signal_rate_kcps; - uint16_t signal_per_spad_kcps; - uint16_t number_of_spad; - uint16_t sigma_mm; + uint16_t distance_mm; + uint16_t ambient_rate_kcps; + uint16_t ambient_per_spad_kcps; + uint16_t signal_rate_kcps; + uint16_t signal_per_spad_kcps; + uint16_t number_of_spad; + uint16_t sigma_mm; uint8_t range_status; } IMU_ToF_Data; diff --git a/SAMM/InboardFloor/Src/can_inboardfloor.c b/SAMM/InboardFloor/Src/can_inboardfloor.c index 1e51dc583..d0de25964 100644 --- a/SAMM/InboardFloor/Src/can_inboardfloor.c +++ b/SAMM/InboardFloor/Src/can_inboardfloor.c @@ -1,4 +1,5 @@ #include "can_inboardfloor.h" + #include "can_cfg.h" static GRCAN_MSG_ID CAN_INBOARDFLOOR_MSG_DATA = GRCAN_INBOARDFLOOR_IMU_TOF_DATA; @@ -52,7 +53,7 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) int InboardFloor_CAN_Init(GRCAN_BUS_ID busID) { - int bus = (int)busID; //technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int + int bus = (int)busID; // technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int if (bus != GRCAN_BUS_DATA && bus != GRCAN_BUS_DATA_SUBNET) { LOGOMATIC("Invalid bus for Inboard Floor Node CAN Init"); @@ -73,27 +74,27 @@ int InboardFloor_CAN_Init(GRCAN_BUS_ID busID) bus_config.fdcan_instance = FDCAN1; bus_config.rx_callback = TCM_Callback; // callback - InboardFloor_Node if_node = (InboardFloor_Node)localNode; - BrakeTemp_Node braketemp_node; - - switch(if_node) { - case InboardFloor_FL: - braketemp_node = BrakeTemp_FL; - break; - case InboardFloor_FR: - braketemp_node = BrakeTemp_FR; - break; - case InboardFloor_RL: - braketemp_node = BrakeTemp_RL; - break; - case InboardFloor_RR: - braketemp_node = BrakeTemp_RR; - break; - default: - LOGOMATIC("Invalid inboard floor node, defaulting to FL\n"); - braketemp_node = BrakeTemp_FL; - break; - } + InboardFloor_Node if_node = (InboardFloor_Node)localNode; + BrakeTemp_Node braketemp_node; + + switch (if_node) { + case InboardFloor_FL: + braketemp_node = BrakeTemp_FL; + break; + case InboardFloor_FR: + braketemp_node = BrakeTemp_FR; + break; + case InboardFloor_RL: + braketemp_node = BrakeTemp_RL; + break; + case InboardFloor_RR: + braketemp_node = BrakeTemp_RR; + break; + default: + LOGOMATIC("Invalid inboard floor node, defaulting to FL\n"); + braketemp_node = BrakeTemp_FL; + break; + } sensorNode = (GRCAN_NODE_ID)braketemp_node; } @@ -118,8 +119,8 @@ bool InboardFloor_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *d } if (msg_id != CAN_INBOARDFLOOR_MSG_DATA) { - LOGOMATIC("Invalid Inboard Floor Node message ID, defaulting to DATA\n"); - msg_id = (GRCAN_MSG_ID)CAN_INBOARDFLOOR_MSG_DATA; + LOGOMATIC("Invalid Inboard Floor Node message ID, defaulting to DATA\n"); + msg_id = (GRCAN_MSG_ID)CAN_INBOARDFLOOR_MSG_DATA; } bool result = GRCAN_Fancy_Send(mainBus, dest_node, msg_id, data, data_length); diff --git a/SAMM/InboardFloor/Src/main.c b/SAMM/InboardFloor/Src/main.c index a35c0ce72..94c28c376 100644 --- a/SAMM/InboardFloor/Src/main.c +++ b/SAMM/InboardFloor/Src/main.c @@ -54,16 +54,16 @@ #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif -#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz -#define BMI_ACC_RANGE 0x2 // +/- 8g -#define BMI_ACC_MODE 0x7 // High performance mode -#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_ACC_RANGE 0x2 // +/- 8g +#define BMI_ACC_MODE 0x7 // High performance mode +#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 #define BMI_ACC_AVGNUM 0x0 // No averaging -#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz -#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) -#define BMI_GYR_MODE 0x7 // High performance mode -#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) +#define BMI_GYR_MODE 0x7 // High performance mode +#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 #define BMI_GYR_AVGNUM 0x0 // No averaging /* USER CODE END PD */ @@ -96,7 +96,8 @@ void SystemClock_Config(void); /* USER CODE BEGIN 0 */ // TODO: MOVE THIS FUNCTION ELSEWHERE -uint16_t ewa(uint16_t new_value, uint16_t old_value) { +uint16_t ewa(uint16_t new_value, uint16_t old_value) +{ if (old_value == 0xFFFF) { return new_value; } @@ -176,10 +177,10 @@ int main(void) /* Infinite loop */ // begin VL53L4ED - HAL_Delay(100); // wait for 5ms to power up the device + HAL_Delay(100); // wait for 5ms to power up the device HAL_GPIO_WritePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin, GPIO_PIN_RESET); // TOF_L_XSHUT_Pin // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_RESET); //TOF_C_XSHUT_Pin - HAL_Delay(100); // wait for 5ms to reset the device + HAL_Delay(100); // wait for 5ms to reset the device HAL_GPIO_WritePin(TOF_XSHUT_GPIO_Port, TOF_XSHUT_Pin, GPIO_PIN_SET); // TOF_L_XSHUT_Pin // HAL_GPIO_WritePin(GPIOF, GPIO_PIN_1, GPIO_PIN_SET); //TOF_C_XSHUT_Pin HAL_Delay(100); // wait for 5ms to power up the device @@ -268,14 +269,14 @@ int main(void) results.number_of_spad = ewa(results.number_of_spad, old_results.number_of_spad); results.sigma_mm = ewa(results.sigma_mm, old_results.sigma_mm); - LOGOMATIC("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, results.signal_per_spad_kcps); + LOGOMATIC("Status = %3u & Internal = %3u, Distance = %5u mm, Signal = %6u kcps/spad\n", results.range_status, status, results.distance_mm - 67, + results.signal_per_spad_kcps); } else { HAL_Delay(10); __disable_irq(); __enable_irq(); } - test_data.bmi323_acc_x = imu_ax; test_data.bmi323_acc_y = imu_ay; test_data.bmi323_acc_z = imu_az; @@ -293,7 +294,6 @@ int main(void) test_data.number_of_spad = results.number_of_spad; test_data.sigma_mm = results.sigma_mm; test_data.range_status = results.range_status; - } if (current_time - last_send_ms > send_interval) { @@ -313,7 +313,7 @@ int main(void) } } - /* USER CODE END 3 */ + /* USER CODE END 3 */ } } @@ -370,7 +370,6 @@ void SystemClock_Config(void) if (HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) { Error_Handler(); } - } /* USER CODE BEGIN 4 */ diff --git a/SAMM/SuspensionNode/Inc/can_sus.h b/SAMM/SuspensionNode/Inc/can_sus.h index 894408e19..53dbb04eb 100644 --- a/SAMM/SuspensionNode/Inc/can_sus.h +++ b/SAMM/SuspensionNode/Inc/can_sus.h @@ -1,11 +1,12 @@ #ifndef CAN_SUS_H #define CAN_SUS_H +#include +#include + #include "GRCAN_FancyLayer.h" #include "Logomatic.h" #include "NodeID.h" -#include -#include typedef enum { TireTemp_FL = GRCAN_TireTemp_FL, diff --git a/SAMM/SuspensionNode/Inc/mag.h b/SAMM/SuspensionNode/Inc/mag.h index 2288cc837..19909c612 100644 --- a/SAMM/SuspensionNode/Inc/mag.h +++ b/SAMM/SuspensionNode/Inc/mag.h @@ -2,10 +2,10 @@ #define __MAG_H__ /* Includes ------------------------------------------------------------------*/ +#include "Logomatic.h" #include "main.h" #include "spi.h" #include "stm32h5xx.h" -#include "Logomatic.h" typedef struct { SPI_HandleTypeDef *spi_port; diff --git a/SAMM/SuspensionNode/Src/can_sus.c b/SAMM/SuspensionNode/Src/can_sus.c index 49056cca2..d6db07a3d 100644 --- a/SAMM/SuspensionNode/Src/can_sus.c +++ b/SAMM/SuspensionNode/Src/can_sus.c @@ -1,4 +1,5 @@ #include "can_sus.h" + #include "can_cfg.h" static GRCAN_MSG_ID CAN_SUS_MSG_DATA = GRCAN_SUSPENSION_IMU_MAG_DATA; @@ -52,7 +53,7 @@ void TCM_Callback(uint32_t id, void *data, uint32_t size) int SusNode_CAN_Init(GRCAN_BUS_ID busID) { - int bus = (int)busID; //technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int + int bus = (int)busID; // technically GRCAN_BUS_DATA_SUBNET does not exist, avoid warnings by casting to int if (bus != GRCAN_BUS_DATA && bus != GRCAN_BUS_DATA_SUBNET) { LOGOMATIC("Invalid bus for Suspension Node CAN Init"); @@ -75,7 +76,7 @@ int SusNode_CAN_Init(GRCAN_BUS_ID busID) Sus_Node sus_node = (Sus_Node)localNode; TireTemp_Node tire_temp_node; - switch(sus_node){ + switch (sus_node) { case Sus_FL: tire_temp_node = TireTemp_FL; break; @@ -116,8 +117,8 @@ bool SusNode_CAN_Send(GRCAN_NODE_ID dest_node, GRCAN_MSG_ID msg_id, void *data) } if (msg_id != CAN_SUS_MSG_DATA) { - LOGOMATIC("Invalid Suspension Node message ID, defaulting to DATA\n"); - msg_id = (GRCAN_MSG_ID)CAN_SUS_MSG_DATA; + LOGOMATIC("Invalid Suspension Node message ID, defaulting to DATA\n"); + msg_id = (GRCAN_MSG_ID)CAN_SUS_MSG_DATA; } bool result = GRCAN_Fancy_Send(mainBus, dest_node, msg_id, data, data_length); diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index b9881ba65..af9d247a1 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -39,9 +39,7 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data) uint8_t rx_bytes[4] = {0}; HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); - HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_bytes, rx_bytes, - 4, - HAL_MAX_DELAY); + HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_bytes, rx_bytes, 4, HAL_MAX_DELAY); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); if (res != HAL_OK) { diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index bf47ca6a3..c45dba99e 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -32,8 +32,8 @@ #include // #include "VL53L4ED_api.h" -#include "mag.h" #include "bmi323.h" +#include "mag.h" // #include "circularBuffer.h" /* USER CODE END Includes */ @@ -53,16 +53,16 @@ #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif -#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz -#define BMI_ACC_RANGE 0x2 // +/- 8g -#define BMI_ACC_MODE 0x7 // High performance mode -#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_ACC_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_ACC_RANGE 0x2 // +/- 8g +#define BMI_ACC_MODE 0x7 // High performance mode +#define BMI_ACC_BW 0x0 // Sets cut off freq to ODR/2 #define BMI_ACC_AVGNUM 0x0 // No averaging -#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz -#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) -#define BMI_GYR_MODE 0x7 // High performance mode -#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 +#define BMI_GYR_ODR 0x7 // Output data rate -> 50 Hz +#define BMI_GYR_RANGE 0x4 // 2000 deg/s (default) +#define BMI_GYR_MODE 0x7 // High performance mode +#define BMI_GYR_BW 0x0 // Sets cut off freq to ODR/2 #define BMI_GYR_AVGNUM 0x0 // No averaging /* USER CODE END PD */ @@ -96,14 +96,16 @@ void SystemClock_Config(void); /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ -uint16_t ewa_u(uint16_t new_value, uint16_t old_value) { +uint16_t ewa_u(uint16_t new_value, uint16_t old_value) +{ if (old_value == 0xFFFF) { return new_value; } return alpha * new_value + (1 - alpha) * old_value; } -int16_t ewa_i(int16_t new_value, int16_t old_value) { +int16_t ewa_i(int16_t new_value, int16_t old_value) +{ if (!ewa_signed_initialization) { ewa_signed_initialization = true; return new_value; @@ -112,7 +114,6 @@ int16_t ewa_i(int16_t new_value, int16_t old_value) { } /* USER CODE END 0 */ - /** * @brief The application entry point. * @retval int @@ -212,28 +213,28 @@ int main(void) if (current_time - last_avgcalc_ms > avgcalc_interval) { last_avgcalc_ms = current_time; -/* - imu_ax = ewa_u(bmi323_read_acc_x(&bmi323_dev), imu_ax); - imu_ay = ewa_u(bmi323_read_acc_y(&bmi323_dev), imu_ay); - imu_az = ewa_u(bmi323_read_acc_z(&bmi323_dev), imu_az); - imu_gyrx = ewa_u(bmi323_read_gyr_x(&bmi323_dev), imu_gyrx); - imu_gyry = ewa_u(bmi323_read_gyr_y(&bmi323_dev), imu_gyry); - imu_gyrz = ewa_u(bmi323_read_gyr_z(&bmi323_dev), imu_gyrz); - imu_temp = ewa_u(bmi323_read_temp_data(&bmi323_dev), imu_temp); - imu_status = bmi323_read_status(&bmi323_dev); - - float imu_ax_test = ((float)imu_ax) / 4096.f; - float imu_ay_test = ((float)imu_ay) / 4096.f; - float imu_az_test = ((float)imu_az) / 4096.f; - float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; - float imu_gyry_test = ((float)imu_gyry) / 16.384f; - float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; - float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; - - LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); - LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); - LOGOMATIC("IMU temperature: %f", imu_temp_test); -*/ + /* + imu_ax = ewa_u(bmi323_read_acc_x(&bmi323_dev), imu_ax); + imu_ay = ewa_u(bmi323_read_acc_y(&bmi323_dev), imu_ay); + imu_az = ewa_u(bmi323_read_acc_z(&bmi323_dev), imu_az); + imu_gyrx = ewa_u(bmi323_read_gyr_x(&bmi323_dev), imu_gyrx); + imu_gyry = ewa_u(bmi323_read_gyr_y(&bmi323_dev), imu_gyry); + imu_gyrz = ewa_u(bmi323_read_gyr_z(&bmi323_dev), imu_gyrz); + imu_temp = ewa_u(bmi323_read_temp_data(&bmi323_dev), imu_temp); + imu_status = bmi323_read_status(&bmi323_dev); + + float imu_ax_test = ((float)imu_ax) / 4096.f; + float imu_ay_test = ((float)imu_ay) / 4096.f; + float imu_az_test = ((float)imu_az) / 4096.f; + float imu_gyrx_test = ((float)imu_gyrx) / 16.384f; + float imu_gyry_test = ((float)imu_gyry) / 16.384f; + float imu_gyrz_test = ((float)imu_gyrz) / 16.384f; + float imu_temp_test = ((float)imu_temp / 512.f) + 23.0f; + + LOGOMATIC("Acceleration: x = %f g, y = %f g, z = %f g\n", imu_ax_test, imu_ay_test, imu_az_test); + LOGOMATIC("Angular rate: x = %f deg/s, y = %f deg/s, z = %f deg/s\n", imu_gyrx_test, imu_gyry_test, imu_gyrz_test); + LOGOMATIC("IMU temperature: %f", imu_temp_test); + */ mag_temp = ewa_u(mag_read_temp(&mag_dev), mag_temp); mag_hysteresis = ewa_u(mag_read_HANG(&mag_dev), mag_hysteresis); mag_angle = ewa_u(mag_read_encoder_angle(&mag_dev), mag_angle); @@ -298,13 +299,13 @@ int main(void) } } -/* TODO: + /* TODO: - AVERAGING IS NOT POSSIBLE IN HIGH PERFORMANCE MODE -> still implement? - static uint32_t millis_since_last = 0 - if (millis since last < b) - only run loop every ~8-ish samples -*/ + AVERAGING IS NOT POSSIBLE IN HIGH PERFORMANCE MODE -> still implement? + static uint32_t millis_since_last = 0 + if (millis since last < b) + only run loop every ~8-ish samples + */ } /* USER CODE END 3 */ } From 1b409724b730bab0971e64b1b67ed48433eca9cd Mon Sep 17 00:00:00 2001 From: Shravya Salem Sathish Date: Thu, 28 May 2026 22:33:49 -0700 Subject: [PATCH 158/158] Mag encoder initializes now yay --- SAMM/IMU/Src/bmi323.c | 4 +++- SAMM/SuspensionNode/Src/mag.c | 42 ++++++++++++++++++++++++++++++---- SAMM/SuspensionNode/Src/main.c | 14 +++++++++--- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/SAMM/IMU/Src/bmi323.c b/SAMM/IMU/Src/bmi323.c index 50fb5738e..b63506611 100644 --- a/SAMM/IMU/Src/bmi323.c +++ b/SAMM/IMU/Src/bmi323.c @@ -99,7 +99,9 @@ THE FUNCTION WILL RETURN 1 IF CALIBRATION WAS SUCCESSFUL, 0 IF NOT uint32_t MillisecondsSinceBoot() { - return HAL_GetTick() * HAL_GetTickFreq(); + uint32_t tick = HAL_GetTick(); + HAL_TickFreqTypeDef freq = HAL_GetTickFreq(); + return tick * freq; } uint8_t bmi323_calib(bmi323 *bmi323_dev) diff --git a/SAMM/SuspensionNode/Src/mag.c b/SAMM/SuspensionNode/Src/mag.c index af9d247a1..d76d05435 100644 --- a/SAMM/SuspensionNode/Src/mag.c +++ b/SAMM/SuspensionNode/Src/mag.c @@ -21,10 +21,17 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD LL_mDelay(20); uint16_t status = mag_read(mag_dev, 0x22); + uint16_t error_reg = mag_read(mag_dev, 0x24); // Check AOK=1 (bit 0) and BIP=0 (bit 1) // If either not true, return error - if (!((status & 0x0001) || (status & 0x0002))) { + /* + if (!((status & 0x0001) || ((status | ~(0x0002)) != 0xFFFF))) { + return HAL_ERROR; + } + */ + + if (!(status & 0x0003)) { return HAL_ERROR; } @@ -35,11 +42,14 @@ HAL_StatusTypeDef mag_init(mag *mag_dev, SPI_HandleTypeDef *spi_port, GPIO_TypeD uint16_t mag_transmit(mag *mag_dev, uint16_t data) { + /* uint8_t tx_bytes[4] = {(uint8_t)(data >> 8), (uint8_t)(data & 0xFF), 0x00, 0x00}; uint8_t rx_bytes[4] = {0}; HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + LL_mDelay(5); HAL_StatusTypeDef res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_bytes, rx_bytes, 4, HAL_MAX_DELAY); + LL_mDelay(5); HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); if (res != HAL_OK) { @@ -47,6 +57,32 @@ uint16_t mag_transmit(mag *mag_dev, uint16_t data) } return ((uint16_t)rx_bytes[2] << 8) | rx_bytes[3]; + */ + + uint8_t tx_bytes[2] = {(uint8_t)(data >> 8), (uint8_t)(data & 0xFF)}; + uint8_t tx_dummy[2] = {0}; + + uint8_t rx_dummy[2] = {0}; + uint8_t rx_bytes[2] = {0}; + + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_StatusTypeDef send_res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_bytes, rx_dummy, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + + LL_mDelay(1); + + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_RESET); + HAL_StatusTypeDef receive_res = HAL_SPI_TransmitReceive(mag_dev->spi_port, tx_dummy, rx_bytes, 2, HAL_MAX_DELAY); + HAL_GPIO_WritePin(mag_dev->port, mag_dev->pin, GPIO_PIN_SET); + + if (receive_res != HAL_OK) { + return 0xFFFF; + } + + uint16_t new_data = ((uint16_t)rx_bytes[0] << 8) | rx_bytes[1]; + + return new_data; + } /* @@ -66,9 +102,7 @@ crc uint16_t mag_read(mag *mag_dev, uint8_t reg) { uint16_t cmd = (uint16_t)((reg & mag_addr_mask) << 8); // read: bit 14 = 0, address in bits 13:8 - uint16_t dummy1 = mag_transmit(mag_dev, cmd); // frame 1: send command, discard response - uint16_t dummy2 = mag_transmit(mag_dev, 0x0000); // frame 2: NOP, receive data - return dummy2; + return mag_transmit(mag_dev, cmd); // frame 1: send command, discard response } /* diff --git a/SAMM/SuspensionNode/Src/main.c b/SAMM/SuspensionNode/Src/main.c index c45dba99e..1e13a8886 100644 --- a/SAMM/SuspensionNode/Src/main.c +++ b/SAMM/SuspensionNode/Src/main.c @@ -183,8 +183,10 @@ int main(void) mag mag_dev = {0}; HAL_GPIO_WritePin(MAG_CS_GPIO_Port, MAG_CS_Pin, GPIO_PIN_SET); + HAL_StatusTypeDef init_status = mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin); + // Initialize magnetic encoder - if (mag_init(&mag_dev, &hspi3, MAG_CS_GPIO_Port, MAG_CS_Pin) != HAL_OK) { + if (init_status != HAL_OK) { LOGOMATIC("MAG initialization failed!\n"); Error_Handler(); } @@ -204,8 +206,10 @@ int main(void) int16_t mag_turns = 0; uint8_t mag_status = 0; - uint32_t last_avgcalc_ms = MillisecondsSinceBoot(); - uint32_t last_send_ms = MillisecondsSinceBoot(); + uint32_t mssinceboot = MillisecondsSinceBoot(); + + uint32_t last_avgcalc_ms = mssinceboot; + uint32_t last_send_ms = mssinceboot; IMU_Mag_Data test_data = {0}; while (1) { @@ -353,6 +357,10 @@ void SystemClock_Config(void) /* Wait till System clock is ready */ while (LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_HSI) {} + /* Insure 1us transition state at intermediate medium speed clock*/ + for (__IO uint32_t i = (160 >> 1); i != 0; i--) + ; + LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);