|
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
|
|
|
|
|
 |
Ответов
|
Sep 21 2012, 10:00
|
Частый гость
 
Группа: Участник
Сообщений: 100
Регистрация: 19-09-12
Пользователь №: 73 602

|
Цитата(Сергей Борщ @ Sep 21 2012, 11:51)  Давайте думать дальше. Вы доработали рабочую программу и ее обработчики прерываний оказались по другим адресам. Вам снова надо брать обе прошивики, снова копировать строки HEX-файлов, программировать уже обновленный загрузчик. Тогда какой в нем смысл, если его надо править и заливать программатором перед каждым обновлением приложения? В чем проблема? Вам жалко 256 байт ОЗУ (а реально меньше, ибо не вся таблица используется)? Пытаюсь сделать с помощью Ремапа, не могу понять в чем дело. Решил идти от простого к сложному. 1)Самое простое в ручную из одного HEX-файла скопировать данные по адресам 0х09-0хС0 (по этим адресам располагается таблица векторов. Не трогаю лишь два первых вектора 0х00 - 0х08). Получилось "Рабочая программа" запустилась. 2) Перешел к более сложному - копирую файлы 0х00 - 0х08 (MSP и Reset handler) программно с помощью чего осуществляю прыжок в "Рабочую программу" и она запускается, если не использует прерываний: #include "LPC11xx.h" #include "core_cm0.h" #include "system_LPC11xx.h" __ASM void __jump_( ) { ldr r0, =0x1000 ldr r0, [r0] mov sp, r0 ldr r0, =0x1004 ldr r0, [r0] mov pc, r0 } nt main(void) { SystemInit(); LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); __jump_( ); while(1); } 3)Перехожу к более сложному - программно копирую всю таблицу прерываний - 0х00 - 0хС0. Текст программы: #include "LPC11xx.h" #include "core_cm0.h" #include "system_LPC11xx.h" __ASM void __jump_( ) { ldr r0, =0x1000 ldr r0, [r0] mov sp, r0 ldr r0, =0x1004 ldr r0, [r0] mov pc, r0 ldr r0, =0x1008 ldr r0, [r0] ldr r1, =0x0008 mov [r1], r0 ldr r0, =0x1008 ldr r0, [r0] ldr r1, =0x0008 mov [r1], r0 ...................... //здесь такие же наборы команд для других адресов ...................... ldr r0, =0x10BC ldr r0, [r0] ldr r1, =0x00BC mov [r1], r0 } int main(void) { SystemInit(); LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6); __jump_( ); while(1); } И тут сталкиваюсь с затруднением - компилятор на строке "mov [r1], r0" выдает ошибку: error: A1647E: Bad register name symbol, expected Integer register В чем дело? Эта команда же допускает копирование из РОН в память
|
|
|
|
Сообщений в этой теме
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 Сергей Борщ 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 А можно ли утоптать загрузчик в память OTP (512 ба... Feb 19 2015, 10:44 AHTOXA А как туда будет передаваться управление? Feb 20 2015, 05:46  ViKo Цитата(AHTOXA @ Feb 20 2015, 08:46) А как... Feb 20 2015, 07:53   AHTOXA Цитата(ViKo @ Feb 20 2015, 12:53) После с... Feb 20 2015, 09:17    ViKo Цитата(AHTOXA @ Feb 20 2015, 12:17) Я вот... Feb 20 2015, 10:36     A. Fig Lee Цитата(ViKo @ Feb 20 2015, 05:36) Я вот ч... Feb 20 2015, 12:20      ViKo Цитата(A. Fig Lee @ Feb 20 2015, 15:20) П... Feb 20 2015, 13:01       A. Fig Lee Цитата(ViKo @ Feb 20 2015, 08:01) Чему по... Feb 20 2015, 14:06        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 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|