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

Плата посудомийки Bosch SWS4118: що вміє прошивка і яка з неї користь (частина 3)

Опубліковано 12.11.2026
Зміст статті 8
  1. Що це за плата
  2. Як ми розбирали
  3. З чого складається прошивка
  4. Що прошивка вмикає на кристалі
  5. Як плата спілкується з панеллю: D-Bus
  6. Яка нам із цього користь
  7. Що далі
  8. Журнал змін статті

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

  • що це за плата в посудомийці і з ким вона спілкується;
  • з чого складається прошивка: завантажувач і основна програма;
  • які блоки мікроконтролера вона вмикає — прочитано з живої плати, лише читанням;
  • два трифазні інвертори, захист від перевантаження струмом, таблиці датчиків температури, самоперевірка;
  • як плата спілкується з панеллю — шина D-Bus;
  • яка нам із цього користь і що робимо далі.

чернетка — перший розбір, дописуємо

⚠ Усе тут прочитано без жодного запису. Прошивку розбирали на комп'ютері з копії, а налаштування блоків мікроконтролера — читанням регістрів, коли плату живив ST-Link від USB (3,3 В, без мережі).

Що це за плата

Проєкт hn/bsh-home-appliances описує силові модулі посудомийок Bosch серії EPG700xx: той самий мікроконтролер STM32F301VCT6 у корпусі на 100 виводів, на частині плат — той самий інвертор FSB50550AB, налагоджувальний роз'єм X20. Схоже, наша плата з цієї родини. (Сам кристал за ідентифікатором — STM32F302/F303, див. другу частину; а за блоками, які вмикає прошивка, — TIM8, шість компараторів, чотири підсилювачі — найімовірніше, саме STM32F303xC: у F302 таймера TIM8 немає.)

За тим описом це головний блок керування мийкою (адреса 1 на шині): саме він виконує програму миття, керує ТЕНом, насосами й клапанами. Панель із кнопками — окремий вузол (адреса 2), вона лише надсилає йому команди: яку програму вибрано, які опції. Спілкуються вони через внутрішню шину D-Bus — про неї нижче.

Для нас це важливо: команда «крути насос» народжується не в панелі, а в самій цій прошивці, коли вона виконує програму миття.

Як ми розбирали

ЩоЧимНавіщо
копія прошивки (256 КБ)дизасемблер Capstone (бібліотека для Python) — для першого поглядупобачити структуру, таблиці, звертання до блоків
налаштування блоків мікроконтролераSTM32_Programmer_CLI з ключем -r32 — читання регістрів на живій платідізнатися, що прошивка насправді ввімкнула
глибший розбір (далі)Ghidra: ARM Cortex, little endian, база 0x08000000обробники команд, логіка програми

Регістри читали так (кожна команда лише читає; вивід — шістнадцяткові слова). GPIO читали для кожного порту з кроком 0x400, тут показано один — GPIOE:

STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x40021000 0x20
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x48001000 0x28
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x40012C00 0x50
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x40013400 0x50
STM32_Programmer_CLI -c port=SWD mode=HOTPLUG freq=100 -r32 0x40013800 0x14
АдресаЩо там
0x40021000RCC — тактування
0x48000000…0x48001400GPIOA…GPIOF — режим кожного виводу (крок 0x400)
0x40012C00, 0x40013400таймери TIM1 і TIM8 — ШІМ інверторів
0x40013800USART1 — лише регістри налаштувань, до 0x10 включно
0x4001001C…0x40010044компаратори й операційні підсилювачі
0x40007400ЦАП

⚠ Регістри даних послідовних портів (у USART1 — з 0x24) не читаємо: саме читання скидає в них прапорці й може загубити байт, який плата якраз приймає.

З чого складається прошивка

Ділянка флеш-пам'ятіРозмірЩо там
0x08000000–0x08000433≈ 1 КБзавантажувач (займає першу сторінку 2 КБ)
0x08000800–≈0x0801E000≈ 118 КБосновна програма: таблиця переривань, код, таблиці
0x0802C000–0x0803400032 КБдані: налаштування, зокрема заводська копія блоку 1 EEPROM
від 0x08038000≈ 200 байтще трохи даних
решта≈ 100 КБпорожньо (FF)

Завантажувач

На самому початку стоїть рядок EDS_ST_STM32F3_02_210313 — схоже на назву й дату збірки (13.03.2021). Що робить завантажувач після ввімкнення:

  1. Вмикає кварцовий генератор і множник частоти ×3. Якщо кварц на 8 МГц (зовні ще не перевірили), це 24 МГц.
  2. Налаштовує послідовний порт USART1 на виводах PE0/PE1 (виводи 97 і 98): 9600 бод, 8 біт з парністю (на 24 МГц дільник 2500 дає рівно 9600 — ще один аргумент за кварц 8 МГц).
  3. Надсилає байт 0x54 і ≈ 30 мс чекає відповіді (до 1 с, якщо попередній запуск попросив довше).
  4. Якщо відповіді немає — ставить в оперативній пам'яті позначку 55 AA і перезапускає кристал сторожовим таймером. Наступний запуск бачить позначку й одразу передає керування основній програмі.
  5. Якщо відповідь є — приймає команди:
Байт командиЩо робить (за нашим розбором)
0x0Aперевірка зв'язку — відповідає 0x8A
0x5Bвіддає рядок версії (EDS_ST_…, 32 байти)
0x77задає адресу (найімовірніше, куди приймати дані)
0x04змінює швидкість порту
0x1Aзапускає код із заданої адреси

Сам завантажувач у флеш-пам'ять не пише: схоже, оновлення працює так — у оперативну пам'ять приймається програма-записувач, і вже вона переписує основну програму. Тобто прошивку можна оновити через той самий послідовний порт, яким плата спілкується з панеллю (лише формат інший: завантажувач — з парністю, 8E1, основна програма — без неї, 8N1). Ми цього не робимо, але це пояснює, звідки завантажувач на платі.

Основна програма

Таблиця переривань починається з 0x08000800. Крім стандартних, у ній задіяно лише сім обробників — вони одразу показують, що головне в програмі:

ПерериванняЩо це, найімовірніше
ADC1_2готові виміри АЦП: струми фаз і напруга шини — серце керування двигуном
TIM1_UPкожен період ШІМ першого інвертора
TIM1_BRK, TIM8_BRKаварійне вимкнення інверторів
USART1прийом і передавання по шині D-Bus
UART5ще один послідовний порт (див. нижче)
EXTI9_5подія на одному з виводів 5–9 будь-якого порту — що саме, ще не з'ясовано

Програма вміє сама писати у власну флеш-пам'ять (у ній є послідовність розблокування запису) — найімовірніше, саме так вона зберігає налаштування в ділянці 0x0802C000.

Що прошивка вмикає на кристалі

Це прочитано з регістрів живої плати, коли програма вже працювала (плата на 3,3 В від ST-Link, двигуни не під'єднані).

БлокЩо прочиталиЩо це означає
тактуваннякварц × 9, шина APB2 — без дільника, APB1 — /2з кварцом 8 МГц — 72 МГц, найбільша частота цього кристала
USART1 (PE0, PE1)дільник 7500, 8 біт без парності, прийом за перериванням9600 бод, 8N1 — рівно як D-Bus
TIM1 (PE8–PE13)три пари доповняльних виходів, центроване ШІМ, період 1562, мертвий час 2 мкстрифазний інвертор, ШІМ ≈ 23 кГц
TIM8 (PC6–PC8, PC10–PC12)те саме, період 3446другий трифазний інвертор, ШІМ ≈ 10,4 кГц
виходи обох таймерівзагальний дозвіл виходів вимкненийдвигуни зараз стоять — так і має бути без мережі
компаратори COMP1–COMP6усі шість увімкнено, виходи заведено на аварійні входи таймерівзахист від перевантаження струмом: по три на кожен інвертор, по одному на фазу
підсилювачі OPAMP1–OPAMP4увімкненопідсилюють сигнал зі шунтів струму для АЦП
ЦАП, обидва канализначення 1806 з 4095 (≈ 1,46 В)найімовірніше, поріг для компараторів
АЦП 1–4≈ 25 виводів в аналоговому режиміструми, напруги, температури, рівні
TIM2 (PA9, PA10), TIM3 (PB5), TIM4 (PD13, PD15)виводи в режимі таймеравимір імпульсів чи частоти (датчики) або ШІМ — ще не з'ясовано
UART5лише передавання, ≈ 900 бод; на виводи не виведенопризначення невідоме
сторожові таймеринезалежний і віконнийпрограма зависла — кристал перезапускається
блок CRCрахує контрольну суму ділянок флеш-пам'яті під час роботисамоперевірка (див. нижче)

Номери виводів у корпусі на 100 виводів:

СигналиВиводи мікроконтролера
TIM1: PE8–PE1339–44
TIM8: PC6, PC7, PC863, 64, 65
TIM8: PC10, PC11, PC1278, 79, 80
USART1 (D-Bus): PE0, PE197, 98

Два інвертори, а силовий модуль один

Прошивка готова керувати двома трифазними двигунами: обидва таймери налаштовано однаково, в обох — свій захист. На нашій платі стоїть один силовий модуль FSB50550AB. Варіантів два: або другий двигун керується інакше (на іншій платі чи на іншій версії цієї), або ця прошивка — спільна для кількох версій плати. Який таймер іде на FSB50550AB, перевіримо прозвонкою: його входи мають дзвонитися або на виводи 39–44 (TIM1), або на 63–65 і 78–80 (TIM8).

У посудомийках Bosch трифазними безщітковими бувають і циркуляційний насос, і зливний; за описом hn на частині плат FSB50550AB крутить вентилятор сушіння. Що саме крутить наш — з'ясуємо тією ж прозвонкою і роз'ємом, до якого йдуть його виходи.

Векторне керування двигуном

У програмі є таблиця синуса на 256 значень (від −32767 до 32767). Разом із доповняльними виходами ШІМ, вимірюванням струмів через підсилювачі й АЦП і компараторами захисту це типовий набір для векторного керування (FOC) безщітковим двигуном без датчиків положення — так само будує керування й бібліотека двигунів від ST. Двигун при цьому крутиться плавно й тихо, а положення ротора прошивка, найімовірніше, обчислює за струмами.

Датчики температури

У прошивці є дві таблиці перерахунку показів 12-бітного АЦП (0–4095) у градуси. Обидві йдуть від 0 до 125 °C — це терморезистори (NTC), найімовірніше, у воді й на нагрівачі чи силовому модулі.

°CТаблиця 1, АЦПТаблиця 2, АЦП
031473492
1028103244
2024392948
3020622616
4017022268
5013781923
6011011600
708751317
826611029
90548870
100435703
125249416

Чим гарячіше, тим менше число: терморезистор стоїть у нижньому плечі дільника. Між точками прошивка, найімовірніше, рахує лінійно. Для нашого водонагрівача це готова градуювальна таблиця: вимірявши напругу на вході АЦП (за тієї самої схеми дільника), одразу маємо температуру. Точка 82 °C замість 80 — так у таблиці прошивки.

Самоперевірка флеш-пам'яті

Під час роботи програма рахує апаратним блоком CRC контрольну суму ділянок своєї флеш-пам'яті за таблицею діапазонів. Так зазвичай роблять у побутовій техніці, щоб пошкоджена пам'ять не керувала ТЕНом і двигуном.

Наслідок для нас: підправити в оригінальній прошивці навіть один байт не вийде просто так — самоперевірка це помітить. Тож варіантів два: рідна прошивка без змін або цілком своя.

Як плата спілкується з панеллю: D-Bus

Що відомо з опису hn і що збігається з нашим розбором:

ЩоОпис hnУ нашій прошивці
дротитри: GND, DATA, VBUS; у посудомийках VBUS ≈ 13,5 В, DATA — логіка 5 ВUSART1 на PE0/PE1 — ще знайти, куди йде
швидкість і формат9600 бод, 8N1так: дільник 7500 на 72 МГц, без парності
кадрдовжина, адреса й підсистема, команда (2 байти), дані, CRC16 (XMODEM)ще розбираємо
підтвердженняодним байтом одразу після кадруще розбираємо

Адреси вузлів за hn: 1 — блок керування мийкою (наша плата), 2 — панель керування, 0x6 — проєктор часу на підлогу, 0xA/0xB — модулі інтернету. Відомі команди: 17.10-10 xx — вибрати програму миття xx, 17.10-00 — опції, 24.20-06 — індикатори ополіскувача й солі, 25.20-08 — залишок часу.

За hn, деякі вузли вміють віддавати вміст своєї пам'яті прямо через D-Bus. Ми цього не перевіряли — нам уже не потрібно: копія є.

⚠ Усе це описано для плат hn; для нашої ще треба записати справжній обмін між панеллю й платою.

Яка нам із цього користь

Що дізналисяЩо це дає
захисту немає, копія збереженаплату завжди можна повернути до заводського стану — можна сміливо пробувати
завантажувач на послідовному портупрошивку можна оновлювати без розбирання, тими самими трьома дротами
D-Bus: 9600 8N1, відомий формат кадруможна слухати й надсилати команди з ESP32, не змінюючи прошивки
виводи ШІМ, частота, мертвий час, захистусе, що потрібно для своєї прошивки, вже відомо з оригінальної
таблиці NTCготове перерахування температури для водонагрівача
самоперевірка CRCправки в оригінальній прошивці — погана ідея: або вона без змін, або цілком своя
два інвертори в прошивцітреба з'ясувати, який із них іде на наш FSB50550AB

Наш план тепер такий:

  1. Спершу — оригінальна прошивка й D-Bus. Панель у нас є: під'єднуємо плату й панель, слухаємо лінію DATA логічним аналізатором або ESP32 (у проєкті hn є готовий компонент для ESPHome) і записуємо, що надсилає панель, коли вмикаємо програму. Потім пробуємо надсилати ці команди самі. Нічого не стираємо.
  2. Обмеження цього шляху: оригінальна прошивка виконує всю програму миття — чекатиме датчиків рівня й води, клапанів, замка дверцят. Без них вона, найімовірніше, зупиниться з помилкою. Можливо, допоможе сервісний тест — його теж шукатимемо в обміні й у прошивці.
  3. Якщо оригінальна не дасть просто крутити насос — своя прошивка. Залізо вже відоме до виводу; заводська копія лежить поруч, тож повернутись можна будь-коли.

Що далі

  1. Прозвонити входи FSB50550AB: TIM1 (виводи 39–44) чи TIM8 (63–65, 78–80).
  2. Знайти, на який роз'єм ідуть PE0/PE1 (виводи 97, 98) — це лінія D-Bus; виміряти на ньому VBUS.
  3. Знайти кварц і перевірити, що він на 8 МГц: від цього залежать усі частоти вище.
  4. Записати обмін панель ↔ плата.
  5. Ghidra: обробник USART1 (0x0800BA3D) і таблиця команд D-Bus.
  6. З'ясувати, що на виводах таймерів TIM2–TIM4 і на перериванні EXTI9_5 — датчики потоку, рівня, двигуна.

🔒 Ідентифікатори й оригінальні копії: приховано, це бачить лише автор.

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

  • 2026-11-10 — перша чернетка: будова прошивки, завантажувач, блоки кристала з живої плати, два інвертори, таблиці NTC, самоперевірка, D-Bus, користь і план.