Из-за чего прошивка для STM32F103 не запускается после перехода с Keil на Cmake?
Сейчас ситуация такая: возникла проблема при переходе сборки с 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
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Если прошивка для 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
Частые ошибки после перехода:
SystemInit;STM32F103xB.Если используется HAL/CMSIS, проверьте, что define конкретной линейки совпадает с чипом. Без него могут подключиться не те заголовки или секции.
Отладка: поставьте breakpoint в Reset_Handler и main. Если Reset_Handler не достигается — проблема в прошивке/адресе/векторах. Если main достигается, но дальше зависает — clock, периферия, watchdog или assert.
Итог: сравните linker script, startup-файл и defines с проектом Keil. Для миграции не переписывайте всё сразу: сначала соберите минимальный blink на CMake для той же платы, затем переносите модули. Так проще отделить проблему сборки от логики приложения.