Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gps: use GPIO interrupt to track pulse per second (PPS) into a counter variable #239

Open
wants to merge 18 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions firmware/.mxproject

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion firmware/CTS-SAT-1_FW.ioc
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DMA1_Channel1_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DMA1_Channel2_IRQn=true\:5\:0\:false\:false\:true\:true\:false\:true\:true
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI9_5_IRQn=true\:5\:0\:false\:false\:true\:true\:true\:true\:true
NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.LPUART1_IRQn=true\:4\:0\:true\:false\:true\:false\:true\:true\:true
Expand Down Expand Up @@ -214,7 +215,7 @@ PA4.Signal=GPIO_Input
PA6.GPIOParameters=GPIO_Label
PA6.GPIO_Label=PIN_GPS_PPS_IN
PA6.Locked=true
PA6.Signal=GPIO_Input
PA6.Signal=GPXTI6
PA9.GPIOParameters=GPIO_Label
PA9.GPIO_Label=PIN_MPI_MOSI_USART1_TX
PA9.Locked=true
Expand Down Expand Up @@ -502,6 +503,8 @@ RCC.VCOInputFreq_Value=16000000
RCC.VCOOutputFreq_Value=192000000
RCC.VCOSAI1OutputFreq_Value=128000000
RCC.VCOSAI2OutputFreq_Value=128000000
SH.GPXTI6.0=GPIO_EXTI6
SH.GPXTI6.ConfNb=1
SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_8
SPI1.CalculateBaudRate=2.0 MBits/s
SPI1.DataSize=SPI_DATASIZE_8BIT
Expand Down
11 changes: 11 additions & 0 deletions firmware/Core/Inc/gpio_handler/gpio_handler.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

#ifndef __INCLUDE_GUARD__GPIO_HANDLER_H
#define __INCLUDE_GUARD__GPIO_HANDLER_H

#include "stm32l4xx_hal.h"
#include "main.h"

extern uint32_t GPS_pps_counter;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
#endif
11 changes: 11 additions & 0 deletions firmware/Core/Inc/gps/gps_pps_interrupt.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

#ifndef __INCLUDE_GUARD__GPS_PPS_INTERRUPT_H
#define __INCLUDE_GUARD__GPS_PPS_INTERRUPT_H

#include "stm32l4xx_hal.h"

void GPIO_EXTI_Init(void);

void Disable_GPIO_EXTI(void);

#endif // __INCLUDE_GUARD__GPS_PPS_INTERRUPT_H
1 change: 1 addition & 0 deletions firmware/Core/Inc/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ void Error_Handler(void);
#define PIN_BOOM_PGOOD_IN_GPIO_Port GPIOA
#define PIN_GPS_PPS_IN_Pin GPIO_PIN_6
#define PIN_GPS_PPS_IN_GPIO_Port GPIOA
#define PIN_GPS_PPS_IN_EXTI_IRQn EXTI9_5_IRQn
#define PIN_GPS_MOSI_USART3_TX_Pin GPIO_PIN_4
#define PIN_GPS_MOSI_USART3_TX_GPIO_Port GPIOC
#define PIN_GPS_MISO_USART3_RX_Pin GPIO_PIN_5
Expand Down
1 change: 1 addition & 0 deletions firmware/Core/Inc/stm32l4xx_it.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ void UsageFault_Handler(void);
void DebugMon_Handler(void);
void DMA1_Channel1_IRQHandler(void);
void DMA1_Channel2_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void TIM1_UP_TIM16_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
Expand Down
11 changes: 11 additions & 0 deletions firmware/Core/Inc/telecommands/gps_telecommand_defs.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@

#ifndef __INCLUDE_GUARD__GPS_TELECOMMAND_DEFINITIONS_H
#define __INCLUDE_GUARD__GPS_TELECOMMAND_DEFINITIONS_H

#include "main.h"
#include "telecommands/telecommand_types.h"

uint8_t TCMDEXEC_gps_set_enabled_pps_tracking(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len);

#endif // __INCLUDE_GUARD__GPS_TELECOMMAND_DEFINITIONS_H
27 changes: 27 additions & 0 deletions firmware/Core/Src/gpio_handler/gpio_handler.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@

#include "gpio_handler/gpio_handler.h"
#include "log/log.h"
#include "timekeeping/timekeeping.h"
#include <stdio.h>
#include <stdint.h>
#include <string.h>
uint32_t GPS_pps_counter = 0;
uint64_t GPS_last_pps_time = 0;

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (TIM_get_current_unix_epoch_time_ms() - GPS_last_pps_time > 800) {
2BlackCats marked this conversation as resolved.
Show resolved Hide resolved
GPS_last_pps_time = TIM_get_current_unix_epoch_time_ms();
if (GPIO_Pin != PIN_GPS_PPS_IN_Pin) {
return;
}
if (HAL_GPIO_ReadPin(PIN_GPS_PPS_IN_GPIO_Port, PIN_GPS_PPS_IN_Pin) == GPIO_PIN_SET) {
GPS_pps_counter++;
}
// char message[100];
2BlackCats marked this conversation as resolved.
Show resolved Hide resolved
// sprintf(message, "GPS PPS interrupt. Counter: %ld\r\n", GPS_pps_counter);
// LOG_message(
// LOG_SYSTEM_TELECOMMAND, LOG_SEVERITY_NORMAL, LOG_SINK_ALL,
// message
// );
}
}
13 changes: 13 additions & 0 deletions firmware/Core/Src/gps/gps_pps_interrupt.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include "stm32l4xx_hal.h"
#include "gps/gps_pps_interrupt.h"

#include "main.h"

void GPIO_EXTI_Init(void) {
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}

void Disable_GPIO_EXTI(void) {
HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
}
17 changes: 14 additions & 3 deletions firmware/Core/Src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1022,11 +1022,17 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/*Configure GPIO pins : PIN_BOOM_PGOOD_IN_Pin PIN_GPS_PPS_IN_Pin */
GPIO_InitStruct.Pin = PIN_BOOM_PGOOD_IN_Pin|PIN_GPS_PPS_IN_Pin;
/*Configure GPIO pin : PIN_BOOM_PGOOD_IN_Pin */
GPIO_InitStruct.Pin = PIN_BOOM_PGOOD_IN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_Init(PIN_BOOM_PGOOD_IN_GPIO_Port, &GPIO_InitStruct);

/*Configure GPIO pin : PIN_GPS_PPS_IN_Pin */
GPIO_InitStruct.Pin = PIN_GPS_PPS_IN_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(PIN_GPS_PPS_IN_GPIO_Port, &GPIO_InitStruct);

/*Configure GPIO pins : PIN_MEM_NCS_FLASH_7_Pin PIN_MEM_NCS_FLASH_6_Pin PIN_MEM_NCS_FLASH_5_Pin PIN_MEM_NCS_FLASH_4_Pin
PIN_MEM_NCS_FLASH_3_Pin */
Expand Down Expand Up @@ -1072,7 +1078,12 @@ static void MX_GPIO_Init(void)
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(PIN_BOOT0_GPIO_Port, &GPIO_InitStruct);

/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);

/* USER CODE BEGIN MX_GPIO_Init_2 */
HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
/* USER CODE END MX_GPIO_Init_2 */
}

Expand Down
24 changes: 22 additions & 2 deletions firmware/Core/Src/stm32l4xx_it.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,20 @@ void DMA1_Channel2_IRQHandler(void)
/* USER CODE END DMA1_Channel2_IRQn 1 */
}

/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */

/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(PIN_GPS_PPS_IN_Pin);
NuclearTea marked this conversation as resolved.
Show resolved Hide resolved
/* USER CODE BEGIN EXTI9_5_IRQn 1 */

/* USER CODE END EXTI9_5_IRQn 1 */
}

/**
* @brief This function handles TIM1 update interrupt and TIM16 global interrupt.
*/
Expand All @@ -221,8 +235,14 @@ 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);
HAL_TIM_IRQHandler(&htim16);
if (htim1.Instance != NULL)
NuclearTea marked this conversation as resolved.
Show resolved Hide resolved
{
HAL_TIM_IRQHandler(&htim1);
}
if (htim16.Instance != NULL)
{
HAL_TIM_IRQHandler(&htim16);
}
/* USER CODE BEGIN TIM1_UP_TIM16_IRQn 1 */
ulHighFrequencyTimerTicks++;

Expand Down
45 changes: 45 additions & 0 deletions firmware/Core/Src/telecommands/gps_telecommand_defs.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#include "telecommands/telecommand_definitions.h"
#include "telecommands/telecommand_args_helpers.h"
#include "telecommands/telecommand_executor.h"
#include "debug_tools/debug_uart.h"
#include "telecommands/gps_telecommand_defs.h"
#include "gps/gps_pps_interrupt.h"

#include <string.h>
#include <stdio.h>

#include "stm32l4xx_hal.h"

/// @brief Telecommand: Delete all agendas
/// @param args_str No arguments needed
/// @param tcmd_channel The channel on which the telecommand was received, and on which the response should be sent
/// @param response_output_buf The buffer to write the response to
/// @param response_output_buf_len The maximum length of the response_output_buf (its size)
/// @return 0 on success, 1 gps is off.
uint8_t TCMDEXEC_gps_set_enabled_pps_tracking(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len) {

static uint8_t GPS_pps_interrupt_enabled = 0;

// Check if EXTI is active
if (GPS_pps_interrupt_enabled) {
// Disable EXTI tracking
Disable_GPIO_EXTI();
GPS_pps_interrupt_enabled = 0;
snprintf(
response_output_buf, response_output_buf_len,
"PPS tracking disabled");
return 0;
}
// Check if EXTI is inactive
else if (!GPS_pps_interrupt_enabled) {
// Enable EXTI tracking
GPIO_EXTI_Init();
GPS_pps_interrupt_enabled = 1;
snprintf(
response_output_buf, response_output_buf_len,
"PPS tracking enabled");
return 0;
}
2BlackCats marked this conversation as resolved.
Show resolved Hide resolved
return 1;
}
10 changes: 10 additions & 0 deletions firmware/Core/Src/telecommands/telecommand_definitions.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include "telecommands/eps_telecommands.h"
#include "telecommands/stm32_internal_flash_telecommand_defs.h"
#include "telecommands/comms_telecommand_defs.h"
#include "telecommands/gps_telecommand_defs.h"
#include "telecommands/comms_telecommand_defs.h"


#include "timekeeping/timekeeping.h"
Expand Down Expand Up @@ -1016,6 +1018,14 @@ const TCMD_TelecommandDefinition_t TCMD_telecommand_definitions[] = {
.readiness_level = TCMD_READINESS_LEVEL_FLIGHT_TESTING,
},
// ****************** END SECTION: comms_telecommand_defs ******************
// ****************** START SECTION: gps_telecommand_defs ******************
{
.tcmd_name = "gps_set_enabled_pps_tracking",
.tcmd_func = TCMDEXEC_gps_set_enabled_pps_tracking,
.number_of_args = 0,
.readiness_level = TCMD_READINESS_LEVEL_FOR_OPERATION,
}
// ****************** END SECTION: gps_telecommand_defs ******************
};

// extern
Expand Down
4 changes: 2 additions & 2 deletions firmware/Makefile
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think this file should be edited. Also, the linker script in our repo is all caps so I don't know how this works

Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [4.4.0-B60] date: [Sat Sep 21 13:09:25 MDT 2024]
# File automatically-generated by tool: [projectgenerator] version: [4.5.0-RC5] date: [Thu Dec 05 20:28:29 MST 2024]
##########################################################################################################################

# ------------------------------------------------
Expand Down Expand Up @@ -165,7 +165,7 @@ CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32L4R5ZITx_FLASH.ld
LDSCRIPT = stm32l4r5zitx_flash.ld

# libraries
LIBS = -lc -lm -lnosys
Expand Down
Loading