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

Как программно загнать STM32 в бутлоадер?

вот, так что кнопка нужна! :)

 

Да те кто правит и пишет стартап перед каждым проектом, снимаю шляпу, вы вызываете уважение, я видать уже обленился, пользуюсь выданным)

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


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

вот, так что кнопка нужна! :)

Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций.

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


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

Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций.

 

Но если очень хочется нажать, то можно)))

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


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

Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? ...

 

 

Потому у меня мнение что надо менять философию и уже считать что нижний уровень погиб, работать на уровень выше. И программу делать на этом уровне абстракции, то есть считать зануленые переменные данностью, которую мы не можем победить. И следовательно совершать какие-то доп действия, как минимум. А как максимум еще и не использовать очевидное свойство возможного сохранения памяти. Где гарантия что все так останется, нет документации - нет свойства!

 

...

А зачем его править? Я же написал английским по белому: __no_init объявление в С программе делает то, что надо.

 

 

У меня без CRC:

есть флажок в EEPROM: "программа годная, хорошая".

По старту всегда стартует бутлоадер, который

смотрит есть ли этот флаг, если есть, то делает проверку, хочет ли кто загрузить фирмварь, нет - прыгает на основную программу.

Если флага нет, никуда прыгать не будет.

Будет ждать аплоада фирмваря.

Аплоад фирмваря заключается в а) стирании флага; б) аплоада и в) прыжка на эту программу после аплоада.

Если аплоад не получился по какойто причине, прыжка не будет, будет опять пытатся сделать аплоад.

 

Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его.

 

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


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

Но если очень хочется нажать, то можно)))

 

 

Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки.

Для AVR без проблем делается делением лапополам и вся недолга. С каждой заливкой чередуются верхняя половинка/нижняя.

Прошивка пишется с последнего сектора. Последним прошивается таблица векторов. Т.к. сектор записи больше чем таблица векторов

- то за таблицей можно расположить служебную инфу. Типа номер прошивки и иже. Чтоб не было камня - достаточно обеспечить

стабильность работы в течении записи одного всего сектора.

 

Для ARMов - ещё просче. Можно сделать весь софт сегментным и ввести логику фулл, диф, инкрементальной версии по модульно. Софт будет сам себя

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

не будет детектироватья (нет црц и иже). Если ошибка софта - то статистика успешных отработок даёт ответ на вопрос целесообразности работы в той

или иной конфигурации загрузки.

 

Почему "если не боитесь" - замороты с адресацией. везде косвенная. Что не всегда поддерживают на ура компиляторы. Особенно когда

кода больше чем ближний(оптимизированный) переход. Ослинные уши вылазят в основном на языках си и выше. На армах юзаю IAR -

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

Отсюда понятно - что в системе должен быть как минимум накопитель (к примеру микро сд).

 

Но можно :)

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


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

Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки.

 

Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть...

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


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

Хм... опять что-то нездравое творится.

Я залил бутлодер, предложенный ST, сделал все в соответствии с AN2557. Заливаю прошивку с помощью все того же HYperTerminal, предложенного в AN2557. Прошивка получена из проекта Keil, специально настроенного под задачу - перенесен адрес приложения, таблица векторов, в общем - если прошивать и бутлодер и основную программу с помощью Keil - они мирно сосуществуют, прыжки из бутлодера в программу и наоборот - без проблем.

Но стоит залить прошивку с помощью HyperTerminal - основная программа не запускается. Отладчиком выяснено, что до функции Jump_To_Application() бутлодер добирается, а дальше - если остановить отладчик - видно что программа висит в HardFault_Handler.

Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется?

Вектора переношу вот так

__set_PRIMASK(1);

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000);

__set_PRIMASK(0);

 

Еще один момент, для понимания: предположив, что прошивка пишется не со смещением, а несколько затирает бутлодер, то бишь портит его - я прошиваю основную программу Keil'ом. По идее, если бутлодер битый, это не поможет. Ан нет - все становится на свои места. Значит битая основная программа. Но я тогда не пойму, почему отлоадчик остается в бутлодере? ПО идее дали пкоманду прыгнуть по адресу основной программы и все - отладчик из бутлодера ушел...

 

Прикрепляю бутлодер от ST

stsw_stm320081111.rar

Изменено пользователем Salamander

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


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

Вот здесь почитайте, может, даст толчок.

http://electronix.ru/forum/index.php?showt...t&p=1317836

У меня все заработало.

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


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

Ну не знаю, я так понял, что у вас вообще не грузилась основная программа. А у меня она грузится, если прошить Keil и перезапустить. А если прошить bootloaderом - то не грузится.

Вопрос - Keil у меня грузит в контроллер файл axf. Бутлодеру я подсовываю hex. Есть предположение, что как-то неправильно генерируется hex. Чтобы проверить это - как мне заставить Keil отправить в контроллер hex файл?

 

Еще вопрос - окно Memory что показывает - Flash или Ram?

 

 

///////////////

 

 

Разобрался как подсунуть HEX - Keil шьет его нормально....

 

В настройках Keil есть пункт IROM - в нем 2 поля, первое эт старт - 0x8003000, с ним все понятно. ВТорое - size 0x80000. Что-то я не нашел в коде бутлодера, где было бы такое значение, значит оно не учитывается бутлодером?

 

Залил по очереди прошивки - кейлом и бутлодером. Скачал по очереди, в HEX редакторе сравнил. Идентичны до адреса 0x00007477 (это смещение от 0x800....)

Дальше каждый байт различен....

Изменено пользователем Salamander

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


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

видно что программа висит в HardFault_Handler.

Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется?

 

Скорее всего чтото недоинициализированно. После бутлоадера осталось.

 

Вот смотреть адреса lr, pc - это откуда хард фолт случился.

 

void hard_fault_handler_c(unsigned int * hardfault_args)
{
 unsigned int stacked_r0;
 unsigned int stacked_r1;
 unsigned int stacked_r2;
 unsigned int stacked_r3;
 unsigned int stacked_r12;

 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]);

 while (1) ;

}


/*******************************************************************************
* Description : This function handles Hard Fault exception.
* Input       : -
* Return      : -
*******************************************************************************/
void HardFault_Handler(void)
{
   // Go to infinite loop when Hard Fault exception occurs
 asm("TST LR, #4");
 asm("ITE EQ");
 asm("MRSEQ R0, MSP");
 asm("MRSNE R0, PSP");
 asm("B hard_fault_handler_c");
   while (1);
}

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


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

Пока выяснил вот что - бутлодер от прошивки не портится. Но пишется во флеш совсем не то, что пишется, если программировать Keilом

Изменено пользователем Salamander

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


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

Мне кто-нибудь может пояснить, что за ерунда?

Test_project.hex - то, что генерирует keil

Зашиваем keilом - работает, скачиваем с помощью FlashLoader - получаем right.hex - он отличается.

Зашиваем бутлодером получаем wrong.hex

 

Как понять логику, если записываем, все записывается правильно, но когда этот правильный код скачиваем - получаем другое...

P.S. скачивал не все, у нажные сектора, начиная с 0x08003000

TEST_Project.rar

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


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

У меня мысли кончились...

Кто-нибудь работал именно с AN2577 ?

Получается грузить только встроенным бутлодером или через Keil.

Предложенный в AN2577 бутлодер грузит во флеш фигню.

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


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

А сама запись/чтение данных в/из флэша нормально работает? Может начать с этого?

 

Вообще, на первый взгляд, данные в файлах TEST_Project.hex и right.hex одинаковы, отличие только в разном количестве байт в строке, т.е. "скачиваем с помощью FlashLoader" то, что и залили программатором.

 

А вот right.hex и wrong.hex отличаются. Ищите ошибку где-то в записи во флэш загрузчиком, возможно в приёме данных или отправке с хоста.

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


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

Ваша правда, test и right одинаковы. Я просто сравнивал их средствами редактора, а в нем сравнение шло тупо побаитово, не вникая в суть записи.

Чуется мне, что собака где-то в привязке к железу зарыта, точнее к архитектуре памяти. В бутлодере полно дефайнов на разные случаи жизни, но возможео разработчики что-то и упустили. Бот кстати под сотую серию, у меня же 103ret6

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


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

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

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

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

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

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

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

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

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

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