Устранение ошибок Hardfault или Usage в процессоре Cortex-M4 - PullRequest
0 голосов
/ 13 марта 2020

При работе над внедрением системных сбоев для системы с микропроцессором ARM cortex-m4. Я включил сбои использования с помощью управления системным обработчиком и регистра состояния,

SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk;

и включил деление на ноль сбоев с помощью настраиваемого регистра управления.

SCB->CCR |= SCB_CCR_DIV_0_TRP_Msk;

Я также пытаюсь избегать многократного ввода ошибки использования , я хочу, чтобы программа вызывала ошибку ISR ошибки использования только один раз при возникновении ошибки, но вместо этого программа повторяет ошибку использования несколько раз . Я пытался использовать NVIC_ClearPendingIRQ(IRQnum), но не решил проблему.

Может ли кто-нибудь мне помочь, если мне не хватает установить регистр или что-то еще?

Код для ISR:

void UsageFault_Handler(void)
{
//  CFSR (Configurable Fault status register)
//  |--------------------|----------|---------|  UFSR - usage fault status register.
//  |        UFSR        |   BFSR   |   MFSR  |  BFSR - bus fault status register.
//  |--------------------|----------|---------|  MFSR - MemManage Fault status register. 
//  31                16   15      8  7      0
// ensure the USFR register is not empty before checking for particular usage faults. 
  if ((SCB->CFSR & 0xFFFF0000) != 0)
  {
    uint32_t CFSRValue = SCB->CFSR;// get the CFSR register and shift the register to extract the UFSR bits.
    CFSRValue >>= 16;                                                 // right shift to lsb

     if ((CFSRValue & (1 << 9)) != 0) // ensure the 25th bit (DIVBYZERO) of CFSR is not set. 
     {
       LOG the fault
     }
   }
}

Я использую IAR с ucos-III для ARM cortex-m4.

...