/** ****************************************************************************** * @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 component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32f7xx_it.h" /** @addtogroup STM32F7xx_HAL_Examples * @{ */ /** @addtogroup GPIO_EXTI * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ extern int current_task; uint32_t* main_stack_pointer; /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/ /* The function saves the context (r4-r11) of the interrupted task into software stack-frame on process stack. The hardware stack frame already contains the context saved by hardware (pc, lr, sp, r0-r3, r12, spr) This function should be defined into the same translational module in which it is used as it is defined as static inline! PSP is special register and cannot be used in STMFD/LDMFD instructions. Thus, we must firs read its value into a general-purpose reg! Pa3cio Bulic, 26.10.2021 */ static inline void save_context(void) { uint32_t reg; asm volatile ( "MRS %0, psp\n\t" "STMFD %0!, {r4-r11}\n\t" "MSR psp, %0\n\t" : "=r" (reg) ); } /* The function restores the context (r4-r11) of the interrupted task from software stack-frame on process stack. This function should be defined into the same translational module in which is use as it is defined as static inline! PSP is special register and cannot be used in STMFD/LDMFD instructions. Thus, we must firs read its value into a general-purpose reg! Pa3cio Bulic, 26.10.2021 */ static inline void restore_context(void) { uint32_t reg; asm volatile ( "MRS %0, psp\n\t" "LDMFD %0!, {r4-r11}\n\t" "MSR psp, %0\n\t" : "=r" (reg) ); } /* 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, 9.11.2021 */ static 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) { if (current_task == 0){ main_stack_pointer = read_main_stack_pointer(); *((uint32_t*)main_stack_pointer + 1) = 0xFFFFFFFD; } HAL_IncTick(); save_context(); switch_context(); restore_context(); } /******************************************************************************/ /* 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) { HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN); } /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/