Advertisement
icis4

Untitled

May 26th, 2025
510
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.18 KB | Source Code | 0 0
  1. /**
  2.   * @brief This function handles Hard fault interrupt.
  3.   */
  4. void HardFault_Handler(void)
  5. {
  6.   /* USER CODE BEGIN HardFault_IRQn 0 */
  7.     __asm volatile
  8.         (
  9.             " tst lr, #4                                                \n"
  10.             " ite eq                                                    \n"
  11.             " mrseq r0, msp                                             \n"
  12.             " mrsne r0, psp                                             \n"
  13.             " ldr r1, [r0, #24]                                         \n"
  14.             " ldr r2, =prvGetRegistersFromStack                         \n"
  15.             " bx r2                                                     \n"
  16.         );
  17.   /* USER CODE END HardFault_IRQn 0 */
  18.   while (1)
  19.   {
  20.     /* USER CODE BEGIN W1_HardFault_IRQn 0 */
  21.     /* USER CODE END W1_HardFault_IRQn 0 */
  22.   }
  23. }
  24.  
  25. __attribute__ ((noreturn)) void prvGetRegistersFromStack( uint32_t *pulFaultStackAddress )
  26. {
  27. /* These are volatile to try and prevent the compiler/linker optimising them
  28. away as the variables never actually get used.  If the debugger won't show the
  29. values of the variables, make them global my moving their declaration outside
  30. of this function. */
  31. volatile uint32_t r0  __unused;
  32. volatile uint32_t r1  __unused;
  33. volatile uint32_t r2  __unused;
  34. volatile uint32_t r3  __unused;
  35. volatile uint32_t r12 __unused;
  36. volatile uint32_t lr  __unused; /* Link register. */
  37. volatile uint32_t pc  __unused; /* Program counter. */
  38. volatile uint32_t psr __unused;/* Program status register. */
  39.  
  40.     r0 =  pulFaultStackAddress[ 0 ];
  41.     r1 =  pulFaultStackAddress[ 1 ];
  42.     r2 =  pulFaultStackAddress[ 2 ];
  43.     r3 =  pulFaultStackAddress[ 3 ];
  44.  
  45.     r12 = pulFaultStackAddress[ 4 ];
  46.     lr =  pulFaultStackAddress[ 5 ];
  47.     pc =  pulFaultStackAddress[ 6 ];
  48.     psr = pulFaultStackAddress[ 7 ];
  49.  
  50.     /* When the following line is hit, the variables contain the register values. */
  51.  
  52.     stack_dump_print("R0  [%08x]  ",  r0);
  53.     stack_dump_print("R1  [%08x]  ",  r1);
  54.     stack_dump_print("R2  [%08x]\n",  r2);
  55.     stack_dump_print("R3  [%08x]  ",  r3);
  56.     stack_dump_print("R12 [%08x]  ",  r12);
  57.     stack_dump_print("LR  [%08x]\n",  lr);
  58.     stack_dump_print("PC  [%08x]  ",  pc);
  59.     stack_dump_print("PSR [%08x]\n",  psr);
  60.  
  61. ...
  62.    
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement