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

|
Цитата(_Артём_ @ Sep 19 2012, 15:56)  Если буту прерывания не нужно, то можете посмотреть пример NXP (secondary bootloader) В этом примере предлагают использовать ассемблерные вставки, добавляю их в main() Бутлоадера: __asm volatile("ldr r0, =0x103C"); __asm volatile("ldr r0, [r0]"); __asm volatile("mov pc, r0"); Компиллирую проект, выдает ошибку: aplication\main.c(38): error: #1113: Inline assembler not permitted when generating Thumb code Добавляю в настройках проекта --arm. Появляется ошибка: main.c: Error: C3006E: specified processor or architecture does not support ARM instructions Цитата(Сергей Борщ @ Sep 20 2012, 10:20)  Тогда нужно: 1) Располагать (линковать) загрузчик с адреса 0x08000000, чтобы он мог продолжать работать после ремапа. 2) Располагать (линковать) приложение с адреса 0x0800хххх, чтобы онo могло работать после ремапа. 2) Копировать вектора приложения в начало ОЗУ. У приложения должно быть "откушено" начало ОЗУ под это дело в скрипте линкера. 3) Из векторов приложения брать адрес начала стека и прописывать его в MSP 4) Делать ремап (SYSCFG, биты MEM_MODE) 5) передавать управление на адрес, взятый из вектора reset_handler 1,2) Flash-память микроконтроллера lpc11c24 - 0x0000 0000 - 0x0000 8000 RAM-память - 0х1000 0000 - 0х1000 2000 Адреса 0x08000000 у меня нет. Если загрузчик распологаю не по адресу 0х0000 0000, то у меня МК не стартует. 2) копировать с помощью ассемблерных вставок из NXP примера "secondary bootloader"? Постом ниже я написал о затруднениях, с которыми столкнулся при их использовании. 3,4) также выподняется ассемблерными вставками?
|
|
|
|
|
Sep 20 2012, 09:23
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Almaz1988 @ Sep 20 2012, 10:18)  Компиллирую проект, выдает ошибку: С кейлом не работаю, не подскажу. Пусть другие участники помогутю QUOTE (Almaz1988 @ Sep 20 2012, 10:18)  1,2) Flash-память микроконтроллера lpc11c24 А название ветки - STM32 bootloader. Невнимательно читал ваше первое сообщение и даю советы по STM32F0xx. Для LPC11 ремапятся первые 512 байт. Соответственно смотрите по ссылке от _Артем_а - там я приводил кусок запуска приложения для LPC11 QUOTE (Almaz1988 @ Sep 20 2012, 10:18)  2) копировать с помощью ассемблерных вставок из NXP примера "secondary bootloader"? Постом ниже я написал о затруднениях, с которыми столкнулся при их использовании.
3,4) также выподняется ассемблерными вставками? 2 - можно и ассемблером, но зачем? Можно сделать и на С/С++ при помощи цикла и указателей либо библиотечной функцией memcpy() 3) да, ассемблерная вставка либо функция из CMSIS, которая тоже на ассемблерной вставке строится. 4) Обычная сишная запись в регистр. Для LPC это будет регистр SYSMEMREMAP
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
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 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 А можно ли утоптать загрузчик в память 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
|
|
|