Skip to content

Commit 162914e

Browse files
authored
Add Hardfault check function, checks if there was a hard_fault, and if that the case, party starts
1 parent d27b33a commit 162914e

4 files changed

Lines changed: 146 additions & 0 deletions

File tree

Inc/HALAL/HALAL.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
#include "HALAL/Models/Concepts/Concepts.hpp"
4646
#include "HALAL/Models/MDMA/MDMA.hpp"
4747

48+
#include "HALAL/HardFault/HardfaultTrace.h"
49+
#include "HALAL/Benchmarking_toolkit/DataWatchpointTrace/DataWatchpointTrace.hpp"
4850
#ifdef STLIB_ETH
4951
#include "HALAL/Models/Packets/Packet.hpp"
5052
#include "HALAL/Models/Packets/Order.hpp"
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#ifndef __HARD_FAULT_TRACE
2+
3+
#define __HARD_FAULT_TRACE
4+
#include "stm32h7xx_ll_gpio.h"
5+
#include "stm32h7xx_ll_bus.h"
6+
#include "stm32h7xx_ll_tim.h"
7+
#define METADATA_FLASH_ADDR (0x080DFD00) //Metadata pool flash address
8+
#define HF_FLASH_ADDR (0x080C0000U) //Hard_fault_flash address
9+
#define HF_FLAG_VALUE (0xFF00FF00U) //Flag to know if already is written information in the flash
10+
#define METADATA_FLASH_SIZE (0X100U)
11+
#define HARD_FAULT_FLASH_SIZE (0X200U)
12+
#define CALL_TRACE_MAX_DEPTH 16
13+
typedef struct __attribute__((packed)) ContextStateFrame {
14+
uint32_t r0;
15+
uint32_t r1;
16+
uint32_t r2;
17+
uint32_t r3;
18+
uint32_t r12;
19+
uint32_t lr;
20+
uint32_t return_address;
21+
uint32_t xpsr;
22+
} sContextStateFrame;
23+
24+
25+
typedef struct __attribute__((packed)) HardFaultLog{
26+
uint32_t HF_flag;
27+
sContextStateFrame frame;
28+
union{
29+
uint32_t cfsr;
30+
struct CfSrFields{
31+
uint8_t MMFSR;
32+
uint8_t BFSR;
33+
uint16_t UFSR;
34+
}fields;
35+
}CfsrDecode;
36+
union{
37+
uint32_t Nothing_Valid;
38+
uint32_t MMAR_VALID;
39+
uint32_t BFAR_VALID;
40+
}fault_address;
41+
struct __attribute__((packed)){
42+
uint32_t depth;
43+
uint32_t pcs[CALL_TRACE_MAX_DEPTH];
44+
}CallTrace;
45+
}HardFaultLog; // 112 bytes this estructure
46+
47+
48+
#ifdef __cplusplus
49+
extern "C" {
50+
#endif
51+
void Hard_fault_check(void);
52+
#ifdef __cplusplus
53+
}
54+
#endif
55+
56+
#endif

STM32H723ZGTX_FLASH.ld

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
ENTRY(Reset_Handler)
3636

3737
/* Highest address of the user mode stack */
38+
_sstack = ORIGIN(DTCMRAM);
3839
_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM); /* end of RAM */
3940
/* Generate a link error if heap and stack don't fit into RAM/DTCM */
4041
_Min_Heap_Size = 0x200; /* required amount of heap */
@@ -82,6 +83,8 @@ SECTIONS
8283
.text :
8384
{
8485
. = ALIGN(4);
86+
_stext = .;
87+
8588
*(.text) /* .text sections (code) */
8689
*(.text*) /* .text* sections (code) */
8790
*(.glue_7) /* glue arm to thumb code */
@@ -104,6 +107,14 @@ SECTIONS
104107
. = ALIGN(4);
105108
} >FLASH
106109

110+
.hardfault_stack (NOLOAD) : /*Stack memory to avoid memfault inside hardfault handler*/
111+
{
112+
. = ALIGN(8);
113+
_hf_stack_start = .;
114+
. += 0x400; /* 1 KB */
115+
_hf_stack_end = .;
116+
} >DTCMRAM
117+
107118
.ARM.extab (READONLY): { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
108119
.ARM (READONLY): {
109120
__exidx_start = .;
@@ -184,6 +195,13 @@ SECTIONS
184195
the sections below it would try to be placed afterwards
185196
thus overflowing the FLASH
186197
*/
198+
199+
.hardfault_log 0x080C0000 :
200+
{
201+
KEEP(*(.hardfault_log))
202+
. = . + 0x200;
203+
} >FLASH
204+
187205
.metadata_pool :
188206
{
189207
. = ABSOLUTE(0x080DFD00);
@@ -192,6 +210,7 @@ SECTIONS
192210
KEEP(*(.metadata_pool))
193211
. += 0x100;
194212
} >FLASH
213+
195214
/* Uninitialized data section */
196215
. = ALIGN(4);
197216
.bss (NOLOAD) :
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include "HALAL/HardFault/HardfaultTrace.h"
2+
#ifdef NUCLEO
3+
#define REPS 200000
4+
#endif
5+
6+
#ifdef BOARD
7+
#define REPS 600000 // Three times faster because the board frequency
8+
#endif
9+
10+
extern GPIO_TypeDef* ports_hard_fault[];
11+
extern uint16_t pins_hard_fault[];
12+
extern uint8_t hard_fault_leds_count;
13+
14+
static void LED_Blink();
15+
static void LED_init(void);
16+
static void EnableGPIOClock(GPIO_TypeDef* port);
17+
static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin);
18+
static void delay();
19+
20+
__attribute__((optimize("O0")))
21+
static void delay(){
22+
for(volatile uint64_t i = 0; i < REPS; i++){
23+
__NOP();
24+
}
25+
}
26+
static void LED_Blink(){
27+
for(volatile int i = 0; i < hard_fault_leds_count;i++){
28+
LL_GPIO_TogglePin(ports_hard_fault[i],pins_hard_fault[i]);
29+
}
30+
delay();
31+
}
32+
static void LED_init(void){
33+
for(int i = 0; i < hard_fault_leds_count;i++){
34+
EnableGPIOClock(ports_hard_fault[i]);
35+
InitGPIO_Output(ports_hard_fault[i],pins_hard_fault[i]);
36+
}
37+
}
38+
void Hard_fault_check(void){
39+
if(*(volatile uint32_t*)HF_FLASH_ADDR == HF_FLAG_VALUE){
40+
volatile HardFaultLog log;
41+
memcpy(&log,(void*)HF_FLASH_ADDR,sizeof(HardFaultLog));
42+
#ifdef DEBUG
43+
__asm__ __volatile__("bkpt 1");
44+
#endif
45+
LED_init();
46+
while(1){
47+
LED_Blink();
48+
}
49+
50+
}
51+
}
52+
static void EnableGPIOClock(GPIO_TypeDef* port){
53+
if(port == GPIOA) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOA);
54+
else if(port == GPIOB) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOB);
55+
else if(port == GPIOC) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOC);
56+
else if(port == GPIOD) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOD);
57+
else if(port == GPIOE) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOE);
58+
else if(port == GPIOF) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOF);
59+
else if(port == GPIOG) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOG);
60+
else if(port == GPIOJ) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOJ);
61+
else if(port == GPIOK) LL_AHB4_GRP1_EnableClock(LL_AHB4_GRP1_PERIPH_GPIOK);
62+
}
63+
static void InitGPIO_Output(GPIO_TypeDef* port,uint16_t pin){
64+
LL_GPIO_SetPinMode(port, pin, LL_GPIO_MODE_OUTPUT);
65+
LL_GPIO_SetPinOutputType(port, pin, LL_GPIO_OUTPUT_PUSHPULL);
66+
LL_GPIO_SetPinSpeed(port, pin, LL_GPIO_SPEED_FREQ_LOW);
67+
LL_GPIO_SetPinPull(port, pin, LL_GPIO_PULL_NO);
68+
}
69+

0 commit comments

Comments
 (0)