Перейти к содержанию
    

stm32 embedded SRAM boot mode

На моем учебном борде (stm32f103c8) я умею загружать программу через SWD или через UART.

Хочу освоить загрузку из памяти, но не могу найти информацию ни на русском, ни на английском.

 

Про bootloader (который с boot0=1 boot1=0) много говорят, а про SRAM (который boot0 = boot1 =1) только упоминают, что есть такой. И все.

 

Работаю с Keilом.

Я догадываюсь, что на закладке target в свойствах проекта надо начальный адрес с 0x08000000 на 0x20000000 поменять, и соответственно начало РАМ сдвинуть с 0x20000000 на 0x20002800, но этого не достаточно.

Еще в настройках дебагера по умолчанию разрешалось использовать РАМ начиная с 20000000. Я это изменил на 20002800.

 

Когда я пытаюсь забежать программу - получаю сообщение "Flash Download Filed". Логично, мы же должны грузить в РАМ, а не во флэш. Но где и как сказать - не догоняю.

 

Кто-нибудь решал такую проблему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хочу освоить загрузку из памяти, но не могу найти информацию ни на русском, ни на английском.

 

Когда я пытаюсь забежать программу - получаю сообщение "Flash Download Filed". Логично, мы же должны грузить в РАМ, а не во флэш. Но где и как сказать - не догоняю.

 

Кто-нибудь решал такую проблему?

 

К чему стартовать из памяти, если ее содержимое - нули или не определено?

 

Вот правильная последовательность:

 

- пишется основная программа и компилируется так, чтобы работала из ОЗУ.

- в стартапе (тот модуль, что на АСМе пишется) пишем маленькую процедурку, которая переписывает код из флеши в ОЗУ и затем передает ему управление. Возможно, включает Ремап.

 

А далее действуем так, как БУДТО имеем дело с программой для флеши. То есть программатором она должна записаться во флеш, оттуда вызваться, переписать себя в ОЗУ и передать управление туда. Теперь при рестарте и выборе ОЗУ, она сразу стартанет из ОЗУ. Зачем вам такое надо? В старые времена этим пользовались на АРМах с медленной внешней флеш-памятью, при холодном старте копируя всю программу в быстрое внутреннее ОЗУ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот правильная последовательность:

 

- пишется основная программа и компилируется так, чтобы работала из ОЗУ.

- в стартапе (тот модуль, что на АСМе пишется) пишем маленькую процедурку, которая переписывает код из флеши в ОЗУ и затем передает ему управление. Возможно, включает Ремап.

 

А далее действуем так, как БУДТО имеем дело с программой для флеши. То есть программатором она должна записаться во флеш, оттуда вызваться, переписать себя в ОЗУ и передать управление туда. Теперь при рестарте и выборе ОЗУ, она сразу стартанет из ОЗУ.

Всё в принципе правильно.

 

Зачем вам такое надо? В старые времена этим пользовались на АРМах с медленной внешней флеш-памятью, при холодном старте копируя всю программу в быстрое внутреннее ОЗУ.

Это нужно бывает и в новые времена.

Например программе нужно сохранить настройки, но EEPROM есть не во всех АРМах - нужно писать во flash. При этом исполнение из flash во время записи не всегда возможно. Значит нужно перенести часть кода куда-то ещё (например в ram) и там запустить процесс. При этом может быть нужно реагировать на прерывания - обработчики и таблицу векторов тоже в ram.

В старые времена этим пользовались на АРМах с медленной внешней флеш-памятью, при холодном старте копируя всю программу в быстрое внутреннее ОЗУ.

Тогда и внутреняя flash была медленная, да и сейчас из ОЗУ быстрее работать может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А еще вот такой момент. Чтобы не убивать флеш частыми перезаписями (я понимаю, что 100000 - это "по уши", но тем не менее), переносим код сразу в ОЗУ и запускаем оттуда?

То есть чисто для отладки, как будто стартап уже перенес код в ОЗУ

 

Сам таким способом не пользовался, но...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, именно чтобы не расходовать ресурс флеша. Я полагаю, что только для отладки такой режим загрузки и предусмотрен. В конечном продукте этот режим ведь невозможно использовать, правда?

 

Я делаю первые шаги в STM32. Спаял первый борд. Вот и экономлю ресурс.

 

В кейле в образцах есть конфигурации для старта из SRAM. Но там нет настроек дебагера (они же не знают какой дебагер у меня будет) И вот тут-то все и застопорилось.

 

Как оказалось, в интернетах тема не обсуждается. Или все банально, или никому не нужно..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как оказалось, в интернетах тема не обсуждается. Или все банально, или никому не нужно..

нет, как раз обсуждалось и на этом форуме. Не уверен, что применительно к STM32, но точно помню, что кто-то грузил программу во внешнюю, кстати, SDRAM

То есть еще как-то ухитрялись изначально конфигурить EMC

 

что же касается внутренней SRAM, попробуйте собрать проект в ее адресном пространстве и добавьте INI файл, в котором будет такое:

$ = 0x20000000

адрес подправьте на начало кода (там, где вектор Reset'а)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема разрешилась!

Как говорится, "дело было не в бобине".

Я пытался загрузить код в память, нажимая кнопку "load". И вот этого делать не надо было. Давим кнопку "debug", и все замечательно работает. Программа грузится в ОЗУ и оттуда бежит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема разрешилась!

хмм.. я даже не подумал, что Вы пытаетесь "прошить" в ОЗУ :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хмм.. я даже не подумал, что Вы пытаетесь "прошить" в ОЗУ :)

А что в этом необычного? Давным давно, когда перепрограммируемого ПЗУ у нас не было, была плата "ОЗУ подмены". Сначала "прожигали" его, а потом забегали. Согласитесь, что перенести данные в ОЗУ, когда оно временно заменяет ПЗУ - это совершенно логичная операция.

Тем более, что может быть я и не хочу бежать под отладчиком, а просто хочу нажать кнопку "ресет" и побежать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что в этом необычного? Давным давно, когда перепрограммируемого ПЗУ у нас не было, была плата "ОЗУ подмены". Сначала "прожигали" его, а потом забегали. Согласитесь, что перенести данные в ОЗУ, когда оно временно заменяет ПЗУ - это совершенно логичная операция.

Тем более, что может быть я и не хочу бежать под отладчиком, а просто хочу нажать кнопку "ресет" и побежать...

не в том дело

обратите внимание на то, что в настройках Кейла указывается, что для программирования используется часть ОЗУ для прошивки флеша

Я, честно говоря, не разбирался никогда, что туда пишется, но не некая ли программа, которая "дергает" IAP?

Или это просто место под данные, а все операции IAP'а можно "дрыгать" JTAG'ом...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я нашел, почему у меня раньше это не работало.

Обязательное условие - в свойствах проекта, на закладке "Utilites" надо убрать чек с параметра "Update Target Before Debugging"

Изменено пользователем igorle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я нашел, почему у меня раньше это не работало.

Обязательное условие - в свойствах проекта, на закладке "Utilites" надо убрать чек с параметра "Update Target Before Debugging"

Как у вас получилось запрограмировать SRAM , тоже так хочу чтобы прямо в коде отлаживать и не работает . Вроде все также сделал и начальный адрес сместил и нажимаю дебаг . А код не работает когда boot 11 , а из флеша работает .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...