Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32. Собственный бутлоадер
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Sidoroff
Работаю в Keil, микроконтроллер STM32F407ZGT.
Хочу написать собственный бутлоадер. Как работает флешка и нужная мне связь, разобрался.
Но столкнулся с одной проблемой: не могу найти, как разместить код, написанный на С
в заранее известных областях встроенной флешки и это проконтролировать,
чтобы бутлоадер не пытался перезаписать сам себя. В свое время писал на AVR на
ассемблере, там такой проблемы не было, можно было точно указать, где размещать код,
и загрузчик просто лежал в неизменяемой части программы.

Можно ли решить проблему именно так?

Или есть более простое решение?
MBR
Для си тоже есть возможность размещать функции в определенных секциях. Синтаксис зависит от компилятора.
haker_fox
QUOTE (Sidoroff @ Nov 27 2012, 17:55) *
Можно ли решить проблему именно так?

Или есть более простое решение?

Именно так проблема и решается rolleyes.gif
Вам прямой путь в справку Кейла по линкеру (Linker). Готовите код загрузчика - размещаете его в соответствующей секции, готовите код приложения - компилируете его для работу в своей секции (адресном пространстве). Справка у Кейла очень даже не плохая. Примеры загрузчиков - имеются. В инете под Кейл найти, полагаю, не составит труда.
Удачи!!! rolleyes.gif
scifi
Цитата(Sidoroff @ Nov 27 2012, 12:55) *
Но столкнулся с одной проблемой: не могу найти, как разместить код, написанный на С в заранее известных областях встроенной флешки и это проконтролировать, чтобы бутлоадер не пытался перезаписать сам себя.

Ничего не понимаю. При каком сценарии загрузчик может переписать сам себя?
Могу предположить, что у вас загрузчик и основная программа линкуются вместе. Если так, то это ужасно. Они должны быть разными проектами.
vlad_new
Полностью согласен с scifi. Нано 2 разных проекта и тогда не надо по доке линка лазить. Просто в кейле указать по какому адресу грузить. Далее в ассемблерном файле указать нужный адрес перехода. Не забыть про таблицу векторов, она то же может переключаться. По крайне мере у меня все так и работает и ни с какими секциями я не заморачивался.
haker_fox
QUOTE (vlad_new @ Nov 27 2012, 21:49) *
тогда не надо по доке линка лазить

Ну в доку-то все равно придется заглянуть, хотя бы чтобы понять, как разместить проект по необходимым адресам.
x893
Можешь скачать как пример HID Bootloader. Часть кода (user) размещено с 0х8003000. Все в обном проекте. Файл bin получается общий - но его легко разделить на два.
http://x89300.codeplex.com/SourceControl/BrowseLatest
CMSIS-DAP\Firmware\STM32
MK2
можно проще решить с помощью линкера: 2 проекта - два разных флеша
Sidoroff
Всем спасибо за советы!
Разобрался с размещением в линкере Keil и сделал так:
Через встроенный бутлоадер по UART на 115200 быстро заливаю маленькую программку для RAM, 4 кбайт
(линкуется с адреса 0x20000000), стартую ее, связываюсь с ней на большой скорости по тому
же UART (на 6 мбит) и уже на большой скорости записываю любую "пользовательскую" программу
для FLASH. Вся операция вместе со стиранием занимает менее 15 секунд,
Это уже близко к пределу по документации, в отличие 2-3 минутной прошивки через ULINK-2.

Другой МК (ATtiny13) мониторит UART RX и по специальной сигнатуре формирует RESET для STM32
в режиме флешки или встроенного бутлоадера.
Tiny нужен и для других целей, поэтому все равно будет.
Кстати у STM32 прога из RAM работает медленнее, чем из флешки, удивительно...
vlad_new
Цитата(Sidoroff @ Dec 13 2012, 15:44) *
Кстати у STM32 прога из RAM работает медленнее, чем из флешки, удивительно...

Физические шыны команд и данных разные. Приходится перебрасывать код с одной шыны на другую. Соответственно требуется лишний такт. :-)

scifi
Цитата(vlad_new @ Dec 13 2012, 16:24) *
Физические шыны команд и данных разные. Приходится перебрасывать код с одной шыны на другую. Соответственно требуется лишний такт. :-)

Жуткая ересь. Читаем мануал:
Цитата
The CPU can access the system SRAM through the System Bus or through the I-Code/D-Code buses when boot from SRAM is selected or when physical remap is selected (Section 7.2.1: SYSCFG memory remap register (SYSCFG_MEMRMP) in the SYSCFG controller). To get the max performance on SRAM execution, physical remap should be selected (boot or software selection).

Если хотим быстро исполнять код из SRAM, то делаем remap. Иначе инструкции в проц пойдут через S-bus (2 такта на инструкцию), а не через I-bus (1 такт на слово).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.