Перейти до вмісту
Майстерня: ремонт і досліди

Плата посудомийки Bosch SWS4118: копія прошивки STM32 через ST-Link (частина 2)

Опубліковано 12.11.2026
Зміст статті 5
  1. Мікроконтролер STM32 — лише читання
  2. Що ми прочитали
  3. Що далі
  4. Безпека
  5. Журнал змін статті

Друга частина про плату посудомийки Bosch 702168823.01GA / SWS4118 Rev.4. У першій частині — що стоїть на платі й копія EEPROM. Тут — мікроконтролер STM32, лише читання:

  • де на платі виводи SWD і що виведено на пади X20;
  • як під'єднати ST-Link V2 (і, у згорнутому блоці, Raspberry Pi);
  • які програми й драйвери потрібні і де їх узяти;
  • як перевірити, чи захищена прошивка від читання;
  • як зробити копію і як переконатися, що вона правильна;
  • що ми прочитали з нашої плати.

Що вміє сама прошивка і яка з неї користь — у третій частині.

чернетка — обговорюємо й дописуємо

⚠ Плата працює просто від мережі 230 В без розв'язки. Поки до неї під'єднано програматор, у мережу вона не вмикається: живимо лише 3,3 В — від ST-Link або окремого блока. Інакше мережева напруга потрапить на USB комп'ютера.

Мікроконтролер STM32 — лише читання

Мета кроку — дізнатися, що це за кристал, чи захищена прошивка від читання і, якщо ні, зберегти її копію. Нічого не записуємо й не стираємо. Програматор CH341B тут не допоможе: STM32 читають через SWD, а CH341 цього інтерфейсу не має. Ми читаємо програматором ST-Link V2 (дешевий клон); як те саме зробити з Raspberry Pi 3B+, розписано в згорнутому блоці нижче.

Де шукати виводи

Мікроконтролер STM32, EEPROM 24C08 і пади X20 з буквеними позначками
Ділянка мікроконтролера: A — STM32, B — EEPROM 24C08WP, D — пади X20, E — ще одна група технологічних пад. Детальніше про кожен компонент — у першій частині.
STM32 у корпусі LQFP100: де шукати виводи для SWD, скидання й живлення — орієнтація як на фотоSTM32F301VCT61–25 →26–50 →← 51–75← 76–100крапка-ключ75 VDD·3,3 В74 VSS·GND72 SWDIO (PA13)69 RX (PA10)68 TX (PA9)76 SWCLK (PA14)94 BOOT099 VSS·GND100 VDD·3,3 В14 NRST — скиданнянумерація проти годинникової стрілки від виводу 1
Корпус LQFP100 у тій самій орієнтації, що й на фото вище: напис читається прямо, крапка-ключ ліворуч унизу. Вивід 1 — крайній лівий на нижньому боці, далі нумерація йде проти годинникової стрілки.
ВивідСигналДля чогоПотрібен для читання
72PA13 — SWDIOдані налагоджувачатак
76PA14 — SWCLKтакт налагоджувачатак
14NRSTскиданнябажано: допомагає, якщо зв'язок не встановлюється
99, 74VSSGNDтак (будь-яка точка GND плати)
100, 75VDD3,3 Вживлення плати
94BOOT0вибір завантаженняні, не чіпати
68, 69PA9, PA10USART1: вбудований завантажувач STні (запасний шлях: потрібен BOOT0 = 1, і захист від читання діє й тут)
  • Номери виводів — стандартна 100-вивідна розкладка ST (як у STM32F303VC). Для мікросхеми з маркуванням STM32F301 VCT6 її ще не звірено з даташитом, тому спершу перевіряємо орієнтацію мультиметром: виводи 99 і 74 мають дзвонитися на GND (наприклад, на вивід 4 EEPROM), а 100 і 75 — на шину 3,3 В (вивід 8 EEPROM). Збіглося — номери правильні.
  • До виводів не паяємо: крок 0,5 мм, легко замкнути сусідні.

Що виведено на пади X20 (D на фото мікроконтролера; рахуємо зліва направо, як на фото знизу плати) — результат нашої прозвонки:

Пад X20Куди йдеЩо це
1вивід 76SWCLK (PA14)
2вивід 72SWDIO (PA13)
3вивід 14NRST (скидання) — не напряму, а через резистор 220 Ом (маркування 221)
4вивід 90PB4 (у JTAG це NJTRST); прошивка тримає його входом, на живій платі на ньому логічна 1
5GNDспільний провід
63,3 Вшина живлення 3,3 В

Тобто X20 — це роз'єм налагодження: SWD і скидання вже на ньому, і до падів X20 зручно під'єднатися щупами чи припаяти дроти.

Пади X20 і доріжки від падів 3 і 4: пад 3 — через резистор 221 до NRST, пад 4 — до виводу 90
Прозвонка падів 3 і 4. Червона лінія: пад 3 → резистор 221 (220 Ом) → вивід 14, NRST, на нижньому боці корпусу. Зелена: пад 4 → вивід 90 на лівому боці корпусу.
  • Резистор 220 Ом у лінії скидання не заважає: ST-Link тягне NRST до землі, а 220 Ом лише обмежують струм — найімовірніше, на випадок, якщо пад випадково замкнуть на живлення.
  • Пад 4 (PB4) для читання не потрібен. Прошивка налаштовує його як вхід без внутрішньої підтяжки, і на живій платі на ньому 1 — схоже, зовнішня підтяжка. Можливо, це вхід сервісного режиму на заводі; що саме він робить, у прошивці ще не з'ясовано. Не замикайте його на землю на робочій платі, поки не знаємо, що це.

Звірка з відкритим описом. Проєкт hn/bsh-home-appliances описує силові модулі посудомийок Bosch з тим самим STM32F301VCT6 і дає такий порядок на X20: SWCLK, SWDIO, BOOT0, RESET, GND, 3,3 В. Перші два й останні два пади збігаються з нашою прозвонкою. Пади 3 і 4 на нашій платі інші: 3 — NRST (вивід 14), 4 — PB4 (вивід 90), BOOT0 на X20 не виведено. Тож або у плат hn інша ревізія, або в тому описі переплутано порядок — покладайтеся на прозвонку своєї плати.

Підключення ST-Link V2

Підключення ST-Link V2 до технологічних пад X20 плати: SWCLK, SWDIO, GND і 3,3 ВST-Link V2гребінка на корпусіSWCLKSWDIORSTGND3,3 ВПади X20 на платізліва направо, як на фото1 · SWCLK (76, PA14)2 · SWDIO (72, PA13)3 · NRST (14, через 220 Ом)4 · вивід 90 (PB4)5 · GND6 · 3,3 ВRST — пад 3, необов’язково: якщо без скидання зв’язку немаєплата без мережі; живлення 3,3 В — від ST-Link або окремого блока, не від обох
ST-Link V2 і пади X20: SWCLK (жовтий) — пад 1, SWDIO (зелений) — пад 2, GND — пад 5, 3,3 В — пад 6. RST (пунктир) — пад 3, необов'язково: знадобиться, якщо зв'язок не встановлюється без скидання.
ST-Link V2Пад X20На платі
SWCLK1вивід 76 (PA14)
SWDIO2вивід 72 (PA13)
GND5GND
3,3 В6шина 3,3 В
RST3NRST, вивід 14 (через 220 Ом) — за потреби
  • Живлення. У дешевих клонах ST-Link контакт 3,3 В — вихід: він живить плату, тож окремий блок не потрібен, і його не під'єднують: два джерела на одній шині заважають одне одному. В оригінальному ST-Link цей контакт лише міряє напругу — тоді плату живить окремий блок 3,3 В, а пад 6 з'єднано з контактом 3,3 В ST-Link для виміру. Після підключення виміряйте напругу на паді 6: має бути ≈ 3,3 В. Якщо з клоном вона нижча за ≈ 3 В — стабілізатор ST-Link не тягне плату: від'єднайте його контакт 3,3 В і живіть плату від окремого блока (GND спільний).
  • Плата весь час без мережі. Вона не має гальванічної розв'язки з мережею: увімкнути її в розетку з під'єднаним ST-Link — це мережева напруга на USB комп'ютера.
  • Дроти короткі (до 15–20 см).
  • Програма: STM32CubeProgrammer від ST (Windows, Linux, macOS) або OpenOCD. Драйвер ST-Link на Windows ставиться разом із STM32CubeProgrammer.
Як під'єднати Raspberry Pi 3B+ замість ST-Link
Підключення Raspberry Pi 3B+ до SWD мікроконтролера STM32 на платі: SWCLK, SWDIO, GND і NRSTRaspberry Pi 3B+роз'єм GPIO (контакти)Плата посудомийкина падах X20: 1 SWCLK, 2 SWDIO, 3 NRST, 5 GND, 6 3,3 Вконтакт 22 · GPIO25SWCLK — PA14 (76)контакт 18 · GPIO24SWDIO — PA13 (72)контакт 20 · GNDGNDконтакт 12 · GPIO18NRST (14) — необов'язково3,3 В на плату — від окремого блока живлення (спільний GND з Pi)плата без мережі; лише читання
Raspberry Pi 3B+ і виводи SWD плати: SWCLK, SWDIO, GND, пунктиром — необов'язковий NRST. Номери — фізичні контакти 40-контактного роз'єму Pi.
Raspberry Pi 3B+, контактСигнал PiНа платі
22GPIO25SWCLK — пад X20 1, вивід 76
18GPIO24SWDIO — пад X20 2, вивід 72
20GNDGND — пад X20 5
12GPIO18NRST — пад X20 3, вивід 14

Плату живлять 3,3 В від окремого блока (пад X20 6), GND спільний з Pi: контакт 3,3 В самої Pi краще не навантажувати платою. Програма — OpenOCD:

sudo apt install openocd telnet
sudo openocd -f interface/raspberrypi2-native.cfg -c "transport select swd" -f target/stm32f3x.cfg -c "adapter speed 100"

Якщо OpenOCD відповість, що файла raspberrypi2-native.cfg немає, — у вашій версії його об'єднано з interface/raspberrypi-native.cfg. Далі — ті самі команди в telnet localhost 4444, що й для ST-Link нижче.

Програми й драйвери

ЩоДе взятиДля чого
STM32CubeProgrammerst.com: STM32CubeProg — безкоштовно; для завантаження потрібен обліковий запис STчитання флеш-пам'яті й option bytes; є і вікно, і консольна програма STM32_Programmer_CLI
драйвер ST-Link для Windowsставиться разом зі STM32CubeProgrammer; окремо — STSW-LINK009щоб Windows бачила ST-Link
OpenOCDLinux: sudo apt install openocd; Windows: збірки xPack OpenOCDвільна альтернатива; працює і з ST-Link, і з Raspberry Pi
Ghidraghidra-sre.orgрозбір копії прошивки на комп'ютері

На Windows консольна програма після встановлення лежить тут:

C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe

Далі в командах пишемо просто STM32_Programmer_CLI: або додайте теку bin у PATH, або запускайте з неї.

Порядок дій коротко:

  1. Плата — без мережі. ST-Link під'єднати до X20 за схемою вище, потім — у USB.
  2. Перевірити, що комп'ютер бачить ST-Link: STM32_Programmer_CLI -l st. Програма покаже ST-Link, версію його прошивки й серійний номер (якщо публікуєте вивід, номер краще прибрати).
  3. Перевірити захист: STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -ob displ. Рядок RDP зі значенням 0xAA (Level 0, no protection) означає: захисту немає, прошивку можна прочитати. Що означають інші значення — у наступному розділі.
  4. Прочитати прошивку двічі й порівняти копії — розділ Якщо захисту немає — копія.

Чи можна зберегти прошивку

STM32 має захист від читання — рівень RDP (0, 1 або 2). Від нього залежить, чи прочитається прошивка.

STM32CubeProgrammer (найпростіше). Вибрати ST-LINK, режим підключення «Normal» (або «Hot plug» — підключитися без скидання мікроконтролера), натиснути Connect. Програма покаже назву кристала й розмір флеш-пам'яті, а на вкладці OB (Option bytes) — RDP: AA — рівень 0, CC — рівень 2, BB чи будь-яке інше — рівень 1. На вкладці OB нічого не змінювати й не натискати Apply. Якщо програма запропонує оновити прошивку самого ST-Link — відмовтеся: клони після такого оновлення іноді перестають працювати.

OpenOCD (Windows, Linux):

openocd -f interface/stlink.cfg -f target/stm32f3x.cfg -c "adapter speed 100"

Коли OpenOCD знайде мікроконтролер, у другому вікні:

telnet localhost 4444

і там по черзі (кожна команда лише читає):

mdw 0xE0042000
mdh 0x1FFFF7CC
mdw 0x4002201C
mdb 0x1FFFF800 16
КомандаЩо показуєЯк читати
mdw 0xE0042000ідентифікатор кристаламолодші три шістнадцяткові цифри: 422 — родина F302/F303 на 128–256 КБ; 439 — F301/F302 на 32–64 КБ; 446 — F302/F303 на 384–512 КБ
mdh 0x1FFFF7CCрозмір флеш-пам'яті в КБ0x0100 = 256 КБ, 0x0040 = 64 КБ
mdw 0x4002201Cрегістр FLASH_OBRбіти 2–1: 00 — рівень 0, 01 — рівень 1 (останній шістнадцятковий знак 0 або 1 — рівень 0; 2 або 3 — рівень 1)
mdb 0x1FFFF800 16option bytes — налаштування кристалаперший байт aa — рівень 0
Що вийшлоРівеньЩо це означаєЩо робимо
біти 2–1 = 00, перший байт option bytes aa0захисту немаєзберігаємо всю флеш-пам'ять (нижче)
біти 2–1 = 01, перший байт — інший (не aa)1через SWD флеш-пам'ять не читаєтьсякопію прошивки не зробити. Зняти захист можна лише разом зі стиранням усієї прошивки — цього не робимо
програма не бачить мікроконтролера, хоча підключення перевіреноможливо 2налагодження вимкнено назавждипрошивку не прочитати й не замінити; спершу ще раз перевірити дроти, живлення й NRST

Якщо захисту немає — копія

У STM32CubeProgrammer: вкладка «Memory & File editing» (значок олівця), адреса 0x08000000, розмір 0x40000 (256 КБ; якщо після Connect програма показала інший розмір флеш-пам'яті — підставте його), Read, потім Save As… у файл. Зробіть так двічі й порівняйте файли.

У консолі STM32CubeProgrammer (так читали ми; кожна команда лише читає):

STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -ob displ
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -u 0x08000000 0x40000 flash_1.bin
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -u 0x08000000 0x40000 flash_2.bin
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -u 0x1FFFF800 0x10 optbytes.bin
  • mode=HOTPLUG — під'єднатися, не скидаючи мікроконтролер: програма в ньому працює далі.
  • freq=100 — 100 кГц: повільно (одна копія 256 КБ читається ≈ 33 с), зате надійно навіть із дротами-щупами.
  • -u (upload) — це читання з мікроконтролера у файл, хоч назва й плутає. Записують у мікроконтролер ключі -d і -w, стирає -e — їх тут не вживаємо.
  • Порівняти копії: на Windows fc /b flash_1.bin flash_2.bin (відповідь «FC: no differences encountered» — однакові), у Linux cmp flash_1.bin flash_2.bin (нічого не вивела — однакові). Або порівняти контрольні суми: certutil -hashfile flash_1.bin SHA256 на Windows, sha256sum flash_*.bin у Linux.

В OpenOCD — у тому самому вікні telnet:

halt
dump_image flash_1.bin 0x08000000 0x40000
dump_image flash_2.bin 0x08000000 0x40000
dump_image optbytes.bin 0x1FFFF800 16
resume
  • 0x40000 — це 256 КБ. Якщо mdh 0x1FFFF7CC показав інший розмір, підставте його: розмір у КБ × 1024 у шістнадцятковому вигляді.
  • halt лише зупиняє виконання програми, resume — продовжує; нічого не записується.
  • Файли з'являються в теці, з якої запущено OpenOCD. Дві копії мають бути однакові (cmp flash_1.bin flash_2.bin) і не складатися з самих FF чи 00.

Що ще зберегти

ЩоДеНавіщоУ статтю
прошивка (флеш-пам'ять)0x08000000, 256 КБголовна копія — до неї завжди можна повернутисьні: це програма виробника
option bytes0x1FFFF800, 16 байтрівень захисту й налаштування кристалатак — значення й що вони означають
ідентифікатор кристала, розмір флеш0xE0042000, 0x1FFFF7CCточна модельтак
унікальний номер кристала0x1FFFF7AC, 12 байтоднозначно визначає саме цей кристалні — приватне
EEPROM 24C08WPчастина 1налаштування й лічильникиза правилом частини 1
вбудований завантажувач STсистемна пам'ятьоднаковий на всіх таких кристалах — зберігати не треба—

Що можна робити, нічого не зіпсувавши

Можна (лише читання)Навіщо
читати ідентифікатор, розмір флеш, option bytesзнати, що за кристал і як він налаштований
читати флеш-пам'ять і оперативну пам'ятькопія прошивки; стан змінних під час роботи
читати регістри периферії (GPIO, таймери, налаштування UART; регістри даних UART і SPI не читати — читання скидає їхні прапорці)дізнатися, які виводи працюють як ШІМ для інвертора, який UART іде до панелі
halt / resumeзупинити програму, щоб подивитись стан, і продовжити
розбирати копію прошивки на комп'ютері (Ghidra: ARM Cortex-M, база 0x08000000)знайти, як плата приймає команду «крути насос», і параметри ШІМ
Не можна: зіпсує щось, часом назавждиЩо станеться
зняти захист рівня 1 (stm32f1x unlock, зміна RDP на 0)стирається вся прошивка
встановити рівень 2налагодження вимикається назавжди, повернути неможливо
flash erase…, flash write…, program, «Erase», «Program», «Download»стирання або заміна прошивки
змінювати option bytes (stm32f1x options_write)можна ввімкнути захист або змінити поведінку кристала
подати на плату мережу, поки під'єднано Pi чи програматормережева напруга на Pi й комп'ютер

Правило кроку: усі команди тут лише читають. Якщо програма пропонує щось стерти, записати чи «розблокувати» — відповідь «ні».

Що ми прочитали

Читали клоном ST-Link V2, під'єднаним до падів X20: пад 1 — SWCLK, пад 2 — SWDIO, пад 5 — GND, пад 6 — 3,3 В. Плату живив сам ST-Link. Пади 3 (NRST) і 4 не під'єднували: скидання не знадобилось. Команди — ті, що в розділі копія, у консолі STM32CubeProgrammer v2.23.

ЩоРезультат
напруга плати (від ST-Link)3,26 В
ідентифікатор кристала0x422, ревізія Y: родина STM32F302xB/xC і F303xB/xC, ядро Cortex-M4
флеш-пам'ять256 КБ (0x1FFFF7CC = 0x0100)
захист від читання (RDP)0xAA — рівень 0, захисту немає
захист від записувимкнений на всіх ділянках
option bytesaa 55 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 ff 00 — заводські значення
копія прошивкизбережено: дві копії по 256 КБ, однакові байт у байт; ≈ 33 с кожна
копія option bytesзбережено, 16 байт

Маркування не збігається з кристалом. На корпусі — STM32F301 VCT6, а кристал відповідає як STM32F302/F303 на 256 КБ (у лінійці F301 ідентифікатор 0x439 і щонайбільше 64 КБ). Схоже, мікросхему маркували на замовлення виробника плати. Для роботи з нею беремо документацію на STM32F302VC / F303VC. За блоками, які вмикає прошивка (таймер TIM8, шість компараторів, чотири підсилювачі), це, найімовірніше, саме STM32F303xC — див. третю частину. Розкладку виводів це теж підтверджує: SWD справді на виводах 72 і 76, як у F303VC.

Що зберегли, крім прошивки: option bytes (16 байт), ідентифікатор і розмір флеш-пам'яті, а також унікальний номер кристала (0x1FFFF7AC, 12 байт). Унікальний номер — лише в приватних нотатках: він однозначно визначає саме цей кристал. Прочитати його можна так:

STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x1FFFF7AC 12

Саму прошивку в статтю не викладаємо: це програма виробника. Що в ній — у третій частині.

Що далі

  1. Копія є, тож тепер можна спокійно розбирати прошивку — у третій частині: з чого вона складається, які блоки кристала працюють, як плата спілкується з панеллю і яка нам із цього користь.
  2. Пади 3 і 4 роз'єму X20 прозвонено (NRST і PB4) — див. таблицю вище.
  3. EEPROM і решта плати — у першій частині.

Безпека

  • Не вмикати плату в мережу, поки під'єднано ST-Link чи Raspberry Pi. Плата не розв'язана з мережею: мережева напруга потрапить на USB комп'ютера.
  • Конденсатор шини тримає ~325 В від кількох секунд до кількох хвилин після вимкнення. Перед тим як торкатися плати, яка була в мережі, — виміряти напругу на ньому.
  • Лише читання. Якщо програма пропонує щось стерти, записати чи «розблокувати» — відповідь «ні».

Журнал змін статті

  • 2026-11-10 — перша чернетка: виділено з першої частини (крок 2 — STM32); додано програми й драйвери, порядок дій, команди консолі, результати читання нашої плати, звірку X20 з відкритим описом.
  • 2026-11-10 — пади 3 і 4 X20 прозвонено: 3 — NRST через 220 Ом, 4 — вивід 90 (PB4); фото прозвонки; схеми ST-Link і Raspberry Pi оновлено.