/** ****************************************************************************** * @file GPIO/GPIO_EXTI/Src/stm32f7xx_it.c * @author MCD Application Team * @brief Main Interrupt Service Routines. * This file provides template for all exceptions handler and * peripherals interrupt service routine. ****************************************************************************** * @attention * * Copyright (c) 2016 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in 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 "main.h" #include "stm32f7xx_it.h" /** @addtogroup STM32F7xx_HAL_Examples * @{ */ /** @addtogroup GPIO_EXTI * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ uint32_t* main_stack_pointer; extern int current_task; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /* The function reads MSP and returns its value in result. This function should be defined into the same translational module in which is use as it is defined as static inline! Pa3cio Bulic, 26.10.2021 */ static __attribute__((always_inline)) void* read_main_stack_pointer(void) { void* result; /* read special register MSP into a general-purpose register (picked by compiler) and write it to result: */ asm volatile ( "MRS %0, MSP\n\t" : "=r" (result) ); //return (result + 0x10); return (result); } /******************************************************************************/ /* Cortex-M7 Processor Exceptions Handlers */ /******************************************************************************/ /** * @brief This function handles NMI exception. * @param None * @retval None */ void NMI_Handler(void) { } /** * @brief This function handles Hard Fault exception. * @param None * @retval None */ void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } /** * @brief This function handles Memory Manage exception. * @param None * @retval None */ void MemManage_Handler(void) { /* Go to infinite loop when Memory Manage exception occurs */ while (1) { } } /** * @brief This function handles Bus Fault exception. * @param None * @retval None */ void BusFault_Handler(void) { /* Go to infinite loop when Bus Fault exception occurs */ while (1) { } } /** * @brief This function handles Usage Fault exception. * @param None * @retval None */ void UsageFault_Handler(void) { /* Go to infinite loop when Usage Fault exception occurs */ while (1) { } } /** * @brief This function handles SVCall exception. * @param None * @retval None */ void SVC_Handler(void) { } /** * @brief This function handles Debug Monitor exception. * @param None * @retval None */ void DebugMon_Handler(void) { } /** * @brief This function handles PendSVC exception. * @param None * @retval None */ void PendSV_Handler(void) { } /** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { HAL_IncTick(); } /******************************************************************************/ /* STM32F7xx Peripherals Interrupt Handlers */ /* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */ /* available peripheral interrupt handler's name please refer to the startup */ /* file (startup_stm32f7xx.s). */ /******************************************************************************/ /** * @brief This function handles external line 0 interrupt request. * @param None * @retval None */ void EXTI0_IRQHandler(void) { // ce smo prvic prekinili main, popravi zapis na skladu (0xFFFFFFF9), da bo 0xFFFFFFFD // -1 oznacuje, da smo prileteli iz maina if (current_task == -1) { main_stack_pointer = read_main_stack_pointer(); *((uint32_t*)main_stack_pointer + 1) = 0xFFFFFFFD; } // TODO: na sklad prekinjenega opravila porini registre r4-r11 switch_context (); // TODO: s skladu novega opravila poberi registre r4-r11 HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); } /** * @} */ /** * @} */