0а. Маршрут новичка: двадцать разделов по порядку
Раздел 0 — карта: уровни, платы и четыре маршрута по частям справочника. Карта хороша, когда уже знаешь, куда идёшь. Тому, кто открыл справочник впервые, нужно другое — одна дорога, по которой можно просто идти. Здесь она и проложена: двадцать разделов по порядку, от «ничего не знаю» до прибора, который собран своими руками и работает на столе.
Взгляд, на котором стоит маршрут, простой: учиться на одном приборе, а не на всех блоках сразу. Прибор — термостат из раздела 196: терморезистор на АЦП, реле нагревателя, консоль по UART, настройки во Flash. Каждый шаг маршрута — деталь этого термостата, и в каждом шаге сказано, что из раздела вынести и что при первом чтении пропустить. Всё пропущенное не пропадает: к нему вернут развилки после маршрута.
Опоры: раздел 0 — как устроены уровни (0.1) и что купить на старт (0.2).
Как это называется в документации
Оригинал Перевод peripheral clock enable включение такта периферии pull-up, pull-down подтяжка к питанию, к земле voltage divider делитель напряжения NTC thermistor терморезистор с отрицательным коэффициентом relay driver ключ реле debouncing подавление дребезга superloop суперцикл: вся программа — один бесконечный цикл state machine автомат: состояния и переходы между ними
0а.1 Как идти по маршруту
Правил три.
Один шаг — один раздел. Из раздела выносится то, что стоит в столбце «Что вынести»; подразделы из столбца «Что пока пропустить» при первом чтении пролистываются. Это не лень, а порядок: пропущенное понадобится позже, и тогда будет понятно зачем.
Первые пять шагов — чтение, дальше — только с платой. Плата нужна уже на шаге 4, чтобы залить пустой проект, а с шестого шага у каждого этапа есть проект 🔧, который собирается на столе: светодиод и кнопка (8.4, 8.5), передача в терминал (16.3), кнопка по прерыванию (7.6), одиночное измерение АЦП (14.4), запись во Flash (11.5) и в конце — термостат (196).
Этап не пройден, пока проект этапа не заработал. Застряли — таблица трудных мест в 0а.6, затем раздел 36.
Чем этот маршрут отличается от маршрута А (0.3). Маршрут А идёт по блокам микроконтроллера и кончается очередями FreeRTOS — двадцать один шаг. Здесь двенадцать разделов те же, но восемь других — электроника, датчики и программа прибора: закон Ома, мультиметр, делитель, подключение датчиков, терморезистор, ключ реле, автоматы вместо ОС — и сам термостат. Маршрут кончается не ядром ОС, а прибором.
0а.2 Этап 1: что внутри и чем писать
Шаги 1–5 — в основном чтение; плата нужна один раз, на шаге 4. Цель этапа — понимать, что такое регистр, и уметь собрать и залить пустой проект.
| Шаг | Раздел | Что вынести | Что пока пропустить |
|---|---|---|---|
| 1 | 1 «Микроконтроллер как таковой» | ядро, память, периферия; регистр — это адрес в карте памяти (1.4) | bit-banding (1.5), конвейер (1.7), отечественный Cortex-M3 (1.9) |
| 2 | 3 «Язык C для встраиваемых систем» | типы из stdint.h (3.1), указатель на регистр (3.3) и volatile (3.4): без них код термостата не читается |
целочисленное продвижение (3.5), стиль имён (3.7) |
| 3 | 3а «Битовые операции» | четыре действия над битом (3а.1), поле из нескольких бит (3а.2), чтение-изменение-запись регистра (3а.6) | битовые поля C (3а.7), порядок байтов (3а.8) |
| 4 | 4 «Инструментарий» | выбрать одну среду (4.2), настроить ST-Link (4.5), понять, как прошивка попадает в плату (4.9) | CubeMX (4.7) и сборку без среды (4.8) |
| 5 | 5 «Три уровня абстракции: CMSIS, HAL и LL» | маршрут идёт на регистрах через заголовки CMSIS, как платформа термостата (196.5); запись в регистр и дописка в него — разные вещи (5.4) | во что превращается каждый уровень (5.5), проект из CubeMX (5.7) |
Среда — одна, любая из 4.2. Keil разобран подробнее в 4а, CubeIDE — в 4б; оба раздела — справочные для своей среды, маршрут без них проходится.
0а.3 Этап 2: первые выводы
Шаги 6–11 — плата уже на столе. Цель этапа — светодиод, кнопка и консоль: прибор начинает отвечать.
| Шаг | Раздел | Что вынести | Что пока пропустить |
|---|---|---|---|
| 6 | 6 «Тактирование (RCC)» | дерево тактов (6.2) и главное правило: такт периферии включается руками (6.5) | 72 МГц вручную (6.3): термостату хватает внутренних 8 МГц HSI (196.5); F4 (6.6), F0 и G0 (6.7), подстройку HSI (6.8) |
| 7 | 49 «Напряжение, ток, мощность: закон Ома и первые расчёты» | закон Ома и мощность (49.2), резистор для светодиода (49.3), что может вывод микроконтроллера (49.7) | маркировку (49.5) и корпус по мощности (49.6) |
| 8 | 36а «Приборы на столе: мультиметр, осциллограф, логический анализатор» | мультиметр (36а.1) и источник с ограничением тока (36а.8) — первые два прибора на столе | осциллограф и логический анализатор (36а.2–36а.7) |
| 9 | 8 «Порты ввода-вывода (GPIO)» | режимы вывода и регистры (8.2), светодиод (8.4), кнопка (8.5) | HAL и CubeMX (8.3), F0 и G0 (8.6), тот же вывод на 1986ВЕ9х (8.7) |
| 10 | 16 «UART / USART» | расчёт скорости (16.2), передача (16.3), приём (16.4), уровни сигналов (16.7): консоль — главный инструмент отладки и интерфейс термостата | пакеты переменной длины (16.5), Modbus (16.8), USART F0 и G0 (16.9) |
| 11 | 7 «Прерывания и исключения» | SysTick (7.4) — часы всего прибора; кнопка по прерыванию (7.6); каким должен быть обработчик (7.7) | Cortex-M0 и M0+ (7.8); разделы 7а–7в |
0а.4 Этап 3: измерение
Шаги 12–15. Цель этапа — число на консоли, которое меняется, если зажать терморезистор в пальцах.
| Шаг | Раздел | Что вынести | Что пока пропустить |
|---|---|---|---|
| 12 | 50 «ВАХ, делитель напряжения, RC-цепи» | делитель (50.2) — на нём стоит терморезистор; конденсатор перед АЦП (50.6); дребезг контакта (50.7) | RC-цепь по частоте (50.4), ШИМ плюс RC вместо ЦАП (50.5) |
| 13 | 14 «Аналого-цифровой преобразователь (АЦП)» | время преобразования (14.2), калибровка F1 (14.3), одиночное измерение (14.4) — ровно то, что делает термостат | очередь каналов и DMA (14.5, 14.6), аналоговый сторож (14.8), F0 и G0 (14.10) |
| 14 | 95 «Как подключать датчики: питание, подтяжки, уровни, провода» | питание 3,3 или 5 вольт (95.2), аналоговые датчики (95.7), развязка и земля (95.8) | подтяжки I²C, длина провода, преобразователь уровней (95.3–95.6) — до первого датчика на шине |
| 15 | 96 «Температура: NTC-термистор и DS18B20» | терморезистор в делителе (96.2), код → градусы целыми числами (96.3) — датчик термостата | DS18B20 (96.4–96.7) |
0а.5 Этапы 4 и 5: нагрузка, память, прибор целиком
Шаги 16–20. Цель — прибор, который сам включает нагрев, помнит уставку после выключения и не зависает на ожидании.
| Шаг | Раздел | Что вынести | Что пока пропустить |
|---|---|---|---|
| 16 | 52 «Управление нагрузками: ключи, реле, MOSFET, драйверы» | три способа и их цена (52.1), когда уместно реле (52.6): термостат включает реле через транзистор | затвор и его обвязка (52.2–52.4), верхний ключ (52.5) |
| 17 | 11 «Память, компоновка, загрузка» | где что лежит (11.1), стек и куча (11.4), запись во Flash (11.5) — так термостат помнит уставку | скрипт компоновщика (11.3), байты конфигурации (11.6), журнал записей (11.8) — он в списке улучшений (196.6) |
| 18 | 23 «Зачем нужна операционная система» | пределы суперцикла (23.1) и когда ОС не нужна (23.6) | устройство и цена ОС (23.2–23.5) |
| 19 | 23а «Прибор без ОС: автоматы, очередь событий, неблокирующие драйверы» | автомат: сначала таблица переходов (23а.1), кольцевая очередь (23а.3), программные таймеры на одном тике (23а.4) | неблокирующий драйвер I²C (23а.5), сон между событиями (23а.6) |
| 20 | 196 «Мини-проект: термостат на BluePill» | логика отдельно от железа (196.2), прогон на модели комнаты (196.4), прошивка на регистрах (196.5) | пропускать нечего; улучшения (196.6) — уже после маршрута |
Финиш маршрута невелик: прошивка термостата занимает 1968 байт Flash и 64 байта ОЗУ (196.5). Логика у него — три состояния и переходы между ними (196.2), главный цикл без ОС, время от SysTick. Всё это — шаги 11, 18 и 19, собранные вместе.
0а.6 Трудные места маршрута
Места, где работа встаёт. Симптомы взяты дословно из подразделов «Грабли» тех самых разделов. Если вашего симптома нет — раздел 36: сначала пять вопросов по порядку (36.1), потом таблицы по симптомам (36.2–36.11).
| Шаг | Симптом из «Грабли» | Что за ним | Где |
|---|---|---|---|
| 4 | Плата «умерла»: отладчик не подключается. | программа заняла выводы отладки или сразу уснула; BOOT0 = 1 и сброс запускают загрузчик |
4.11, 4.9 |
| 6 | Забытый такт периферии. | запись в регистры блока без такта уходит в никуда молча; проверять регистр в отладчике, а не код | 6.9, 36.1 |
| 9 | Светодиод BluePill горит наоборот. | светодиод включён катодом к PC13: сброс вывода зажигает, установка гасит |
8.9, 8.4 |
| 10 | Мусор вместо текста. | скорости не совпали или делитель посчитан не для той шины | 16.10, 16.2 |
| 10 | Ничего не работает, линии перепутаны. | TX одной стороны идёт на RX другой |
16.10 |
| 11 | Дребезг превращается в десяток прерываний. | контакт кнопки даёт пачку импульсов; лечится выдержкой или RC-цепочкой | 7.9, 50.7 |
| 13 | Вывод не переведён в аналоговый режим. | цифровая обвязка вывода остаётся подключённой и искажает измерение | 14.11 |
| 13 | Забыта калибровка на F1. | погрешность заметно выше ожидаемой | 14.11, 14.3 |
| 14 | Аналоговый выход датчика на 5 В — прямо на вход АЦП. | больше 3,3 В на вход АЦП нельзя, нужен делитель | 95.9, 50.2 |
| 14 | Нет общей земли. | уровни не значат ничего, датчик «отвечает мусором» | 95.9 |
| 15 | Термистор показывает −40 или +125 и не меняется. | код ушёл за край таблицы: обрыв или замыкание — это авария, а не температура | 96.8, 196.1 |
| 16 | Микроконтроллер перезагружается при коммутации. | выброс от обмотки, общая земля с силовой цепью — силу и логику разводить раздельно | 52.8, 49.8 |
| 17 | Запись во Flash F1 поднимает PGERR. |
писали в нестёртую ячейку: сначала страницу стирают | 11.10, 11.5 |
| 19 | «Подождать 30 мс» внутри действия автомата. | ожидание в действии останавливает весь прибор; оно оформляется состоянием и таймером | 23а.8, 23а.5 |
0а.7 Куда дальше: пять развилок
Термостат собран — дальше дорога расходится. Каждая развилка — четыре раздела по порядку; выбирайте по тому, что хочется сделать следующим.
Приборы и датчики — второй и третий прибор: - 13 «Таймеры (TIM)» — ШИМ, захват сигнала и энкодер: время и частота в железе; - 17 «Шина I²C» — шина цифровых датчиков; - 98 «Давление и высота: BMP280 и BME280» — первый датчик на шине после терморезистора; - 197 «Мини-проект: частотомер на таймере» — второй законченный прибор.
Сети и IoT — прибор, который видно издалека: - 37 «Приложения IoT» — картина целиком; - 150 «ESP32 как платформа: чип, модуль, память, выводы, загрузка» — второй микроконтроллер, с радио на кристалле; - 156 «Сеть на ESP32: esp_netif и lwIP, DHCP, SNTP, syslog, HTTP REST, MQTT» — прибор в сети; - 105 «Сеть снизу вверх: Ethernet, MAC, IP, подсети, ARP» — как устроена сеть; дальше — маршрут Г (0.6).
RTOS — когда суперцикл перестал читаться (23а.7): - 24 «Устройство FreeRTOS» — из чего состоит ядро; - 26 «Задачи» — задача и её стек; - 27 «Очереди» — главный канал между задачами; - 28 «Прерывания в RTOS» — обработчик и ядро; это уже продвинутый уровень.
Электроника — схема вокруг прибора: - 51 «Полупроводники: диоды, стабилитроны, биполярные транзисторы» — что стоит в ключе реле; - 55 «Линейные стабилизаторы» — откуда берутся 3,3 вольта; - 61 «Минимальная обвязка микроконтроллера: условия запуска» — что нужно камню без готовой платы; - 62 «Защита выводов» — чтобы вывод пережил провод; дальше — маршрут В (0.5).
Изделие — от макета к прибору, который не стыдно отдать: - 79 «Как рождается устройство: этапы разработки» — путь целиком; - 12 «Служебные блоки: сторожевые таймеры, CRC, RTC» — сторож: первое улучшение термостата (196.6); - 184 «Тестирование прошивки: уровни, покрытие, мутации, санитайзеры» — развитие приёма из 196.2: модуль проверяется без платы; - 200 «Первое включение новой платы» — когда макет станет платой.
0а.8 Грабли
Читать разделы маршрута целиком. Столбец «Что пока пропустить» — половина маршрута. Раздел, прочитанный от первой до последней строки на первом проходе, тормозит сильнее, чем пропущенный подраздел (0а.1).
Идти дальше пятого шага без платы. С шестого шага текст без железа не запоминается; проект этапа — не приложение к чтению, а его проверка (0а.1).
Перепрыгнуть электронику. Шаги 7, 8, 12, 14 и 16 — не отступление от программирования: без делителя нет датчика, без ключа нет нагрузки, без мультиметра не видно, что из этого не работает (0а.3–0а.5).
Взять ОС раньше прибора. Термостат работает без ОСРВ: главный цикл и SysTick (196.2). RTOS — развилка после маршрута, а не ступень перед прибором (0а.7).
Искать свой симптом поиском по разделам. Сначала таблица трудных мест (0а.6), потом пять вопросов 36.1 — они короче любого поиска.
0а.9 Итоги
- Маршрут — двадцать шагов в пять этапов: что внутри и чем писать (1–5), первые выводы (6–11), измерение (12–15), нагрузка и память (16–17), программа прибора и сам прибор (18–20).
- Финиш — термостат 196: 1968 байт Flash, 64 байта ОЗУ, без ОС.
- С маршрутом А (0.3) общих разделов двенадцать; восемь других — электроника, датчики и программа прибора.
- Уровень шагов — не выше среднего; первые пять шагов — чтение, дальше — только с проектом этапа на столе.
- Трудных мест в таблице 0а.6 — четырнадцать, каждое — дословно из «Грабли» своего раздела; остальное — раздел 36.
- После маршрута — пять развилок по четыре раздела: приборы и датчики, сети и IoT, RTOS, электроника, изделие.
Дальше: раздел 0б «Маршруты по темам: CAN и диагностика автомобиля» — для того, у кого задача уже есть: разделы одной темы по порядку. Если задачи пока нет — сразу раздел 1 «Микроконтроллер как таковой».