HVAC_M7_MONO/MODULES/HVAC_M7_HardFault/HardFault.c

58 lines
2.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Created by cfif on 14.07.2026.
//
#include "HardFault.h"
#include CMSIS_device_header
#include "cmsis_os2.h"
#include "InternalFlashPage.h"
extern uint32_t __StackTop;
#define START_FLASH_ADR 0x04001000
#define CODE_START (0x01000000 + 64 * 1024)
#define CODE_END (CODE_START + 704 * 1024) // или используйте символ из линкера
__attribute__((section(".save_data"))) volatile uint32_t hardReset_addresses[SIZE_BUF_HARD_FAULT]; // массив для адресов возврата (достаточно 32)
__attribute__((section(".save_data"))) volatile uint32_t hardReset_count;
__attribute__((section(".save_data"))) volatile uint32_t hardReset_type;
__attribute__((section(".save_data"))) volatile uint32_t hardReset_magic;
__attribute__((section(".save_data"))) volatile uint32_t none_data;
void vTaskGetCurrentTaskStackInfo(void **ppvStackStart, void **ppvStackEnd);
void HardReset_C_Handler(uint32_t *sp, uint32_t stack_flag, eHardResetType typeReset) {
uint32_t *src = sp;
const uint32_t max_ret = sizeof(hardReset_addresses) / sizeof(uint32_t) - 1;
uint32_t *stack_end = NULL;
if (stack_flag == 0) { // Использовался MSP – стек ядра
//src += 8; // пропускаем контекст
stack_end = &__StackTop;
} else { // Использовался PSP – стек задачи
void *pvStackStart, *pvStackEnd;
vTaskGetCurrentTaskStackInfo(&pvStackStart, &pvStackEnd);
// uint32_t *stack_start = (uint32_t *) pvStackStart;
stack_end = (uint32_t *) pvStackEnd;
}
hardReset_count = 0;
while (src < stack_end && hardReset_count < max_ret) {
uint32_t val = *src;
// Проверяем, принадлежит ли значение области кода
if (val >= CODE_START && val < CODE_END) {
hardReset_addresses[hardReset_count++] = val & ~1; // убираем Thumb-бит
}
src++;
}
hardReset_type = typeReset;
hardReset_magic = 0xDEADBEEF;
NVIC_SystemReset();
}