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

 
 
 
Reply to this topicStart new topic
> stm32 embedded SRAM boot mode
igorle
сообщение May 8 2013, 22:03
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



На моем учебном борде (stm32f103c8) я умею загружать программу через SWD или через UART.
Хочу освоить загрузку из памяти, но не могу найти информацию ни на русском, ни на английском.

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

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

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

Кто-нибудь решал такую проблему?
Go to the top of the page
 
+Quote Post
Gorby
сообщение May 10 2013, 21:51
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 449
Регистрация: 28-10-04
Из: Украина
Пользователь №: 1 002



Цитата(igorle @ May 9 2013, 02:03) *
Хочу освоить загрузку из памяти, но не могу найти информацию ни на русском, ни на английском.

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

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


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

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

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

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


--------------------
Умею молчать на 37 языках...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 10 2013, 23:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Gorby @ May 11 2013, 00:51) *
Вот правильная последовательность:

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

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

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

Цитата(Gorby @ May 11 2013, 00:51) *
Зачем вам такое надо? В старые времена этим пользовались на АРМах с медленной внешней флеш-памятью, при холодном старте копируя всю программу в быстрое внутреннее ОЗУ.

Это нужно бывает и в новые времена.
Например программе нужно сохранить настройки, но EEPROM есть не во всех АРМах - нужно писать во flash. При этом исполнение из flash во время записи не всегда возможно. Значит нужно перенести часть кода куда-то ещё (например в ram) и там запустить процесс. При этом может быть нужно реагировать на прерывания - обработчики и таблицу векторов тоже в ram.
Цитата(Gorby @ May 11 2013, 00:51) *
В старые времена этим пользовались на АРМах с медленной внешней флеш-памятью, при холодном старте копируя всю программу в быстрое внутреннее ОЗУ.

Тогда и внутреняя flash была медленная, да и сейчас из ОЗУ быстрее работать может.
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 11 2013, 06:17
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



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

Сам таким способом не пользовался, но...
Go to the top of the page
 
+Quote Post
igorle
сообщение May 11 2013, 09:36
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



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

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

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

Как оказалось, в интернетах тема не обсуждается. Или все банально, или никому не нужно..
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 11 2013, 14:22
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorle @ May 11 2013, 13:36) *
Как оказалось, в интернетах тема не обсуждается. Или все банально, или никому не нужно..

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

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

адрес подправьте на начало кода (там, где вектор Reset'а)
Go to the top of the page
 
+Quote Post
igorle
сообщение May 11 2013, 16:52
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Проблема разрешилась!
Как говорится, "дело было не в бобине".
Я пытался загрузить код в память, нажимая кнопку "load". И вот этого делать не надо было. Давим кнопку "debug", и все замечательно работает. Программа грузится в ОЗУ и оттуда бежит.
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 11 2013, 18:43
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorle @ May 11 2013, 20:52) *
Проблема разрешилась!

хмм.. я даже не подумал, что Вы пытаетесь "прошить" в ОЗУ sm.gif
Go to the top of the page
 
+Quote Post
igorle
сообщение May 11 2013, 20:16
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(toweroff @ May 11 2013, 21:43) *
хмм.. я даже не подумал, что Вы пытаетесь "прошить" в ОЗУ sm.gif

А что в этом необычного? Давным давно, когда перепрограммируемого ПЗУ у нас не было, была плата "ОЗУ подмены". Сначала "прожигали" его, а потом забегали. Согласитесь, что перенести данные в ОЗУ, когда оно временно заменяет ПЗУ - это совершенно логичная операция.
Тем более, что может быть я и не хочу бежать под отладчиком, а просто хочу нажать кнопку "ресет" и побежать...
Go to the top of the page
 
+Quote Post
toweroff
сообщение May 11 2013, 21:20
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorle @ May 12 2013, 00:16) *
А что в этом необычного? Давным давно, когда перепрограммируемого ПЗУ у нас не было, была плата "ОЗУ подмены". Сначала "прожигали" его, а потом забегали. Согласитесь, что перенести данные в ОЗУ, когда оно временно заменяет ПЗУ - это совершенно логичная операция.
Тем более, что может быть я и не хочу бежать под отладчиком, а просто хочу нажать кнопку "ресет" и побежать...

не в том дело
обратите внимание на то, что в настройках Кейла указывается, что для программирования используется часть ОЗУ для прошивки флеша
Я, честно говоря, не разбирался никогда, что туда пишется, но не некая ли программа, которая "дергает" IAP?
Или это просто место под данные, а все операции IAP'а можно "дрыгать" JTAG'ом...
Go to the top of the page
 
+Quote Post
igorle
сообщение May 11 2013, 21:59
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



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

Сообщение отредактировал igorle - May 12 2013, 16:22
Go to the top of the page
 
+Quote Post
Евгений_Юрьевич
сообщение Apr 28 2016, 15:04
Сообщение #12





Группа: Новичок
Сообщений: 2
Регистрация: 28-04-16
Пользователь №: 91 533



Цитата(igorle @ May 12 2013, 00:59) *
Я нашел, почему у меня раньше это не работало.
Обязательное условие - в свойствах проекта, на закладке "Utilites" надо убрать чек с параметра "Update Target Before Debugging"

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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:40
Рейтинг@Mail.ru


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