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

 
 
> 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

Сообщений в этой теме
- 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
|- - KnightIgor   Цитата(smk @ Nov 3 2014, 12:42) Если я пр...   Nov 3 2014, 13:53
- - 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 Текстовая версия Сейчас: 7th September 2025 - 00:11
Рейтинг@Mail.ru


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