Перейти к содержанию
    

Stm32 HardFault_Handler

Осваиваю 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. В чём может быть причина?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

tmppriority - это что.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

tmppriority - это что.

 

 

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

при выполнении строки:
Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.

[тут ерунду написал, удалил]

В указанной вами строке используется чтение SCB->AIRCR, надо смотреть - действительно ли по этому адресу производится чтение и если нет - разбираться почему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спуститесь еще на уровень ниже. Поройдите по дизассемблированному коду и определите - на какой конкретно команде происходит прокол и что находится в используемых регистрах.

[тут ерунду написал, удалил]

В указанной вами строке используется чтение 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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот эти строчки неверны:

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 10;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;

Там всего 4 бита на них в сумме (на preemption priority и subpriority). Группировка задаётся функцией NVIC_SetPriorityGrouping().

Вряд ли от этого будет HardFault, но всё же исправьте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

0x08000568 4C1B      LDR      r4,[pc,#108]; @0x080005D8 <- Вылетает здесь

Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда проверьте значение, расположенное по указанному адресу (0x080005D8). Должно быть 0xE000ED00. Если это так, то всё, кранты - в ваш процессор забыли положить ядро :)

 

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

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, ну да, правильно, я забыл смещение.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте константу 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);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо за участие. Проблема разрешилась, правда не пойму откуда ноги растут :) Я не указал что  использовал ОС RL-RTX. Вызов NVIC_Init(&NVIC_InitStructure); производился внутри задачи - ошибка выскакивала, перенес её вызов в точку перед вызовом os_sys_init() ошибка исчезла. Видимо что-то происходит при инициализации ОС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо, доступ к соответствующим регистрам разрешен только в привилегированном режиме.

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

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...