From 919bbfca67056ce39e3d9ed977a90e9c3c218328 Mon Sep 17 00:00:00 2001 From: rawoo1 Date: Sat, 18 Jan 2025 16:31:45 -0800 Subject: [PATCH 1/6] working apogee detection --- .pre-commit-config.yaml | 15 + src/AFS_2.1.code-workspace | 9 - src/main.cc | 566 ++++++++++++++-------------- src/stm32f1xx_hal_msp.c | 747 +++++++++++++++++++------------------ 4 files changed, 696 insertions(+), 641 deletions(-) delete mode 100644 src/AFS_2.1.code-workspace diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 95e1ee3..8f9ab71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,6 +8,21 @@ repos: - id: mixed-line-ending args: [--fix=lf] - id: trailing-whitespace +- repo: https://github.com/pre-commit/mirrors-clang-format + rev: v17.0.4 + hooks: + - id: clang-format + +# repos: +# - repo: https://github.com/pre-commit/pre-commit-hooks +# rev: v4.5.0 +# hooks: +# - id: check-json +# - id: check-yaml +# - id: end-of-file-fixer +# - id: mixed-line-ending +# args: [--fix=lf] +# - id: trailing-whitespace # - repo: https://github.com/pre-commit/mirrors-clang-format # rev: v17.0.4 # hooks: diff --git a/src/AFS_2.1.code-workspace b/src/AFS_2.1.code-workspace deleted file mode 100644 index e7a92eb..0000000 --- a/src/AFS_2.1.code-workspace +++ /dev/null @@ -1,9 +0,0 @@ -{ - "folders": [ - { - "name": "AFS_2.1", - "path": ".." - } - ], - "settings": {} -} \ No newline at end of file diff --git a/src/main.cc b/src/main.cc index 171adc2..9be794e 100644 --- a/src/main.cc +++ b/src/main.cc @@ -22,16 +22,16 @@ #include "altimeter_ms5607_spi.h" #include "gps_ubxm8_i2c.h" #include "imu_bmi088_spi.h" -#include "memory_w25q1128jv_spi.h" #include "magnetometer_bmi150_i2c.h" +#include "memory_w25q1128jv_spi.h" #include "usb_device.h" #include "usbd_cdc_if.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include #include #include -#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -57,6 +57,8 @@ SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi2; SPI_HandleTypeDef hspi3; +TIM_HandleTypeDef htim4; +TIM_HandleTypeDef htim5; /* USER CODE BEGIN PV */ uint8_t usbCommand; @@ -64,7 +66,7 @@ uint8_t usbCommand; MemoryW25q1128jvSpi memory(&hspi2, MEM_CS_GPIO_Port, MEM_CS_Pin, MEM_WP_GPIO_Port, MEM_WP_Pin, MEM_HOLD_GPIO_Port, MEM_HOLD_Pin); /* Altimeter initialised */ -AltimeterMs5607Spi altimeter(&hspi3, ALT_CS_GPIO_Port, ALT_CS_Pin, ALT_MISO_GPIO_Port, ALT_MISO_Pin, 1014.9, 100); +AltimeterMs5607Spi altimeter(&hspi3, ALT_CS_GPIO_Port, ALT_CS_Pin, ALT_MISO_GPIO_Port, ALT_MISO_Pin, 1014.9, 100); /* GPS initialised */ GpsUbxM8I2c gps(GPS_RESET_GPIO_Port, GPS_RESET_Pin, &hi2c1, PVT_MESSAGE); @@ -85,6 +87,8 @@ static void MX_I2C2_Init(void); static void MX_SPI1_Init(void); static void MX_SPI2_Init(void); static void MX_SPI3_Init(void); +static void MX_TIM4_Init(void); +static void MX_TIM5_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -105,8 +109,8 @@ int main(void) { MemoryW25q1128jvSpi::AfsState afsState; // Altimeter data package - AltimeterMs5607Spi::Data altData; - volatile AltimeterMs5607Spi::State altState; + AltimeterMs5607Spi::Data altData; + AltimeterMs5607Spi::State altState; // GPS data package UBX_NAV_PVT_PAYLOAD gpsData; @@ -142,82 +146,79 @@ int main(void) { MX_SPI2_Init(); MX_SPI3_Init(); MX_USB_DEVICE_Init(); + MX_TIM4_Init(); + MX_TIM5_Init(); + + /* HAL timer starts */ + HAL_TIM_Base_Start(&htim4); + HAL_TIM_Base_Start(&htim5); /* Sensor module resets */ altimeter.Reset(); imu.Reset(); magnetometer.Reset(); gps.Reset(); - HAL_Delay(100); // Ensures reset done for all modules + HAL_Delay(100); // Ensures reset done for all modules /******************** USB call ********************/ uint8_t usbBuffer[64]; - char text[256]; - int retval; - - while(1) - { - //breaks loop if usb not plugged in - if(HAL_GPIO_ReadPin(USB_VBUS_GPIO_Port, USB_VBUS_Pin) != GPIO_PIN_SET) break; - - switch(usbCommand) - { - //Erases memory - //Note: for some reason, VBUS goes low and the loop ends - case(0x4F): - //Set LEDs - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_SET); + char text[256]; + int retval; + + while (1) { + // breaks loop if usb not plugged in + if (HAL_GPIO_ReadPin(USB_VBUS_GPIO_Port, USB_VBUS_Pin) != GPIO_PIN_SET) break; + + switch (usbCommand) { + // Erases memory + // Note: for some reason, VBUS goes low and the loop ends + case (0x4F): + // Set LEDs + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_SET); memory.ChipErase(); sprintf(text, "Memory fully erased\n"); CDC_Transmit_FS((uint8_t *)text, strlen(text)); - //reset usbCommand + // reset usbCommand usbCommand = 0; break; - //USB Memory dump of all nodes - case(0x68): - //Reduce frequency so hterm doesn't crash lol - HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port,LED_STORAGE_Pin); - //gets Memory data + // USB Memory dump of all nodes + case (0x68): + // Reduce frequency so hterm doesn't crash lol + HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin); + // gets Memory data retval = memory.ChipReadDump(usbBuffer); - //error handler - if(retval == -1) - { + // error handler + if (retval == -1) { sprintf(text, "Memory SPI error\n"); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } usbCommand = 0; break; - } - else if(retval == -2) - { + } else if (retval == -2) { sprintf(text, "Memory is full and is fully dumped\n"); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } - //reset usb command being sent + // reset usb command being sent usbCommand = 0; break; - } - else if(usbBuffer[0] != 0x00) - { + } else if (usbBuffer[0] != 0x00) { sprintf(text, "Memory fully dumped\n"); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } - //reset usb command being sent + // reset usb command being sent usbCommand = 0; break; } - - afsData = *(MemoryW25q1128jvSpi::AfsTelemetryData *)&usbBuffer; - afsState = *(MemoryW25q1128jvSpi::AfsState *)&afsData.state; - + afsData = *(MemoryW25q1128jvSpi::AfsTelemetryData *)&usbBuffer; + afsState = *(MemoryW25q1128jvSpi::AfsState *)&afsData.state; sprintf(text, "Address: %06X, ", retval); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { @@ -226,7 +227,7 @@ int main(void) { sprintf(text, "Timestamp: %010d, ", afsData.timestamp); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } - + sprintf(text, "State: %01X, ArmCont: %01X, DrogueCont: %01X, MainCont: %01X, ", afsState.state, afsState.armPinState, afsState.drogueContinuity, afsState.mainContinuity); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } @@ -237,47 +238,47 @@ int main(void) { sprintf(text, "AccX: %05d, AccY: %05d, AccZ: %05d, ", afsData.accelerationX, afsData.accelerationY, afsData.accelerationZ); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } sprintf(text, "MagX: %05d, MagY: %05d, MagZ: %05d, ", afsData.magneticFieldX, afsData.magneticFieldY, afsData.magneticFieldZ); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } - sprintf(text, "Temp: %05d, Alt: %09d, ", afsData.temperature, afsData.altitude); + sprintf(text, "Temp: %05d, Alt: %09d, ", afsData.temperature, (int)afsData.altitude); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } sprintf(text, "GPSposX: %010d, GPSposY: %010d, GPSposZ: %010d, GPSposAcc: %010d, ", afsData.ecefPositionX, afsData.ecefPositionY, afsData.ecefPositionZ, afsData.ecefPositionAccuracy); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } sprintf(text, "GPSvelX: %010d, GPSvelY: %011d, GPSvelZ: %010d, GPSvelAcc: %010d, ", afsData.ecefVelocityX, afsData.ecefVelocityY, afsData.ecefVelocityZ, afsData.ecefVelocityAccuracy); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } - sprintf(text,"\r\n"); + sprintf(text, "\r\n"); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { - } + } break; - + default: HAL_Delay(1000); - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_SET); - //test usb send from AFS to confirm connection + // test usb send from AFS to confirm connection sprintf(text, "1\r"); while (CDC_Transmit_FS((uint8_t *)text, strlen(text)) == USBD_BUSY) { } break; } - } /******************** MAIN AFS FIRMWARE LOOP VARIABLES ********************/ /* Sensor module initialises */ + // memory.ChipErase(); memory.Init(); altimeter.Init(); imu.Init(); @@ -291,7 +292,6 @@ int main(void) { uint8_t memoryBuffer[64]; // Current state of AFS, value = to AfsState struct documentation - // current bypassing arming stage uint8_t state = 0x0; // Memory LED blinking counter @@ -301,11 +301,9 @@ int main(void) { volatile double startAltitude = 0.0; // Averaging to find starting alt double j = 0.0; - while(j < 10) - { + while (j < 10) { altState = altimeter.Read(AltimeterMs5607Spi::Rate::OSR4096); - if(altState == AltimeterMs5607Spi::State::COMPLETE) - { + if (altState == AltimeterMs5607Spi::State::COMPLETE) { altData = altimeter.GetData(); startAltitude += altData.altitude; j++; @@ -321,140 +319,94 @@ int main(void) { int tick = 0; // Previous time for timing delay of writing into - uint32_t prevTime = HAL_GetTick(); - - while (1) - { - if(state > 0x0) - { + uint32_t prevTime = TIM5->CNT << 16 | TIM4->CNT; + + while (1) { /******************** DATA COLLECTION ********************/ - afsData.type = 0x00; - afsData.timestamp = HAL_GetTick(); - - afsState.armPinState = HAL_GPIO_ReadPin(ARM_CONT_GPIO_Port, ARM_CONT_Pin); - afsState.drogueContinuity = ~HAL_GPIO_ReadPin(DROGUE_CONT_GPIO_Port, DROGUE_CONT_Pin); - afsState.mainContinuity = ~HAL_GPIO_ReadPin(MAIN_CONT_GPIO_Port, MAIN_CONT_Pin); - afsState.state = state; - afsData.state = *(uint8_t *)&afsState; - - /* Altimeter data */ - altState = altimeter.Read(AltimeterMs5607Spi::Rate::OSR4096); - if(altState == AltimeterMs5607Spi::State::COMPLETE) - { - altData = altimeter.GetData(); - afsData.temperature = altData.temperature; - afsData.altitude = altData.altitude; - } - else - { - afsData.temperature = 0xFFFF; - afsData.altitude = 0xFFFFFFFF; - } + afsData.type = 0x00; + // uint32_t timeStamp = HAL_GetTick(); + uint32_t timeStamp = TIM5->CNT << 16 | TIM4->CNT; + afsData.timestamp = timeStamp; + + afsState.armPinState = HAL_GPIO_ReadPin(ARM_CONT_GPIO_Port, ARM_CONT_Pin); + afsState.drogueContinuity = HAL_GPIO_ReadPin(DROGUE_CONT_GPIO_Port, DROGUE_CONT_Pin); + afsState.mainContinuity = HAL_GPIO_ReadPin(MAIN_CONT_GPIO_Port, MAIN_CONT_Pin); + afsState.state = state; + afsData.state = *(uint8_t *)&afsState; + + /* Altimeter data */ + altState = altimeter.Read(AltimeterMs5607Spi::Rate::OSR4096); + if (altState == AltimeterMs5607Spi::State::COMPLETE) { + altData = altimeter.GetData(); + afsData.temperature = altData.temperature; + afsData.altitude = altData.altitude; + } - /* GPS Data */ - gps.PollUpdate(); - GpsUbxM8I2c::State gpsState = gps.GetState(); - if (gpsState == GpsUbxM8I2c::State::RESPONSE_READY) { - //getting data - gpsData = *(UBX_NAV_PVT_PAYLOAD *)gps.GetSolution(); - afsData.ecefPositionX = gpsData.ecefX; - afsData.ecefPositionY = gpsData.ecefY; - afsData.ecefPositionZ = gpsData.ecefZ; - afsData.ecefVelocityX = gpsData.ecefVX; - afsData.ecefVelocityY = gpsData.ecefVY; - afsData.ecefVelocityZ = gpsData.ecefVZ; - afsData.ecefPositionAccuracy = gpsData.pAcc; - afsData.ecefVelocityAccuracy = gpsData.sAcc; - - if ((GPSFixType)gpsData.gpsFix == GPSFixType::FIX_3D && gpsData.iTOW > gpsPreviousTow) { - HAL_GPIO_TogglePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin); - gpsPreviousTow = gpsData.iTOW; - } - gps.Reset(); - } - else - { - afsData.ecefPositionX = 0xFFFFFFFF; - afsData.ecefPositionY = 0xFFFFFFFF; - afsData.ecefPositionZ = 0xFFFFFFFF; - afsData.ecefVelocityX = 0xFFFFFFFF; - afsData.ecefVelocityY = 0xFFFFFFFF; - afsData.ecefVelocityZ = 0xFFFFFFFF; - afsData.ecefPositionAccuracy = 0xFFFFFFFF; - afsData.ecefVelocityAccuracy = 0xFFFFFFFF; + /* GPS Data */ + gps.PollUpdate(); + GpsUbxM8I2c::State gpsState = gps.GetState(); + if (gpsState == GpsUbxM8I2c::State::RESPONSE_READY) { + // getting data + gpsData = *(UBX_NAV_PVT_PAYLOAD *)gps.GetSolution(); + afsData.ecefPositionX = gpsData.ecefX; + afsData.ecefPositionY = gpsData.ecefY; + afsData.ecefPositionZ = gpsData.ecefZ; + afsData.ecefVelocityX = gpsData.ecefVX; + afsData.ecefVelocityY = gpsData.ecefVY; + afsData.ecefVelocityZ = gpsData.ecefVZ; + afsData.ecefPositionAccuracy = gpsData.pAcc; + afsData.ecefVelocityAccuracy = gpsData.sAcc; + + if ((GPSFixType)gpsData.gpsFix == GPSFixType::FIX_3D && gpsData.iTOW > gpsPreviousTow) { + HAL_GPIO_TogglePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin); + gpsPreviousTow = gpsData.iTOW; } + gps.Reset(); + } - /* IMU data */ - imuData = imu.Read(); - afsData.angularVelocityX = -imuData.angularVelocityX; - afsData.angularVelocityY = imuData.angularVelocityY; - afsData.angularVelocityZ = -imuData.angularVelocityZ; - afsData.accelerationX = -imuData.accelerationX; - afsData.accelerationY = imuData.accelerationY; - afsData.accelerationZ = -imuData.accelerationZ; - - /* Magnetometer data */ - magData = magnetometer.Read(); - afsData.magneticFieldX = magData.magneticFieldX; - afsData.magneticFieldY = magData.magneticFieldY; - afsData.magneticFieldZ = magData.magneticFieldZ; - - /* Data written into memory */ - memcpy(memoryBuffer, &afsData, sizeof(memoryBuffer)); - // when AFS is armed and on launch rails, store data every .5 seconds - if(state == 0x1 || state == 0xB) - { - if(HAL_GetTick() > prevTime + 100) - { - if(memory.ChipWrite(memoryBuffer) == MemoryW25q1128jvSpi::State::COMPLETE) - { - if(memoryLEDCounter % 10 == 0) - { - //for blinking LED - HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin); - } - memoryLEDCounter++; - - prevTime = HAL_GetTick(); - } - } - } - // when AFS is in flight, store data as fast as possible - else - { - if(memory.ChipWrite(memoryBuffer) == MemoryW25q1128jvSpi::State::COMPLETE) - { - if(memoryLEDCounter % 10 == 0) - { - //for blinking LED - HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin); - } - memoryLEDCounter++; - } - } + /* IMU data */ + imuData = imu.Read(); + afsData.angularVelocityX = -imuData.angularVelocityX; + afsData.angularVelocityY = imuData.angularVelocityY; + afsData.angularVelocityZ = -imuData.angularVelocityZ; + afsData.accelerationX = -imuData.accelerationX; + afsData.accelerationY = imuData.accelerationY; + afsData.accelerationZ = -imuData.accelerationZ; + + /* Magnetometer data */ + magData = magnetometer.Read(); + afsData.magneticFieldX = magData.magneticFieldY; + afsData.magneticFieldY = -magData.magneticFieldX; + afsData.magneticFieldZ = magData.magneticFieldZ; /******************** State maching and parachute deployment ********************/ - switch (state) - { + switch (state) { + case (0x0): + /* Standby mode 0x0 */ + // Standby mode, keep collecting data but never log into memory + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_RESET); + + if (HAL_GPIO_ReadPin(ARM_CONT_GPIO_Port, ARM_CONT_Pin) == 1) { + state = 0x1; + } + break; case (0x1): /* ARMED mode 0x01 */ // Armed mode: will collect data and look for flught condition - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); - if((afsData.altitude != -1)) - { - if(altData.altitude > startAltitude + 25) - { + if ((altData.altitude != -1) && altData.altitude != prevAltitude) { + if (altData.altitude > startAltitude + 3) { tick++; - if(tick > 30) - { + if (tick > 20) { tick = 0; state = 0x2; } - } - else - { + } else { tick = 0; } } @@ -464,25 +416,20 @@ int main(void) { case (0x2): /* BOOST mode 0x02 */ // when the rocket is in flight off launch - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); // condition to find when to deploy drogue parachute - if(afsData.altitude != -1) - { - if(altData.altitude < prevAltitude) - { + if (afsData.altitude != -1 && altData.altitude != prevAltitude) { + if (altData.altitude < prevAltitude) { tick++; // 100 is found based on HZ of loop being around 50 HZ ish - if(tick > 100) - { + if (tick > 5) { tick = 0; state = 0x4; } - } - else - { - // Reset count if altitude is increaseing again + } else if (altData.altitude > prevAltitude) { + // Reset count if altitude is increasing again tick = 0; } } @@ -492,26 +439,22 @@ int main(void) { case (0x4): /* Apogee 0x4 */ // deploys the drogue parachute about 2 sec after apogee - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(DROGUE_GPIO_Port, DROGUE_Pin, GPIO_PIN_SET); // condition to find when to deploy main parachute - if ((afsData.altitude != -1)) - { - if((altData.altitude < startAltitude + 200)) - { + if ((afsData.altitude != -1) && (altData.altitude != prevAltitude)) { + // change state after 5 ticks of AFS under 200 ft or 61 meters + if ((altData.altitude < startAltitude + 61)) { tick++; - if(tick > 20) - { + if (tick > 5) { tick = 0; state = 0x8; } - } - else - { - // Reset count if altitude is increaseing again + } else { + // Reset count if altitude is increasing again tick = 0; } } @@ -521,95 +464,96 @@ int main(void) { case (0x8): /* Main 0x8 */ // Deploys the main parachute about - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(MAIN_GPIO_Port, MAIN_Pin, GPIO_PIN_SET); // condition to find when the rocket has landed - if((afsData.altitude != -1)) - { - if((round(altData.altitude - prevAltitude) < 1)) - { + if ((afsData.altitude != -1) && (altData.altitude != prevAltitude)) { + // altitude is change is less than meter + if (abs(altData.altitude - prevAltitude) < 1) { tick++; - if(tick > 20) - { + if (tick > 5) { tick = 0; state = 0xB; } - } - else - { + } else { // Reset count if altitude is increaseing again tick = 0; } } - case(0xB): + case (0xB): /* Land 0xB */ // Landing conditinon, do nothing but still log data HAL_GPIO_TogglePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); HAL_Delay(100); default: break; - } + } - //update the previous altitude data - if(afsData.altitude != -1) - { - prevAltitude = altData.altitude; + afsData.angularVelocityX = tick; /////////////////////////////////////////////////////////// + + /******************** Data written into memory ********************/ + memcpy(memoryBuffer, &afsData, sizeof(memoryBuffer)); + // when AFS is armed and on launch rails, store data every .5 seconds + if (state == 0x1 || state == 0xB) { + if (HAL_GetTick() > prevTime + 100) { + if (memory.ChipWrite(memoryBuffer) == MemoryW25q1128jvSpi::State::COMPLETE) { + // LED blinking + if (memoryLEDCounter % 10 == 0) { + // for blinking LED + HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin); + } + memoryLEDCounter++; + // reestablish the prevTime + prevTime = HAL_GetTick(); + // reset the data from modules with lead time + afsData.temperature = 0xFFFF; + afsData.altitude = 0xFFFFFFFF; + afsData.ecefPositionX = 0xFFFFFFFF; + afsData.ecefPositionY = 0xFFFFFFFF; + afsData.ecefPositionZ = 0xFFFFFFFF; + afsData.ecefVelocityX = 0xFFFFFFFF; + afsData.ecefVelocityY = 0xFFFFFFFF; + afsData.ecefVelocityZ = 0xFFFFFFFF; + afsData.ecefPositionAccuracy = 0xFFFFFFFF; + afsData.ecefVelocityAccuracy = 0xFFFFFFFF; + } } - } - else - { - /* Standby mode 0x0 */ - HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); - HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin, GPIO_PIN_RESET); - HAL_GPIO_WritePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin, GPIO_PIN_RESET); - - if(HAL_GPIO_ReadPin(ARM_CONT_GPIO_Port, ARM_CONT_Pin) == 1) - { - state = 0x1; - } - - /* GPS Data */ - // Here to check starting the GPS connection - gps.PollUpdate(); - GpsUbxM8I2c::State gpsState = gps.GetState(); - if (gpsState == GpsUbxM8I2c::State::RESPONSE_READY) { - //getting data - gpsData = *(UBX_NAV_PVT_PAYLOAD *)gps.GetSolution(); - afsData.ecefPositionX = gpsData.ecefX; - afsData.ecefPositionY = gpsData.ecefY; - afsData.ecefPositionZ = gpsData.ecefZ; - afsData.ecefVelocityX = gpsData.ecefVX; - afsData.ecefVelocityY = gpsData.ecefVY; - afsData.ecefVelocityZ = gpsData.ecefVZ; - afsData.ecefPositionAccuracy = gpsData.pAcc; - afsData.ecefVelocityAccuracy = gpsData.sAcc; - - if ((GPSFixType)gpsData.gpsFix == GPSFixType::FIX_3D && gpsData.iTOW > gpsPreviousTow) { - HAL_GPIO_TogglePin(LED_FLIGHT_GPIO_Port, LED_FLIGHT_Pin); - gpsPreviousTow = gpsData.iTOW; + // when AFS is in flight, store data as fast as possible + else if (state > 0x1 && state < 0xB) { + if (memory.ChipWrite(memoryBuffer) == MemoryW25q1128jvSpi::State::COMPLETE) { + // LED blinking + if (memoryLEDCounter % 10 == 0) { + // for blinking LED + HAL_GPIO_TogglePin(LED_STORAGE_GPIO_Port, LED_STORAGE_Pin); } - gps.Reset(); + memoryLEDCounter++; + // reestabilish the prevTime + prevTime = HAL_GetTick(); + // reset the data from modules with lead time + afsData.temperature = 0xFFFF; + afsData.altitude = 0xFFFFFFFF; + afsData.ecefPositionX = 0xFFFFFFFF; + afsData.ecefPositionY = 0xFFFFFFFF; + afsData.ecefPositionZ = 0xFFFFFFFF; + afsData.ecefVelocityX = 0xFFFFFFFF; + afsData.ecefVelocityY = 0xFFFFFFFF; + afsData.ecefVelocityZ = 0xFFFFFFFF; + afsData.ecefPositionAccuracy = 0xFFFFFFFF; + afsData.ecefVelocityAccuracy = 0xFFFFFFFF; } - else - { - afsData.ecefPositionX = 0xFFFFFFFF; - afsData.ecefPositionY = 0xFFFFFFFF; - afsData.ecefPositionZ = 0xFFFFFFFF; - afsData.ecefVelocityX = 0xFFFFFFFF; - afsData.ecefVelocityY = 0xFFFFFFFF; - afsData.ecefVelocityZ = 0xFFFFFFFF; - afsData.ecefPositionAccuracy = 0xFFFFFFFF; - afsData.ecefVelocityAccuracy = 0xFFFFFFFF; - } + } + + // update the previous altitude data + if (altData.altitude != prevAltitude) { + prevAltitude = altData.altitude; } } } @@ -899,6 +843,82 @@ static void MX_GPIO_Init(void) { /* USER CODE END MX_GPIO_Init_2 */ } +/** + * @brief TIM4 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM4_Init(void) { + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 36000; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 65535; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ +} + +/** + * @brief TIM5 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM5_Init(void) { + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_SlaveConfigTypeDef sSlaveConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 0; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 65535; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) { + Error_Handler(); + } + sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; + sSlaveConfig.InputTrigger = TIM_TS_ITR1; + if (HAL_TIM_SlaveConfigSynchro(&htim5, &sSlaveConfig) != HAL_OK) { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) { + Error_Handler(); + } +} + /* USER CODE BEGIN 4 */ /* USER CODE END 4 */ diff --git a/src/stm32f1xx_hal_msp.c b/src/stm32f1xx_hal_msp.c index 47fddef..5ee61b9 100644 --- a/src/stm32f1xx_hal_msp.c +++ b/src/stm32f1xx_hal_msp.c @@ -1,359 +1,388 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * @file stm32f1xx_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_AFIO_CLK_ENABLE(); - __HAL_RCC_PWR_CLK_ENABLE(); - - /* System interrupt init*/ - - /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled - */ - __HAL_AFIO_REMAP_SWJ_NOJTAG(); - - /* USER CODE BEGIN MspInit 1 */ - - /* USER CODE END MspInit 1 */ -} - -/** -* @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 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C1 GPIO Configuration - PB6 ------> I2C1_SCL - PB7 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPS_SCL_Pin|GPS_SDA_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - 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 */ - } - else if(hi2c->Instance==I2C2) - { - /* USER CODE BEGIN I2C2_MspInit 0 */ - - /* USER CODE END I2C2_MspInit 0 */ - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**I2C2 GPIO Configuration - PB10 ------> I2C2_SCL - PB11 ------> I2C2_SDA - */ - GPIO_InitStruct.Pin = MAG_SCL_Pin|MAG_SDA_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - /* Peripheral clock enable */ - __HAL_RCC_I2C2_CLK_ENABLE(); - /* USER CODE BEGIN I2C2_MspInit 1 */ - - /* USER CODE END I2C2_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(GPS_SCL_GPIO_Port, GPS_SCL_Pin); - - HAL_GPIO_DeInit(GPS_SDA_GPIO_Port, GPS_SDA_Pin); - - /* USER CODE BEGIN I2C1_MspDeInit 1 */ - - /* USER CODE END I2C1_MspDeInit 1 */ - } - else if(hi2c->Instance==I2C2) - { - /* USER CODE BEGIN I2C2_MspDeInit 0 */ - - /* USER CODE END I2C2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_I2C2_CLK_DISABLE(); - - /**I2C2 GPIO Configuration - PB10 ------> I2C2_SCL - PB11 ------> I2C2_SDA - */ - HAL_GPIO_DeInit(MAG_SCL_GPIO_Port, MAG_SCL_Pin); - - HAL_GPIO_DeInit(MAG_SDA_GPIO_Port, MAG_SDA_Pin); - - /* USER CODE BEGIN I2C2_MspDeInit 1 */ - - /* USER CODE END I2C2_MspDeInit 1 */ - } - -} - -/** -* @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 */ - /* Peripheral 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 = IMU_SCK_Pin|IMU_MOSI_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = IMU_MISO_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(IMU_MISO_GPIO_Port, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI1_MspInit 1 */ - - /* USER CODE END SPI1_MspInit 1 */ - } - else if(hspi->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspInit 0 */ - - /* USER CODE END SPI2_MspInit 0 */ - /* Peripheral clock enable */ - __HAL_RCC_SPI2_CLK_ENABLE(); - - __HAL_RCC_GPIOB_CLK_ENABLE(); - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - GPIO_InitStruct.Pin = MEM_SCK_Pin|MEM_MOSI_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = MEM_MISO_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(MEM_MISO_GPIO_Port, &GPIO_InitStruct); - - /* USER CODE BEGIN SPI2_MspInit 1 */ - - /* USER CODE END SPI2_MspInit 1 */ - } - else if(hspi->Instance==SPI3) - { - /* USER CODE BEGIN SPI3_MspInit 0 */ - - /* USER CODE END SPI3_MspInit 0 */ - /* Peripheral 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 = ALT_SCK_Pin|ALT_MOSI_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = ALT_MISO_Pin; - GPIO_InitStruct.Mode = GPIO_MODE_INPUT; - GPIO_InitStruct.Pull = GPIO_NOPULL; - HAL_GPIO_Init(ALT_MISO_GPIO_Port, &GPIO_InitStruct); - - __HAL_AFIO_REMAP_SPI3_ENABLE(); - - /* 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) -{ - 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 - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI - */ - HAL_GPIO_DeInit(GPIOA, IMU_SCK_Pin|IMU_MISO_Pin|IMU_MOSI_Pin); - - /* USER CODE BEGIN SPI1_MspDeInit 1 */ - - /* USER CODE END SPI1_MspDeInit 1 */ - } - else if(hspi->Instance==SPI2) - { - /* USER CODE BEGIN SPI2_MspDeInit 0 */ - - /* USER CODE END SPI2_MspDeInit 0 */ - /* Peripheral clock disable */ - __HAL_RCC_SPI2_CLK_DISABLE(); - - /**SPI2 GPIO Configuration - PB13 ------> SPI2_SCK - PB14 ------> SPI2_MISO - PB15 ------> SPI2_MOSI - */ - HAL_GPIO_DeInit(GPIOB, MEM_SCK_Pin|MEM_MISO_Pin|MEM_MOSI_Pin); - - /* USER CODE BEGIN SPI2_MspDeInit 1 */ - - /* USER CODE END SPI2_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 - PC10 ------> SPI3_SCK - PC11 ------> SPI3_MISO - PC12 ------> SPI3_MOSI - */ - HAL_GPIO_DeInit(GPIOC, ALT_SCK_Pin|ALT_MISO_Pin|ALT_MOSI_Pin); - - /* USER CODE BEGIN SPI3_MspDeInit 1 */ - - /* USER CODE END SPI3_MspDeInit 1 */ - } - -} - -/* USER CODE BEGIN 1 */ - -/* USER CODE END 1 */ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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_AFIO_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled + */ + __HAL_AFIO_REMAP_SWJ_NOJTAG(); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** + * @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 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPS_SCL_Pin | GPS_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + 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 */ + } else if (hi2c->Instance == I2C2) { + /* USER CODE BEGIN I2C2_MspInit 0 */ + + /* USER CODE END I2C2_MspInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB11 ------> I2C2_SDA + */ + GPIO_InitStruct.Pin = MAG_SCL_Pin | MAG_SDA_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C2_CLK_ENABLE(); + /* USER CODE BEGIN I2C2_MspInit 1 */ + + /* USER CODE END I2C2_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(GPS_SCL_GPIO_Port, GPS_SCL_Pin); + + HAL_GPIO_DeInit(GPS_SDA_GPIO_Port, GPS_SDA_Pin); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } else if (hi2c->Instance == I2C2) { + /* USER CODE BEGIN I2C2_MspDeInit 0 */ + + /* USER CODE END I2C2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C2_CLK_DISABLE(); + + /**I2C2 GPIO Configuration + PB10 ------> I2C2_SCL + PB11 ------> I2C2_SDA + */ + HAL_GPIO_DeInit(MAG_SCL_GPIO_Port, MAG_SCL_Pin); + + HAL_GPIO_DeInit(MAG_SDA_GPIO_Port, MAG_SDA_Pin); + + /* USER CODE BEGIN I2C2_MspDeInit 1 */ + + /* USER CODE END I2C2_MspDeInit 1 */ + } +} + +/** + * @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 */ + /* Peripheral 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 = IMU_SCK_Pin | IMU_MOSI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = IMU_MISO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(IMU_MISO_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } else if (hspi->Instance == SPI2) { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + GPIO_InitStruct.Pin = MEM_SCK_Pin | MEM_MOSI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = MEM_MISO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(MEM_MISO_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } else if (hspi->Instance == SPI3) { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* Peripheral 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 = ALT_SCK_Pin | ALT_MOSI_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = ALT_MISO_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(ALT_MISO_GPIO_Port, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_SPI3_ENABLE(); + + /* 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) { + 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 + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, IMU_SCK_Pin | IMU_MISO_Pin | IMU_MOSI_Pin); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } else if (hspi->Instance == SPI2) { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + HAL_GPIO_DeInit(GPIOB, MEM_SCK_Pin | MEM_MISO_Pin | MEM_MOSI_Pin); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_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 + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PC12 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOC, ALT_SCK_Pin | ALT_MISO_Pin | ALT_MOSI_Pin); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } +} + +/** + * @brief TIM_Base MSP Initialization + * This function configures the hardware resources used in this example + * @param htim_base: TIM_Base handle pointer + * @retval None + */ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) { + if (htim_base->Instance == TIM4) { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } else if (htim_base->Instance == TIM5) { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } +} + +/** + * @brief TIM_Base MSP De-Initialization + * This function freeze the hardware resources used in this example + * @param htim_base: TIM_Base handle pointer + * @retval None + */ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) { + if (htim_base->Instance == TIM4) { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } else if (htim_base->Instance == TIM5) { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } +} +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ From e933592225a508679a2f60900adbe8393ea9f484 Mon Sep 17 00:00:00 2001 From: rawoo1 Date: Sat, 18 Jan 2025 16:33:41 -0800 Subject: [PATCH 2/6] working apogee detection, angVelX counts ticks variable --- src/main.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main.cc b/src/main.cc index 9be794e..ec63fcf 100644 --- a/src/main.cc +++ b/src/main.cc @@ -496,6 +496,7 @@ int main(void) { break; } + // Will be deleted later, used to store in memory the attempts to check for apogee detection afsData.angularVelocityX = tick; /////////////////////////////////////////////////////////// /******************** Data written into memory ********************/ From c44549ac77d8647860f2409a3e0c1b6812bf3e8a Mon Sep 17 00:00:00 2001 From: rawoo1 Date: Sat, 18 Jan 2025 21:15:51 -0800 Subject: [PATCH 3/6] For the PR --- .pre-commit-config.yaml | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8f9ab71..7a21b31 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,26 +12,3 @@ repos: rev: v17.0.4 hooks: - id: clang-format - -# repos: -# - repo: https://github.com/pre-commit/pre-commit-hooks -# rev: v4.5.0 -# hooks: -# - id: check-json -# - id: check-yaml -# - id: end-of-file-fixer -# - id: mixed-line-ending -# args: [--fix=lf] -# - id: trailing-whitespace -# - repo: https://github.com/pre-commit/mirrors-clang-format -# rev: v17.0.4 -# hooks: -# - id: clang-format -# - repo: https://github.com/psf/black-pre-commit-mirror -# rev: 23.11.0 -# hooks: -# - id: black -# - repo: https://github.com/pre-commit/mirrors-prettier -# rev: v3.1.0 -# hooks: -# - id: prettier From dee6b1d69971175bd873fab5dd7b19a8ceb8f97f Mon Sep 17 00:00:00 2001 From: rawoo1 Date: Sat, 18 Jan 2025 22:00:48 -0800 Subject: [PATCH 4/6] for PR --- src/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cc b/src/main.cc index ec63fcf..2c7892e 100644 --- a/src/main.cc +++ b/src/main.cc @@ -497,7 +497,7 @@ int main(void) { } // Will be deleted later, used to store in memory the attempts to check for apogee detection - afsData.angularVelocityX = tick; /////////////////////////////////////////////////////////// + afsData.angularVelocityX = tick; /******************** Data written into memory ********************/ memcpy(memoryBuffer, &afsData, sizeof(memoryBuffer)); From e572625e6f4e25fbe15dca1e25ff73c7899a2247 Mon Sep 17 00:00:00 2001 From: rawoo1 Date: Thu, 6 Feb 2025 21:35:43 -0800 Subject: [PATCH 5/6] added magnitude of acceleration into launch detection --- src/main.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main.cc b/src/main.cc index ec63fcf..11d2f78 100644 --- a/src/main.cc +++ b/src/main.cc @@ -292,7 +292,7 @@ int main(void) { uint8_t memoryBuffer[64]; // Current state of AFS, value = to AfsState struct documentation - uint8_t state = 0x0; + uint8_t state = 0x1; // Memory LED blinking counter int memoryLEDCounter = 0; @@ -399,8 +399,14 @@ int main(void) { HAL_GPIO_WritePin(LED_STANDBY_GPIO_Port, LED_STANDBY_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(LED_ARMED_GPIO_Port, LED_ARMED_Pin, GPIO_PIN_SET); - if ((altData.altitude != -1) && altData.altitude != prevAltitude) { - if (altData.altitude > startAltitude + 3) { + // if altitude is above 25 meters and AFS is experiencing more than 2.5 g of magnitude for 20 cycles + // afs is in BOOST mode + if (afsData.altitude != -1 && altData.altitude != prevAltitude) { + if (altData.altitude > startAltitude + 25 && + (sqrt(pow(afsData.accelerationX,2) * 7.3 * pow(10, -4) + + pow(afsData.accelerationY,2) * 7.3 * pow(10, -4) + + pow(afsData.accelerationZ,2) * 7.3 * pow(10, -4)) > 2.5)) + { tick++; if (tick > 20) { tick = 0; From 2cb6b3627cda4155e626c6a1816ab3753cdc0455 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 Mar 2025 11:20:59 -0800 Subject: [PATCH 6/6] fix timer --- src/main.cc | 33 +++++---------------------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/src/main.cc b/src/main.cc index 8f13a81..9073384 100644 --- a/src/main.cc +++ b/src/main.cc @@ -562,6 +562,10 @@ int main(void) { if (altData.altitude != prevAltitude) { prevAltitude = altData.altitude; } + + // loop time control (the timestamp rolls over after 49 hours, should be ok) + while ((TIM5->CNT << 16 | TIM4->CNT) - timestamp < 100) { + } } } @@ -850,22 +854,10 @@ static void MX_GPIO_Init(void) { /* USER CODE END MX_GPIO_Init_2 */ } -/** - * @brief TIM4 Initialization Function - * @param None - * @retval None - */ static void MX_TIM4_Init(void) { - /* USER CODE BEGIN TIM4_Init 0 */ - - /* USER CODE END TIM4_Init 0 */ - TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; - /* USER CODE BEGIN TIM4_Init 1 */ - - /* USER CODE END TIM4_Init 1 */ htim4.Instance = TIM4; htim4.Init.Prescaler = 36000; htim4.Init.CounterMode = TIM_COUNTERMODE_UP; @@ -884,27 +876,12 @@ static void MX_TIM4_Init(void) { if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) { Error_Handler(); } - /* USER CODE BEGIN TIM4_Init 2 */ - - /* USER CODE END TIM4_Init 2 */ } -/** - * @brief TIM5 Initialization Function - * @param None - * @retval None - */ static void MX_TIM5_Init(void) { - /* USER CODE BEGIN TIM5_Init 0 */ - - /* USER CODE END TIM5_Init 0 */ - TIM_SlaveConfigTypeDef sSlaveConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; - /* USER CODE BEGIN TIM5_Init 1 */ - - /* USER CODE END TIM5_Init 1 */ htim5.Instance = TIM5; htim5.Init.Prescaler = 0; htim5.Init.CounterMode = TIM_COUNTERMODE_UP; @@ -915,7 +892,7 @@ static void MX_TIM5_Init(void) { Error_Handler(); } sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; - sSlaveConfig.InputTrigger = TIM_TS_ITR1; + sSlaveConfig.InputTrigger = TIM_TS_ITR2; if (HAL_TIM_SlaveConfigSynchro(&htim5, &sSlaveConfig) != HAL_OK) { Error_Handler(); }