|
|
  |
Как программно загнать STM32 в бутлоадер? |
|
|
|
Mar 11 2015, 10:46
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Цитата(aaarrr @ Mar 11 2015, 13:03)  Нужна, но не для того, чтобы на неё нажимать. Только для нештатных ситуаций. Но если очень хочется нажать, то можно)))
|
|
|
|
|
Mar 11 2015, 13:26
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Golikov A. @ Mar 11 2015, 01:12)  Это понятно, у меня вопрос вы когда последний раз писали или хотя бы правили startup? ...
Потому у меня мнение что надо менять философию и уже считать что нижний уровень погиб, работать на уровень выше. И программу делать на этом уровне абстракции, то есть считать зануленые переменные данностью, которую мы не можем победить. И следовательно совершать какие-то доп действия, как минимум. А как максимум еще и не использовать очевидное свойство возможного сохранения памяти. Где гарантия что все так останется, нет документации - нет свойства!
... А зачем его править? Я же написал английским по белому: __no_init объявление в С программе делает то, что надо. У меня без CRC: есть флажок в EEPROM: "программа годная, хорошая". По старту всегда стартует бутлоадер, который смотрит есть ли этот флаг, если есть, то делает проверку, хочет ли кто загрузить фирмварь, нет - прыгает на основную программу. Если флага нет, никуда прыгать не будет. Будет ждать аплоада фирмваря. Аплоад фирмваря заключается в а) стирании флага; б) аплоада и в) прыжка на эту программу после аплоада. Если аплоад не получился по какойто причине, прыжка не будет, будет опять пытатся сделать аплоад. Главная программа стартует, инициализируется, проверяет че надо, и если флажок не стоит, записывает его.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 11 2015, 20:23
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Salamander @ Mar 11 2015, 13:46)  Но если очень хочется нажать, то можно))) Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Для AVR без проблем делается делением лапополам и вся недолга. С каждой заливкой чередуются верхняя половинка/нижняя. Прошивка пишется с последнего сектора. Последним прошивается таблица векторов. Т.к. сектор записи больше чем таблица векторов - то за таблицей можно расположить служебную инфу. Типа номер прошивки и иже. Чтоб не было камня - достаточно обеспечить стабильность работы в течении записи одного всего сектора. Для ARMов - ещё просче. Можно сделать весь софт сегментным и ввести логику фулл, диф, инкрементальной версии по модульно. Софт будет сам себя писать и в добавок у вас в камне более одной рабочей прошивки. В случае сбоя - вы получаете кусок сбойной записи, которая при старте камня никак не будет детектироватья (нет црц и иже). Если ошибка софта - то статистика успешных отработок даёт ответ на вопрос целесообразности работы в той или иной конфигурации загрузки. Почему "если не боитесь" - замороты с адресацией. везде косвенная. Что не всегда поддерживают на ура компиляторы. Особенно когда кода больше чем ближний(оптимизированный) переход. Ослинные уши вылазят в основном на языках си и выше. На армах юзаю IAR - грешен в нём так-же компилятор  Посему системы записи места краша программы - актуально выходит на первое место. Ну и скидывания причины в удобный вид. Отсюда понятно - что в системе должен быть как минимум накопитель (к примеру микро сд). Но можно
|
|
|
|
|
Mar 12 2015, 06:56
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(kolobok0 @ Mar 11 2015, 23:23)  Если не боитесь программить - то ышо один вариант - хранить во флеше более одной рабочей прошивки. Да и зачем?? Если бутлодырь "правильный", то перезальет любую кривозалитую прошивку, а все эти дубли и пр, только усложняют прогу и уменьшают объем флешки... Если уж бутлодырь кривой, то и 3 копии не помогут, проверял на собственном опыте, лучше делать больше вариантов прошивки в буте, например, флешка, уарт, а если нужно удаленно - сеть...
|
|
|
|
|
Mar 14 2015, 07:23
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Хм... опять что-то нездравое творится. Я залил бутлодер, предложенный 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
Сообщение отредактировал Salamander - Mar 14 2015, 07:01
|
|
|
|
|
Mar 14 2015, 12:24
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Ну не знаю, я так понял, что у вас вообще не грузилась основная программа. А у меня она грузится, если прошить Keil и перезапустить. А если прошить bootloaderом - то не грузится. Вопрос - Keil у меня грузит в контроллер файл axf. Бутлодеру я подсовываю hex. Есть предположение, что как-то неправильно генерируется hex. Чтобы проверить это - как мне заставить Keil отправить в контроллер hex файл?
Еще вопрос - окно Memory что показывает - Flash или Ram?
///////////////
Разобрался как подсунуть HEX - Keil шьет его нормально....
В настройках Keil есть пункт IROM - в нем 2 поля, первое эт старт - 0x8003000, с ним все понятно. ВТорое - size 0x80000. Что-то я не нашел в коде бутлодера, где было бы такое значение, значит оно не учитывается бутлодером?
Залил по очереди прошивки - кейлом и бутлодером. Скачал по очереди, в HEX редакторе сравнил. Идентичны до адреса 0x00007477 (это смещение от 0x800....) Дальше каждый байт различен....
Сообщение отредактировал Salamander - Mar 14 2015, 11:24
|
|
|
|
|
Mar 14 2015, 13:15
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(Salamander @ Mar 14 2015, 02:23)  видно что программа висит в HardFault_Handler. Господа, я не силен в отладке - чо мне делать дальше, как понять, что и почему не так пишется? Скорее всего чтото недоинициализированно. После бутлоадера осталось. Вот смотреть адреса lr, pc - это откуда хард фолт случился. CODE 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); }
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 14 2015, 15:53
|
Местный
  
Группа: Участник
Сообщений: 466
Регистрация: 17-11-12
Пользователь №: 74 443

|
Мне кто-нибудь может пояснить, что за ерунда? Test_project.hex - то, что генерирует keil Зашиваем keilом - работает, скачиваем с помощью FlashLoader - получаем right.hex - он отличается. Зашиваем бутлодером получаем wrong.hex Как понять логику, если записываем, все записывается правильно, но когда этот правильный код скачиваем - получаем другое... P.S. скачивал не все, у нажные сектора, начиная с 0x08003000
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|