|
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
|
|
|
|
|
 |
Ответов
|
Dec 11 2014, 08:55
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026

|
Хочу сделать загрузку прошивки через веб, но неполучается, не запускается основная программа. Делаю на основе проекта с STM32CubeF4, LwIP_IAP. Манеул к этому проекту http://www.st.com/st-web-ui/static/active/.../DM00103145.pdfСреда Keil uVision, мк STM32f4 ------------------------------------------ В бутлоадере выставил начальный адрес с которого будет стартовать основная программа #define USER_FLASH_FIRST_PAGE_ADDRESS 0x08020000 В основной программе изменил начальный адресс 0x08020000 В основной программе изменил смещение для таблици векторов #define VECT_TAB_OFFSET 0x20000 ------------------------------------------ После загрузки прошивок, доходит до Jump_To_Application(); и все, дальше тишина. Переменная JumpAddress = 0x080201A5 if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4); Jump_To_Application = (pFunction) JumpAddress; __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS); Jump_To_Application(); } Основная программа начинается с адреса 0x08020000 смотрел через STM32 ST-LINK Utility На скринах без смещения с со смещением, данные совпадаю, отличие только адресами. В чем может быть причина? Спасибо.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 12 2014, 11:12
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026

|
Цитата(Kabdim @ Dec 12 2014, 14:46)  Выглядит более менее, за исключением того что неясно как вы меняете таблицу прерываний с бутлоадера на вашу программу. А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000 Цитата(Kabdim @ Dec 12 2014, 14:46)  Вы блинк пробовали прошить? Я свою прошивку заливаю.
|
|
|
|
|
Dec 12 2014, 13:19
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(vovanxp @ Dec 12 2014, 14:12)  А где менять менять? Я с таблицей ничего не делал. Я думал что таблица прерываний по умолчанию в основной программе будет после адреса 0x08020000
Я свою прошивку заливаю. SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам. Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний. Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс. Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1.
|
|
|
|
|
Dec 12 2014, 14:56
|
Участник

Группа: Участник
Сообщений: 20
Регистрация: 28-10-11
Пользователь №: 68 026

|
Цитата(Kabdim @ Dec 12 2014, 16:19)  SCB->VTOR - на этом форуме очень много тем посвященных бутлоадерам. Залейте простейшую мигалку что бы понять правильно ли вы слинковались и заливаете. Заодно если она заработает, значит дело действительно в таблице прерываний. Еще стоит отключать прерывания во время смены таблицы и перехода т.к. они могут испортить процесс.
Вдогонку, если у вас thumb, то младший бит адреса по которому переходите должен быть 1. В моей программе(не в загрузчике) я поменял дефайн //#define VECT_TAB_OFFSET 0x00 #define VECT_TAB_OFFSET 0x20000 В SystemInit() есть такой кусок кода #ifdef VECT_TAB_SRAM SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ #else SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ #endif
Сообщение отредактировал vovanxp - Dec 12 2014, 14:56
|
|
|
|
|
Dec 12 2014, 17:25
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(vovanxp @ Dec 12 2014, 17:56)  В моей программе(не в загрузчике) я поменял дефайн Видимо нужно отладится в асемблере. К примеру мой код для кортекса м0 Код void JumpToMainProgram() { __disable_irq(); memcpy(MEMORY_OFFSET, MAIN_PROG_FLASH_OFFSET, INT_MEM_TO_MAP_SIZE); __set_MSP(*MAIN_PROG_FLASH_OFFSET); LPC_SYSCON->SYSMEMREMAP = 1; __enable_irq(); ISRPtr application_reset_handler = *((ISRPtr*) (MAIN_PROG_FLASH_OFFSET + 1)); goto *application_reset_handler;
} MAIN_PROG_FLASH_OFFSET - указатель на u32
Сообщение отредактировал Kabdim - Dec 12 2014, 17:23
|
|
|
|
Сообщений в этой теме
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 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
|
|
|