0 beğenilme 0 beğenilmeme
59 kez görüntülendi
STMicroelectronics kategorisinde (3,700 puan) tarafından

Stm32f051 Discovery ile bir çalışmada,
DEBUG anında girmediği HARD_FAULT a neden çalışma anında girer ? Zamanlamalarla oynadım ama olmadı, böyle bir hatayı nasıl handle edersiniz ?

1 cevap

1 beğenilme 0 beğenilmeme
(2,620 puan) tarafından

Kod uzun degilse bakabilir miyiz ? Cok sebebi olabilir ama interruptli bir calisma ise yaris durumuna giriyor olabilir.
Asagida bulunan kod exception i handle etmektedir ve gcc ile yazilmistir. HardFault sizin hata interruptiniz olmalidir.
pc -> sizin hata aldiginiz programin adresini
lr -> sizin hata aldiginiz parcayi cagiran yerin adresini gostermektedir

Bu degerleri disari atabilirseniz. Nerede hata aldiginizi bulabilirsiniz.

struct cm0_frame_s
{
    unsigned long int cf_r0,
                cf_r1,
                cf_r2,
                cf_r3,
                cf_r12,
                cf_lr,
                cf_pc;
};

void exception_handler(struct cm0_frame_s *fr_ptr)
{
    volatile uint32_t lr __attribute__((unused)), pc __attribute__((unused));

    lr = fr_ptr -> cf_lr;
    pc = fr_ptr -> cf_pc;
}

void HardFault_Handler(void)
{
    asm("MOVS R0, #4");
    asm("MOVS R1, LR");
    asm("TST    R0,R1");
    asm("BNE Use_PSP");
    asm("Use_MSP:MRS R0, MSP");
    asm("Use_PSP:MRS R0, PSP");
    asm("B exception_handler");
}
(3,700 puan) tarafından

Kodlar Uzun Hocam. Bir ara programCounter degerini almayı planladım. Ama sanırım USART1 REC interrupt ı kullanıyorum, oradan olma ihtimalinin üzerinde duruyorum. Malum olduğu üzere HAL kullanıyorum. @Baran Ekrem :)

    void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    HAL_GPIO_TogglePin(LD4_GPIO_Port,LD4_Pin);
    HAL_Delay(100);
      /* USER CODE END W1_HardFault_IRQn 0 */
  }
}
(2,620 puan) tarafından

Yukarida attigim kodu kopyalayin degerleri alabilirsiniz.

...