200. Первое включение новой платы
Макет работает, плата разведена, заказ с монтажа приехал — в коробке лежат первые собранные экземпляры. Соблазн понятен: воткнуть питание, прошить и посмотреть. Правильный порядок другой. Свежесобранная плата — это изделие, которого ещё никто никогда не включал: в ней могут быть перемычки припоя, перевёрнутые компоненты и короткое между питанием и землёй. Полчаса с лупой и мультиметром до первого включения дешевле сгоревшего стабилизатора — и намного дешевле выводов о «плохой схеме», сделанных по дефекту монтажа.
Раздел — про порядок оживления первой платы: осмотр, прозвонка, питание под
ограничением тока, напряжения по контрольным точкам, первый контакт по SWD и
тестовая прошивка. Числа — из даташитов STM32F103 и STM32F407 в паках;
тестовая прошивка собрана arm-none-eabi-gcc и прогнана в QEMU
(_verify/fpo200), арифметика — calc200.py там же.
Как это называется в документации
Оригинал Перевод board bring-up оживление платы: первый запуск нового изделия smoke test «дымовой тест»: первое включение под ограниченным током solder bridge перемычка припоя между соседними выводами cold (dry) joint холодная пайка: непропаянный матовый контакт tombstoning «надгробие»: компонент, вставший на торец continuity test прозвонка: проверка целостности цепи diode test диодный тест: измерение падения на переходе test point контрольная точка под щуп known-good board эталонная, заведомо исправная плата
200.1 Плата пришла: осмотр под лупой
Первый инструмент оживления — не лабораторный источник, а лупа с десятикратным увеличением или камера телефона в макрорежиме. Снимок платы, рассмотренный на большом экране, ловит дефекты, которые глаз «в железе» пропускает; заодно фотографии обеих сторон каждой платы остаются артефактом — через месяц по ним видно, что менялось.
Что искать:
| Дефект | Как выглядит | Где искать в первую очередь |
|---|---|---|
| перемычка припоя | блестящий мостик между соседними выводами | корпуса с шагом 0,5 мм, разъёмы |
| холодная пайка | матовый зернистый бугорок; припой есть, смачивания нет | ручной монтаж, крупные полигоны |
| «надгробие» | чип-компонент встал на торец, одна площадка в воздухе | мелкие резисторы и конденсаторы |
| сдвиг | компонент сидит на половине площадки | вся мелочь подряд |
| полярность | точка-ключ микросхемы не у первого вывода; полоса диода не там; плюс танталового конденсатора не там | все полярные корпуса |
| нет компонента | пустая площадка со следами пасты | сверка с перечнем варианта сборки |
⚠️ Полярные корпуса проверяются до включения, а не после. Перевёрнутая микросхема стабилизатора и танталовый конденсатор плюсом на землю — два главных кандидата «в дым» при первой подаче питания. Осмотр ключей и полос занимает минуты; менять выгоревший участок платы — часы.
Остатки флюса вокруг паек у безотмывочных паст — норма; липкий слой по всей плате или белёсые разводы — повод спросить монтажников, чем паяли и мыли. Для высокоомных аналоговых цепей остатки флюса — это утечки, и такие участки отмывают отдельно (раздел 44).
200.2 Прозвонка до подачи питания
Плата обесточена; мультиметр — в режиме прозвонки (раздел 36а.1). Первая пара точек — питание и земля: короткое между ними должно быть найдено омметром, а не источником.
Прозвонка меряет сопротивление малым током — порядка миллиампера. Из-за этого конденсаторы по питанию в первый момент выглядят как короткое: пока они заряжаются, прибор пищит. Заряд 10 мкФ до порога в 2 В током 1 мА занимает 20 мс — короткий писк, и показания поползли вверх; у платы со 100 мкФ по питанию тот же писк растянется на 200 мс. Это норма. Короткое — это когда прибор показывает устойчивый ноль и пищит не переставая. У исправной платы установившееся сопротивление питание—земля — килоомы и выше: делители, подтяжки, цепи обратной связи стабилизатора.
Вторая проверка — диодный тест на тех же точках, в обе полярности. Внутри камня и большинства микросхем между землёй и питанием стоят защитные переходы: в одну сторону тест покажет падение в сотни милливольт, в другую — заметно больше или «за пределом». Ноль милливольт в обе стороны — глухое короткое, и искать его надо до включения (приёмы — в 200.7).
🔧 Что прозвонить на типовой плате. 3,3 В — земля; 5 В — земля (если вход 5 В есть); 3,3 В — 5 В между собой (перемычка между шинами — тоже короткое, хотя каждая шина к земле «звонится» нормально); VDDA — земля. Список стоит записать: он же станет заготовкой теста для серии (раздел 201).
200.3 Первое питание: источник с ограничением тока
Первый раз плата включается от лабораторного источника с ограничением тока — рецепт и почему не USB описаны в 36а.8. Здесь — какой предел ставить и как читать то, что источник покажет.
Предел считается от ожидаемого тока, а ожидание для новой платы скромное. Стёртый F103 стартует от внутреннего генератора HSI на 8 МГц; по строке «8 МГц, периферия выключена» таблицы типовых токов даташита это 4 мА. Добавить светодиод питания и собственный ток стабилизатора — всё равно единицы миллиампер. Предел 20 мА даёт пятикратный запас и при этом не даст ничему выгореть: даже если весь предел уйдёт в одну точку, плата получит не больше 3,3 В × 20 мА = 66 мВт — это меньше, чем рассеивает чип-резистор среднего размера. Для сравнения, потолок исправного F103 — 50 мА на 72 МГц со всей включённой периферией (максимум по даташиту); у стёртого F407 на его стартовых 16 МГц — около 5 мА, а потолок на 168 МГц — 87 мА типовых и 109 мА максимум. К этим цифрам плата придёт потом, с боевой прошивкой — а для первого включения предел поднимать некуда.
Включили — и первые секунды смотрим не на плату, а на индикатор источника:
| Источник показывает | Что это значит |
|---|---|
| режим CV, ток около расчётного | норма: можно мерить напряжения (200.4) |
| ток 0,0 мА | цепь разорвана: стабилизатор не запаян, дорожка, разъём |
| режим CV, ток заметно выше расчёта | что-то лишнее работает или подтекает: искать нагрев (200.7) |
| режим CC, напряжение просело | короткое: при пределе 20 мА на коротком в 1 Ом останется 20 мВ |
Последняя строка — главная: источник в CC не «не смог включить плату», а поймал короткое и держит его безопасным. Напряжение на плате при этом — милливольты, ток — ровно предел.
⚠️ Предел не поднимают, «чтобы стартовало». Если источник ушёл в CC, увеличение предела не запустит плату — оно только начнёт греть перемычку или перевёрнутый компонент. Сначала находят, куда уходит ток, потом поднимают предел до рабочего — уже осознанно.
200.4 Напряжения по контрольным точкам
Источник в CV, ток разумный — теперь вольтметр. Мерить нужно на выводах камня, а не на выходе стабилизатора: между ними разъёмы, ферритовая бусина и дорожки, и «3,3 В на стабилизаторе» ещё не значит «3,3 В на VDD».
| Точка | Что должно быть | Если не так |
|---|---|---|
| VDD, все выводы | 3,3 В (рабочий диапазон F103 — 2,0…3,6 В) | просадка: источник в CC, тонкая дорожка, разъём |
| VDDA | практически VDD: на бусине фильтра — милливольты; для АЦП нужно не меньше 2,4 В | 0 В — фильтр VDDA не запаян: АЦП мёртв, камень может вести себя странно |
| VREF+ (где выведен) | равен VDDA или опорному источнику | 0 В — АЦП без опоры |
| NRST | около 3,3 В: внутренняя подтяжка 30…50 кОм | 0 В — что-то держит сброс: кнопка, залипшая перемычка, отладчик |
| BOOT0 | 0 В через резистор на землю (раздел 61.5) | висит в воздухе — «стартует через раз» |
| VCAP_1, VCAP_2 (F4) | 1,2…1,3 В — выход внутреннего стабилизатора ядра (типовые 1,26 В) | 0 В или 3,3 В — конденсаторы VCAP не запаяны или перемычка: ядро не запустится |
| VBAT | равен VDD, если батарейки нет (раздел 61.1) | 0 В — часть RTC без питания |
Внутренняя опора VREFINT — типовые 1,20 В — снаружи не видна: её меряет сам АЦП, и это уже дело тестовой прошивки (раздел 14). А вот всё перечисленное выше проверяется обычным мультиметром за пару минут — и именно эти точки стоит выводить на контактные площадки ещё при разводке (раздел 61.7 — про отладочный разъём, логика та же).
200.5 Первый контакт с камнем: ST-Link видит IDCODE
Питание в норме — пора узнать, жив ли сам камень. Подключаем
программатор-отладчик: SWDIO, SWCLK, земля — и опрашиваем камень командами
из раздела 35б: st-info --probe, или OpenOCD с файлами interface/target
(35б.2), или STM32CubeProgrammer.
Первое, что читает отладчик, — код отладочного порта SW-DP. По справочным
руководствам он один на семейство: у F1 это 0x1BA01477, у F4 —
0x2BA01477. Дальше программы читают код устройства из DBGMCU_IDCODE
и называют серию и размер флеш-памяти (раздел 2а). Увидели код порта, серию
и флеш — камень жив, монтаж его цепей верен, можно прошивать.
Не увидели — проверять по порядку, от компьютера к камню:
- Адаптер. Если
st-infoне нашёл ни одного программатора — до платы дело вообще не дошло: USB-кабель (зарядочные без линий данных — классика), порт, сам адаптер. Плату на этом шаге не трогать — она ни при чём. - Питание камня. SWD без питания молчит: 3,3 В на выводах VDD — по 200.4. Если отладчик умеет мерить целевое напряжение — сверить.
- NRST. На выводе должно быть около 3,3 В (внутренняя подтяжка). Ноль — камень держится в сбросе, и отвечать он не обязан.
- Линии SWD. Перепутанные местами SWDIO и SWCLK — самая частая пара;
дальше — общая земля между платой и адаптером, длина проводов, частота
вниз (
adapter speed, 35б.2). - BOOT0 и содержимое флеш-памяти. Чистый камень никуда «уйти» не мог,
а вот уже прошиванный — мог: сон или переназначение выводов SWD. Тогда —
подключение под сбросом
connect_assert_srst(35б.2) или BOOT0 вверх и сброс: камень стартует в заводской загрузчик, выводы SWD свободны.
🔧 Записать, что ответил камень. Код порта, серия, ревизия, размер флеш-памяти — одна строка в журнале оживления. При следующей партии эта строка отличит «камень не отвечает» от «отвечает, но другой» — включая подделки (раздел 2а).
200.6 Тестовая прошивка: мигание, UART «жив», HSE
Боевую прошивку на свежую плату лить рано: она большая, и падать может по
тысяче причин. Первой заливается тестовая — крошечная, отвечающая на три
вопроса: ядро выполняет код? по UART можно разговаривать? кварц работает?
Наша (_verify/fpo200/blink200.c) укладывается в 392 байта и написана
по регистрам, чтобы читаться целиком; сборка — arm-none-eabi-gcc со
стартовым кодом и скриптом компоновщика из раздела 4в.
Настройка и первая строка — ядро, флеш и UART живы, если она пришла:
RCC_APB2ENR |= (1u << 2) | (1u << 4) | (1u << 14); /* GPIOA, GPIOC, USART1 */
GPIOA_CRH = (GPIOA_CRH & ~0xF0u) | 0xA0u; /* PA9: альтернативный выход 2 МГц */
GPIOC_CRH = (GPIOC_CRH & ~(0xFu << 20)) | (0x2u << 20); /* PC13: выход 2 МГц */
USART1_BRR = 8000000u / 115200u; /* 115200 от HSI 8 МГц после сброса */
USART1_CR1 = (1u << 13) | (1u << 3); /* UE + TE: только передача */
uart_puts("alive: core+uart ok\r\n"); /* дошли сюда — ядро, флеш и UART живы */
Делитель UART считается от HSI: BRR = 8 МГц / 115200 = 69, фактическая скорость 115942 бод — ошибка 0,6 %, в допуске приёмника. Тактироваться от кварца на этом шаге нельзя: кварц — один из подозреваемых, и первая строка должна дойти даже с мёртвым HSE.
Вторая часть — проверка кварца, с таймаутом:
RCC_CR |= (1u << 16); /* HSEON: запустить кварц */
uint32_t n = 100000; /* таймаут с запасом: кварцу типично 2 мс */
while (n && !(RCC_CR & (1u << 17))) /* HSERDY: генератор стабилен */
n--;
uart_puts(n ? "HSE: ok\r\n" : "HSE: silent, staying on HSI\r\n");
Типовое время запуска кварца у F103 — 2 мс (таблица характеристик HSE);
таймаут даёт многократный запас. Ждать HSERDY без таймаута нельзя: с
мёртвым кварцем прошивка молча повиснет — и не скажет главного.
Прогон в QEMU (машина stm32vldiscovery, Cortex-M3 с USART1 на том же адресе) печатает:
alive: core+uart ok
HSE: silent, staying on HSI
В QEMU кварца нет — регистры RCC читаются нулями, и прошивка честно уходит
по ветке таймаута. На живой плате с исправным кварцем вторая строка —
HSE: ok; а silent на железе — это уже диагноз: кварц, его конденсаторы,
дорожки (61.6). Третий ответ — мигание светодиода — виден вообще без
приборов: мигает, значит ядро крутит главный цикл.
🔧 Тестовая прошивка живёт в репозитории платы. Рядом со схемой и герберами, с номером ревизии. Каждая новая ревизия платы и каждая новая партия начинаются с неё — а не с боевой прошивки, в которой сто подозреваемых.
200.7 Если не заработало
Порядок выше локализует беду до шага: «короткое», «нет VDDA», «камень не отвечает», «кварц молчит». Дальше работают три приёма.
Половинное деление — на железе. Тот же приём, что для кода (36.1), но делится схема: обесточить половину блоков и посмотреть, ушёл ли симптом. Для этого на плате должны быть «рубильники» — перемычки или резисторы 0 Ом в питании каждого блока. Их закладывают при разводке; на плате без них остаётся греть паяльник и поднимать выводы, что медленнее и рискованнее. Десять минут на этапе схемы экономят час на оживлении каждой платы.
Термометр-палец. Под пределом 20 мА греться нечему — 66 мВт не чувствуются. Поэтому любой тёплый корпус сразу после включения — подозреваемый: тёплый стабилизатор — короткое или перегруз за ним, тёплый камень — перевёрнутое питание или защёлкивание, одиночный тёплый конденсатор — пробит или стоит плюсом на землю. Палец находит это быстрее тепловизора, потому что он всегда с собой.
Сравнение с эталонной платой. Вторая плата из той же партии (или работающий макет) — измерительный прибор: мерить одно и то же на обеих — напряжения точек из 200.4, сопротивления прозвонки, осциллограммы NRST и кварца — и искать, где числа разошлись. Расхождение — это след; дальше по нему. Если из партии не работает одна плата — беда в монтаже конкретного экземпляра; если все одинаково — беда в схеме или в номиналах, и это уже разговор из раздела 36.
200.8 Грабли
Плата ест ровно предел источника, напряжение просело. Это не «предел маловат» — источник в режиме CC держит короткое. Поднимать предел бесполезно и вредно: сначала диодный тест и термометр-палец, потом уже ток.
Прозвонка питание—земля пищит при касании щупами. Первые 20…200 мс — заряд конденсаторов по питанию, это норма. Короткое — устойчивый ноль, который не растёт со временем.
st-info не видит ни одного программатора. До платы дело не дошло:
USB-кабель без линий данных, порт, адаптер. Менять кабель, а не
пропаивать SWD.
Отладчик не видит камень при исправном питании. Идти по порядку 200.5: NRST около 3,3 В? SWDIO и SWCLK не перепутаны местами? Земля между платой и адаптером есть? Частота SWD снижена?
Плата работает с подключённым отладчиком и умирает без него. Плата всё это время питалась от вывода 3,3 В отладочного разъёма, а собственный стабилизатор мёртв. Проверить: отключить отладчик и померить VDD.
Мигает, а UART молчит. TX платы должен приходить на RX переходника: перепутанная пара TX/RX — зеркальная классика SWDIO/SWCLK. Осциллограф на выводе TX при сбросе покажет стартовую строку — тогда дело в кабеле, а не в прошивке.
HSE: silent на живой плате. Кварц не запустился: конденсаторы не под
его нагрузочную ёмкость, длинные дорожки, брак пайки самого кварца (61.6).
Коварство в том, что плата продолжает работать от HSI и выглядит здоровой —
до первого USB или точных измерений времени.
На VCAP ноль или все 3,3 В. У F4 без живых конденсаторов на VCAP_1 и VCAP_2 (по 2,2 мкФ, раздел 61.1) внутренний стабилизатор ядра не работает: камень не отвечает по SWD, хотя VDD в норме. Мерить эту точку — до выводов о «мёртвом камне».
200.9 Итоги
- Порядок оживления: осмотр → прозвонка → питание под ограничением → контрольные точки → SWD → тестовая прошивка. Каждый шаг локализует беду до своего участка.
- Осмотр под лупой до включения: перемычки припоя, холодная пайка, «надгробия», полярность всех полярных корпусов, пустые площадки.
- Прозвонка: писк первых 20…200 мс — заряд конденсаторов (10 мкФ до 2 В током 1 мА — 20 мс); короткое — устойчивый ноль. Диодный тест в обе стороны отличает защитные переходы от глухого короткого.
- Первое включение: 3,3 В с пределом 20 мА — пятикратный запас над 4 мА стёртого F103 и потолок 66 мВт на любой дефект. Режим CC на индикаторе — это найденное короткое, а не повод поднять предел.
- Контрольные точки: VDD 3,3 В, VDDA не ниже 2,4 В для АЦП, NRST около 3,3 В (подтяжка 30…50 кОм), BOOT0 — 0 В, у F4 на VCAP — типовые 1,26 В.
- Код порта SW-DP: 0x1BA01477 у F1, 0x2BA01477 у F4. Нет ответа — проверять по порядку: адаптер, питание камня, NRST, линии SWD, BOOT0.
- Тестовая прошивка в 392 байта отвечает на три вопроса: ядро живо (строка по UART от HSI), кварц запустился (HSERDY с таймаутом — типовой старт 2 мс), главный цикл крутится (мигание). Она живёт в репозитории платы.
- Не заработало: половинное деление по цепям через резисторы 0 Ом, термометр-палец, парные измерения с эталонной платой.
Полные исходники
blink200.c — тестовая прошивка первого включения для BluePill.
/* Раздел 200: тестовая прошивка первого включения для BluePill (STM32F103C8).
* Три ответа тремя строками: ядро и UART живы, кварц запустился или нет,
* мигание PC13 — видно без приборов. Регистры — напрямую, без заголовков:
* прошивка нарочно минимальная, чтобы её можно было прочитать целиком. */
#include <stdint.h>
#define RCC_CR (*(volatile uint32_t *)0x40021000u) /* HSEON, HSERDY */
#define RCC_APB2ENR (*(volatile uint32_t *)0x40021018u) /* такты GPIO и USART1 */
#define GPIOA_CRH (*(volatile uint32_t *)0x40010804u) /* PA9 = TX1 */
#define GPIOC_CRH (*(volatile uint32_t *)0x40011004u) /* PC13 = светодиод */
#define GPIOC_ODR (*(volatile uint32_t *)0x4001100Cu)
#define USART1_SR (*(volatile uint32_t *)0x40013800u)
#define USART1_DR (*(volatile uint32_t *)0x40013804u)
#define USART1_BRR (*(volatile uint32_t *)0x40013808u)
#define USART1_CR1 (*(volatile uint32_t *)0x4001380Cu)
static void uart_puts(const char *s)
{
for (; *s; s++) {
while (!(USART1_SR & (1u << 7))) { /* TXE: буфер передатчика пуст */
}
USART1_DR = (uint8_t)*s;
}
}
int main(void)
{
RCC_APB2ENR |= (1u << 2) | (1u << 4) | (1u << 14); /* GPIOA, GPIOC, USART1 */
GPIOA_CRH = (GPIOA_CRH & ~0xF0u) | 0xA0u; /* PA9: альтернативный выход 2 МГц */
GPIOC_CRH = (GPIOC_CRH & ~(0xFu << 20)) | (0x2u << 20); /* PC13: выход 2 МГц */
USART1_BRR = 8000000u / 115200u; /* 115200 от HSI 8 МГц после сброса */
USART1_CR1 = (1u << 13) | (1u << 3); /* UE + TE: только передача */
uart_puts("alive: core+uart ok\r\n"); /* дошли сюда — ядро, флеш и UART живы */
RCC_CR |= (1u << 16); /* HSEON: запустить кварц */
uint32_t n = 100000; /* таймаут с запасом: кварцу типично 2 мс */
while (n && !(RCC_CR & (1u << 17))) /* HSERDY: генератор стабилен */
n--;
uart_puts(n ? "HSE: ok\r\n" : "HSE: silent, staying on HSI\r\n");
for (;;) { /* мигание — видно без единого прибора */
GPIOC_ODR ^= (1u << 13);
for (volatile uint32_t i = 0; i < 400000; i++) {
}
}
}
Дальше: раздел 201 «Тест в производстве и прошивка на линии» — как то же самое делается не с одной платой на столе, а с сотней на конвейере.