Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Stm32 HardFault_Handler
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
tag
Осваиваю STM32VLDISCOVERY. Запустил RTC и пытаюсь разрешить прерывания:




Код
    NVIC_InitTypeDef NVIC_InitStructure;
    
    // Enable the RTC Interrupt.
    NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);






При вызове NVIC_Init() процессор вываливается в HardFault_Handler. Посмотрел пошагово эту функцию, при выполнении строки:

Код
tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;


я сразу же попадаю в HardFault_Handler. В чём может быть причина?

Pat
Цитата(tag @ Dec 15 2011, 16:03) *
Код
tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;


Скорее всего происходит попытка записи по несуществующему адресу.

tmppriority - это что.
tag
Цитата(Pat @ Dec 15 2011, 17:18) *
Скорее всего происходит попытка записи по несуществующему адресу.

tmppriority - это что.




Эти функции (в приведённом выше фрагменте) взяты из библиотек которые пилагались к оценочному kit-у tmppriority переменная класса auto


Сергей Борщ
QUOTE (tag @ Dec 15 2011, 16:03) *
при выполнении строки:
Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.
[тут ерунду написал, удалил]
В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему.
tag
Цитата(Сергей Борщ @ Dec 16 2011, 09:57) *
Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.
[тут ерунду написал, удалил]
В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему.





спустился ниже:





Код
       123:     tmppriority = (0x700 - ((SCB->AIRCR) & (uint32_t)0x700))>> 0x08;
0x08000568 4C1B      LDR      r4,[pc,#108] ; @0x080005D8 <- Вылетает здесь
0x0800056A 6824      LDR      r4,[r4,#0x00]
0x0800056C F40464E0  AND      r4,r4,#0x700
0x08000570 F5C464E0  RSB      r4,r4,#0x700
0x08000574 EA4F2114  LSR      r1,r4,#8


AHTOXA
Вот эти строчки неверны:
Цитата(tag @ Dec 15 2011, 20:03) *
Код
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;

Там всего 4 бита на них в сумме (на preemption priority и subpriority). Группировка задаётся функцией NVIC_SetPriorityGrouping().
Вряд ли от этого будет HardFault, но всё же исправьте.
tag
Исправил, результат тот же. Впрочем, так и должно быть.
AHTOXA
Цитата(tag @ Dec 16 2011, 14:15) *
Код
0x08000568 4C1B      LDR      r4,[pc,#108]; @0x080005D8 <- Вылетает здесь

Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядроsm.gif
tag
Цитата(AHTOXA @ Dec 16 2011, 14:47) *
Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро sm.gif


 по указанному адресу (0x080005D8) значение   0xE000ED0С




AHTOXA
А, ну да, правильно, я забыл смещение.
Короче, в указанных строчках всё в порядке, ищите ошибку в другом месте. Обрезайте проект понемногу, ловите момент, когда ошибка пропадёт. Или наоборот, начните с пустого проекта и добавляйте помаленьку.
chan
Проверьте константу RTC_IRQn на всякий случай

/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
tag
Цитата(chan @ Dec 16 2011, 18:59) *
Проверьте константу RTC_IRQn на всякий случай



... с константой всё нормально

tag
Всем спасибо за участие. Проблема разрешилась, правда не пойму откуда ноги растут sm.gif Я не указал что  использовал ОС RL-RTX. Вызов NVIC_Init(&NVIC_InitStructure); производился внутри задачи - ошибка выскакивала, перенес её вызов в точку перед вызовом os_sys_init() ошибка исчезла. Видимо что-то происходит при инициализации ОС.
Dron_Gus
Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме.
esaulenka
Цитата(Dron_Gus @ Dec 20 2011, 19:46) *
Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме.

Угу. Информация из первых рук: wink.gif

The privilege levels for software execution are:
• Unprivileged
The software:
– has limited access to the MSR and MRS instructions, and cannot use the CPS instruction
– cannot access the system timer, NVIC, or system control block
– might have restricted access to memory or peripherals.
Unprivileged software executes at the unprivileged level.
• Privileged
The software can use all the instructions and has access to all resources.
Privileged software executes at the privileged level.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.