Just seeing the register values at the starting of hardfault handler is not enough.You also need to find out the register values that are pushed to the stack asit enter hardfault handler.The value of R4 might not mean anything. The program could have gone wrongfor a number of cycle before entering hard fault, and load this value as a literaldata accidentally. I don't know about the IAR function __iar_Tls_dtor__Isdst_rules.Have you contact IAR support about this? They might be able to help.Have you try to find out if IAR tool got exception event trace?If not, define a couple of global variables that work as a shift register to record the last couple of exceptions.This might help locate the problem.Are you using really Process Stack?Another possible issue is that the Main Stack Pointer and the Process Stack Pointer values are quite close. Are you sure they haven't got overlapped by mistake?