Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * @brief This function handles Hard fault interrupt.
- */
- void HardFault_Handler(void)
- {
- /* USER CODE BEGIN HardFault_IRQn 0 */
- __asm volatile
- (
- " tst lr, #4 \n"
- " ite eq \n"
- " mrseq r0, msp \n"
- " mrsne r0, psp \n"
- " ldr r1, [r0, #24] \n"
- " ldr r2, =prvGetRegistersFromStack \n"
- " bx r2 \n"
- );
- /* USER CODE END HardFault_IRQn 0 */
- while (1)
- {
- /* USER CODE BEGIN W1_HardFault_IRQn 0 */
- /* USER CODE END W1_HardFault_IRQn 0 */
- }
- }
- __attribute__ ((noreturn)) void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
- {
- /* These are volatile to try and prevent the compiler/linker optimising them
- away as the variables never actually get used. If the debugger won't show the
- values of the variables, make them global my moving their declaration outside
- of this function. */
- volatile uint32_t r0 __unused;
- volatile uint32_t r1 __unused;
- volatile uint32_t r2 __unused;
- volatile uint32_t r3 __unused;
- volatile uint32_t r12 __unused;
- volatile uint32_t lr __unused; /* Link register. */
- volatile uint32_t pc __unused; /* Program counter. */
- volatile uint32_t psr __unused;/* Program status register. */
- r0 = pulFaultStackAddress[ 0 ];
- r1 = pulFaultStackAddress[ 1 ];
- r2 = pulFaultStackAddress[ 2 ];
- r3 = pulFaultStackAddress[ 3 ];
- r12 = pulFaultStackAddress[ 4 ];
- lr = pulFaultStackAddress[ 5 ];
- pc = pulFaultStackAddress[ 6 ];
- psr = pulFaultStackAddress[ 7 ];
- /* When the following line is hit, the variables contain the register values. */
- stack_dump_print("R0 [%08x] ", r0);
- stack_dump_print("R1 [%08x] ", r1);
- stack_dump_print("R2 [%08x]\n", r2);
- stack_dump_print("R3 [%08x] ", r3);
- stack_dump_print("R12 [%08x] ", r12);
- stack_dump_print("LR [%08x]\n", lr);
- stack_dump_print("PC [%08x] ", pc);
- stack_dump_print("PSR [%08x]\n", psr);
- ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement