TOG 0 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба Товарищи, пытаюсь разобраться с возможностью загрузки МК со встроенной 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба В таблице векторов адреса обработчиков должны быть с установленным LSB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба On 9/14/2023 at 11:32 AM, x893 said: Сколько RAM у этого F103 ? 0x6000 = 24KB У него 64кБ (0x10000) SRAM. Пробовал ставить разные MSP и даже пробовал разные МК(STM32F103) на разных отладочных платах и всегда почему-то при загрузке из SRAM, PC=0x200001E0. Капец. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 9 minutes ago, TOG said: У него 64кБ (0x10000) SRAM. Пробовал ставить разные MSP и даже пробовал разные МК(STM32F103) на разных отладочных платах и всегда почему-то при загрузке из SRAM, PC=0x200001E0. Капец. После сброса и подключения отладчиком содержимое памяти совпадает ? Если под отладчиком загружать/запускать работает ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба On 9/14/2023 at 11:45 AM, x893 said: После сброса и подключения отладчиком содержимое памяти совпадает ? Если под отладчиком загружать/запускать работает ? Содержимое памяти совпадает. И если вручную поставить PC=0x20006000 и запустить, то программа работает и под отладчиком и при выходе из отладчика. Но если теперь сделать резет, то программа не работает, т.к при перезагрузке PC опять становится 0x200001E0. Я на этом адресе уже ловушку поставил(цикл бесконечный) и при подключении отладчика видно, что программа сидит в этой ловушке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 10 minutes ago, TOG said: И если вручную поставить PC=0x20006000 и запустить Стесняюсь спросить об очевидном: Вы errata почитали? Там точно нет проблем с этим? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба On 9/14/2023 at 12:16 PM, haker_fox said: Стесняюсь спросить об очевидном: Вы errata почитали? Там точно нет проблем с этим? Явно про этот косяк ничего не нашел. Есть правда вот такое упоминание. Не знаю относится ли это к моей проблеме. Проверил на другом МК (STM32F100RE), такая-же ерунда- при загрузке из SRAM регистр PC=0x200001E0 всегда не зависимо от значений в таблице векторов. Проверил на STM32F072RB, там все работает как надо, PC загружается из таблицы векторов. Видимо с STM32F10x какой-то косяк не указанный в Errata Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба Ну так поставьте в 1Е0 нужные действия Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба On 9/14/2023 at 2:56 PM, x893 said: Ну так поставьте в 1Е0 нужные действия Так и сделал. Размещаю начало программы по адресу 0x200001E0 и все в общем работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 2 hours ago, TOG said: Размещаю начало программы по адресу 0x200001E0 и все в общем работает. Это уже результат! Осталось выяснить, что это за магический адрес такой. Вы же не хотите, чтобы микроконтроллер контролировал Ваши действия?😜 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 245 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 1 час назад, haker_fox сказал: Это уже результат! Осталось выяснить, что это за магический адрес такой. Вы же не хотите, чтобы микроконтроллер контролировал Ваши действия?😜 Вангую - встроенный загрузчик не читает адрес из вектора сброса, а просто - передаёт управление на первый адрес за пределами последнего вектора прерывания. Скорей всего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба 2 hours ago, jcxz said: встроенный загрузчик Гм. Интересная теория! Вполне! Автор топика это может попытаться проверить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 14 сентября, 2023 Опубликовано 14 сентября, 2023 · Жалоба Вычитал я (но в документации этого никогда не найдете), что при старте из ОЗУ при сбросе в PC помещается команда, размещенная по адресу 0x200001E0 (но этот адрес device-dependency). В примерах флеш-алгоритмов отладчиков видно, что они помещают в эту ячейку код 0xF85FF1E0, что, якобы, соответствует команде ldr.w pc, [pc, #-480]. Пробуйте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться