From cf761bbb3c9b6c6c9949332b4787088440933efc Mon Sep 17 00:00:00 2001 From: oganigl Date: Thu, 11 Dec 2025 16:12:40 +0100 Subject: [PATCH 01/10] Added party when hard_fault --- .../Benchmarking_toolkit/HardfaultTrace.h | 53 +++++++++++++ Inc/HALAL/HALAL.hpp | 2 + .../Benchmarking_toolkit/HardfaultTrace.c | 76 +++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h create mode 100644 Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c diff --git a/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h b/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h new file mode 100644 index 000000000..0e7997701 --- /dev/null +++ b/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h @@ -0,0 +1,53 @@ +#ifndef __HARD_FAULT_TRACE + +#define __HARD_FAULT_TRACE +#include "stm32h7xx_ll_gpio.h" +#include "stm32h7xx_ll_bus.h" +#include "stm32h7xx_ll_tim.h" +#define METADATA_FLASH_ADDR (0x080DFD00) //Metadata pool flash address +#define HF_FLASH_ADDR (0x080C0000U) //Hard_fault_flash address +#define HF_FLAG_VALUE (0xFF00FF00U) //Flag to know if already is written information in the flash +#define METADATA_FLASH_SIZE (0X100U) +#define HARD_FAULT_FLASH_SIZE (0X200U) +typedef struct __attribute__((packed)) ContextStateFrame { + uint32_t r0; + uint32_t r1; + uint32_t r2; + uint32_t r3; + uint32_t r12; + uint32_t lr; + uint32_t return_address; + uint32_t xpsr; +} sContextStateFrame; + + +typedef struct __attribute__((packed)) HardFaultLog{ + uint32_t HF_flag; + sContextStateFrame frame; + union{ + uint32_t cfsr; + struct CfSrFields{ + uint8_t MMFSR; + uint8_t BFSR; + uint16_t UFSR; + }fields; + }CfsrDecode; + union{ + uint32_t Nothing_Valid; + uint32_t MMAR_VALID; + uint32_t BFAR_VALID; + }fault_address; +}HardFaultLog; // 44 bytes this estructure +// static void LED_init(void); +// static void LED_Blink(uint32_t delay_ms); +// static uint8_t HF_FLASH(void); +#ifdef __cplusplus +extern "C" { +#endif +void Hard_fault_check(void); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/Inc/HALAL/HALAL.hpp b/Inc/HALAL/HALAL.hpp index d1c0438ce..61e1af042 100644 --- a/Inc/HALAL/HALAL.hpp +++ b/Inc/HALAL/HALAL.hpp @@ -41,6 +41,8 @@ #include "HALAL/Models/BoardID/BoardID.hpp" #include "HALAL/Models/Concepts/Concepts.hpp" +#include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" +#include "HALAL/Benchmarking_toolkit/DataWatchpointTrace/DataWatchpointTrace.hpp" #ifdef STLIB_ETH #include "HALAL/Models/Packets/Packet.hpp" #include "HALAL/Models/Packets/Order.hpp" diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c new file mode 100644 index 000000000..173c4f85a --- /dev/null +++ b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c @@ -0,0 +1,76 @@ +#include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" + +extern GPIO_TypeDef* ports_hard_fault[]; +extern uint16_t pins_hard_fault[]; +extern uint8_t hard_fault_leds_count; + +static void LED_Blink(uint32_t delay); +static void LED_init(void); +static void EnableGPIOClock(GPIO_TypeDef* port); +static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin); +static void TIM_init(void); +static void delay_ms(uint32_t); + +static void delay_ms(uint32_t ms){ + uint32_t start = LL_TIM_GetCounter(TIM2); + uint64_t us = ms*10000; + while((LL_TIM_GetCounter(TIM2) - start) < us){ + __NOP(); + } +} +static void LED_Blink(uint32_t delay){ + //PB0 blink + for(int i = 0; i < hard_fault_leds_count;i++){ + LL_GPIO_TogglePin(ports_hard_fault[i],pins_hard_fault[i]); + } + delay_ms(delay); +} +static void LED_init(void){ + for(int i = 0; i < hard_fault_leds_count;i++){ + EnableGPIOClock(ports_hard_fault[i]); + InitGPIO_Output(ports_hard_fault[i],pins_hard_fault[i]); + } +} +void Hard_fault_check(void){ + if(*(volatile uint32_t*)HF_FLASH_ADDR == HF_FLAG_VALUE){ + HardFaultLog log; + memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog)); + LED_init(); + TIM_init(); + while(1){ + LED_Blink(200); + } + + } +} +static void EnableGPIOClock(GPIO_TypeDef* port){ + if(port == GPIOA) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA); + else if(port == GPIOB) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB); + else if(port == GPIOC) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC); + else if(port == GPIOD) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOD); + else if(port == GPIOE) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOE); + else if(port == GPIOF) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOF); + else if(port == GPIOG) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOG); + else if(port == GPIOJ) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOJ); + else if(port == GPIOK) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOK); +} +static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin){ + LL_GPIO_SetPinMode(port, pin, LL_GPIO_MODE_OUTPUT); + LL_GPIO_SetPinOutputType(port, pin, LL_GPIO_OUTPUT_PUSHPULL); + LL_GPIO_SetPinSpeed(port, pin, LL_GPIO_SPEED_FREQ_LOW); + LL_GPIO_SetPinPull(port, pin, LL_GPIO_PULL_NO); +} + +static void TIM_init(void){ + LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); + + LL_TIM_DisableCounter(TIM2); + + uint32_t psc = (SystemCoreClock / 1000000) - 1;//freq = 1000 hz + LL_TIM_SetPrescaler(TIM2, psc); + LL_TIM_SetAutoReload(TIM2, 0xFFFFFFFF); + LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP); + LL_TIM_SetCounter(TIM2, 0); + + LL_TIM_EnableCounter(TIM2); +} \ No newline at end of file From 4037346aaa029714a4101e9343621abd8b3309d6 Mon Sep 17 00:00:00 2001 From: oganigl Date: Thu, 11 Dec 2025 16:25:20 +0100 Subject: [PATCH 02/10] eliminate systick --- .../Benchmarking_toolkit/HardfaultTrace.c | 34 +++++-------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c index 173c4f85a..9739e7e4c 100644 --- a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c +++ b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c @@ -1,29 +1,25 @@ #include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" - +#define REPS 100000 extern GPIO_TypeDef* ports_hard_fault[]; extern uint16_t pins_hard_fault[]; extern uint8_t hard_fault_leds_count; -static void LED_Blink(uint32_t delay); +static void LED_Blink(); static void LED_init(void); static void EnableGPIOClock(GPIO_TypeDef* port); static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin); -static void TIM_init(void); -static void delay_ms(uint32_t); +static void delay(); -static void delay_ms(uint32_t ms){ - uint32_t start = LL_TIM_GetCounter(TIM2); - uint64_t us = ms*10000; - while((LL_TIM_GetCounter(TIM2) - start) < us){ +static void delay(){ + for(uint64_t i = 0; i < REPS; i++){ __NOP(); } } -static void LED_Blink(uint32_t delay){ - //PB0 blink +static void LED_Blink(){ for(int i = 0; i < hard_fault_leds_count;i++){ LL_GPIO_TogglePin(ports_hard_fault[i],pins_hard_fault[i]); } - delay_ms(delay); + delay(); } static void LED_init(void){ for(int i = 0; i < hard_fault_leds_count;i++){ @@ -36,9 +32,8 @@ void Hard_fault_check(void){ HardFaultLog log; memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog)); LED_init(); - TIM_init(); while(1){ - LED_Blink(200); + LED_Blink(); } } @@ -61,16 +56,3 @@ static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin){ LL_GPIO_SetPinPull(port, pin, LL_GPIO_PULL_NO); } -static void TIM_init(void){ - LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM2); - - LL_TIM_DisableCounter(TIM2); - - uint32_t psc = (SystemCoreClock / 1000000) - 1;//freq = 1000 hz - LL_TIM_SetPrescaler(TIM2, psc); - LL_TIM_SetAutoReload(TIM2, 0xFFFFFFFF); - LL_TIM_SetCounterMode(TIM2, LL_TIM_COUNTERMODE_UP); - LL_TIM_SetCounter(TIM2, 0); - - LL_TIM_EnableCounter(TIM2); -} \ No newline at end of file From c0d7a758638ca31511f1d4791cc796cb0ed1a05d Mon Sep 17 00:00:00 2001 From: oganigl Date: Sat, 13 Dec 2025 12:06:02 +0100 Subject: [PATCH 03/10] Add breakpoint to read hard fault when debugging --- Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c index 9739e7e4c..50e2053ba 100644 --- a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c +++ b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c @@ -31,6 +31,9 @@ void Hard_fault_check(void){ if(*(volatile uint32_t*)HF_FLASH_ADDR == HF_FLAG_VALUE){ HardFaultLog log; memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog)); + #ifdef DEBUG + __asm("bkpt 1"); + #endif LED_init(); while(1){ LED_Blink(); From a6a1cc4fd1cb332ca62bd4719fc48fb6e48cec91 Mon Sep 17 00:00:00 2001 From: oganigl Date: Sat, 13 Dec 2025 17:35:38 +0100 Subject: [PATCH 04/10] add no optimization to the delay --- Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c index 50e2053ba..00098662f 100644 --- a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c +++ b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c @@ -10,13 +10,14 @@ static void EnableGPIOClock(GPIO_TypeDef* port); static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin); static void delay(); +__attribute__((optimize("O0"))) static void delay(){ - for(uint64_t i = 0; i < REPS; i++){ + for(volatile uint64_t i = 0; i < REPS; i++){ __NOP(); } } static void LED_Blink(){ - for(int i = 0; i < hard_fault_leds_count;i++){ + for(volatile int i = 0; i < hard_fault_leds_count;i++){ LL_GPIO_TogglePin(ports_hard_fault[i],pins_hard_fault[i]); } delay(); @@ -29,7 +30,7 @@ static void LED_init(void){ } void Hard_fault_check(void){ if(*(volatile uint32_t*)HF_FLASH_ADDR == HF_FLAG_VALUE){ - HardFaultLog log; + volatile HardFaultLog log; memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog)); #ifdef DEBUG __asm("bkpt 1"); From 6266c1831a7e223a9b505d4ed479f355059ac6a0 Mon Sep 17 00:00:00 2001 From: oganigl Date: Sat, 13 Dec 2025 23:25:24 +0100 Subject: [PATCH 05/10] add a ifdef for the speed of the blinking depending if it's a board or nucleo --- Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c index 00098662f..d4c347a8b 100644 --- a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c +++ b/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c @@ -1,5 +1,12 @@ #include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" -#define REPS 100000 +#ifdef NUCLEO +#define REPS 200000 +#endif + +#ifdef BOARD +#define REPS 600000 // Three times faster because the board frequency +#endif + extern GPIO_TypeDef* ports_hard_fault[]; extern uint16_t pins_hard_fault[]; extern uint8_t hard_fault_leds_count; From 5279511bc935fa57e60c6a1f2e1cd088521abfe1 Mon Sep 17 00:00:00 2001 From: oganigl Date: Tue, 20 Jan 2026 17:05:55 +0100 Subject: [PATCH 06/10] add call trace max depth --- Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h b/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h index 0e7997701..6fe45e4b0 100644 --- a/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h +++ b/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h @@ -9,6 +9,7 @@ #define HF_FLAG_VALUE (0xFF00FF00U) //Flag to know if already is written information in the flash #define METADATA_FLASH_SIZE (0X100U) #define HARD_FAULT_FLASH_SIZE (0X200U) +#define CALL_TRACE_MAX_DEPTH 16 typedef struct __attribute__((packed)) ContextStateFrame { uint32_t r0; uint32_t r1; @@ -37,15 +38,17 @@ typedef struct __attribute__((packed)) HardFaultLog{ uint32_t MMAR_VALID; uint32_t BFAR_VALID; }fault_address; -}HardFaultLog; // 44 bytes this estructure -// static void LED_init(void); -// static void LED_Blink(uint32_t delay_ms); -// static uint8_t HF_FLASH(void); + struct __attribute__((packed)){ + uint32_t depth; + uint32_t pcs[CALL_TRACE_MAX_DEPTH]; + }CallTrace; +}HardFaultLog; // 112 bytes this estructure + + #ifdef __cplusplus extern "C" { #endif void Hard_fault_check(void); - #ifdef __cplusplus } #endif From 814b93836c9cbc481281c072f6aaafb0899ccd66 Mon Sep 17 00:00:00 2001 From: oganigl Date: Fri, 23 Jan 2026 17:51:27 +0100 Subject: [PATCH 07/10] create a unique folder for hard_fault --- Inc/HALAL/{Benchmarking_toolkit => HardFault}/HardfaultTrace.h | 0 Src/HALAL/{Benchmarking_toolkit => HardFault}/HardfaultTrace.c | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Inc/HALAL/{Benchmarking_toolkit => HardFault}/HardfaultTrace.h (100%) rename Src/HALAL/{Benchmarking_toolkit => HardFault}/HardfaultTrace.c (98%) diff --git a/Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h b/Inc/HALAL/HardFault/HardfaultTrace.h similarity index 100% rename from Inc/HALAL/Benchmarking_toolkit/HardfaultTrace.h rename to Inc/HALAL/HardFault/HardfaultTrace.h diff --git a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c b/Src/HALAL/HardFault/HardfaultTrace.c similarity index 98% rename from Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c rename to Src/HALAL/HardFault/HardfaultTrace.c index d4c347a8b..0e93aa4d6 100644 --- a/Src/HALAL/Benchmarking_toolkit/HardfaultTrace.c +++ b/Src/HALAL/HardFault/HardfaultTrace.c @@ -40,7 +40,7 @@ void Hard_fault_check(void){ volatile HardFaultLog log; memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog)); #ifdef DEBUG - __asm("bkpt 1"); + __asm__ __volatile__("bkpt 1"); #endif LED_init(); while(1){ From 7f4d908944249b3723c248ea6dc79a2a3527ba84 Mon Sep 17 00:00:00 2001 From: oganigl Date: Fri, 23 Jan 2026 17:58:19 +0100 Subject: [PATCH 08/10] change folders name --- Inc/HALAL/HALAL.hpp | 2 +- Src/HALAL/HardFault/HardfaultTrace.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Inc/HALAL/HALAL.hpp b/Inc/HALAL/HALAL.hpp index d3a1de3bb..f1bb426b3 100644 --- a/Inc/HALAL/HALAL.hpp +++ b/Inc/HALAL/HALAL.hpp @@ -44,7 +44,7 @@ #include "HALAL/Models/BoardID/BoardID.hpp" #include "HALAL/Models/Concepts/Concepts.hpp" -#include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" +#include "HALAL/HardFault/HardfaultTrace.h" #include "HALAL/Benchmarking_toolkit/DataWatchpointTrace/DataWatchpointTrace.hpp" #ifdef STLIB_ETH #include "HALAL/Models/Packets/Packet.hpp" diff --git a/Src/HALAL/HardFault/HardfaultTrace.c b/Src/HALAL/HardFault/HardfaultTrace.c index 0e93aa4d6..8f5a9ad45 100644 --- a/Src/HALAL/HardFault/HardfaultTrace.c +++ b/Src/HALAL/HardFault/HardfaultTrace.c @@ -1,4 +1,4 @@ -#include "HALAL/Benchmarking_toolkit/HardfaultTrace.h" +#include "HALAL/HardFault/HardfaultTrace.h" #ifdef NUCLEO #define REPS 200000 #endif From bed70447d4960c8eb5eb5b92f7c74e83b9651e7b Mon Sep 17 00:00:00 2001 From: oganigl Date: Fri, 23 Jan 2026 21:20:16 +0100 Subject: [PATCH 09/10] add memory space for hard_fault in linker script --- STM32H723ZGTX_FLASH.ld | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/STM32H723ZGTX_FLASH.ld b/STM32H723ZGTX_FLASH.ld index 4e1345425..2df735b45 100644 --- a/STM32H723ZGTX_FLASH.ld +++ b/STM32H723ZGTX_FLASH.ld @@ -35,6 +35,7 @@ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ +_sstack = ORIGIN(DTCMRAM) _estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ /* Generate a link error if heap and stack don't fit into RAM/DTCM */ _Min_Heap_Size = 0x200; /* required amount of heap */ @@ -82,6 +83,8 @@ SECTIONS .text : { . = ALIGN(4); + _stext = .; + *(.text) /* .text sections (code) */ *(.text*) /* .text* sections (code) */ *(.glue_7) /* glue arm to thumb code */ @@ -104,6 +107,14 @@ SECTIONS . = ALIGN(4); } >FLASH + .hardfault_stack (NOLOAD) : /*Stack memory to avoid memfault inside hardfault handler*/ + { + . = ALIGN(8); + _hf_stack_start = .; + . += 0x400; /* 1 KB */ + _hf_stack_end = .; + } >DTCMRAM + .ARM.extab (READONLY): { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH .ARM (READONLY): { __exidx_start = .; @@ -184,6 +195,13 @@ SECTIONS the sections below it would try to be placed afterwards thus overflowing the FLASH */ + + .hardfault_log 0x080C0000 : + { + KEEP(*(.hardfault_log)) + . = . + 0x200; + } >FLASH + .metadata_pool : { . = ABSOLUTE(0x080DFD00); @@ -192,6 +210,7 @@ SECTIONS KEEP(*(.metadata_pool)) . += 0x100; } >FLASH + /* Uninitialized data section */ . = ALIGN(4); .bss (NOLOAD) : From e2a56178a9ed2cebb53a4840e00f862e5b9e3935 Mon Sep 17 00:00:00 2001 From: oganigl Date: Fri, 23 Jan 2026 21:29:36 +0100 Subject: [PATCH 10/10] always is a semicolon the problem --- STM32H723ZGTX_FLASH.ld | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/STM32H723ZGTX_FLASH.ld b/STM32H723ZGTX_FLASH.ld index 2df735b45..16f605035 100644 --- a/STM32H723ZGTX_FLASH.ld +++ b/STM32H723ZGTX_FLASH.ld @@ -35,7 +35,7 @@ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ -_sstack = ORIGIN(DTCMRAM) +_sstack = ORIGIN(DTCMRAM); _estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */ /* Generate a link error if heap and stack don't fit into RAM/DTCM */ _Min_Heap_Size = 0x200; /* required amount of heap */