Даташит на 600 страниц за 15 минут: промты, с которыми Arduino, ESP32 и STM32 перестают быть чёрными ящиками
Каждый embedded-разработчик знает это чувство: ты открываешь reference manual на 600+ страниц, ищешь нужный бит в регистре, пролистываешь раздел про I2C, находишь таблицу таймингов — и понимаешь, что прошло два часа, а ты ещё не написал ни строчки кода. По данным Stack Overflow Developer Survey, C и C++ остаются среди самых используемых языков именно в embedded-сегменте, но при этом порог входа в работу с «железом» держится высоким: спецификации STM32 Reference Manual (RM0008 для F1, RM0433 для H7) занимают сотни страниц, а ESP-IDF Documentation обновляется с каждой минорной версией SDK.
Хорошая новость: LLM научились быть неплохим «вторым инженером» — не тем, кто за тебя всё сделает, а тем, кто быстро объяснит, что означает поле BRR в регистре USART, почему DMA не стартует и как уложить ESP32 в deep sleep с пробуждением по таймеру. Ниже — подборка конкретных промтов, которые я и коллеги реально используем в работе с Arduino, ESP32 и STM32. Каждый промт — готов к копипасту, с пояснением задачи и примером.
1. Разбор даташита: превращаем PDF в шпаргалку по регистрам
Задача: быстро понять назначение регистра и его битовых полей, не читая весь раздел.
Промт:
Ты — embedded-инженер, специализирующийся на STM32. У меня есть фрагмент Reference Manual (я вставлю его ниже).
Разбери для меня регистр {ИМЯ_РЕГИСТРА} периферии {USART/I2C/SPI/TIM}:
1. Назначение регистра в 1-2 предложениях.
2. Таблица полей: имя бита, смещение, размер, назначение, допустимые значения.
3. Что произойдёт, если я запишу {конкретное значение} — покажи по шагам.
4. Типичные ошибки при работе с этим регистром.
5. Один рабочий пример на C (bare-metal, без HAL).
Данные из RM:
{вставь фрагмент текста из PDF}
Пример использования: для STM32F407 ты вставляешь описание USART_BRR из RM0090 и просишь разобрать формулу USARTDIV = fCK / (16 * baud). Модель объяснит, почему при 42 МГц и 115200 бод значение мантиссы будет 22, а дробная часть — 13, и даст готовый код установки скорости без HAL.
Источник: STM32F407 Reference Manual RM0090, раздел USART (страницы 981–1040 в редакции Rev 19).
2. Генерация кода прошивки под конкретный MCU
Задача: получить рабочий скелет прошивки под свой чип, а не абстрактный пример.
Промт:
Напиши прошивку для {Arduino Uno / ESP32-WROOM-32 / STM32F103C8T6} на {C / C++ / Arduino framework / ESP-IDF}.
Функциональность:
- Каждые 500 мс читать {датчик, например DHT22 / BME280 / ADC-канал}.
- Публиковать результат по {UART / MQTT / Wi-Fi}.
- Мигать светодиодом на пине {номер} с частотой {Гц}.
Ограничения:
- Не использовать блокирующие delay() — только неблокирующий таймер.
- Объясни каждый include и каждую настройку периферии.
- Покажи, как проверить работу без осциллографа.
Пример: для ESP32 модель сгенерирует код с esp_timer для мигания и esp_mqtt_client для публикации — это соответствует официальным примерам из ESP-IDF (examples/protocols/mqtt/tcp).
3. Настройка периферии: UART, I2C, SPI, PWM, ADC
Задача: не гадать, какие пины и таймеры конфликтуют.
Промт:
Я настраиваю {I2C / SPI / UART / PWM / ADC} на {ESP32 / STM32F4 / Arduino Mega}.
Мои требования: {частота, разрешение, скорость, режим}.
Дай:
1. Таблицу доступных пинов с пометкой конфликтов (какие заняты USB, JTAG, flash).
2. Код инициализации.
3. Что произойдёт, если подключить устройство с {другой адрес / другой частотой} — типичные симптомы.
4. Как проверить логическим анализатором.
Пример: для ESP32 при настройке I2C по умолчанию используются GPIO21 (SDA) и GPIO22 (SCL) — это указано в ESP32 Technical Reference Manual и подтверждено в примерах Arduino-ESP32.
4. Дебаг по логам: «почему не работает»
Задача: найти причину зависания или ошибки по выводу Serial Monitor.
Промт:
Прошивка на {MCU} падает / зависает / выдаёт ошибку. Вот лог:
---
{вставь лог полностью}
---
Вот код, который выполняется в момент сбоя:
---
{вставь релевантный фрагмент}
---
Проанализируй:
1. Наиболее вероятная причина (ранжируй 3 гипотезы).
2. Как проверить каждую гипотезу за 5 минут.
3. Что добавить в логирование, чтобы поймать баг в следующий раз.
4. Исправленный фрагмент кода.
Пример: Guru Meditation Error на ESP32 с LoadProhibited чаще всего означает разыменование NULL-указателя — модель подскажет, где искать, и предложит добавить проверку перед обращением к queue handle.
5. Интеграция с MQTT и Home Assistant
Задача: подключить устройство к умному дому с автодискавери.
Промт:
Напиши прошивку для {ESP32 / ESP8266}, которая:
- Подключается к Wi-Fi {SSID} и MQTT-брокеру {адрес}.
- Публикует показания {датчика} в топик homeassistant/sensor/{name}/state.
- Поддерживает MQTT Discovery для Home Assistant (retain, конфиг-топик).
- Умеет принимать команды в топике homeassistant/switch/{name}/set.
Покажи JSON-конфиг для discovery и объясни каждое поле.
Пример: MQTT Discovery в Home Assistant описан в официальной документации (home-assistant.io/docs/mqtt/discovery) — модель должна сгенерировать конфиг, соответствующий этой спецификации, с полями state_topic, unique_id, device_class.
6. Оптимизация энергопотребления
Задача: батарейное устройство должно работать месяцами.
Промт:
У меня {ESP32 / STM32L4 / Arduino Pro Mini} с питанием от батареи {тип, ёмкость}.
Текущее потребление — {мА}. Целевое — {мА}.
Что я делаю: {перечисли периферию, частоту, режимы}.
Дай пошаговый план оптимизации:
1. Какие режимы сна доступны и их токи (с указанием источника — datasheet).
2. Что отключить в первую очередь.
3. Перепиши мой loop() в неблокирующий с deep sleep.
4. Оцени ожидаемое время работы от батареи.
Пример: у ESP32 в deep sleep ток порядка 10 мкА (по datasheet Espressif), у STM32L4 в Stop 2 — единицы микроампер. Модель должна ссылаться на эти цифры и не выдумывать.
7. Чтение чужого кода и документации
Задача: разобраться в библиотеке или чужом проекте.
Промт:
Объясни, что делает этот код, как будто я джун в embedded:
---
{вставь код}
---
По шагам:
1. Что происходит при старте (setup / init).
2. Какая периферия задействована.
3. Где потенциальные баги и race conditions.
4. Какие функции можно упростить.
Пример: разбор библиотеки Adafruit_BME280 — модель покажет, что begin() делает soft reset через регистр 0xE0, а readPressure() использует компенсационные коэффициенты из даташита Bosch.
8. Таблица сравнения платформ под задачу
Задача: выбрать MCU под проект.
Промт:
Сравни {Arduino Nano / ESP32 / STM32F103 / RP2040} для задачи: {опиши проект}.
Таблица: цена, ядро, частота, RAM, flash, Wi-Fi/BLE, ADC, потребление в сне, экосистема, сложность старта.
В конце — рекомендация с обоснованием.
| Платформа | Ядро | RAM | Wi-Fi | Сон | Старт |
|---|---|---|---|---|---|
| Arduino Nano | ATmega328P, 16 МГц | 2 КБ | нет | ~мкА | простой |
| ESP32 | Xtensa LX6, 240 МГц | 520 КБ | да | ~10 мкА | средний |
| STM32F103 | Cortex-M3, 72 МГц | 20 КБ | нет | единицы мкА | высокий |
| RP2040 | Cortex-M0+, 133 МГц | 264 КБ | нет | низкий | средний |
9. Генерация unit-тестов для прошивки
Задача: тестировать логику без железа.
Промт:
Напиши unit-тесты на {Unity / GoogleTest / PlatformIO} для функций:
{перечисли функции}
Покрой граничные случаи: 0, максимум, переполнение, некорректный ввод.
Покажи, как замокать {ADC / I2C / таймер}.
Пример: для функции пересчёта АЦП в температуру модель сгенерирует тест-кейсы, включая деление на ноль и выход за диапазон.
10. Ревью схемы и поиск проблем
Задача: проверить проект до заказа платы.
Промт:
Вот описание моей схемы (или netlist / список соединений):
{вставь}
MCU: {модель}. Питание: {напряжение}.
Найди:
1. Конфликты пинов (что занято, что перепутано).
2. Проблемы с подтяжками I2C, делителями, питанием.
3. Что проверить мультиметром до включения.
Пример: типичная ошибка — отсутствие pull-up 4.7 кОм на линии I2C. Модель укажет это и предложит номинал.
11. Перевод формул из даташита в код
Задача: не ошибиться в математике таймеров и АЦП.
Промт:
Вот формула из даташита: {формула}.
Переменные: {опиши}.
Напиши функцию на C, которая вычисляет {результат}, с защитой от переполнения и деления на ноль.
Покажи пример вызова и unit-тест.
Пример: расчёт частоты ШИМ для STM32: f_PWM = f_CLK / ((PSC+1)*(ARR+1)) — модель сгенерирует функцию с проверкой диапазонов.
12. Чек-лист перед прошивкой
Задача: не забыть мелочи.
Промт:
Составь чек-лист перед прошивкой {MCU} для проекта {описание}:
- питание и уровни;
- пины и конфликты;
- тактирование и watchdog;
- проверка прошивки;
- что логировать в первом запуске.
Оформи как таблицу с колонками «пункт — как проверить — риск».
Этот промт экономит часы, потому что заставляет модель перечислить типовые грабли: забытый watchdog, неверный уровень 3.3 В вместо 5 В, отсутствие развязки по питанию.
Как использовать эти промты без вреда
LLM не заменяет даташит — она ускоряет навигацию по нему. Правило простое: любое утверждение модели о конкретном регистре, бите или тайминге проверяй по официальному документу (ST RM, Espressif TRM, Microchip datasheet). Промты выше составлены так, чтобы модель сама ссылалась на источник — если она этого не делает, попроси явно: «укажи страницу и раздел». И помни: код, сгенерированный без проверки на реальном железе, — это гипотеза, а не решение. Прошей, залогируй, сними осциллограмму — и только тогда считай задачу закрытой.
Комментарии