Открытое чтение без регистрации · демонстрационные уроки помечены отдельно
Программа завершена

Embedded C: ESP32, STM32 и надёжная прошивка

60 учебных разборов от архитектуры и периферии до устойчивости, безопасности и долговечности данных. Русский оригинал, полный английский перевод и отдельно отмеченная практика Egorov Learn. Примеры требуют адаптации к конкретной плате; компиляция и испытания на оборудовании не заявляются.

Объяснения: русскийОпубликованных уроков: 60
Начать чтение

Офлайн-чтение

Собрать PDF

Embedded C: ESP32, STM32 и надёжная прошивка

Сохраняется опубликованный выпуск с текстом, примерами и изображениями. Ваш локальный прогресс в файл не входит.

Что включить

Выбрано уроков: 60. Максимум за один раз: 60. Порядок совпадёт с программой.

Посмотреть программу

Чему посвящён курс

  • Проектировать границы драйверов, сервисов и state machines.
  • Разбирать тайминги, ownership, recovery и условия корректности.
  • Формулировать воспроизводимые проверки и критерии для собственной платы.

Что понадобится знать

  • Базовый C: указатели, структуры, unsigned arithmetic и время жизни объектов.
  • Представление о GPIO/UART и задачах FreeRTOS.

Инструменты и оборудование

  • Для чтения и интерактивной самопроверки оборудование не требуется.
  • Для выполнения исходных заданий: конкретная ESP32/STM32 плата, соответствующий SDK, документация чипа и выбранные измерительные инструменты.

Последовательные шаги

Программа курса

Учебных уроков: 60

Модуль 01

Архитектура, FreeRTOS и промышленные входы

Разделение ответственности, события, очереди, watchdog и обработка входных сигналов.

10 уроков
  1. 01

    Урок 1. Прошивка - это не while(1), а система

    Как правильно мыслить embedded-прошивку: слои, события, драйверы и сервисы. Главная идея: прошивка для ESP32 или STM32 - это не один большой файл с GPIO, UART и таймерами, а маленькая система, где каждый блок отвечает за свою область. Типичный набор подсистем в реальном проекте:

  2. 02

    Урок 2. ESP-IDF project structure: как разложить прошивку по компонентам

    Структура ESP-IDF проекта: как правильно делить код на components, что класть в main, как оформлять CMakeLists.txt, где хранить пины платы, где держать бизнес-логику, а где - драйверы. Предыдущий урок был про архитектурное мышление. Сегодня переводим это в реальную структуру ESP-IDF проекта.

  3. 03

    Урок 3. FreeRTOS tasks: как не превратить прошивку в хаос из потоков

    Как проектировать задачи FreeRTOS в ESP-IDF: сколько задач нужно, какие у них должны быть ответственности, как выбирать приоритеты, где использовать очереди, а где не плодить лишние потоки. Главная мысль: FreeRTOS task - это не “просто поток”. Это владелец конкретной ответственности во времени.

  4. 04

    Урок 4. FreeRTOS queues, event groups и task notifications

    Три главных механизма связи между задачами FreeRTOS:

  5. 05

    Урок 5. Watchdog: защита, а не враг

    Watchdog в ESP32/ESP-IDF и STM32: зачем он нужен, какие бывают виды, почему он срабатывает, как правильно “кормить” watchdog и почему плохая идея вставлять esp_task_wdt_reset() куда попало. Главная мысль: Watchdog - не костыль от зависаний, а диагностический механизм, который показывает, что архитектура задачи нарушена.

  6. 06

    Урок 6. State machine для Quectel EC25

    Машина состояний для Quectel EC25: AT-команды, OK, ERROR, URC, таймауты, MQTT/TCP/UDP reconnect и восстановление связи. Главная мысль: Модем нельзя обслуживать как последовательность send_at(); delay();. Модем должен быть отдельным сервисом со своим состоянием, очередью запросов, таймаутами и восстановлением.

  7. 07

    Урок 7. UART parser для AT-команд

    UART-парсер для AT-модема Quectel EC25: поток байтов, сборка строк, отделение ответов на команды от URC, обработка OK, ERROR, +CME ERROR, +QMTOPEN, +QMTCONN, +QMTSTAT, переполнение буфера и частичные сообщения. Главная мысль: AT-парсер не должен “ждать строку OK”. Он должен непрерывно разбирать поток, в котором ответы на команды и асинхронные URC могут перемешиваться.

  8. 08

    Урок 8. GPIO и strapping pins ESP32

    GPIO-ограничения ESP32/ESP32-C3 и правила выбора пинов: strapping pins, UART0, flash/PSRAM- пины, JTAG/SWD, input-only GPIO, ADC2 при Wi-Fi, оформление board_pins.h. Главная мысль: В embedded нельзя выбирать GPIO только по принципу “свободная ножка”. У каждой ножки есть история: загрузка, flash, отладка, аналоговые ограничения, подтяжки, sleep/wakeup и периферийные функции.

  9. 09

    Урок 9. Входы через оптопары

    Дискретные входы через оптопары: что реально происходит между внешним сигналом 220 В / 24 В / 12 В и GPIO ESP32/STM32, почему на выходе могут быть пульсации, дребезг, задержки, ложные фронты. Главная мысль: Оптопара не превращает внешний сигнал в идеальный логический уровень. Она превращает его в ток через светодиод, затем в ток фототранзистора, а уже потом схема подтяжки и фильтрации делает уровень для MCU.

  10. 10

    Урок 10. Детектирование 220 В AC после оптопары

    Алгоритм детектирования фазы светофора по AC-сигналу после оптопары: окно импульсов, стабильность, подавление ложного OFF и правильный timestamp. Главная задача: Отличать реальное включение/выключение фазы от пульсаций 50/100 Гц, кратких пропаданий, помех и переходных состояний.

Модуль 02

Периферия ESP32 и STM32

Таймеры, GPIO, UART/RS-485, DMA, ADC, CAN и диагностические ограничения.

10 уроков
  1. 11

    Урок 11. ADS1115, GPIO-расширители и компараторы: что выбрать для входов светофора

    Выбор входного фронт-энда: оптопара -> GPIO, оптопара -> GPIO-расширитель, оптопара -> ADS1115, оптопара -> компаратор/Schmitt trigger -> GPIO. Главная мысль: ADS1115 измеряет, GPIO-расширитель расширяет, компаратор/Schmitt очищает сигнал.

  2. 12

    Урок 12. Таймеры ESP32 и STM32: когда vTaskDelay() уже недостаточно

    Разница между vTaskDelay(), vTaskDelayUntil(), esp_timer, GPTimer, RMT, MCPWM/LEDC на ESP32 и TIM/Input Capture/Output Compare/DMA на STM32. Главная мысль: vTaskDelay() не является точным физическим таймером.

  3. 13

    Урок 13. STM32 Clock Tree: почему без RCC непонятны таймеры, UART, ADC и CAN/RS-485

    STM32 clock tree: HSI/HSE, PLL, SYSCLK, HCLK, APB1/APB2, kernel clocks, prescaler’ы и реальные частоты периферии. Главная мысль: если не знаешь частоту периферии, не знаешь её реальное поведение.

  4. 14

    Урок 14. STM32 GPIO и EXTI: как правильно принимать дискретные сигналы

    GPIO modes, pull-up/pull-down, floating input, push-pull/open-drain, output speed, alternate function, analog mode и EXTI. Главная мысль: GPIO на STM32 - это не просто 0/1, а настраиваемый электрический узел.

  5. 15

    Урок 15. STM32 UART/USART и RS-485: промышленная последовательная связь без потерь байтов

    UART/USART, RX через interrupt/DMA/ring buffer, RS-485 DE/RE, half-duplex, Modbus RTU timing. Главная мысль: UART - поток байтов; RS-485 добавляет управление направлением передачи.

  6. 16

    Урок 16. DMA и буферы: почему ускорить через DMA - это отдельная архитектура памяти

    DMA, circular buffers, half-transfer/complete callbacks, UART RX DMA, ADC DMA, cache coherency. Главная мысль: DMA - это отдельный участник системы, который читает/пишет память параллельно CPU.

  7. 17

    Урок 17. ADC на STM32 и ESP32: почему 12 бит не означает точные 12 бит

    ADC: sampling time, source impedance, calibration, oversampling, DMA scan, min/max/avg и диагностика. Главная мысль: ADC измеряет результат схемы выборки, а не идеальное напряжение.

  8. 18

    Урок 18. CAN/FDCAN на STM32 и TWAI на ESP32: промышленная шина без random bus-off

    CAN/FDCAN/TWAI: bit timing, sample point, arbitration, termination, transceiver, filters, error counters, bus-off recovery. Главная мысль: CAN - не UART, а многомастерная шина с арбитражем, ошибками, приоритетами ID и строгой физикой.

  9. 19

    Урок 19. Watchdog и health monitoring: прошивка должна диагностируемо восстановиться

    Hardware watchdog, task watchdog, heartbeat, progress counters, reset reason, panic/core dump, fault snapshot, recovery. Главная мысль: watchdog кормят только тогда, когда вся система действительно здорова.

  10. 20

    Урок 20. Логи и диагностика в production-прошивке: как не убить real-time красивыми сообщениями

    Log levels, rate limit, event ring buffer, breadcrumbs, fault snapshot, binary events, UART/MQTT/CAN telemetry, CLI diag/events/health. Главная мысль: логирование само может стать причиной задержек, переполнений и watchdog reset.

Модуль 03

Надёжность, обновления и тестирование

Fault domains, конфигурация, OTA, CI/HIL, unit tests, fuzzing и синхронизация.

10 уроков
  1. 21

    Урок 21. Fault handling и safe degraded modes

    Разбираем обработку отказов и безопасные деградированные режимы:

  2. 22

    Урок 22. Конфигурация, NVS и Flash settings

    Главная мысль: конфигурация - это часть прошивки. Если параметры в Flash испортились, устарели или не подходят новой версии firmware, устройство должно не зависнуть, а загрузиться с безопасными defaults и понятно сообщить причину.

  3. 23

    Урок 23. Безопасное OTA через EC25 с rollback

    Главная мысль: OTA заканчивается не тогда, когда файл записан во Flash, а когда новая прошивка загрузилась, прошла самодиагностику и сохранила возможность следующего обновления.

  4. 24

    Урок 24. CI/CD для firmware-релизов

    Строим путь прошивки от коммита до безопасного релиза:

  5. 25

    Урок 25. Unit-тестирование embedded-кода без платы

    Как отделить прикладную логику от ESP-IDF, STM32 HAL и реального железа, чтобы запускать сотни тестов на Linux/Windows за секунды. Правильная цепочка:

  6. 26

    Урок 26. Fuzzing и property-based testing

    Главная мысль: unit-тест проверяет придуманный тобой сценарий. Fuzzer пытается найти сценарий, о котором ты не подумал.

  7. 27

    Урок 27. Гонки данных, deadlock и priority inversion

    Главная мысль: лучший способ защитить общий ресурс - по возможности вообще не делить его между задачами. Назначь ресурсу одного владельца, а остальные задачи пусть отправляют ему команды и события.

  8. 28

    Урок 28. Архитектура прерываний

    Главная мысль: ISR должна быстро зафиксировать аппаратное событие, очистить источник прерывания, передать минимальную информацию задаче и завершиться. Парсинг, фильтрация, recovery, логирование и работа с сетью выполняются не в ISR.

  9. 29

    Урок 29. DMA, кольцевые буферы и cache coherency

    Главная мысль: DMA решает проблему перемещения байтов, но не решает проблему владения буфером. Надёжность появляется только тогда, когда в каждый момент известно, кто имеет право читать или изменять конкретную область памяти.

  10. 30

    Урок 30. Аппаратные таймеры, Input Capture и Output Compare

    Главная мысль: если момент фронта или длительность импульса важны, событие должно фиксироваться или формироваться аппаратным таймером. Задача FreeRTOS должна обрабатывать уже готовый timestamp.

Модуль 04

Время, безопасность и устойчивость аппаратуры

Timestamp, Modbus framing, crash diagnosis, MPU, TrustZone, TLS, команды и питание.

10 уроков
  1. 31
  2. 32

    Урок 32. UART/RS-485 и Modbus RTU: half-duplex, управление DE, framing и надёжный транспорт поверх DMA

    Сегодня разбираем промышленный последовательный транспорт:

  3. 33

    Урок 33. Low-level отладка HardFault и аварий ESP32: найти причину, а не только место падения

    Сегодня разбираем диагностику аварий, возникающих из-за:

  4. 34
  5. 35
  6. 36

    Урок 36. TLS, PKI и жизненный цикл сертификатов: защищённые MQTT/HTTPS через ESP32 и EC25

    Сегодня разбираем защищённую связь устройства с сервером:

  7. 37
  8. 38

    Урок 38. Детерминированное управление памятью: static allocation, object pools и защита от фрагментации heap

    Сегодня разбираем, как спроектировать прошивку, которая не начинает случайно падать через недели непрерывной работы из-за памяти:

  9. 39
  10. 40

    Урок 40. EMC/ESD и защита промышленных входов: как не маскировать плохую схемотехнику программным debounce

    Сегодня разбираем устойчивость платы к электромагнитным помехам и электрическим переходным процессам:

Модуль 05

Инженерия production-прошивки

FSM, бинарные протоколы, fault injection, observability, release provenance и identity.

10 уроков
  1. 41

    Урок 41. Конечные автоматы в embedded-системах

    Конечный автомат, или FSM, описывает подсистему как набор допустимых состояний, событий и переходов:

  2. 42

    Урок 42. Собственный бинарный протокол

    Проектируем бинарный протокол поверх UART, RS-485, TCP, UDP, CAN FD, MQTT binary payload и HIL-связи с Raspberry Pi. Основные темы:

  3. 43

    Урок 43. Fuzzing и property-based testing

    Проверяем parser не только ручными тестами, а миллионами случайных и полуслучайных входов:

  4. 44

    Урок 44. Fault injection и chaos testing

    Главная мысль: надежность не доказывается наличием if (err). Нужно воспроизводимо вызвать ошибку и проверить, что recovery ограничена, наблюдаема и не повреждает данные.

  5. 45

    Урок 45. Наблюдаемость и postmortem-анализ

    Строим систему, которая после reset отвечает:

  6. 46

    Урок 46. Воспроизводимые release-сборки и provenance

    Главная мысль: version=1.8.0 недостаточно. Полная идентичность прошивки - это source, configuration, dependencies, toolchain и хеш конкретного артефакта.

  7. 47

    Урок 47. Secure Boot, Flash Encryption и anti-rollback

    Главная мысль: это разные механизмы, включать их нужно в правильном порядке.

  8. 48

    Урок 48. Уникальная идентичность устройства и provisioning

    Главная мысль: у каждого устройства должна быть собственная криптографическая идентичность. Производственная станция не должна записывать один общий пароль или private key на весь парк.

  9. 49

    Урок 49. Защищенные удаленные команды

    Главная мысль: mTLS/MQTT подтверждает канал, но устройство все равно должно проверить автора команды, адресата, свежесть, полномочия и допустимость операции сейчас.

  10. 50

    Урок 50. Latency budget и планирование времени в FreeRTOS

    Переходим от «в среднем работает быстро» к вопросу:

Модуль 06

Память, конкурентность и долговечность данных

DMA ownership, SPSC, snapshots, replay, contracts, recovery и сохранность Flash.

10 уроков
  1. 51

    Урок 51. DMA, cache coherency и zero-copy

    DMA позволяет периферии читать и писать RAM без участия CPU. Это удобно для ADC, UART, SPI, CAN, Ethernet и больших потоков данных, но появляется новая проблема: кто сейчас владеет буфером и видят ли CPU и DMA одинаковую версию данных. Типовой путь:

  2. 52

    Урок 52. Lock-free SPSC ring buffer

    SPSC означает Single Producer / Single Consumer. Это кольцевой буфер, где ровно один producer пишет head, а ровно один consumer пишет tail. Он подходит для быстрых путей:

  3. 53

    Урок 53. RCU, immutable snapshots и double-buffered configuration

    Нужно обновлять конфигурацию, пока realtime-задачи продолжают её читать. Например:

  4. 54

    Урок 54. Event sourcing и deterministic replay

    Идея: записывать не произвольный лог, а входные события de- terministic core, чтобы потом точно воспроизвести поведение FSM на ПК.

  5. 55

    Урок 55. Property-based testing и state-machine fuzzing

    Unit test проверяет конкретный сценарий. Property-based test- ing проверяет законы системы на множестве автоматически сгенерированных сценариев.

  6. 56

    Урок 56. Design by Contract в embedded C

    Design by Contract формализует правила системы прямо в коде:

  7. 57

    Урок 57. Fault containment и supervisor architecture

    Когда ошибка обнаружена, не всегда нужно перезагружать весь MCU. Строим recovery ladder:

  8. 58

    Урок 58. Brownout, power-fail transactions и crash-consistent storage

    Строим storage, который переживает внезапное отключение питания в любой точке update transaction. Главная мысль: после power loss допустим OLD или NEW, но никогда HALF-NEW.

  9. 59

    Урок 59. Wear, endurance и write amplification Flash

    После crash consistency нужно посчитать ресурс Flash. Ресурс расходуют physical program/erase operations, а не размер переменной сам по себе. Главная мысль: запись 4 байт раз в секунду может превратиться в сотни миллионов logical updates за 10 лет.

  10. 60

    Урок 60. Data retention, ECC, scrubbing и latent corruption

    Endurance — это сколько раз можно erase/program. Retention