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

 
 
> STM32 сделать bootloader в Keil, помогите разобраться
smk
сообщение Nov 2 2014, 15:22
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Суть вопроса такова. Понадобился бутлоадер. Ранее таким не занимался. Начитался форума и интернета по самое нехочу. Теперь в голове просто каша. Хочу все поставить на места и упорядочить. Изначально давайте сразу ориентироваться на STM32 чтоб уже применительно к ним. Задача следующая: устройство подключено по ethernet и другие интерфейсы недоступны. Нужно перепрошивать по имеющемуся. Размер кода программы примерно 30% от имеющейся флеши на борту. Представляет интерес получать файл прошивки, записывать его в свободную часть флеши, проверять и если все ОК то переписывать на место для собственно программы. Бутлоадер думал располагать в самом конце. Собственно вопрос как бы это все устроить? Наверно было бы удобно сделать бутлоадер отдельным проектом и при изменении размера флеши контроллера следить за его расположением. Можно ли сделать так чтоб потом шить программу (как новый проект) не стирая бутлоадер и чтоб он всеравно продолжал оставаться работоспособным?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Nov 2 2014, 20:28
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(smk @ Nov 2 2014, 17:22) *
Суть вопроса такова. Понадобился бутлоадер.


Многие ответили, но обще. Я приведу примеры и "трюки" из собственного загрузчика, тем более, что предпосылки STM32 и KEIL совпадают.
1. Загрузчик нужно располагать с начала флэша, тогда управление при старте передается сразу к нему.
2. С точки зрения создания и отладки загрузчик представляет собой обычную программу.
3. Пользовательская программа являет собой также обычную программу, которая, однако, располагается с некоего фиксированного адреса после загрузчика. С какого именно, станет ясно, когда размер загрузчика определится более-менее. Этот адрес следует знать затем и загрузчику, чтобы упростить ему задачу поиска приложения в памяти, хотя можно применить и другие методы поиска.
4. Для основной программы необходимо:
4.1. соответствующим образом настроить проект KEIL и, как это сделал я, создать свой файл скаттера для компоновщика, например, когда первые 16К для загрузчика зарезервированы:
CODE

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;
; FlashSize = 0x00040000 (256K):
;
; Boot Loader 16K
;
;LR_IROM1 0x08000000 0x4000 {
; ER_IROM1 0x08000000 0x4000 {
; *.o (RESET, +First)
; }
;}
;
; Main Code from 16K
;
LR_IROM2 (0x08000000 + 0x4000) (0x40000-0x4000) { ; load region size_region
ER_IROM2 (0x08000000 + 0x4000) (0x40000-0x4000) { ; load address = execution address
*.o (USER_VECTORS, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x0000C000 { ; RW data
.ANY (+RW +ZI)
}
}

4.2. start-up код (файл *.s) следут модифицировать так, чтобы он сразу переназначал таблицу векторов пользовательской программы:
CODE

; Vector Table Mapped to Address 0 at Reset
; AREA RESET, DATA, READONLY, ALIGN=9 ; 2^9=512
;
;__Boot DCD __initial_sp ; Top of Stack
; DCD Reset_Handler ; Reset Handler

; Future user program vector table at 0x4000

AREA USER_VECTORS, DATA, READONLY, ALIGN=9 ; 2^9=512
EXPORT __Vectors

__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
...

AREA |.text|, CODE, READONLY

VTOR EQU (0xE000E000 + 0x0D08)

; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
MOV32 R1, #VTOR ; Load VTOR register address
LDR R0, =__Vectors ; Load user program vector table address
STR R0, [R1] ; Store to VTOR to relocate the vector table
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP

4.3. Обратите внимание на закомментированные строки в начале скаттера (LR_IROM1) и start-up файла (AREA RESET). Они определяют вектор по адресу 0. Эти строки можно раскомментировать, чтобы отлаживать основную программу, пока загрузчик еще не готов или сам в память не загружен.

5. Для определения версии основной программы я использовал дату и время ее компиляции.
5.1. В любом месте кода можно разместить строки:
CODE
//------------------------------------------------------------------------------
//
// Compilation time stamp
//
const char _cd[] = __DATE__;
const char _ct[] = __TIME__;

Эти строки представляют собой генерируемые компилятором дату и время. Встроенные макросы __DATE__ и __TIME__ описаны в помощи KEIL.

5.2. В start-up файле можно поместить некоторый дескриптор со ссылками на эти строки:
CODE

IMPORT |Load$$LR$$LR_IROM2$$Length|

IMPORT _cd
IMPORT _ct
DCB "DSC="
DCD __Vectors ; load address
DCD |Load$$LR$$LR_IROM2$$Length|; Image length (.bin file length)
DCD _cd ; -> date stamp as Jan 01 2012
DCD _ct ; -> time as HH:MM:SS

Фактически, это есть некая структура, которую я располагаю между таблицей векторов и Reset_Handler. Эта структура содержит уникальную строку "DSC=", затем идет указатель на таблицу векторов (фактически те самые 0x4000), затем длина образа программы, после чего указатели на строки даты и времени компиляции. Для загрузчика эту структуру легко найти (уж точно в первых 512 байтах кода пользовательской программы) и почерпнуть оттуда версию и длину приложения.

6. Загрузчик передает управление приложению, загрузив SP из первого слова таблицы векторов, и переходом по адресу из второго слова. Следует помнить, что нужно предварительно остановить периферию, которую использовал загрузчик, и SysTick.

7. Мой загрузчик использует SD карту как источник обновления. При старте он ищет файл с образом приложения, сравнивает версии и, если необходимо, - обновляет приложение.

Сообщение отредактировал KnightIgor - Nov 2 2014, 20:36
Go to the top of the page
 
+Quote Post
smk
сообщение Nov 3 2014, 10:42
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Цитата(KnightIgor @ Nov 2 2014, 22:28) *
Многие ответили, но обще. Я приведу примеры и "трюки" из собственного загрузчика, тем более, что предпосылки STM32 и KEIL совпадают.

Если я правильно понял, то загрузчик пишется как обычно, а программа с примнением указанных примеров?


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 3 2014, 13:53
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(smk @ Nov 3 2014, 12:42) *
Если я правильно понял, то загрузчик пишется как обычно, а программа с примнением указанных примеров?

Загрузчик пишется с применением настроек по-умолчанию. Просто как свежий проект под KEIL. Основная программа по сути тоже, просто ее надо разместить в памяти не с самого начала, а после загрузчика. У меня загрузчик занимает 16К. Следовательно, основную программу размещаем как бы с адреса 0x4000 (ну, фактически с 0x08000000 + 0x4000). Для этого применяется модифицированный скаттер файл. Можно напрямую взять тот, что я привел. В проекте KEIL в закладке Linker нужно будет лишь явно указать имя файла модифицированного скаттера. Например, myscatter.sct.
Следует понимать, что в процессе отладки основной программы, если не предпринять действий по записи векторной таблицы по адресу начала флэша (то есть, 0x08000000), управление основной программе не попадет. Если загрузчик не готов или еще не загружен, нужно временно раскомментировать строки секции LR_IROM1, а также что я там указал в старт-ап файле. Тогда после сборки проекта основной программы ее кусочек "заменит" загрузчик, и можно будет работать. Потом, собирая образ программы для загрузчика, нужно будет снова закомментировать, что надо.

Цитата(smk @ Nov 3 2014, 15:01) *
я все правильно понял?

Мне кажется, Вы тут чего-то не дописали. Если применить идею модификации скаттера к Вашему проекту, оставив, скажем, 32K на загрузчик, то будет так:

CODE
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
;
; Boot loader 32K (0x8000)
;
; Uncomment this load region for debugging the main application as long as no boot loader present
; Also remove comments in start-up.s file for RESET area in this case.
;
;LR_IROM1 0x08000000 0x8000 { ; load region size_region
; ER_IROM1 0x08000000 0x8000 { ; load address = execution address
; *.o (RESET, +First)
; }
;}
;
; Main Application begins at 32K.
;
LR_IROM2 0x08000000 0x00100000-0x8000 { ; load region size_region, smaller by 32K
ER_IROM2 0x08000000 0x00100000-0x8000 { ; load address = execution address, , smaller by 32K
*.o (USER_VECTORS, +First) ; <- changed default name RESET to USER_VECTORS, make the same in start-up.s file!
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}


Сообщение отредактировал IgorKossak - Nov 3 2014, 14:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- smk   STM32 сделать bootloader в Keil   Nov 2 2014, 15:22
- - Golikov A.   у нас сделано так бутлоадер в начале флеши, прям т...   Nov 2 2014, 15:27
- - smk   Можно и так, но не понятны два вопроса. 1) как про...   Nov 2 2014, 16:00
- - scifi   Насколько я помню, неоднократно перетирали тему пр...   Nov 2 2014, 16:05
|- - smk   Цитата(scifi @ Nov 2 2014, 18:05) Насколь...   Nov 2 2014, 16:10
|- - scifi   Цитата(smk @ Nov 2 2014, 19:10) Как перед...   Nov 2 2014, 16:27
- - Golikov A.   у вас должно быть 2 пути сброс -> загрузчик -...   Nov 2 2014, 16:40
- - kolobok0   Цитата(smk @ Nov 2 2014, 18:22) ...Понадо...   Nov 2 2014, 17:21
- - smk   Сложновато выходит. Да и нужды нет разбивать на мо...   Nov 2 2014, 17:29
|- - scifi   Цитата(smk @ Nov 2 2014, 20:29) В отношен...   Nov 2 2014, 17:49
- - inventor   мы сделали такой прошиватель (на блекфине, но в пр...   Nov 2 2014, 17:34
|- - AHTOXA   Цитата(inventor @ Nov 2 2014, 22:34) на S...   Nov 2 2014, 17:59
|- - inventor   Цитата(AHTOXA @ Nov 2 2014, 20:59) А поче...   Nov 2 2014, 18:05
- - Golikov A.   ЦитатаЗагрузчик получается по сути добавляется в п...   Nov 2 2014, 18:15
|- - scifi   Цитата(Golikov A. @ Nov 2 2014, 21:15) За...   Nov 2 2014, 18:33
- - menzoda   Это уже обсуждали вот здесь. Можно хотя бы для при...   Nov 2 2014, 20:06
- - smk   Код; *********************************************...   Nov 3 2014, 11:45
- - smk   CODE; ********************************************...   Nov 3 2014, 13:01
- - Golikov A.   а я версию программы по репозиторию гит получаю пр...   Nov 3 2014, 13:07
- - smk   Да, так и есть если применительно к моему. Значит ...   Nov 3 2014, 14:36
- - smk   КодAREA RESET, DATA, READONLY, ALIGN=9 ; 2^9=5...   Nov 4 2014, 11:49
|- - scifi   Цитата(smk @ Nov 4 2014, 14:49) вот эта с...   Nov 4 2014, 12:46
|- - KnightIgor   Цитата(smk @ Nov 4 2014, 13:49) КодAREA ...   Nov 4 2014, 14:28
- - smk   Кодerror: L6236E: No section matches selec...   Nov 5 2014, 11:50


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

 


RSS Текстовая версия Сейчас: 21st August 2025 - 01:24
Рейтинг@Mail.ru


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