Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Hardfault STM32F4 Keil
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Boriska
Подскажите, как идентифицировать ошибку и найти место ее возникновения.

Нажмите для просмотра прикрепленного файла

Обработчик:
Код
void HardFault_Handler(unsigned long *hardfault_args){
        volatile unsigned long stacked_r0;
        volatile unsigned long stacked_r1;
        volatile unsigned long stacked_r2;
        volatile unsigned long stacked_r3;
        volatile unsigned long stacked_r12;
        volatile unsigned long stacked_lr;
        volatile unsigned long stacked_pc;
        volatile unsigned long stacked_psr;
        volatile unsigned long _CFSR;
        volatile unsigned long _HFSR;
        volatile unsigned long _DFSR;
        volatile unsigned long _AFSR;
        volatile unsigned long _BFAR;
        volatile unsigned long _MMAR;

        stacked_r0 = ((unsigned long)hardfault_args[0]);
        stacked_r1 = ((unsigned long)hardfault_args[1]);
        stacked_r2 = ((unsigned long)hardfault_args[2]);
        stacked_r3 = ((unsigned long)hardfault_args[3]);
        stacked_r12 = ((unsigned long)hardfault_args[4]);
        stacked_lr = ((unsigned long)hardfault_args[5]);
        stacked_pc = ((unsigned long)hardfault_args[6]);
        stacked_psr = ((unsigned long)hardfault_args[7]);

        // Configurable Fault Status Register
        // Consists of MMSR, BFSR and UFSR
        _CFSR = (*((volatile unsigned long *)(0xE000ED28)));  
                                                                                        
        // Hard Fault Status Register
        _HFSR = (*((volatile unsigned long *)(0xE000ED2C)));

        // Debug Fault Status Register
        _DFSR = (*((volatile unsigned long *)(0xE000ED30)));

        // Auxiliary Fault Status Register
        _AFSR = (*((volatile unsigned long *)(0xE000ED3C)));

        // Read the Fault Address Registers. These may not contain valid values.
        // Check BFARVALID/MMARVALID to see if they are valid values
        // MemManage Fault Address Register
        _MMAR = (*((volatile unsigned long *)(0xE000ED34)));
        // Bus Fault Address Register
        _BFAR = (*((volatile unsigned long *)(0xE000ED38)));

        __asm("BKPT #0\n"); // Break into the debugger

}


Но стек пустой -
Нажмите для просмотра прикрепленного файла

Подскажите, в чем может быть проблема?
nill
Цитата(Boriska @ Oct 7 2014, 00:34) *
Подскажите, как идентифицировать ошибку и найти место ее возникновения.

Начните с чтения "AN209: Using CM3 and CM4 fault exceptions". Там указаны три основных причины возникновения INVSTATE, исходя из которых уже можно проводить дальнейший анализ.

Цитата(Boriska @ Oct 7 2014, 00:34) *
Но стек пустой -

А где и как заполняется hardfault_args? По идее, у Вас должен быть переопределён вектор прерывания HardFault, в нём заполняется hardfault_args и вызывается функция HardFault_Handler.
Boriska
Цитата(nill @ Oct 7 2014, 09:09) *
Начните с чтения "AN209: Using CM3 and CM4 fault exceptions".

Это я читал. Не помогает.
Цитата(nill @ Oct 7 2014, 09:09) *
По идее, у Вас должен быть переопределён вектор прерывания HardFault, в нём заполняется hardfault_args и вызывается функция HardFault_Handler

Спасибо за подсказку. Сейчас смотрю на PSP и MSP, но указатели на стек ссылаются на фрагменты памяти, где PC = 0 или PC=0x76432320, что не похоже на область, откуда может выполняться код.
Не понятно, какая инструкция вызвала ошибку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.