ARM Cortex M3 How do I determine the program counter value before a hard fault?

前端 未结 5 1179
醉话见心
醉话见心 2020-12-28 23:27

I have an embedded project using a STM32F103 (ARM Cortex M3), it is getting a occasionally getting hard fault in release mode. As part of recovery, I would like to retrieve

相关标签:
5条回答
  • 2020-12-29 00:05

    I have an FAQ on this very topic. The page linked to from the FAQ includes fault handler code that will obtain the program counter from the stack for you.

    0 讨论(0)
  • 2020-12-29 00:12

    I found a common cause for these issues are those 'for loop' delays. When using -O3 they simply get optimized away if you are are not referring to volatile variables. Personally, I prefer the SysTick approach.

    0 讨论(0)
  • 2020-12-29 00:17

    Cortex-M3 uses a quite different model of exception handling from the "classic" ARM, e.g. it doesn't have "abort mode" mentioned in the other post. I suggest you to read this app note. For example, for the Hard Fault:

    The value of SCB->BFAR indicates the memory address that caused a Bus Fault and is valid if the bit BFARVALID in the SCB->CFSR register is set. The value of SCB->MMFAR indicates the memory address that caused a Memory Management Fault and is valid if the bit MMFARVALID in the SCB->CFSR register is set.

    To determine the PC value at the time of exception you need to examine the stack; the processor pushes R0-R3, R12, PC and LR before executing the handler. The stack used can be either Main (if bit 2 of LR is 0) or Process (otherwise). See page 13 of the app note for details.

    0 讨论(0)
  • 2020-12-29 00:20

    When an exception occurs, the processor state change from the current state to the abort state. In the abort state the processor shifts to use a new set of registers for sp and lr (sp_abt and sp_lr respectively. For a data abort, the offending instruction can be found in lr_abt + 8 for an prefect about in lr_abt + 4 (as per the ARMv7 Architecure reference manual)

    0 讨论(0)
  • 2020-12-29 00:28

    You should look into the ARM Architecture Reference Manual in the section on Exceptions. You need to register to get it.

    Typically a relevant address will be put in the link register LR (R14), but the precise meaning varies according to the exception, and there are varying offsets.

    W.r.t. accessing the User/System mode register bank, I think you need to switch the mode to access it.

    0 讨论(0)
提交回复
热议问题