STM32F105RCT6: как считать прошивку с микроконтроллера

Чтение прошивки с STM32F105RCT6 чаще всего упирается в активированный бит защиты RDP (Readout Protection): программатор подключается по SWD, но вместо содержимого Flash возвращает нули или ошибку чтения. Если защита не установлена, дамп снимается штатными средствами за несколько минут — через ST-Link и утилиту STM32CubeProgrammer или через загрузчик по UART.

Микроконтроллер STM32F105RCT6 относится к линейке Connectivity Line: ядро Cortex-M3, 256 КБ Flash-памяти, 64 КБ SRAM, корпус LQFP-64. Чтение прошивки может понадобиться для резервной копии перед экспериментами, клонирования прошивки на второе устройство, анализа работы оборудования или восстановления утерянного исходника. Ниже разберём рабочие способы, ограничения каждого и типичные ошибки.

Что нужно знать перед чтением прошивки

Первое, что определяет успех операции — состояние битов опций (Option Bytes). Уровень RDP Level 0 означает, что Flash доступна для чтения без ограничений. RDP Level 1 блокирует доступ к памяти через отладочный интерфейс: программатор видит чип, но читать содержимое не может. Снятие RDP Level 1 возможно только с полным стиранием Flash-памяти — прошивка при этом безвозвратно теряется.

Второй момент — целостность питания и разводки. Для стабильной связи по SWD нужны всего четыре линии: SWDIO, SWCLK, GND и опорное напряжение VDD (обычно 3,3 В). Длинные неэкранированные провода и «плавающее» питание — частая причина обрывов соединения в середине чтения.

  • 🔌 Проверьте напряжение питания целевой платы — оно должно соответствовать документации на конкретное устройство.
  • 🔍 Убедитесь, что линии SWD не заняты другой периферией и не подтянуты к питанию внешними цепями.
  • 🧷 Зафиксируйте контакт: нестабильный соединитель даёт ошибку чтения на случайном адресе.
  • 📄 Сверьте распиновку с datasheet на STM32F105RCT6 — на разных платах выводы могут быть разведены иначе.

Самый прямой путь — фирменный программатор ST-Link/V2 (или его совместимый клон) и бесплатная утилита STM32CubeProgrammer от STMicroelectronics. Подключите программатор к плате, запустите программу, выберите интерфейс SWD и нажмите Connect. Если чип определился, вся карта памяти отобразится во вкладке чтения.

Для сохранения дампа укажите начальный адрес 0x08000000 и размер, соответствующий объёму Flash (для RCT6 — 256 КБ, то есть 0x40000). Результат сохраняется в формате .bin или .hex. Бинарный файл удобнее для последующей заливки, hex — для просмотра и сравнения.

STM32_Programmer_CLI -c port=SWD -r32 0x08000000 0x40000 dump.bin

Команда выше делает то же самое из консоли, что удобно для автоматизации. Утилита STM32_Programmer_CLI ставится вместе с CubeProgrammer.

☑️ Чтение прошивки через ST-Link

Выполнено: 0 / 6
📊 Какой способ чтения прошивки STM32 вы используете чаще всего?
ST-Link + STM32CubeProgrammer
J-Link + J-Flash
UART-загрузчик (bootloader)
OpenOCD / другие инструменты

Отладчики SEGGER J-Link работают с STM32F1 через тот же интерфейс SWD, но используют собственный софт — J-Flash или утилиту командной строки JLinkExe. Последовательность похожа: подключение, выбор устройства STM32F105RC в списке, чтение области памяти и сохранение файла.

Преимущество J-Link — стабильность на «капризных» платах и гибкая настройка скорости интерфейса. Если ST-Link отказывается соединяться, попробуйте снизить частоту SWD до минимальной — иногда это решает проблему с некачественной разводкой линий.

Способ 3: чтение через встроенный UART-загрузчик

В STM32F105RCT6 зашит заводской загрузчик (system memory bootloader), активируемый удержанием вывода BOOT0 в высоком уровне при подаче питания или сбросе. Загрузчик работает через USART1 (выводы PA9/PA10) и позволяет читать Flash через тот же STM32CubeProgrammer — достаточно выбрать интерфейс UART.

⚠️ Внимание: системный загрузчик подчиняется той же защите RDP. Если установлен Level 1, чтение через UART вернёт ошибку так же, как и через SWD. Загрузчик — не способ обхода защиты, а альтернативный канал доступа.

Этот способ выручает, когда выводы SWD в устройстве задействованы под другие функции или физически недоступны, а линии UART выведены на разъём. Для подключения понадобится USB-UART адаптер с уровнями 3,3 В.

Защита RDP: что можно и чего нельзя сделать

Здесь важно разделить два сценария честно. При RDP Level 0 чтение выполняется любым из описанных способов без ограничений. При RDP Level 1 единственный штатный путь — снятие защиты через RDP Regression: уровень понижается до 0, но Flash полностью стирается. Содержимое прошивки восстановить после этого невозможно.

Существуют исследовательские методы извлечения прошивки с защищённых чипов семейства STM32F1 через аппаратные уязвимости (fault injection, сбои по питанию). Это лабораторные техники, требующие специализированного оборудования, и результат не гарантирован. Для практической задачи «сделать копию прошивки» они обычно неприменимы — проще восстановить прошивку из исходников или резервной копии.

СпособОборудованиеРаботает при RDP Level 1Сложность
ST-Link + CubeProgrammerST-Link/V2 или совместимыйНетНизкая
J-Link + J-FlashОтладчик SEGGERНетНизкая
UART-загрузчикUSB-UART адаптер 3,3 ВНетСредняя
RDP RegressionЛюбой программаторДа, но Flash стираетсяНизкая

Проверка и сохранение дампа

Полученный файл стоит проверить до того, как вы отключите программатор. Самый простой контроль — повторное чтение той же области и побайтовое сравнение двух дампов: они должны совпадать полностью. Расхождения говорят о нестабильном контакте или помехах на линии.

Дополнительные признаки корректного дампа:

  • 📦 Размер файла равен запрошенному объёму (256 КБ для полного чтения Flash).
  • 🧭 Первые байты файла — таблица векторов: начальное значение указателя стека и адрес Reset Handler, а не сплошные 0xFF или 0x00.
  • 🗂 Файл открывается в hex-редакторе и содержит читаемые структуры кода, а не однородный «мусор».
⚠️ Внимание: не записывайте ничего в чип, пока не убедились, что дамп считан корректно и сохранён в двух копиях. Любая операция записи или стирания при сбое соединения может оставить устройство без рабочей прошивки.
Почему в дампе встречаются области 0xFF

Незаписанные ячейки Flash-памяти читаются как 0xFF. Если прошивка занимает не весь объём, хвост файла будет заполнен этим значением — это норма, а не ошибка чтения. Подозрительна обратная ситуация: весь файл состоит из 0xFF или 0x00, хотя устройство работает. Такое чаще всего означает активную защиту RDP или потерю связи в начале чтения.

Типичные ошибки при чтении и их причины

Ошибка No target connected при исправном программаторе обычно означает проблему с питанием целевой платы или занятые линии SWD. Проверьте, что плата запитана, а отладочные выводы не переназначены прошивкой в первые миллисекунды после старта — в этом случае помогает Connect Under Reset.

Ошибка чтения на конкретном адресе в середине процесса — признак нестабильного соединения. Сократите длину проводов, снизьте скорость интерфейса и исключите «помехонасыщенные» источники питания рядом с платой.

Если программа сообщает, что устройство защищено (Readout protection enabled), дальнейшее чтение невозможно без стирания. Решение о снятии защиты принимайте только когда прошивку не жалко потерять или есть иной источник её восстановления.

Часто задаваемые вопросы

Можно ли считать прошивку с STM32F105RCT6 без программатора?

Да, через встроенный UART-загрузчик: потребуется только USB-UART адаптер с уровнями 3,3 В и перевод вывода BOOT0 в высокий уровень при старте. Ограничение то же — при активной защите RDP чтение будет заблокировано.

Что произойдёт с прошивкой при снятии защиты RDP Level 1?

Flash-память полностью стирается. Это аппаратное поведение микроконтроллера: защита снимается только вместе с содержимым, восстановить прошивку после regression невозможно.

Программатор определяет чип, но читает только нули — в чём причина?

Наиболее вероятная причина — активированная защита RDP Level 1. Проверьте состояние Option Bytes в STM32CubeProgrammer. Реже такое поведение даёт потеря связи сразу после соединения — попробуйте снизить скорость SWD.

В каком формате лучше сохранять дамп — BIN или HEX?

Для последующей записи обратно в чип удобнее .bin — это прямой образ памяти с адреса 0x08000000. Формат .hex содержит адресную информацию и удобен для просмотра, сравнения и работы с разрозненными областями памяти.

Можно ли считать только часть прошивки, а не всю Flash?

Да. Укажите начальный адрес и нужный размер при чтении — например, первые 64 КБ. Это быстрее и достаточно, если интересует конкретный участок кода. Учтите, что таблица векторов находится в самом начале Flash, поэтому для анализа прошивки её стоит включать в дамп.