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

STM32F103 не хочет загружаться из встроенной SRAM

Товарищи,

пытаюсь разобраться с возможностью загрузки МК со встроенной SRAM.

Под отладчиком в оперативке по адресу 0x20000000 размещаю таблицу векторов

(MSP,               RESETVECTOR,          NMI,         HARDFAULT ...)

00 50 00 20     01 60 00 20         01 70 00 20    01 70 00 20   ...

По адресу 20006000(RESETVECTOR) размещаю несколько инструкций в бесконечном цикле(дергает ножкой).

Выставляю пины BOOT0=1 и BOOT1=1, что должно соответствовать загрузке МК из встроенной SRAM, далее делаю RESET и по идее программа по адресу 0x20006000 должна начать выполняться. 

Однако программа выполняться не хочет.

Подключаюсь опять отладчиком, вижу, что программа в памяти, MSP = 0x20005000, а вот PC почему-то всегда 0x2000001E0 и никак при резете PC не хочет стать 0x20006000

 

От самой программы это вообще не зависит.  Если вообще стереть все содержимое SRAM, тоже при резете PC=0x2000001E0

 

(Когда загружаюсь из встроенной флэш памяти, то при резете MSP и PC автоматически заполняются правильными значениями из таблицы векторов как и должно быть.)

 

Кто-нибудь знает, что за чертовщина при загрузке из встроенной SRAM ?

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


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

8 minutes ago, Arlleex said:

В таблице векторов адреса обработчиков должны быть с установленным LSB.

Я тоже подумал об этом, пока не увидел, что у автора всё ОК с этим:

Quote

(MSP,               RESETVECTOR,          NMI,         HARDFAULT ...)

00 50 00 20     01 60 00 20         01 70 00 20    01 70 00 20   ...

 

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


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

1 hour ago, TOG said:

Товарищи,

пытаюсь разобраться с возможностью загрузки МК со встроенной SRAM.

Под отладчиком в оперативке по адресу 0x20000000 размещаю таблицу векторов

(MSP,               RESETVECTOR,          NMI,         HARDFAULT ...)

00 50 00 20     01 60 00 20         01 70 00 20    01 70 00 20   ...

По адресу 20006000(RESETVECTOR) размещаю несколько инструкций в бесконечном цикле(дергает ножкой).

Выставляю пины BOOT0=1 и BOOT1=1, что должно соответствовать загрузке МК из встроенной SRAM, далее делаю RESET и по идее программа по адресу 0x20006000 должна начать выполняться. 

Однако программа выполняться не хочет.

Подключаюсь опять отладчиком, вижу, что программа в памяти, MSP = 0x20005000, а вот PC почему-то всегда 0x2000001E0 и никак при резете PC не хочет стать 0x20006000

 

От самой программы это вообще не зависит.  Если вообще стереть все содержимое SRAM, тоже при резете PC=0x2000001E0

 

(Когда загружаюсь из встроенной флэш памяти, то при резете MSP и PC автоматически заполняются правильными значениями из таблицы векторов как и должно быть.)

 

Кто-нибудь знает, что за чертовщина при загрузке из встроенной SRAM ?

Сколько RAM у этого F103 ?
0x6000 = 24KB

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


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

On 9/14/2023 at 11:32 AM, x893 said:

Сколько RAM у этого F103 ?
0x6000 = 24KB

У него 64кБ (0x10000) SRAM.

Пробовал ставить разные MSP и даже пробовал разные МК(STM32F103) на разных отладочных платах и всегда почему-то при загрузке из SRAM, PC=0x200001E0. Капец.

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


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

9 minutes ago, TOG said:

У него 64кБ (0x10000) SRAM.

Пробовал ставить разные MSP и даже пробовал разные МК(STM32F103) на разных отладочных платах и всегда почему-то при загрузке из SRAM, PC=0x200001E0. Капец.

После сброса и подключения отладчиком содержимое памяти совпадает ?
Если под отладчиком загружать/запускать работает ?

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


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

On 9/14/2023 at 11:45 AM, x893 said:

После сброса и подключения отладчиком содержимое памяти совпадает ?
Если под отладчиком загружать/запускать работает ?

Содержимое памяти совпадает. И если вручную поставить PC=0x20006000 и запустить, то программа работает и под отладчиком и при выходе из отладчика.

Но если теперь сделать резет, то программа не работает, т.к при перезагрузке PC опять становится 0x200001E0. Я на этом адресе уже ловушку поставил(цикл бесконечный) и при подключении отладчика видно, что программа сидит в этой ловушке.

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


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

10 minutes ago, TOG said:

И если вручную поставить PC=0x20006000 и запустить

Стесняюсь спросить об очевидном: Вы errata почитали? Там точно нет проблем с этим?

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


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

On 9/14/2023 at 12:16 PM, haker_fox said:

Стесняюсь спросить об очевидном: Вы errata почитали? Там точно нет проблем с этим?

Явно про этот косяк ничего не нашел.

Есть правда вот такое упоминание. Не знаю относится ли это к моей проблеме.

 

111.png

 

Проверил на другом МК (STM32F100RE), такая-же ерунда- при загрузке из SRAM регистр PC=0x200001E0 всегда не зависимо от значений в таблице векторов.

Проверил на STM32F072RB, там все работает как надо, PC загружается из таблицы векторов. 

Видимо с STM32F10x какой-то косяк не указанный в Errata

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


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

On 9/14/2023 at 2:56 PM, x893 said:

Ну так поставьте в 1Е0 нужные действия

Так и сделал.

Размещаю начало программы по адресу 0x200001E0 и все в общем работает.

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


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

2 hours ago, TOG said:

Размещаю начало программы по адресу 0x200001E0 и все в общем работает.

Это уже результат! Осталось выяснить, что это за магический адрес такой. Вы же не хотите, чтобы микроконтроллер контролировал Ваши действия?😜

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


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

1 час назад, haker_fox сказал:

Это уже результат! Осталось выяснить, что это за магический адрес такой. Вы же не хотите, чтобы микроконтроллер контролировал Ваши действия?😜

Вангую - встроенный загрузчик не читает адрес из вектора сброса, а просто - передаёт управление на первый адрес за пределами последнего вектора прерывания. Скорей всего.

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


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

2 hours ago, jcxz said:

встроенный загрузчик

Гм. Интересная теория! Вполне! Автор топика это может попытаться проверить...

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


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

Вычитал я (но в документации этого никогда не найдете), что при старте из ОЗУ при сбросе в PC помещается команда, размещенная по адресу 0x200001E0 (но этот адрес device-dependency). В примерах флеш-алгоритмов отладчиков видно, что они помещают в эту ячейку код 0xF85FF1E0, что, якобы, соответствует команде ldr.w pc, [pc, #-480]. Пробуйте.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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