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

Ошибка hardfault

Здравствуйте, я новичок в программировании, такая ситуация, когда захожу в отладчик программы в Keil программа сразу вылетает в hardfault, у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии? Мк-stm32f103

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


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

40 minutes ago, keton333 said:

у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии?

В целом нет

"затактируйте" ее, чтобы убедиться наверняка ))

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


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

3 hours ago, keton333 said:

у меня вопрос может ли быть это из-за того что я обращаюсь к регистрам незатактированной периферии

На сайте ARM и в популярных книгах Джозефа Ю приводится достаточное количество информации, чтобы расшифровать причины вызова данного исключения. В книге даже примеры есть. Сама книга легко находится на просторах сети глобальной. А умение расшифровывать причины исключения hardfault Вам пригодится неоднократно, если планируете и далее программировать микроконтроллеры данной архитектуры.

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


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

Если вылетает "сразу" - вполне возможно, что вы выбрали в среде разработки модель с бОльшим количеством памяти, чем есть в вашем контроллере. Поэтому компилятор разместил стек в несуществующей памяти и первая же инструкция записи на стек приводит к исключению. Самый простой и быстрый (на мой взгляд) способ проверить это - вставить в программу вот такой обработчик исключения HardFault:

void HardFault_Handler(void)
{
    volatile int i = 0;
    while(!i)
        ;
}

Попав в него вы переводите отладчик в режим исполнения ассемблерных команд (не помню, как это делается в Кейле - возможно, надо открыть и сделать активным окно дизассемблера), через отладчик заносите в i любое не равное 0 значение и двигаясь по ассемблерным командам выходите из обработчика. Попадаете на следующую инструкцию после той, которая вызвала исключение. Смотрите на нее, смотрите на содержимое использованных в ней регистров, думаете, почему там появились именно эти значения и какими они должны быть для правильной работы. Если же вы попадаете куда-то за пределы памяти программ - тогда все несколько сложнее, можно и книги Ю читать или тупо несколько раз выполнить программу с самого начала по ассемблерным командам найдя ту, на которой происходит падение.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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