Debugging STM32G0
Hello,
Currently I'm working on a system using the : STM32G0B1.
I'm encountering some Hardfaults, for what I've seen on G0 finding the source of the hardfaults is complicated.
I've used an code of type :
typedef struct{
TByte rSHCSR_name[4];
TLongWord rSHCSR;
TByte rDFSR_name[4];
TLongWord rDFSR;
TByte SP_name[4];
TLongWord * StackPointer;
TByte R0_name[4];
TLongWord stacked_r0;
TByte R1_name[4];
TLongWord stacked_r1;
TByte R2_name[4];
TLongWord stacked_r2;
TByte R3_name[4];
TLongWord stacked_r3;
TByte R12_name[4];
TLongWord stacked_r12;
TByte LR_name[4];
TLongWord stacked_lr;
TByte PC_name[4];
TLongWord stacked_pc;
TByte PSR_name[4];
TLongWord stacked_psr;
TByte REG_DCRSR_name[4];
TLongWord REG_DCRSR;
TByte REG_DCRDR_name[4];
TLongWord REG_DCRDR;
TByte REG_DEMCR_name[4];
TLongWord REG_DEMCR;
}TsHardFaultRegisters;
TsHardFaultRegisters oHardFaultRegistersPSP;
void HardFault_Handler(void)
{
// Get the process stack pointer mandatory if we use an OS
oHardFaultRegistersPSP.StackPointer = (TLongWord *)__get_PSP();
// assembler call to avoir stack modifications
__asm volatile("B CpuDriver_PRV_CheckFaultStatusRegisters\n\t");
}
void CpuDriver_PRV_CheckFaultStatusRegisters(void)
{
// Get the 8 register stacked by the core
oHardFaultRegistersPSP.stacked_r0 = ((TLongWord) oHardFaultRegistersPSP.StackPointer[0]);
oHardFaultRegistersPSP.stacked_r1 = ((TLongWord) oHardFaultRegistersPSP.StackPointer[1]);
oHardFaultRegistersPSP.stacked_r2 = ((TLongWord) oHardFaultRegistersPSP.StackPointer[2]);
oHardFaultRegistersPSP.stacked_r3 = ((TLongWord) oHardFaultRegistersPSP.StackPointer[3]);
oHardFaultRegistersPSP.stacked_r12 = ((TLongWord) oHardFaultRegistersPSP.StackPointer[4]);
oHardFaultRegistersPSP.stacked_lr = ((TLongWord) oHardFaultRegistersPSP.StackPointer[5]);
oHardFaultRegistersPSP.stacked_pc = ((TLongWord) oHardFaultRegistersPSP.StackPointer[6]);
oHardFaultRegistersPSP.stacked_psr = ((TLongWord) oHardFaultRegistersPSP.StackPointer[7]);
}
Sometimes I get the above result.
In which case, the disassembly looks like:
Questions :
1/ on several hardfaults I get the BL involved. However, the LR register is always positionnated on the adresses after the BL.
I might be interpreting the LR value wrongly ?
2/ The PC counter is located before or after the involved commands.
Is the PC not placed on the commands because BL pushes it ?
3/BL command seems to be correctly working most of the time. As for what I understand BL and MOV command are always used together to call a function. Do you have any ideas on how I can debug my code?
Best regards!
