Embedded HandbookПриложения
Все разделы › XXVI. От макета к изделию
STM32F103, STM32F407 · уровень средний · 16 мин чтения
Открыть в интерактивном справочнике

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 эталонная, заведомо исправная плата

Порядок оживления платы шесть шагов: осмотр под лупой, прозвонка питания, включение с ограничением тока, напряжения по контрольным точкам, IDCODE по SWD, тестовая прошивка — и куда идти при отказе на каждом шаге


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 — про отладочный разъём, логика та же).

Контрольные точки первого включения: лабораторный источник 3,3 В с пределом 20 мА питает плату, на выводах камня вольтметр должен увидеть VDD 3,3 В, VDDA 3,3 В, NRST около 3,3 В через подтяжку 40 кОм, BOOT0 0 В через резистор, у F4 на VCAP 1,26 В


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а). Увидели код порта, серию и флеш — камень жив, монтаж его цепей верен, можно прошивать.

Не увидели — проверять по порядку, от компьютера к камню:

  1. Адаптер. Если st-info не нашёл ни одного программатора — до платы дело вообще не дошло: USB-кабель (зарядочные без линий данных — классика), порт, сам адаптер. Плату на этом шаге не трогать — она ни при чём.
  2. Питание камня. SWD без питания молчит: 3,3 В на выводах VDD — по 200.4. Если отладчик умеет мерить целевое напряжение — сверить.
  3. NRST. На выводе должно быть около 3,3 В (внутренняя подтяжка). Ноль — камень держится в сбросе, и отвечать он не обязан.
  4. Линии SWD. Перепутанные местами SWDIO и SWCLK — самая частая пара; дальше — общая земля между платой и адаптером, длина проводов, частота вниз (adapter speed, 35б.2).
  5. 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 Итоги

Полные исходники

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 «Тест в производстве и прошивка на линии» — как то же самое делается не с одной платой на столе, а с сотней на конвейере.

Открыть в интерактивном справочнике