|
|
  |
stm32 bootloader, разьясните новичку |
|
|
|
Apr 19 2012, 07:26
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Цитата(jcxz @ Apr 19 2012, 11:22)  1. неизменяемой части (загрузчика) в первом секторе флеш, который прошивается изначально на заводе и при удалённой прошивке не может быть перешит; 2. собственно рабочего ПО (во флеш после загрузчика). Ну где-то так я себе это и предсатвляю. У меня еще вот вопросы: 1. Как можно определить программно размер записанной программы в МК. 2. Как программно перегрузить МК?
|
|
|
|
|
Apr 19 2012, 07:27
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Делаю примерно так же, но помимо текущей версии ПО, храню в памяти программ и дефолтную заводскую прошивку, чтобы можно было одной простой командой откатить версию прошивки на гарантировано рабочую. Просто специфика в том, что прошивку подгоняют под нужды заказчиков прямо на объекте, а при проблемах с новыми версиями необходимо максимально быстро восстановить работоспособность устройства. Вот для возможности запуска обоих прошивок и переношу таблицу прерываний в область нужной мне прошивки.
По программной перезагрузке: функция NVIC_SystemReset(); в StdPeriph Lib от STM.
Сообщение отредактировал lead_seller - Apr 19 2012, 07:31
|
|
|
|
|
Apr 19 2012, 07:31
|

Twilight Zone
  
Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990

|
Цитата(batisto4ka @ Apr 19 2012, 10:26)  Ну где-то так я себе это и предсатвляю. У меня еще вот вопросы: 1. Как можно определить программно размер записанной программы в МК. 2. Как программно перегрузить МК? Вот для Вас полезная ссылочка будет тыц
--------------------
Magic Friend
|
|
|
|
|
Apr 19 2012, 07:34
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(batisto4ka @ Apr 19 2012, 13:26)  1. Как можно определить программно размер записанной программы в МК. В общем случае - никак. Если вам нужно определять размер, то можно зафиксировать его постоянным (равным макс. доступной памяти программ). Возможно в каких-то конкретных компоновщиках есть возможность определить максимальный адрес размещения прошивки и поместить его в заранее определенное место памяти - тогда можно воспользоваться этим. Не забывайте, что программа в общем случае может занимать ряд несоседних участков памяти программ с дырками между ними. Цитата(batisto4ka @ Apr 19 2012, 13:26)  2. Как программно перегрузить МК? Например - с помощью внутреннего сторожевика.
|
|
|
|
|
Apr 19 2012, 07:36
|

Частый гость
 
Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190

|
Цитата(lead_seller @ Apr 19 2012, 12:41)  ....с огромной вероятностью разрывов на линии. При этом вероятность того, что устройство продолжит функционировать после неудачной перепрошивки, должна стремится к 100%. позвольте встрять в вашу беседу. с СТМ я пока еще только теоретик, и у меня возник вопрос: если имеются во флеш firmware1 и firmware2. допустим firmware1 - битый, тогда как стартанут с firmware2 без использования ассэмблерной комманды по переходу на точку входа firmware2?
--------------------
Шизоидный холерик
|
|
|
|
|
Apr 19 2012, 07:44
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
При каждом старте бутлоадер проверяет целостность прошивки по CRC. Если CRC совпало то стартуем custom прошивку, если прошивка битая - проверяем целостность default прошивки и стартуем ее, если и default окажется битым, то бутлоадер будет ждать процесса прошивки. А запуск прошивки реализуется переносом таблицы векторов и банальным переходом по стартовым адресам прошивок (они жестко заданы).
По данным - области константных данных в Flash контроллера для каждой из прошивок свои, данные во внешней SPI flash (там хранятся настройки и архив) при подгрузке их любой прошивкой проверяются (тем же CRC) и если они не подходят для работающей прошивки изменяются на настройки по умолчанию. Так что никаких проблем с несовместимостью данных не возникает
Сообщение отредактировал lead_seller - Apr 19 2012, 07:47
|
|
|
|
|
Apr 19 2012, 07:56
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
Не спорю. Вообще и при моем алгоритме тоже. Но лучше перестраховаться, чем телепать в шахту, и в полузатопленном штреке, при свете коногонки, перепрошивать устройство по JTAG). У меня задача, обеспечить максимальную вероятность того, что устройство запустится с хоть какой-то прошивкой, и 100% вероятность того, что при работающей связи и питании, его можно будет прошить удаленно.
|
|
|
|
|
Apr 19 2012, 12:36
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225

|
У нас проблемы с настройками связи не возникают. По всей сети одна, жестко заданная скорость CAN. Максимум что может случится - изменится идентификатор устройства (номер) на линии, на номер по умолчанию. При этом он все равно останется уникальным (при монтаже номер по умолчанию не используется), а потом его поменяют командой сверху. Все остальные данные генерятся непосредственно прошивкой на этапе самотестирования.
Мы даунгрейды тоже не любим, но не все протестируешь наверху, и приходится заливать в работающие устройства экспериментальные прошивки. Вот и надо иметь возможность быстрого отката.
Сообщение отредактировал lead_seller - Apr 19 2012, 12:38
|
|
|
|
|
Apr 19 2012, 18:37
|
Участник

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929

|
Хочу привести несколько рекомендаций, основываясь на собственном опыте, как не наступить на грабли при написании связки бутлоадер-приложение.
1. Перед переходом на приложение запретите прерывания. 2. Если разрешен Watchdog, задайте его период "с запасом" и перед переходом на приложение вызовите IWDG_ReloadCounter(); 3. Если бутлоадер использует USB, не забудьте выполнить USB_Cable_Config(DISABLE); 4. Отключите устройства, которые не используются приложением, если такие есть.
5. В приложении первым действием задайте новый адрес таблицы векторов, затем проинициализируйте WatchDog и только потом разрешайте прерывания. После Reset, инициированного Watchdog'ом или после прошивки по JTAG, STM32 стартует с текущей таблицей векторов, т.е с начала приложения. Поэтому приложение в общем случае не должно знать о существовании бутлоадера и о том, какая периферия уже была включена и настроена. В приложении лучше сделать все заново.
6. STM32 XL-Density имеют два банка Flash по 512К, расположенные с одного и того же адреса. Какой банк будет подключен после Reset, задается в Option Byte. Этот механизм можно использовать для хранения двух версий прошивки, скомпилированных с одного начального адреса. При этом, бутлоадер нужно продублировать в каждом банке.
|
|
|
|
|
Apr 22 2012, 17:02
|
Частый гость
 
Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997

|
Подскажите, как сделать безусловный переход по адресу. Бутлоадер записал прогу например по адресу 0х08010000. Находила примеры типа Код void (*FuncPtr)(void);
FuncPtr=(void(*)(void))0x08010000; //адресс куда переходим FuncPtr(); Но при выполнении последней строчки (вызов функции) FuncPtr() стшка вылетает в хард фолт. В чем может быть проблемма и как организовать прыжек из бутлоадера в основную программу? Может, можно сделать ассемблерную ставку типа goto или jump?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|