38. Сводный каталог проектов
Всё, что в справочнике помечено значком 🔧, — одним списком. Каждый пункт — законченная вещь: её можно собрать на макетке, прошить и увидеть результат. Указано, что понадобится сверх платы, какие интерфейсы задействованы, насколько это сложно и что вы поймёте, сделав. Порядок — по разделам; рекомендуемая последовательность для новичка — в 38.2.
Обозначения
● базовый: один блок, один вечер ●● средний: два-три блока, понимание таймингов ●●● продвинутый: ядро или внешние микросхемы, отладка обязательна B BluePill, STM32F103C8 D Discovery на STM32F407: светодиоды PD12…PD15, ЦАП есть; у Nucleo-F401 светодиод наPA5и ЦАП нетG Nucleo на STM32G474 — для аналоговых блоков и HRTIM Как это называется в документации
Оригинал Перевод debug probe отладочный адаптер (ST-Link, J-Link) logic analyzer логический анализатор operational amplifier (op-amp, OPAMP) операционный усилитель, ОУ shunt resistor шунт — резистор малого сопротивления в цепи тока shift register сдвиговый регистр multiplexer (mux) мультиплексор, «переключатель» EEPROM электрически стираемая постоянная память flyback / freewheeling diode гасящий (обратный) диод
38.1 Каталог
Ядро и системные механизмы
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 7.6 | Кнопка по прерыванию | кнопка, резистор | EXTI, NVIC, GPIO | ● | цепочка «периферия → EXTI → NVIC», сброс флага, дребезг |
| 8.4 | Мигаем светодиодом | ничего: PC13 на B, PD12 на D |
GPIO, RCC | ● | такт порта, регистры CRL/MODER, BSRR против ODR |
| 8.5 | Опрос кнопки | кнопка | GPIO | ● | подтяжка, активный уровень, подавление дребезга по времени |
| 9.5 | Передача по UART через DMA | переходник USB–UART | DMA, USART | ●● | буфер, DMAT, разница между «отправлено» и «ушло» |
| 9.7 | Светодиод дышит без процессора | светодиод с резистором на B; на D не нужен — PD12 |
TIM, DMA | ●● | DMA пишет в регистр другого таймера, темп от второго таймера, циклический режим, работа во сне |
| 11.5 | Запись во встроенную Flash | ничего | FLASH, RCC | ●● | разблокировка, стирание страницы, запись полусловом, где хранить настройки |
| 11.8 | Настройки во Flash журналом | ничего; кнопка «сохранить» по желанию | FLASH | ●● | запись подряд без лишних стираний, номер и CRC-32, устойчивость к пропаданию питания, версия раскладки |
Периферия
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 13.5 | ШИМ | светодиод или сервопривод | TIM, GPIO | ● | PSC/ARR/CCR, удвоение на APB1, MOE у TIM1 |
| 13.10 | Яркость светодиода от энкодера | механический энкодер, светодиод с резистором | TIM, GPIO | ●● | режим энкодера ×4, фильтр входа, разность показаний через ноль, шкала по гамме |
| 14.4 | Одиночное измерение АЦП | потенциометр | ADC | ● | время выборки, калибровка на F1, аналоговый режим вывода |
| 14.6 | Сканирование АЦП с DMA | два-три датчика | ADC, DMA | ●● | скан-режим, кольцевой буфер, volatile на данных DMA |
| 14.9 | Питание и температура без внешних деталей | ничего | ADC | ● | VREFINT, заводские коды F4, пересчёт в целых, самое длинное время выборки |
| 15.4 | Генератор сигнала на таблице | D (у BluePill и F401 ЦАП нет); осциллограф или наушник с резистором | DAC, DMA, TIM | ●● | таблица отсчётов, запуск по таймеру, частота = такт / (точки × период) |
| 15.6 | Электронная нагрузка | D (у BluePill и F401 ЦАП нет); ОУ, MOSFET на радиаторе, шунт 1 Ом | DAC | ●●● | ток задаёт ЦАП через петлю ОУ, буфер ЦАП выключен, мощность греет транзистор |
| 16.3 | Передача по UART | переходник USB–UART | USART | ● | TXE против TC, делитель скорости, терминал |
| 16.5 | Приём пакетов переменной длины | переходник USB–UART | USART, DMA | ●● | обнаружение паузы IDLE, кольцевой буфер, ORE |
| 16.8 | Ведомый Modbus RTU | переходник USB–UART или приёмопередатчик RS-485; ведущий на компьютере | USART, TIM, GPIO | ●● | символ из 11 бит, конец кадра по паузе 3,5 символа, исключения, передатчик по TC |
| 17.4 | Чтение регистра датчика по I²C | любой датчик с I²C | I²C | ●● | старт — адрес — регистр — рестарт — чтение; ADDR и оба SR |
| 17.6 | Оживление залипшей шины I²C | датчик с I²C | I²C, GPIO | ●● | девять тактов вручную, почему ведомый держит SDA |
| 17.8 | Внешняя EEPROM AT24C | микросхема 24C04 или 24C08 | I²C | ●● | запись по страницам, опрос готовности, старшие биты адреса ячейки в адресе устройства |
| 18.5 | Обмен блоком по SPI | любая микросхема с SPI | SPI | ● | CPOL/CPHA, BSY перед снятием CS, полный дуплекс |
| 18.9 | Идентификатор флеш-памяти JEDEC | микросхема SPI Flash | SPI | ● | команда 0x9F, пропуск первого ответа, 0xFF и 0x00 как признаки обрыва |
| 18.11 | Цепочка сдвиговых регистров 74HC595 | две-три микросхемы 74HC595, светодиоды | SPI, GPIO | ● | порядок байтов в цепочке, защёлка после BSY |
| 20.7 | Виртуальный COM-порт: приём команд | кабель USB; на B — подтяжка D+ 1,5 кОм | USB | ●● | пакет — не строка, кольцо между прерыванием и циклом, ввод по символу, USBD_BUSY при передаче |
| 21.9 | Замер времени: счётчик тактов и канал ITM | отладчик с приёмом SWO | DWT, ITM | ● | CYCCNT, отдельный канал для чисел, пакет 0x0B и слово |
| 22.4 | Адресные светодиоды WS2812B | лента или несколько светодиодов, источник 5 В | TIM, DMA | ●● | ШИМ + DMA как генератор кода, тайминг ±150 нс, порядок GRB |
| 22.7 | Индикатор и клавиатура в одном прерывании | четырёхразрядный индикатор, два 74HC595, клавиатура 4×4, транзисторы разрядов | TIM, SPI, GPIO | ●● | динамическая индикация 250 Гц на разряд, строки открытым стоком, антидребезг 20 мс |
FreeRTOS
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 26.4 | Периодическая задача: две версии | светодиод | ядро | ●● | vTaskDelay против xTaskDelayUntil, уплывание периода на числах |
| 26.9 | Кому достаётся процессор | ничего | ядро, учёт времени | ●● | квантование, голодание, ожидание отдаёт время младшим, урезание приоритета после configASSERT |
| 27.7 | Кнопка → очередь → светодиод | кнопка, светодиод | ядро, очередь | ● | тайм-аут очереди как таймер, дребезг, отправка без ожидания и счёт потерь |
| 29.5 | Один обработчик на группу таймеров | три светодиода | таймеры ядра | ●● | идентификатор таймера, демон, ноль ожидания в обратном вызове |
| 29.6 | Сторожевой таймер связи | переходник USB–UART | таймеры ядра, USART | ●● | однократный таймер с перезапуском из прерывания, FromISR |
| 29.7 | Сторож прибора на программном таймере | ничего | таймеры ядра, группа событий, IWDG | ●● | демон жив всегда, отметки задач в группе событий, чтение со сбросом одним вызовом |
| 30.8 | Задача-привратник | переходник USB–UART | ядро, очередь | ●●● | ресурс без мьютекса, запросы из прерываний, отсутствие тупиков |
| 31.5 | Входы и выходы по маске | четыре кнопки, четыре светодиода | ядро, группа событий | ●● | «все» и «любой», признак изменения вместо ожидания маски, правило меняется на ходу |
Внешняя память и файлы
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 41.5 | W25Q128FV: чтение и запись | микросхема SPI Flash | SPI | ●● | JEDEC ID, Write Enable, стирание перед записью, BUSY |
| 41.6 | AT45DB161E: нестандартная микросхема | микросхема с буферной архитектурой | SPI | ●●● | чем «другая» флеш отличается: буферы, размер страницы 528, чтение статуса |
| 42.5 | Работа с файлами через FatFS | карта SD или SPI Flash | SPI, FatFS | ●●● | слой диска, f_mount/f_open/f_write/f_sync, что ломается при выключении |
Аналог, питание и управление
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 44.8 | Защита по току внутри кристалла | G; шунт 10 мОм, ключ, нагрузка до 10 А | OPAMP, COMP, TIM, ADC | ●●● | шунт → усилитель ×16 → компаратор → аварийный вход таймера: ШИМ гаснет без участия программы |
| 46.3 | Понижающий преобразователь 12 → 5 В | G или F334; полумост с драйвером, дроссель, конденсатор | HRTIM | ●●● | 54 400 шагов на период 100 кГц, комплементарная пара с защитным интервалом, аварийный вход |
| 47.6 | Регулятор в коде | RC-цепь 10 мс или нагреватель с датчиком | TIM, ADC | ●● | постоянный период, свой предел накопителя, производная по измерению |
Электроника на макетке
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 49.3 | Резистор для светодиода | светодиод, резистор | GPIO | ● | бюджет напряжений: падение на выводе, резисторе и светодиоде |
| 50.5 | ШИМ плюс RC вместо ЦАП | резистор 10 кОм, конденсатор 1 мкФ | TIM | ● | среднее равно скважности, поверх — пила 82,5 мВ размахом при 1 кГц |
| 51.5 | Ключ на транзисторе для реле | транзистор, реле 12 В, гасящий диод, резистор 510 Ом, источник 12 В | GPIO | ●● | принудительный коэффициент 10…20, ток базы 5 мА, зачем диод на обмотке |
| 60.6 | Расширение выводов сдвиговым регистром | сдвиговый регистр с защёлкой, восемь светодиодов | GPIO или SPI | ● | три вывода на любое число выходов, защёлка, 4 мкс на 32 выхода при 8 МГц |
| 60.7 | Аналоговый мультиплексор перед АЦП | аналоговый мультиплексор на 8 каналов | ADC, GPIO | ●● | сопротивление канала складывается с источником: 4,2 мкс выборки для 100 кОм |
Язык C на камне
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 76.3 | Таблица калибровки | датчик с нелинейной характеристикой | ADC, Flash | ● | таблица const во Flash, двоичный поиск, интерполяция в целых |
Связь
| § | Проект | Железо сверх платы | Блоки | Сложность | Что поймёте |
|---|---|---|---|---|---|
| 93.5 | Радиомодуль LoRa SX1276 | модуль на SX1276 с антенной; для связи — два | SPI, GPIO, EXTI | ●● | регистры радиомодуля: бит LoRa во сне, частота в 64 битах, флаги сбрасываются единицами |
38.2 Рекомендуемый порядок
Для того, кто начинает с нуля на BluePill, — шестнадцать шагов, каждый опирается на предыдущие:
| Шаг | § | Зачем именно сейчас |
|---|---|---|
| 1 | 8.4 | первая прошивка; убедиться, что цепочка «сборка → загрузка → плата» работает |
| 2 | 8.5 | первый вход и первый дребезг |
| 3 | 16.3 | вывод текста в терминал — без него дальше отлаживать нечем |
| 4 | 13.5 | первый таймер, первое понимание частот |
| 5 | 7.6 | первое прерывание; сравнить с опросом из шага 2 |
| 6 | 14.4 | первое измерение; вывести в терминал из шага 3 |
| 7 | 9.5 | первый DMA на уже знакомом UART |
| 8 | 14.6 | DMA на АЦП: два знакомых блока вместе |
| 9 | 16.5 | приём — сложнее передачи; здесь появляются буферы и IDLE |
| 10 | 18.5 | SPI — проще I²C, с него легче начать шины |
| 11 | 17.4 | I²C с реальным датчиком |
| 12 | 11.5 | сохранить настройки, которые набрали за десять шагов |
| 13 | 26.4 | первая задача под ядром — на уже знакомом светодиоде |
| 14 | 29.6 | таймеры ядра на уже знакомом UART |
| 15 | 30.8 | привратник: ядро всерьёз |
| 16 | 42.5 | файлы на карте — венец: SPI, ядро, внешняя память вместе |
После шестнадцатого шага остальное из каталога делается в любом порядке.
38.3 Что нужно иметь
Минимальный набор, покрывающий весь каталог:
| Для чего | |
|---|---|
| BluePill или Nucleo/Discovery | всё; 15.4 и 15.6 — только Discovery на F407 (ЦАП) |
| отладчик ST‑Link (не клон — если нужен SWO) | загрузка, отладка, 21.9 |
| переходник USB–UART | 9.5, 16.x, 29.6, 30.8 |
| приёмопередатчик RS-485 (по желанию) | 16.8 |
| макетка, провода, кнопки, светодиоды, резисторы | 7.6, 8.5, 9.7, 13.5, 26.4, 27.7, 29.5, 49.3 |
| потенциометр; для сканирования — два-три потенциометра или датчика | 14.4, 14.6 |
| механический энкодер | 13.10 |
| кабель USB; на BluePill — резистор 1,5 кОм на D+ | 20.7 |
| четыре кнопки и четыре светодиода | 31.5 |
| ОУ, MOSFET на радиаторе, шунт 1 Ом | 15.6 |
| любой датчик с I²C | 17.x |
| микросхема EEPROM 24C04 или 24C08 | 17.8 |
| микросхема SPI Flash | 18.5, 18.9, 41.x |
| карта SD с переходником | 42.5 |
| лента WS2812B и источник 5 В | 22.4 |
| четырёхразрядный индикатор, клавиатура 4×4, два 74HC595, транзисторы разрядов | 22.7 |
| осциллограф или логический анализатор | 15.4, 22.4, и вообще желательно |
| плата Nucleo на STM32G474 | 44.8, 46.3 |
| шунт 10 мОм, ключ и нагрузка до 10 А; полумост с драйвером, дроссель, конденсатор | 44.8, 46.3 |
| транзистор, реле 12 В, гасящий диод, источник 12 В | 51.5 |
| сдвиговый регистр, аналоговый мультиплексор, резисторы и конденсаторы | 18.11, 47.6, 50.5, 60.6, 60.7 |
| датчик с нелинейной характеристикой | 76.3 |
| два модуля LoRa на SX1276 с антеннами | 93.5 |
Осциллограф — единственная дорогая вещь в списке, и без него можно обойтись почти везде. Но раздел 36 не зря заканчивается словами «осциллограф на линию»: то, что на проводе, а не то, что должно быть, — это ответ на половину вопросов «работает иногда».
38.4 Итоги
- Каталог 38.1 собран из всех подразделов с меткой 🔧 и сверяется с ними при каждом выпуске.
- Порядок 38.2 — шестнадцать шагов от первого светодиода до файлов на карте: каждый опирается на предыдущие.
- Набор 38.3 покрывает весь каталог; осциллограф — единственная дорогая вещь и нужен не всегда.
Дальше: раздел 38а «Вопросы для собеседования: сто вопросов по справочнику с короткими ответами и ссылкой на раздел».