|
STM32 bootloader, написание собственного бута |
|
|
|
Jan 3 2012, 13:31
|

Участник

Группа: Участник
Сообщений: 32
Регистрация: 3-02-11
Из: Украина, Киев
Пользователь №: 62 695

|
Всем привет. Появилась задача создать бутлоадер, который будет удаленно перепрошивать контроллер. Контроллер работает в связке с gsm-модулем. Раньше опыта создания бутов не было, поэтому вопросов появилось просто масса. Во-первых, для себя я вижу 2 концепции бутлоадера, каждый со своими плюсами и минусами. 1. Основная программа качает прошивку, пишет её в определенное место флеша(например, с 16-й страницы флеша), проверяет, все ли правильно записалось, устанавливает в энергонезависимом регистре флаг, что нужно войти в бут, перезагружается, происходит вход в бутлоадер, который очищает основную программу(например, со 2й страницы флеша) и перезаписывает новую прошивку на это место и переходит на выполнение основной программы. Преимущества(+)/недостатки(-): +простота бутлоадера, в том числе не нужно инициализировать юарт и модуль из бутлоадера. +не нужно долго висеть в буте +перезагружаться в бут можно только после того, как прошивка успешно закачана -если не верно закачалась прошивка либо же не рабочая прошивка - только вручную перепрошивать -нужен МК с бОльшим обьемом Flash 2. Основная программа перегружает МК в бут, который удаляет старую прошивку, качает новую и сразу записывает её вместо старой. Преимущества(+)/недостатки(-): +бут может сам скачать новую прошивку +контроллер с меньшим обьемом флеша -сложность бута - нужно будет иниициализировать юарт, включать и инициализировать gsm модуль. -долго находиться в бутлоадере Какой вариант лучше? И, может, есть более совершенные решения? Теперь вопросы по реализации: 1. Какие подводные камни могут быть в написании бута? 2. Читал на форуме про то, что нужно перезаписывать таблицу векторов(или вектора прерываний?)? Можно об этом подробнее? Как это делается? Где об этом можно подробнее почитать, а то никакой вразумительной инфы не нашел. 3. Бут и основная программа пишуться ведь как 2 разных проекта? Отадельным вопросом - как заставить программу перейти на выполнение с определенного адреса? Где найти об этом информацию? Пробывал как в примере от ST: CODE #include "common.h" #define ApplicationAddress 0x08000073
extern pFunction Jump_To_Application; extern uint32_t JumpAddress;
/* Jump to user application */ JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4); Jump_To_Application = (pFunction) JumpAddress; /* Initialize user application's Stack Pointer */ __set_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); Не получилось. На ф-ции Jump_To_Application(); уходит в hardfault Особенно не понятно, где тело этой функции, нигде в присоединенных файлах эта функция не описана. (файлы примера прикрепил к сообщению) Был бы очень благодарен, если бы кто-то подсказал, где об этом можно прочитать и где можно найти рабочие и понятные примеры. И чтобы не плодить сообщения, напишу про еще одну проблему с отладочной платой: на STM32VLDiscovery целевой контроллер работает, прошивается, но невероятно греется. Даже на 2 секунды нельзя на нем задержать палец. Очень горячий. Закороток визуально нет, да и паяльником я не притрагивался к плате , не знаю, с чего все и началось. Тестера под рукой тоже нет. Не работает светодиод LD4. Правда я не знаю, это следствие или причина нагрева, сейчас далеко от цивилизации, протестить и перепаять ничего не могу. (схема : http://www.st.com/internet/com/TECHNICAL_R...CD00267113.pdf)
Прикрепленные файлы
an2557.rar ( 1.64 мегабайт )
Кол-во скачиваний: 79
|
|
|
|
|
 |
Ответов
|
Feb 20 2015, 07:53
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(AHTOXA @ Feb 20 2015, 08:46)  А как туда будет передаваться управление? Это будет автономный проект, загрузчик. Без прерываний, работа только по последовательному порту. После сброса попадаем в него. Если есть признак, что нужно обновить основную программу (или просто ждать сообщения секунды 4), принимаем, программируем, сбрасываемся. Если признака нет уходим на основную программу. Стартовый адрес (тот, что в прошивке по 0x00000000), сохраняем где-то в недрах..., и используем его для перехода. А вместо него при прошивке пишем адрес загрузчика. И не надо перемещать основную программу, удобно для отладки. Вижу вероятность получить неработающий прибор, когда сектор 0 уже стер, а записать не успел.
|
|
|
|
|
Feb 20 2015, 10:36
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(AHTOXA @ Feb 20 2015, 12:17)  Я вот про это и спрашивал. Как мы попадаем в него? Насколько я знаю, после сброса можно попасть в три места: в начало флеша, в ОЗУ и в заводской загрузчик. Как обычно. В начале flash записан адрес (загрузчика, в данном случае), по которому переходим... ага, эта часть не отображается на нулевые адреса... и из нее, очевидно, нельзя выполнять программы. Но ведь в System Memory скакнуть, вроде, можно? Ладно, идею похерим. Займу нулевой сектор под загрузчик. Только разобраться надо, как основную программу создавать. Задать ее расположение с адреса 0x0800_4000, что ли? Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще? Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике? То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали...
|
|
|
|
|
Feb 20 2015, 12:20
|

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

|
Цитата(ViKo @ Feb 20 2015, 05:36)  Я вот чего не пойму. Программный счетчик когда по программе бегает, он какие значения перебирает? Вижу в отладчике 0x0800XXXX. Тогда при чем тут нулевые адреса вообще? Или в этом случае (работа из flash) адреса 0x00000000 и 0x08000000 - это одно и то же? И можно задать и так, и так? Скажем, вручную в отладчике? То есть, старшие биты адреса при старте принудительно выставляются в 0x0800 и погнали... Правильные пацаны просто читают мануаль в таком случае. Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров. Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет. И не факт что поможет. http://www.keil.com/forum/20219/stm32-and-interrupts/
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Feb 20 2015, 13:01
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(A. Fig Lee @ Feb 20 2015, 15:20)  Правильные пацаны просто читают мануаль в таком случае. Угу, одно и тоже. А вот "задать вручную в отладке" это уже методы юных кулхацкеров. Неизвестно как оно имплементировано, и гарантии нет что везде одинаково и так и будет. И не факт что поможет. Чему поможет? Мне ничего не надо. А мануалов я начитался тонны. Просто когда не сталкиваешься, не задумываешься. А кое-кто и столкнувшись, не думает. Просто посылает в мануал.  Зачем тогда компилировать в адреса 0x08000000? Кидай сразу в 0, и что из RAM, что из Flash будет работать. Зачем мне Keil демонстрирует адреса 0x08000000? Глянул в отладчике Memory View. Что по 0x00000000, что по 0x08000000 - одинаковое показывает. Первое слово - стек, второе - стартовый адрес - в обоих вариантах 0x0800EAC5. Куда-то в конец скачет, видимо, загрузка переменных.
|
|
|
|
Сообщений в этой теме
ierofant STM32 bootloader Jan 3 2012, 13:31 skripach Я бы делал вариант 2, т.к. в первом варианте во вн... Jan 3 2012, 16:12 Cosmojam Цитата(ierofant @ Jan 3 2012, 16:31) Проб... Jan 3 2012, 20:52 skripach Цитатаskripach, Ваш пример ничем не отличается от ... Jan 3 2012, 21:30 ierofant Спасибо, что откликнулись.
skripach
Пытаюсь в пр... Jan 3 2012, 21:33 Сергей Борщ Как у вас все сложно!
Какова структура "о... Jan 4 2012, 07:47 skripach ЦитатаТ.е. по предположению - код должен выполнить... Jan 4 2012, 00:49 ierofant Спасибо всем за помощь.
В целом получилось и пере... Jan 8 2012, 00:38 Almaz1988 Так же пишу бутлоадер, но для lpc11c24.
Столкнулся... Sep 19 2012, 09:41 _Артём_ Цитата(Almaz1988 @ Sep 19 2012, 12:41) Ст... Sep 19 2012, 10:09 Almaz1988 Спасибо Артем, ваш ответ очень помог)
По адресу 0... Sep 19 2012, 10:55 _Артём_ Цитата(Almaz1988 @ Sep 19 2012, 13:55) Не... Sep 19 2012, 11:56 Almaz1988 Исправил на reset handler.
По поводу ремапа, как ... Sep 19 2012, 12:36 Сергей Борщ QUOTE (Almaz1988 @ Sep 19 2012, 15:36) ... Sep 19 2012, 20:15 Almaz1988 Цитата(Сергей Борщ @ Sep 20 2012, 00:15) ... Sep 20 2012, 04:24 Сергей Борщ QUOTE (Almaz1988 @ Sep 20 2012, 07:24) Co... Sep 20 2012, 06:20 Almaz1988 Цитата(_Артём_ @ Sep 19 2012, 15:56) Если... Sep 20 2012, 07:18 Сергей Борщ QUOTE (Almaz1988 @ Sep 20 2012, 10:18) Ко... Sep 20 2012, 09:23 Almaz1988 2) а если размещать вектор прерываний не в RAM, а ... Sep 20 2012, 11:01 Сергей Борщ QUOTE (Almaz1988 @ Sep 20 2012, 14:01) 2)... Sep 20 2012, 11:21 Almaz1988 Т.е., когда я заливаю "Загрузчик" по адр... Sep 20 2012, 12:36 Сергей Борщ Примерно так. Процессор умеет читать вектора тольк... Sep 20 2012, 15:26 Almaz1988 А как такое решение проблемы:
Проект №1 - "За... Sep 21 2012, 06:37 Сергей Борщ QUOTE (Almaz1988 @ Sep 21 2012, 09:37) По... Sep 21 2012, 07:51 Alex19 Если Вы в загрузчике не используете прерывания - с... Sep 21 2012, 07:11 Almaz1988 Цитата(Сергей Борщ @ Sep 21 2012, 11:51) ... Sep 21 2012, 10:00 Сергей Борщ QUOTE (Almaz1988 @ Sep 21 2012, 13:00) Эт... Sep 21 2012, 10:12 Almaz1988 Цитата(Сергей Борщ @ Sep 21 2012, 14:12) ... Sep 21 2012, 12:30 Сергей Борщ QUOTE (Almaz1988 @ Sep 21 2012, 15:30) Ви... Sep 21 2012, 12:45 Almaz1988 Цитата(Сергей Борщ @ Sep 21 2012, 16:45) ... Sep 21 2012, 13:14 Сергей Борщ Возможность записи во флеш есть. Ведь как-то этот ... Sep 21 2012, 13:25 Almaz1988 А IAP-команды переводятся же в ассемблерный код пр... Sep 21 2012, 14:57 toweroff Цитата(Almaz1988 @ Sep 21 2012, 18:57) А ... Sep 21 2012, 16:10  _Артём_ Цитата(toweroff @ Sep 21 2012, 19:10) а в... Sep 22 2012, 12:13   toweroff Цитата(_Артём_ @ Sep 22 2012, 16:13) Ссыл... Sep 22 2012, 16:05    _Артём_ Цитата(toweroff @ Sep 22 2012, 19:05) Зде... Sep 22 2012, 17:00     AHTOXA Кхм...
Господа, а как обсуждение IAP от NXP относи... Sep 22 2012, 20:02      toweroff Цитата(AHTOXA @ Sep 23 2012, 00:02) Госпо... Sep 22 2012, 20:16 Almaz1988 #include "LPC11xx.h"
#include "rom_... Sep 24 2012, 08:44 AndreFF Здравствуйте!
Просьба откликнуться кто в те... Mar 2 2013, 07:01 Сергей Борщ QUOTE (AndreFF @ Mar 2 2013, 09:01) Это т... Mar 2 2013, 23:03 MK2 тоже интересовал этот вопрос, но решил следующим о... Mar 2 2013, 19:40 AndreFF Спасибо за ответы.
Пробовал следовать советам офиц... Mar 3 2013, 06:27 vovanxp Хочу сделать загрузку прошивки через веб, но непол... Dec 11 2014, 08:55 Kabdim Цитата(vovanxp @ Dec 11 2014, 11:55) В че... Dec 12 2014, 10:46  vovanxp Цитата(Kabdim @ Dec 12 2014, 14:46) Выгля... Dec 12 2014, 11:12   Kabdim Цитата(vovanxp @ Dec 12 2014, 14:12) А гд... Dec 12 2014, 13:19    vovanxp Цитата(Kabdim @ Dec 12 2014, 16:19) SCB-... Dec 12 2014, 14:56     Kabdim Цитата(vovanxp @ Dec 12 2014, 17:56) В мо... Dec 12 2014, 17:25 vovanxp Только что удалось прошить через веб, причина было... Dec 17 2014, 07:59        ViKo Цитата(A. Fig Lee @ Feb 20 2015, 17:06) А... Feb 20 2015, 14:08         A. Fig Lee Цитата(ViKo @ Feb 20 2015, 09:08) А им за... Feb 20 2015, 14:16          ViKo Цитата(A. Fig Lee @ Feb 20 2015, 17:16) Н... Feb 20 2015, 14:33           A. Fig Lee Цитата(ViKo @ Feb 20 2015, 09:33) Он уже ... Feb 20 2015, 14:36 Сергей Борщ Видимо затем, что программу еще надо во флешку зап... Feb 20 2015, 13:29 ViKo А в чем тогда вообще великий смысл "отображен... Feb 20 2015, 13:45 x893 Особенно когда люди даже прочитать не могут, а сра... Feb 20 2015, 17:06 ViKo Может ли Cortex-M3 выполнять программу из внешней ... Feb 21 2015, 01:22 x893 Да ему пофиг какой адрес - что указано в 8000004 и... Feb 21 2015, 11:08 ViKo Ой ли? Надо по шинам посмотреть в руководстве. Feb 21 2015, 11:38 x893 Без Ой-ли. Только hardfault можно получить, если н... Feb 21 2015, 11:52 ViKo Предыдущий оратор путается в показаниях. То у него... Feb 22 2015, 12:35 SSerge Цитата(ViKo @ Feb 22 2015, 19:35) Есть у ... Feb 23 2015, 19:34 ViKo Судя по рисунку, STM32F20X может выполнять програм... Feb 24 2015, 10:58 jcxz Цитата(ViKo @ Feb 24 2015, 16:58) Судя по... Mar 2 2015, 19:43 ViKo Что-то не выходит у меня запустить скомпилированну... Feb 25 2015, 13:01 SSerge Цитата(ViKo @ Feb 25 2015, 20:01) Но осно... Feb 25 2015, 13:41  ViKo Цитата(SSerge @ Feb 25 2015, 16:41) NVIC_... Feb 25 2015, 14:00   esaulenka Цитата(ViKo @ Feb 25 2015, 17:00) Дохожу ... Feb 25 2015, 15:14    ViKo Цитата(esaulenka @ Feb 25 2015, 18:14) Ка... Feb 25 2015, 15:45     Сергей Борщ Цитата(ViKo @ Feb 25 2015, 17:45) Да вот ... Feb 25 2015, 17:58   SSerge Цитата(ViKo @ Feb 25 2015, 21:00) Дохожу ... Feb 25 2015, 17:29    ViKo Цитата(SSerge @ Feb 25 2015, 20:29) Надо ... Feb 25 2015, 18:29 ViKo Из программы-загрузчика по стартовому адресу основ... Feb 26 2015, 13:33 ViKo Перенес инициализацию FSMC (заодно и всего остальн... Feb 27 2015, 15:58 ViKo Хочу спросить... Что-то не могу после прошивки нов... Mar 9 2015, 10:10 ViKo А в отладчике после 16 с перескакивает в основную ... Mar 9 2015, 14:10 ViKo Так и не могу разобраться, что же не дает загрузчи... Mar 10 2015, 13:27 Сергей Борщ Выходите через сброс (я выхожу через сброс по соба... Mar 10 2015, 14:33 ViKo Все, исправил. Кнопка от панели передается двумя б... Mar 13 2015, 13:47 ViKo Цитата(ViKo @ Mar 13 2015, 16:47) Теперь ... Mar 23 2015, 11:29 veteq Есть проблема со входом в бутлоадер STM32L051 (cor... Mar 19 2015, 13:24 ViKo Теперь подвис на том, как размер кода задать в сам... Mar 25 2015, 08:37 Сергей Борщ Цитата(ViKo @ Mar 25 2015, 10:37) upd. ... Mar 25 2015, 09:52  ViKo Цитата(Сергей Борщ @ Mar 25 2015, 12:52) ... Mar 25 2015, 10:00 ViKo Пробую разместить строки в startup.s, чтобы знать ... Mar 25 2015, 13:27 AHTOXA Напишите перед использованием объявление:
extern u... Mar 26 2015, 05:30  ViKo Цитата(AHTOXA @ Mar 26 2015, 08:30) Напиш... Mar 26 2015, 12:36   Сергей Борщ Цитата(ViKo @ Mar 26 2015, 14:36) А exter... Mar 26 2015, 13:09    ViKo Цитата(Сергей Борщ @ Mar 26 2015, 16:09) ... Mar 26 2015, 13:14     Сергей Борщ Цитата(ViKo @ Mar 26 2015, 15:14) Я, врод... Mar 26 2015, 14:11      ViKo Цитата(Сергей Борщ @ Mar 26 2015, 17:11) ... Mar 26 2015, 14:53
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|