Из-за чего прошивка для STM32F103 не запускается после перехода с Keil на Cmake?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: возникла проблема при переходе сборки с Keil на Cmake на STM32F103. Самописный бутлоадер принимает прошивку по xmodem и сохраняет ее по адресу 0x08040000, затем по команде update копирует данные в 0x08020000, ищет в прошивке строку вида "ver:x.y.z", выводит версию, настраивает msp, vtor и прыгает на reset_handler приложения по команде gop.

По вводным: если использовать бинарник, собранный в Keil, все работает супер - версия определяется корректно и приложение запускается. На Cmake (используется arm-none-eabi) elf и bin собираются без ошибок, таблица векторов действительно лежит по адресу 0x08020000, строка "ver:1.0.0" присутствует в бинарнике, но после загрузки через xmodem, выполнения update и gop бутлоадер выводит версию 0.0.0, а запуск приложения приводит к зависанию.

Сейчас ситуация такая: я просмотрел реальное содержимое флеша по адресу 0x08020000. Первые слова не совпадают с теми, которые должны быть в elf. Например, адрес reset_handler в памяти получается 0x08020fd1, хотя в elf секция.text начинается с 0x080201e8. Похоже, что во флеш записываются не те данные, но сама передача xmodem проходит нормально.

Нужно понять: какие причины могут приводить к тому, что во флеш записывается другой набор данных, включая неправильный адрес reset_handler, несмотря на то, что elf/bin выглядят корректно?

Код бутлоадера:https://github.com/johanngorban/bootloader

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Стас DB Ответ

Если прошивка для STM32F103 запускалась из Keil, но не запускается после перехода на CMake, почти всегда проблема в стартовых файлах, linker script, vector table, системной инициализации clock или параметрах сборки. Сам CMake не ломает микроконтроллер, но легко собрать бинарник с другим layout.

Сравните артефакты Keil и CMake: адрес начала Flash, размер секций, наличие vector table по 0x08000000, entry point, startup file. Для STM32F103 обычно нужен правильный startup_stm32f103xx.s и linker script с Flash/RAM вашей модели.

Проверьте map-файл:

arm-none-eabi-size firmware.elf
arm-none-eabi-objdump -h firmware.elf
arm-none-eabi-objdump -D firmware.elf | head

arm-none-eabi-size firmware.elf arm-none-eabi-objdump -h firmware.elf arm-none-eabi-objdump -D firmware.elf | head

Частые ошибки после перехода:

  • не тот linker script под размер Flash/RAM;
  • не подключён startup assembly;
  • не вызывается SystemInit;
  • неправильный F_CPU/HSE_VALUE;
  • vector table уехала не по тому адресу;
  • оптимизация убрала нужный код из-за неверных flags;
  • не добавлены defines вроде STM32F103xB.

Если используется HAL/CMSIS, проверьте, что define конкретной линейки совпадает с чипом. Без него могут подключиться не те заголовки или секции.

Отладка: поставьте breakpoint в Reset_Handler и main. Если Reset_Handler не достигается — проблема в прошивке/адресе/векторах. Если main достигается, но дальше зависает — clock, периферия, watchdog или assert.

Итог: сравните linker script, startup-файл и defines с проектом Keil. Для миграции не переписывайте всё сразу: сначала соберите минимальный blink на CMake для той же платы, затем переносите модули. Так проще отделить проблему сборки от логики приложения.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно