реклама на сайте
подробности

 
 
> STM32 bootloader, написание собственного бута
ierofant
сообщение Jan 3 2012, 13:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
 
Go to the top of the page
 
+Quote Post
8 страниц V  « < 3 4 5 6 7 > »   
Start new topic
Ответов (60 - 74)
ViKo
сообщение Feb 20 2015, 14:08
Сообщение #61


Универсальный солдатик
******

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



Цитата(A. Fig Lee @ Feb 20 2015, 17:06) *
А как программа/компилятор поймет это РАМ или флаш, если обращение будет к 0х00000100 ?

А им зачем? Сказано, в 100, значит, в 100. Это пусть процессор мучается, он же знает, как его запустили.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 20 2015, 14:16
Сообщение #62


Знающий
****

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



Цитата(ViKo @ Feb 20 2015, 09:08) *
А им зачем? Сказано, в 100, значит, в 100. Это пусть процессор мучается, он же знает, как его запустили.


Ну а процессор что делать будет?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 20 2015, 14:33
Сообщение #63


Универсальный солдатик
******

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



Цитата(A. Fig Lee @ Feb 20 2015, 17:16) *
Ну а процессор что делать будет?

Он уже включен железно так, как задано. Может, вам мануал почитать? rolleyes.gif

Мысль, что по нулевым адресам ничего нет, мне нравится больше.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Feb 20 2015, 14:36
Сообщение #64


Знающий
****

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



Цитата(ViKo @ Feb 20 2015, 09:33) *
Он уже включен железно так, как задано. Может, вам мануал почитать? rolleyes.gif

Да, не надо нашим людям помогать. Тебя же потом и по кумполу.
Зря влез.
До свидания.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 20 2015, 17:06
Сообщение #65


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Особенно когда люди даже прочитать не могут, а сразу строчат в форум в надежде, что им разжуют всё (однокашники).
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 21 2015, 01:22
Сообщение #66


Универсальный солдатик
******

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



Может ли Cortex-M3 выполнять программу из внешней памяти?
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 21 2015, 11:08
Сообщение #67


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Да ему пофиг какой адрес - что указано в 8000004 или 20000004 (от BOOT0/1 зависит) туда и перейдет.

Сообщение отредактировал x893 - Feb 21 2015, 11:09
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 21 2015, 11:38
Сообщение #68


Универсальный солдатик
******

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



Ой ли? Надо по шинам посмотреть в руководстве.
Go to the top of the page
 
+Quote Post
x893
сообщение Feb 21 2015, 11:52
Сообщение #69


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Без Ой-ли. Только hardfault можно получить, если не туда куда можно.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 22 2015, 12:35
Сообщение #70


Универсальный солдатик
******

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



Предыдущий оратор путается в показаниях. То у него "без ой-ли", то HardFault.
Есть у кого-нибудь подтверженное практикой мнение, или и так всем ясно (что нельзя)?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 23 2015, 19:34
Сообщение #71


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ViKo @ Feb 22 2015, 19:35) *
Есть у кого-нибудь подтверженное практикой мнение, или и так всем ясно (что нельзя)?

Cortex™-M3 Technical Reference Manual от ARM™
утверждает что исполнение кода запрещено только из старших 1/2 Гигабайта адресного пространства (от 0xE0000000 и до упора).
Так что при желании можно поисполнять даже содержимое регистров периферийных устройств.
Т.е. архитектура ARM не запрещает, но конкретно у STM32F1xx не получится, выборка кода запрещена для адресов 0x40000000- 0x5FFFFFFF и от 0xA0000000 до конца памяти.

Под внешнюю память отведен диапазон адресов 0x60000000 - 0x9FFFFFFF, если контроллер внешней памяти настроить соответствующим образом, то можно и из внешней памяти код исполнять.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 24 2015, 10:58
Сообщение #72


Универсальный солдатик
******

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



Судя по рисунку, STM32F20X может выполнять программу из внешней памяти. А также и из внутренней OTP Flash, наверное.

А еще под картинкой написано:
S2: S-bus
This bus connects the system bus of the Cortex®-M3 core to a BusMatrix. This bus is used
to access data located in a peripheral or in SRAM. Instructions may also be fetch on this bus
(less efficient than ICode)
. The targets of this bus are the 112 KB & 16 KB internal SRAMs,
the AHB1 peripherals including the APB peripherals, the AHB2 peripherals and the external
memories through the FSMC.

То есть, можно команды выбирать откуда хочешь!? rolleyes.gif
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 25 2015, 13:01
Сообщение #73


Универсальный солдатик
******

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



Что-то не выходит у меня запустить скомпилированную со сдвигом программу.
Сделал загрузчик, пока только переход на основную программу. Занял нулевой сектор.
В основном проекте задал в Кейле в свойствах проекта начало ПЗУ 0x8004000, размер 0x3C000 (отобрал нулевой сектор для загрузчика), соответственно задал и диапазон для Flash Download. Скомпилировал, зашил. Вижу в ST-Link Utility свое зашитое. Могу и в отладчике в проекте загрузчика посмотреть память. Вроде, все как надо. Но основной проект не работает. Предполагаю, в загрузчике дело. Что-то не так. Вот фрагмент, переход.
Код
/* Если есть SP для приложения */
  if (((*(__IO uint32_t *)APPL_ADDR) & 0x2FFE0000) == 0x20000000) {
/* Адрес таблицы */
    SCB->VTOR = 0x08004000;
    // NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);
/* Указатель на приложение */
    pFunc_t JumpAppl = (pFunc_t)(*(__IO uint32_t *)(APPL_ADDR + 4));
    __set_MSP(*(__IO uint32_t *)APPL_ADDR);
    JumpAppl();
  }
  while (true);
}

Go to the top of the page
 
+Quote Post
SSerge
сообщение Feb 25 2015, 13:41
Сообщение #74


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ViKo @ Feb 25 2015, 20:01) *
Но основной проект не работает. Предполагаю, в загрузчике дело. Что-то не так.

NVIC_SetVectorTable() в загрузчике не особо нужен.
Это надо в самой запущенной программе сделать, потому что по умолчанию в SystemInit() регистр SCB->VTOR устанавливается на начало флеша.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 25 2015, 14:00
Сообщение #75


Универсальный солдатик
******

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



Цитата(SSerge @ Feb 25 2015, 16:41) *
NVIC_SetVectorTable() в загрузчике не особо нужен.
Это надо в самой запущенной программе сделать, потому что по умолчанию в SystemInit() регистр SCB->VTOR устанавливается на начало флеша.

Это я из примеров выше в теме (или подобных) вытянул. Не использую, такой функции в CMSIS и нет. А SystemInit у меня своя, и ничего с VTOR не делает.
Плохо, в отладчике оба проекта не видны. Дохожу в загрузчике до JumpAppl() и улетаю незнамо куда, в 0xBFFFXXXX.
Go to the top of the page
 
+Quote Post

8 страниц V  « < 3 4 5 6 7 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01485 секунд с 7
ELECTRONIX ©2004-2016