Плата посудомийки Bosch SWS4118: копія прошивки STM32 через ST-Link (частина 2)
Друга частина про плату посудомийки 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+, розписано в згорнутому блоці нижче.
Де шукати виводи
| Вивід | Сигнал | Для чого | Потрібен для читання |
|---|---|---|---|
| 72 | PA13 — SWDIO | дані налагоджувача | так |
| 76 | PA14 — SWCLK | такт налагоджувача | так |
| 14 | NRST | скидання | бажано: допомагає, якщо зв'язок не встановлюється |
| 99, 74 | VSS | GND | так (будь-яка точка GND плати) |
| 100, 75 | VDD | 3,3 В | живлення плати |
| 94 | BOOT0 | вибір завантаження | ні, не чіпати |
| 68, 69 | PA9, PA10 | USART1: вбудований завантажувач 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 | вивід 76 | SWCLK (PA14) |
| 2 | вивід 72 | SWDIO (PA13) |
| 3 | вивід 14 | NRST (скидання) — не напряму, а через резистор 220 Ом (маркування 221) |
| 4 | вивід 90 | PB4 (у JTAG це NJTRST); прошивка тримає його входом, на живій платі на ньому логічна 1 |
| 5 | GND | спільний провід |
| 6 | 3,3 В | шина живлення 3,3 В |
Тобто X20 — це роз'єм налагодження: SWD і скидання вже на ньому, і до падів X20 зручно під'єднатися щупами чи припаяти дроти.
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 | 1 | вивід 76 (PA14) |
| SWDIO | 2 | вивід 72 (PA13) |
| GND | 5 | GND |
| 3,3 В | 6 | шина 3,3 В |
| RST | 3 | NRST, вивід 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+, контакт | Сигнал Pi | На платі |
|---|---|---|
| 22 | GPIO25 | SWCLK — пад X20 1, вивід 76 |
| 18 | GPIO24 | SWDIO — пад X20 2, вивід 72 |
| 20 | GND | GND — пад X20 5 |
| 12 | GPIO18 | NRST — пад 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 нижче.
Програми й драйвери
| Що | Де взяти | Для чого |
|---|---|---|
| STM32CubeProgrammer | st.com: STM32CubeProg — безкоштовно; для завантаження потрібен обліковий запис ST | читання флеш-пам'яті й option bytes; є і вікно, і консольна програма STM32_Programmer_CLI |
| драйвер ST-Link для Windows | ставиться разом зі STM32CubeProgrammer; окремо — STSW-LINK009 | щоб Windows бачила ST-Link |
| OpenOCD | Linux: sudo apt install openocd; Windows: збірки xPack OpenOCD | вільна альтернатива; працює і з ST-Link, і з Raspberry Pi |
| Ghidra | ghidra-sre.org | розбір копії прошивки на комп'ютері |
На Windows консольна програма після встановлення лежить тут:
C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin\STM32_Programmer_CLI.exe
Далі в командах пишемо просто STM32_Programmer_CLI: або додайте теку bin у PATH, або запускайте з неї.
Порядок дій коротко:
- Плата — без мережі. ST-Link під'єднати до X20 за схемою вище, потім — у USB.
- Перевірити, що комп'ютер бачить ST-Link:
STM32_Programmer_CLI -l st. Програма покаже ST-Link, версію його прошивки й серійний номер (якщо публікуєте вивід, номер краще прибрати). - Перевірити захист:
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -ob displ. РядокRDPзі значенням0xAA (Level 0, no protection)означає: захисту немає, прошивку можна прочитати. Що означають інші значення — у наступному розділі. - Прочитати прошивку двічі й порівняти копії — розділ Якщо захисту немає — копія.
Чи можна зберегти прошивку
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 16 | option bytes — налаштування кристала | перший байт aa — рівень 0 |
| Що вийшло | Рівень | Що це означає | Що робимо |
|---|---|---|---|
біти 2–1 = 00, перший байт option bytes aa | 0 | захисту немає | зберігаємо всю флеш-пам'ять (нижче) |
біти 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» — однакові), у Linuxcmp 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 bytes | 0x1FFFF800, 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 bytes | aa 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
Саму прошивку в статтю не викладаємо: це програма виробника. Що в ній — у третій частині.
Що далі
- Копія є, тож тепер можна спокійно розбирати прошивку — у третій частині: з чого вона складається, які блоки кристала працюють, як плата спілкується з панеллю і яка нам із цього користь.
- Пади 3 і 4 роз'єму X20 прозвонено (NRST і PB4) — див. таблицю вище.
- 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 оновлено.