Browse Source

Try to analize HardFault.

Vladimir N. Shilov 3 years ago
parent
commit
e50721504b
1 changed files with 26 additions and 0 deletions
  1. 26 0
      Src/stm32g0xx_it.c

+ 26 - 0
Src/stm32g0xx_it.c

@@ -47,6 +47,32 @@ void NMI_Handler(void)
   */
 void HardFault_Handler(void)
 {
+  // tube power off
+  GPIOA->BSRR = 0x10;
+  // red led
+  TIM1->CCR2 = 0xff; TIM1->CCR3 = 0; TIM1->CCR4 = 0;
+
+  /* https://habr.com/ru/post/511924/ */
+  struct 
+  {
+    uint32_t r0;
+    uint32_t r1;
+    uint32_t r2;
+    uint32_t r3;
+    uint32_t r12;
+    uint32_t lr;
+    uint32_t pc;
+    uint32_t psr;
+  } * stack_ptr; //Указатель на текущее значение стека(SP)
+
+  asm (
+      "TST lr, #4 \n" //Тестируем 3-й бит указателя стека (побитовое И)
+      "ITE EQ \n"   //Значение указателя стека имеет бит 3?
+      "MRSEQ %[ptr], MSP  \n"  //Да, сохраняем основной указатель стека
+      "MRSNE %[ptr], PSP  \n"  //Нет, сохраняем указатель стека процесса
+      : [ptr] "=r" (stack_ptr)
+  );
+  // there plase break-point...
   while (1)
   {
   }