0. С чего начать и куда идти
Справочник — не роман: в нём 417 разделов в 27 частях и 25 приложений, и читать его подряд нельзя, да и не нужно. Этот раздел — карта. Здесь сказано, как устроены уровни сложности, какие две платы лежат в основе всех примеров и что купить в первый заход, а дальше — четыре маршрута: с нуля, на средний уровень, в электронику и в сеть. Выберите свой, остальное пусть подождёт. А если справочник открыт впервые и выбирать пока не из чего — сразу раздел 0а: одна дорога из двадцати разделов к первому прибору.
Как это называется в документации
Оригинал Перевод getting started «с чего начать»: вводные документы и первые шаги development board отладочная плата firmware прошивка bare metal «голое железо»: программа без операционной системы RTOS операционная система реального времени breadboard макетная плата, «макетка» prerequisite что нужно знать заранее
0.1 Как устроен справочник: уровни и что пропустить
У каждого раздела в шапке стоит поле уровень — оно и решает, читать раздел сейчас или отложить:
| Уровень | Разделов | Что это значит |
|---|---|---|
| базовый | 64 | читается без подготовки; с этих разделов начинаются маршруты |
| средний | 296 | опирается на базовые разделы своей части; основной объём справочника |
| продвинутый | 52 | внутренности: ассемблер, кадры исключений, загрузчики, ядро ОС |
| справочник | 5 + 25 приложений | не читают подряд, а открывают по мере надобности |
Правило первого чтения простое: идти по маршруту своего уровня и пропускать всё, что уровнем выше. Продвинутый раздел никуда не денется — он станет понятным и нужным, когда упрётесь в то, ради чего он написан.
Второе правило — про буквенные разделы: 2а, 7б, 11а, 132г и им подобные. Это ответвления от родительского номера, углубления в одну тему. При первом чтении пропускаются все: раздел 7 обязателен, разделы 7а–7в ждут, пока прерывания станут привычными.
Внизу каждого раздела есть строка «Дальше:» — это сквозная цепочка через весь справочник, от этого раздела до последнего. Она — для второго прохода или для упрямых; первый проход быстрее и полезнее по маршрутам из 0.3–0.6.
0.2 Две опорные платы и что купить на старт
Все примеры справочника собираются на двух платформах — по их именам подписаны регистровые главы каждого раздела периферии:
| BluePill | Discovery на F407 | |
|---|---|---|
| камень | STM32F103C8 | STM32F407VG |
| ядро | Cortex-M3, 72 МГц | Cortex-M4 с FPU, 168 МГц |
| Flash | 64 КБ | 1 МБ |
| ОЗУ | 20 КБ | 192 КБ: 128 обычных + 64 CCM |
| роль | дешёвая учебная: регистровый уровень | плавающая точка, DSP, быстрый DMA |
| светодиод | PC13, катодом к выводу |
PD12…PD15 |
Вместо Discovery годится Nucleo-F401RE: тот же Cortex-M4 с FPU,
84 МГц, 512 КБ Flash и 96 КБ ОЗУ, отладчик уже на плате — но нет ЦАП,
а светодиод на PA5. Учебный вариант BluePill — NR Blue Kit с
готовой обвязкой. Подробный разбор плат, ревизий и подделок — в 2.6
и 2а.
Ещё ближе к BluePill по цене и размеру — BlackPill от WeAct на STM32F411CE
или F401CC: тот же Cortex-M4 с FPU, 100 или 84 МГц, 512 или 256 КБ Flash,
прошивается по USB заводским загрузчиком без программатора. Нет ЦАП, CAN
и Ethernet, светодиод на PC13, кварц 25 МГц. Плата и перенос примеров
с Discovery — в 2ж.
Первая покупка — пять строк, всё остальное докупается по мере маршрута:
| Зачем | |
|---|---|
| плата: BluePill или Nucleo | всё |
| ST-Link (у Nucleo и Discovery — на плате) | загрузка и отладка |
| переходник USB–UART | терминал: главный инструмент отладки |
| макетка, провода, кнопки, светодиоды, резисторы | первые десять проектов |
| потенциометр | всё про АЦП |
Осциллограф в этот список не входит: он единственная дорогая вещь в хозяйстве и почти везде без него можно обойтись. Полный список железа под каждый проект — в 38.3.
0.3 Маршрут А: с нуля на BluePill
Уровень маршрута: базовый → средний. Двадцать один шаг; каждый — один раздел. У шага две пометки: что из раздела вынести обязательно и что при первом чтении пропустить. Пропущенное не пропадает — к нему возвращают более поздние разделы.
| Шаг | Раздел | Что вынести | Что пока пропустить |
|---|---|---|---|
| 1 | 1 | ядро, память, периферия; карта памяти (1.4) | bit-banding (1.5) и конвейер (1.7) |
| 2 | 2 | маркировка (2.2), выбор платы (2.6), ST-Link (2.7) | замену камня (2.9); раздел 2б |
| 3 | 3 | stdint.h, volatile (3.4), указатель на регистр (3.3) |
продвижение типов (3.5) — глубже в 122 |
| 4 | 3а | четыре действия над битом; чтение-изменение-запись (3а.6) | порядок байтов (3а.8) |
| 5 | 4 | выбрать среду (4.2), поставить, прошить плату (4.9) | сборку без IDE (4.8) — она развёрнута в 4в |
| 6 | 4а | слои программы, паки, Debug и Release | сборку из командной строки (4а.10); если среда — CubeIDE, читайте 4б вместо 4а |
| 7 | 5 | когда регистры, а когда HAL; присваивание против дописки (5.4) | проект из CubeMX (5.7) — до первой работы с ним |
| 8 | 6 | дерево тактов, 72 МГц (6.3); такт периферии включается руками | подстройку HSI (6.8); F0 и G0 (6.7) |
| 9 | 8 | режимы вывода, BSRR; светодиод (8.4) и кнопка (8.5) |
альтернативные функции — вернутся в 13 и 16 |
| 10 | 16 | кадр, скорость, передача в терминал (16.3), уровни (16.7) | Modbus (16.8); приём (16.5) проще после DMA |
| 11 | 13 | PSC/ARR/CCR, теневые регистры, ШИМ (13.5) |
одноимпульсный режим (13.8) и синхронизацию (13.9) |
| 12 | 7 | цепочка EXTI → NVIC, кнопка по прерыванию (7.6) | разделы 7а–7в: это продвинутый уровень |
| 13 | 14 | одиночное измерение (14.4), время выборки, калибровка | сканирование (14.6) — через два шага, вместе с DMA |
| 14 | 9 | канал, приоритет, кольцевой буфер; проекты 9.5 и 14.6 | FIFO у F4 (9.6) — у F1 его нет |
| 15 | 18 | CPOL/CPHA, обмен блоком (18.5) |
режим ведомого — раздел 17а |
| 16 | 17 | старт — адрес — рестарт, датчик (17.4), оживление шины (17.6) | EEPROM (17.8) — когда встретится |
| 17 | 11 | где живут переменные, стек и куча; настройки во Flash (11.5) | свой скрипт компоновщика (4в) и MPU (11а) |
| 18 | 23 | пределы суперцикла; когда ОС не нужна (23.6) | кооперативный планировщик (23.7) — когда суперцикл перестанет читаться |
| 19 | 24 | из чего состоит ядро, что нужно для запуска (24.4) | обёртку CMSIS-RTOS (24.6) |
| 20 | 26 | задача и её стек; vTaskDelay против xTaskDelayUntil (26.4) |
статическое создание (26.8) |
| 21 | 27 | очередь копирует (27.1); кнопка → очередь → светодиод (27.7) | данные переменной длины (27.5) |
С шага 9 читать без платы бессмысленно: параллельно собирайте проекты по порядку 38.2 — шаги маршрута идут с ним в одном порядке. Последние проекты того списка (30.8 и 42.5) остаются на потом: они опираются на разделы уровнем выше. Когда встанет — раздел 36 разбирает отказы по симптомам, от «не собирается» до «работает иногда».
0.4 Маршрут Б: средний уровень на F407
Уровень маршрута: средний → продвинутый. Для тех, кто прошёл маршрут А или пришёл с равным опытом — например, с уверенного Arduino с регистрами. Плата — Discovery на F407: здесь появляются FPU, DSP-библиотека и память, в которую FreeRTOS помещается не считая байтов.
| Шаг | Раздел | Зачем |
|---|---|---|
| 1 | 9 | у F4 DMA другой: потоки вместо каналов (9.2), FIFO (9.6) |
| 2 | 7а | кадр стека и FPU: что ядро кладёт на стек и почём (7а.4) |
| 3 | 81а | КИХ и БИХ на CMSIS-DSP — FPU за работой |
| 4 | 25 | пять куч FreeRTOS: какую взять и сколько памяти дать |
| 5 | 26 | задачи, приоритеты, стек каждой задачи |
| 6 | 27 | очереди — главный канал между задачами |
| 7 | 28 | прерывания и ядро: FromISR и маска приоритетов |
| 8 | 30 | гонки, мьютексы, инверсия приоритетов |
| 9 | 21 | SWO и ITM: вывод без UART и замер времени тактами |
| 10 | 35 | отладчик всерьёз: разбор HardFault (35.2), стек (35.4) |
| 11 | 11 | компоновка и раскладка памяти — фундамент следующего шага |
| 12 | 48 | собственный загрузчик и обновление прошивки |
После двенадцатого шага естественное продолжение — подпись прошивки (48а) и, если прибор смотрит в сеть, маршрут Г.
0.5 Маршрут В: электроника и аналог
Уровень маршрута: базовый → средний. Прошивка упирается в схему раньше, чем кажется: первый же датчик тянет за собой подтяжки, деление напряжения и шум. Маршрут проходится параллельно любому другому — этапами, каждый этап — несколько разделов подряд:
| Этап | Разделы | Что вынести |
|---|---|---|
| 1 | 49, 50 | закон Ома, делитель, RC-цепи — арифметика всего остального |
| 2 | 51, 52, 53, 55 | диоды и транзисторы, ключи и реле, питание и стабилизаторы |
| 3 | 59, 60, 61, 62 | логика, обвязка микроконтроллера, защита выводов |
| 4 | 54, 56, 57, 57а, 58 | изоляция, ОУ, силовой ШИМ, двигатели, импульсные преобразователи |
| 5 | 162, 163, 164, 165 | тракт под АЦП: усиление, устойчивость, реальный ОУ, бюджет шума |
| 6 | 166, 167, 168, 169, 170, 171, 172, 173, 174 | элементы в деталях — от ТКС резистора до кварца |
| 7 | 175, 176, 177, 178, 179, 180, 181 | узлы: компараторы, ИУ, ИОН, фильтры, тракт АЦП, разводка |
Первые три этапа стоит пройти не позже середины маршрута А — дальше разделы про датчики (95–104) и внешнюю обвязку будут опираться на них молча.
0.6 Маршрут Г: прибор в сети
Уровень маршрута: средний → продвинутый. Когда прибор работает, его хочется видеть издалека: телеметрия, обновление, приложение. Девять шагов — от устройства сети до своего прибора в ней и приложения к нему; многие шаги — пара разделов:
| Шаг | Раздел | Зачем |
|---|---|---|
| 1 | 37 | картина целиком: способы подключения, почему MQTT, безопасность |
| 2 | 105, 106 | сеть снизу вверх: Ethernet и IP, TCP и UDP |
| 3 | 106а, 106б | Ethernet на F407: PHY и дескрипторы DMA; пакет по байтам глазами микроконтроллера |
| 4 | 106в | lwIP на STM32: буферы, три интерфейса и память |
| 5 | 198ж, 198з | первые приборы в сети: датчик по UDP, веб-страница и REST |
| 6 | 107, 108 | DNS, DHCP, HTTP и TLS; маршрутизация, VLAN, Wi-Fi и VPN |
| 7 | 37а, 198и | сколько стоит TLS на микроконтроллере; клиент MQTT с повторным подключением |
| 8 | 110, 111, 112 | сборка в контейнере, инфраструктура, логи и метрики |
| 9 | 188 | приложение говорит с прибором: HTTP, WebSocket, MQTT |
Если Git ещё не в руках — перед восьмым шагом раздел 109. Фоновые знания о сетях и облаках без привязки к прибору — в 86–91, они базового уровня и читаются в любой момент.
0.7 Справочные разделы: когда что-то не работает
Пять разделов и приложения устроены иначе: их не читают, а открывают.
| Куда | Когда |
|---|---|
| 36 | прибор не работает: таблицы симптом → причина → лечение |
| 38 | что собрать и в каком порядке; какое железо понадобится |
| 34 | забыли имя или аргументы функции FreeRTOS |
| 39, 39а | как читать даташит и RM; какой документ ST где взять |
| 40 | английский термин из документации → где он разобран здесь |
| A–A18 | карты регистров всех семейств |
| B, C, D | шпаргалки CMSIS, HAL и FreeRTOS API |
| E, F, G | распиновки плат, сокращения, указатель регистров и функций |
Приём, который экономит время: встретили в чужом коде или в RM незнакомое слово — идите не в поиск по разделам, а в словарь 40: он собран из врезок «Как это называется в документации» всех разделов и ведёт прямо к нужному месту.
0.8 Обозначения и соглашения в примерах кода
Все примеры справочника подчиняются одним правилам — привыкнув к ним в части I, дальше вы читаете код без пояснений:
static volatile uint32_t g_ticks; /* меняется в прерывании — volatile */
void SysTick_Handler(void)
{
g_ticks++;
}
void led_init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; /* такт порта — до обращения к нему */
GPIOC->CRH = (GPIOC->CRH & ~(0xFu << 20)) /* PC13: очистить поле режима... */
| (0x2u << 20); /* ...и записать «выход 2 МГц» */
}
- Типы — из
stdint.h:uint32_t, а неint(почему — 3.1). У беззнаковых констант — суффиксu. - Регистры — через структуры CMSIS:
RCC->APB2ENR,GPIOC->CRH. Битовые маски — именами из заголовков ST, где имя есть; голые сдвиги — только с комментарием, какое это поле. - Общие с прерыванием переменные —
volatileи префиксg_(стиль имён — 3.7). - Комментарии по-русски и объясняют «зачем», а не пересказывают строку.
- Единицы: КБ = 1024 байта; частоты — МГц и кГц; выводы — именами
порта:
PC13.
Значки в тексте: ⚠️ — грабли по месту, 🔧 — законченный проект,
который собирается на плате (все такие проекты сведены в 38.1).
Ссылки вида «(раздел 14)» или «(14.6)» — переходы по справочнику.
Врезка ✅ внизу раздела — отчёт, чем проверены его числа и листинги:
сборкой, эмулятором, расчётом. Листинг выше, например, собран
armclang под Cortex-M3 — см. врезку в конце этого раздела.
0.9 Грабли
Читать подряд, как книгу. На 226 разделах это верный способ бросить на втором десятке. Цепочка «Дальше» — для второго прохода; первый — по маршруту из 0.3–0.6 (0.1).
Сразу продвинутое. Разделы 7а–7в стоят рядом с 7, но написаны для другого читателя. Уровень в шапке раздела — это фильтр: не ваш уровень — смело мимо, дорога туда ещё приведёт (0.1).
Читать без платы. С шага 9 маршрута А текст без железа перестаёт запоминаться: проекты 38.2 — не приложение к чтению, а его половина (0.3).
Пропустить электронику. «Я же программист» кончается на первом датчике: подтяжка, делитель, шум. Первые три этапа маршрута В — не позже середины маршрута А (0.5).
0.10 Итоги
- В справочнике 417 разделов в 27 частях и 25 приложений; уровень в шапке раздела — фильтр первого чтения: базовый → средний → продвинутый, буквенные разделы — углубления на потом.
- Опорных плат две: BluePill (F103C8: Cortex-M3, 72 МГц, 64 КБ Flash, 20 КБ ОЗУ) и Discovery на F407 (Cortex-M4 с FPU, 168 МГц, 1 МБ, 192 КБ); стартовый набор — плата, ST-Link, USB–UART, макетка с мелочью, потенциометр.
- Маршрут А — двадцать один шаг с нуля до очередей FreeRTOS; с девятого шага — только вместе с платой и проектами 38.2.
- Маршрут Б — F407: DMA-потоки, FPU и DSP, ядро всерьёз, отладка, свой загрузчик.
- Маршрут В — электроника от закона Ома до аналогового тракта АЦП; первые этапы нужны раньше, чем кажется.
- Маршрут Г — прибор в сети: от картины IoT до разговора приложения с прибором.
- Справочные разделы и приложения не читают — открывают: 36 при отказе, 38 при выборе проекта, 40 при незнакомом термине.
- Примеры кода —
stdint.h, регистры CMSIS,volatileу общих с прерываниями данных; ✅ внизу раздела — чем проверены его числа.
Дальше: раздел 0а «Маршрут новичка: двадцать разделов по порядку» — одна дорога от «ничего не знаю» до термостата на столе: что вынести из каждого раздела и что пока пропустить.