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

 
 
> 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
 
Start new topic
Ответов
ierofant
сообщение Jan 3 2012, 21:33
Сообщение #2


Участник
*

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



Спасибо, что откликнулись.

skripach

Пытаюсь в простейшей программке протестировать переход выполнения кода по определенному адресу. Пробывал с вашим примером, опять не получилось.

Вот мой код(для иара, поэтому немного отличается от вашего):
CODE
#include "stm32f10x.h"
#include "core_cm3.h"
#define ApplicationAddress 0x08000081


void JumpToApplication(uint32_t addr)
{
typedef void (*pFunction)(void);
pFunction Jump_To_Application;
uint32_t JumpAddress;
//if(addr>=0x08005000)
//{
JumpAddress = *(uint32_t*) (addr + 4);
Jump_To_Application = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(uint32_t*) addr);
//__MSR_MSP(*(vu32*) addr);
Jump_To_Application();
//}
}




void init_mk()
{
RCC->APB2ENR |= (RCC_APB2ENR_IOPAEN|RCC_APB2ENR_IOPCEN);

GPIOC->CRH |= (GPIO_CRH_MODE9 | GPIO_CRH_MODE8); //C.8, C.9 OUTPUT
GPIOC->CRH &= ~(GPIO_CRH_CNF9 | GPIO_CRH_CNF8);
GPIOA->CRL&=~GPIO_CRL_MODE0;//A.0 INPUT
}

void test()
{
GPIOC->BSRR = GPIO_BSRR_BS9;
}


int main()
{
init_mk();


JumpToApplication(ApplicationAddress);


GPIOC->BSRR = GPIO_BSRR_BS8;

test();

while(1)
{
}
}



__MSR_MSP - не было, заменил на функцию подобного содержания из своего хидера. Вот такая функция

CODE
void __set_MSP(uint32_t topOfMainStack)
{
  __ASM("msr msp, r0");
  __ASM("bx lr");
}


Проверка была для конкретно вашего примера, насколько я понял, поэтому она закоменчена.

#define ApplicationAddress 0x08000081 - это начальный адрес функции test(). (беру его из map-а)

Т.е. по предположению - код должен выполниться в обход строки : GPIOC->BSRR = GPIO_BSRR_BS8; Верно?

Отладчик после выполнения Jump_To_Application(); матерится на то, что указатель стека находится вне его пределах, причем откуда такое значение - черт знает: The stack pointer for stack 'CSTACK' (currently 0x00F44F28) is outside the stack range (0x20000000 to 0x20000400)

Cosmojam, я пока пытаюсь осуществить просто переход выполнения программы по определенному адресу, таблицу векторов даже не трогаю.sm.gif Выше отписался, что у меня не так.


Кстати, я правильно понимаю алгоритм работы бутлоадера?
После того, как он закончил все свои необходимые действия, нужно:
1. перенести таблицу векторов по адресу в памяти, где начинается основная программа.(т.е. если у меня основная программа записана, начиная с 2й страницы флеша (1 страница - 1кб), то нужно будет сделать так: NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x08000800)wink.gif
2. Перейти к выполнению кода на тот же адрес (0x08000800)

Верно ли я все понял?

P.S. Кстати, skripach, спасибо за приведенный код.

Сообщение отредактировал ierofant - Jan 3 2012, 21:38
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 4 2012, 07:47
Сообщение #3


Гуру
******

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



Как у вас все сложно!
Какова структура "обычной" программы под STM32?
В начале идет блок векторов, он состоит из:
-начальное значение стека
-адрес обработчика исключения Reset
-адреса остальных обработчиков ядра
-адреса обработчиков периферии
Далее за ним идет код.

Ну так и работать надо с этой структурой, а не с какими-то магическими числами и приведением указателей:
CODE
struct application
{
    struct vectors
    {
        typedef void( *handler )( void );
        uint32_t    MSP_init;
        handler     Reset_vector;
        handler     Core_handler[14];
        static const uint_fast8_t MCU_VECTORS =
#if defined(STM32F10X_LD_VL) || defined(STM32F10X_MD_VL)
        56
#elif   defined(STM32F10X_HD_VL)
        61
#elif defined(STM32F10X_CL)
        68
#elif defined(STM32F10X_LD) || defined(STM32F10X_MD) ||defined(STM32F10X_HD) ||defined(STM32F10X_XL)
        60
#endif
     ;
        handler     MCU_handler[MCU_VECTORS];
    }       Vectors;
    uint32_t Size;                          // application size, 4-byte words
};

extern const application Application;

.......
                if (!CRC->DR)                        // Application Section OK
            {
                // set vectors table to application vectors
                SCB->VTOR = (uintptr_t)&Application.Vectors;
                asm volatile
                (
                    "   MSR   MSP, %0\n" // store App stack init value to MSP
                    :
                    : "r" (Application.Vectors.MSP_init)
                );
                Application.Vectors.Reset_vector();
            }

От линкера требуется лишь предоставить символ Application с адресом начала той области, в которую загружается приложение. Не знаю как в последнем ИАРе, в старом это можно было сделать, вписав в линкерный скрипт или командную строку линкера -DApplication=0x08001000

У меня при сборке приложения линкер сразу за таблицей векторов вписывает размер образа, чтобы загрузчик мог просчитать контрольную сумму загруженного приложения (и только его, не учитывая свободную память).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - 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   А можно ли утоптать загрузчик в память 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 страниц V   1 2 >


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th August 2025 - 00:15
Рейтинг@Mail.ru


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