Перейти к содержанию

JTAG и SWD: как устроена отладка микроконтроллера

JTAG (IEEE 1149.1) и SWD — последовательные интерфейсы, через которые отладчик останавливает ядро, ставит точки останова, читает и пишет память и прошивает флеш. Разбираем по документации Arm (ADIv5, IHI 0031G), руководству TI по JTAG и RM0090 для STM32F4: автомат TAP, регистры IR и DR, граничное сканирование, протокол SWD, порты DP и AP, SWO и опорное напряжение VTref.

Обновлено Редакция GAW

JTAG и SWD — два способа подключить отладчик к микроконтроллеру. JTAG — стандарт IEEE 1149.1, задуманный для проверки плат и ставший универсальным портом отладки: четыре сигнала TCK, TMS, TDI, TDO и необязательный сброс TRST. SWD (Serial Wire Debug) — протокол Arm на двух линиях: такт SWCLK и двунаправленные данные SWDIO. В микроконтроллерах Cortex-M оба интерфейса ведут к одному и тому же порту отладки, и через него программа-отладчик останавливает ядро, ставит точки останова, читает регистры и память и записывает флеш.

На этой странице — как это устроено внутри: автомат TAP, регистры JTAG, протокол SWD, порты DP и AP. Какой контакт разъёма за что отвечает, как подключить ST-LINK или J-Link и какие команды дать OpenOCD — на странице «Распиновка JTAG и SWD». Требования стандарта IEEE 1149.1 приведены в изложении TI (SSYA002D), протокол SWD и порты Arm — по спецификации ADIv5 (IHI 0031G), примеры для STM32F4 — по RM0090.

Коротко

  • JTAG: TCK — такт, TMS — управление автоматом, TDI — данные в кристалл, TDO — из кристалла, TRST — необязательный сброс. TMS и TDI читаются по нарастающему фронту TCK, TDO меняется по спадающему.
  • Автомат TAP: 16 состояний; пять тактов с TMS = 1 из любого состояния — сброс в Test-Logic-Reset.
  • SWD: SWCLK и SWDIO; операция — 8 бит запроса, 3 бита подтверждения, 32 бита данных и бит чётности; биты младшим вперёд.
  • Ответы SWD: OK = 0b001, WAIT = 0b010, FAULT = 0b100.
  • Сброс линии SWD: не меньше 50 тактов с SWDIO = 1, затем не меньше двух тактов с нулём; первой операцией читают DPIDR.
  • Переход JTAG → SWD: последовательность 0xE79E (младшим битом вперёд) между двумя сериями по 50 единиц.
  • Порт отладки: DP (SW-DP или JTAG-DP) плюс порты доступа AP; MEM-AP превращает обращения отладчика в обращения к шине.

Что умеет отладчик

Отладка Cortex-M — это не отдельный «режим работы» кристалла, а набор блоков рядом с ядром, доступных снаружи. RM0090 перечисляет их для STM32F4 (разд. 38.1): ядро можно остановить на выборке команды по адресу — точка останова — или на обращении к данным — точка наблюдения; в остановленном ядре отладчик смотрит регистры и память, потом возобновляет выполнение. Точки останова во флеш-памяти даёт блок FPB, точки наблюдения и счётчики — DWT, программную трассировку — ITM, вывод трассировки наружу — TPIU с выводом SWO.

Все эти блоки — регистры в адресном пространстве кристалла. Отладчику нужен только способ читать и писать по адресам, даже когда ядро работает или стоит. Этот способ и дают JTAG и SWD.

JTAG: стандарт IEEE 1149.1

Стандарт описывает тестовую логику внутри микросхемы (SSYA002D, гл. 3):

  • TAP (Test Access Port) — контроллер, которым управляют TCK и TMS;
  • регистр команд IR — выбирает, какой регистр данных подключён между TDI и TDO;
  • регистры данных DR — обязательные граничный регистр и регистр обхода (bypass), необязательный регистр идентификатора и любые регистры производителя.

Регистры команд и данных — два отдельных пути сдвига между TDI и TDO. Сдвиг идёт по нарастающему фронту TCK, данные на TDO меняются по спадающему: так у приёмника на другой стороне цепочки есть полтакта на установку.

Автомат TAP

Контроллер TAP — конечный автомат из 16 состояний. Переход выбирает уровень TMS на нарастающем фронте TCK.

Автомат состояний TAP по IEEE 1149.1: 16 состоянийШестнадцать состояний контроллера TAP. Слева Test-Logic-Reset и Run-Test/Idle, в середине столбец сдвига регистра данных DR, справа — зеркальный столбец регистра команд IR: Select, Capture, Shift, Exit1, Pause, Exit2, Update. Цифры у стрелок — уровень TMS на нарастающем фронте TCK. Из любого состояния пять тактов с TMS = 1 приводят в Test-Logic-Reset.100111101000101111000Select-DR-ScanCapture-DRShift-DRExit1-DRPause-DRExit2-DRUpdate-DR00101111000Select-IR-ScanCapture-IRShift-IRExit1-IRPause-IRExit2-IRUpdate-IRTest-Logic-ResetRun-Test/Idle
Автомат TAP по IEEE 1149.1. Цифра у стрелки — уровень TMS на нарастающем фронте TCK. Средний столбец — сдвиг регистра данных (DR), правый — регистра команд (IR); выделены сброс и состояния сдвига.

Как читать схему (SSYA002D, гл. 3):

  • Test-Logic-Reset — единственное устойчивое состояние при TMS = 1. Поэтому пять тактов с TMS = 1 приводят автомат в сброс из любого состояния, и отдельный вывод TRST не обязателен. В этом состоянии тестовая логика не мешает обычной работе микросхемы, а в IR загружается команда BYPASS или IDCODE.
  • Run-Test/Idle — ожидание между операциями.
  • Две зеркальные ветви: Select → Capture → Shift → Exit1 → (Pause → Exit2) → Update — для регистра данных и для регистра команд.
  • Capture параллельно загружает выбранный регистр: граничный регистр защёлкивает уровни выводов, регистр команд — служебный код, у которого два младших бита всегда 01. По этим 01 отладчик проверяет целостность цепочки.
  • Shift сдвигает регистр на один бит за такт: из TDI внутрь, из регистра на TDO. Последний бит сдвигают уже с TMS = 1, переходя в Exit1.
  • Pause нужен, чтобы приостановить сдвиг — например, пока тестер дозагружает буфер.
  • Update переписывает сдвинутое значение в теневые защёлки, и только тогда оно начинает действовать. Пока идёт сдвиг, выходы микросхемы не дёргаются.

Пример: загрузить команду и прочитать регистр данных. Из Run-Test/Idle TMS = 1, 1, 0, 0 ведут в Shift-IR; дальше сдвигают биты команды, последний — с TMS = 1 (Exit1-IR); TMS = 1 — Update-IR, команда вступила в силу; TMS = 1, 0, 0 — через Select-DR-Scan и Capture-DR в Shift-DR; сдвигают регистр данных и выходят так же через Exit1-DR и Update-DR.

Команды и регистры

Из девяти команд IEEE 1149.1 три обязательны, шесть — необязательны (SSYA002D, гл. 3):

КомандаОбязательнаЧто делаетКод
BYPASSдаставит между TDI и TDO однобитный регистр обхода, микросхема работает как обычновсе единицы
SAMPLE/PRELOADдаподключает граничный регистр: снимок уровней выводов на ходу или предзагрузка тестового наборазадаёт производитель
EXTESTдаграничный регистр управляет выводами: выдать тест наружу и прочитать ответ соседейвсе нули в редакции 1990 года
INTESTнеттест внутренней логики через граничные ячейкипроизводитель
RUNBISTнетвстроенный самотестпроизводитель
CLAMPнетзафиксировать выходы по граничному регистру, сдвигать через bypassпроизводитель
HIGHZнетвсе выходы в высокоимпедансное состояниепроизводитель
IDCODEнетподключает 32-битный регистр идентификаторапроизводитель
USERCODEнет32-битный код, заданный пользователемпроизводитель

Длина регистра команд — не меньше двух бит; у JTAG-DP Arm — 4 или 8 бит, у TAP граничного сканирования STM32F4 — 5. Регистр идентификатора (32 бита) устроен так: биты 31–28 — версия, 27–12 — номер изделия, 11–1 — код производителя по списку JEDEC JEP106, бит 0 всегда 1 (SSYA002D, рис. 3-8). Пример (наш разбор по RM0090): ID-код TAP граничного сканирования STM32F405/407 — 0x06413041, то есть версия 0, номер изделия 0x6413, код производителя 0x020; ID-код TAP ядра Cortex-M4 — 0x4BA00477, стандартный код Arm: версия 4, номер 0xBA00, производитель 0x23B.

Цепочка кристаллов

TDO одного кристалла соединяют с TDI следующего, TCK и TMS — общие. Все TAP цепочки проходят состояния синхронно, а сдвиг идёт через их регистры подряд. Чтобы работать с одним кристаллом, остальные переводят в BYPASS: каждый добавит в путь данных только один бит.

Такая цепочка бывает и внутри одного корпуса. В STM32F4 последовательно стоят два TAP: граничного сканирования с регистром команд 5 бит и ядра Cortex-M4 с регистром 4 бита (RM0090, разд. 38.5).

Цепочка JTAG в STM32F4: два TAP последовательноВнутри STM32F4 два контроллера TAP соединены цепочкой: вход JTDI идёт на TAP граничного сканирования с регистром команд 5 бит, его выход TDO — на вход TAP ядра Cortex-M4 с регистром команд 4 бита, выход которого — вывод JTDO. Сигналы TCK, TMS и nTRST общие. При сдвиге команды в цепочке 9 бит, при сдвиге данных неиспользуемый TAP в режиме BYPASS добавляет один бит.STM32F4TAP граничного сканированияIR 5 битTAP Cortex-M4IR 4 битаJTDITDO → TDIJTDOTCK, TMS, nTRSTСдвиг IR — 5 + 4 = 9 бит; сдвиг DR через ядро — плюс 1 бит BYPASS граничного TAP
Два TAP внутри STM32F4 по RM0090: сначала TAP граничного сканирования (IR 5 бит), затем TAP ядра (IR 4 бита). При сдвиге команды в цепочке 9 бит, при сдвиге данных обойдённый TAP добавляет 1 бит.

Чтобы добраться до ядра, отладчик сдвигает в IR 9 бит: команду BYPASS для TAP граничного сканирования и нужную команду ядра; при каждом сдвиге данных добавляет один бит обхода. После переключения на SWD TAP граничного сканирования отключается: на его TMS принудительно подаётся единица (RM0090, разд. 38.5).

Граничное сканирование

Ради него JTAG и создавали. Между каждым выводом и внутренней логикой микросхемы стоит ячейка граничного регистра. Ячейки соединены в длинный сдвиговый регистр вдоль периметра кристалла — отсюда название boundary scan. Командой EXTEST тестер выставляет через ячейки уровни на выходах одной микросхемы и читает их входами соседней — так проверяются дорожки и пайка выводов BGA, до которых не дотянуться щупом. SAMPLE/PRELOAD снимает уровни на работающей плате (SSYA002D, гл. 3). Состав и порядок ячеек конкретного кристалла производитель описывает на языке BSDL — по этому файлу программы граничного сканирования строят тесты.

SWD: отладка по двум проводам

JTAG занимает четыре-пять выводов, для маленьких корпусов это дорого. SWD передаёт то же самое по двум: SWCLK — такт от отладчика, SWDIO — данные в обе стороны (IHI 0031G, гл. B4). Кристалл читает SWDIO по нарастающему фронту SWCLK и по нему же меняет уровень, когда сам ведёт линию. Временных параметров спецификация Arm не задаёт — частоту SWCLK ограничивают конкретный кристалл и отладчик.

Операция SWD

Каждая операция — две или три фазы (IHI 0031G, разд. B4.1 и B4.2):

  1. Запрос, 8 бит, от отладчика: Start (всегда 1), APnDP (0 — регистр порта отладки DP, 1 — порта доступа AP), RnW (0 — запись, 1 — чтение), два бита адреса A[2:3], бит чётности, Stop (всегда 0), Park (отладчик выставляет 1 перед тем, как отпустить линию). В RM0090 (табл. 303) о бите Park сказано иначе: отладчик его не ведёт, а кристалл читает 1 благодаря подтяжке; здесь мы следуем спецификации Arm (IHI 0031G, разд. B4.2), где Park — 1, которую выдаёт отладчик.
  2. Подтверждение, 3 бита, от кристалла: OK, WAIT или FAULT.
  3. Данные, 33 бита: 32 бита и бит чётности — от кристалла при чтении, от отладчика при записи. Обычно фаза есть только после ответа OK; исключение — включённый флаг CTRL/STAT.ORUNDETECT: тогда фаза данных следует и за WAIT и FAULT (IHI 0031G, разд. B4.1.1).

Когда направление линии меняется, вставляется такт смены направления (turnaround, Trn): линию не ведёт никто, и её состояние не определено (IHI 0031G, разд. B4.1.3) — подтяжка лишь удерживает прежний уровень. По умолчанию он длится один такт: после запроса, после подтверждения на запись и после данных чтения.

Пакеты SWD: чтение и запись с ответом OKДве операции SWD с периодом смены направления в один такт. Чтение регистра DPIDR: 8 бит запроса от отладчика (на линии 1, 0, 1, 0, 0, 1, 0, 1), такт смены направления, 3 бита подтверждения OK от кристалла (1, 0, 0), 32 бита данных и бит чётности от кристалла, затем снова смена направления. Запись в CTRL/STAT: запрос (1, 0, 0, 1, 0, 1, 0, 1), смена направления, OK, ещё одна смена направления, 32 бита данных и бит чётности от отладчика. Биты идут младшим вперёд.ЧтениеStart1APnDP0RnW1A20A30Par1Stop0Park1TrnACK01ACK10ACK20RDATA[0:31]DPIDRParTrnЗаписьStart1APnDP0RnW0A21A30Par1Stop0Park1TrnACK01ACK10ACK20TrnWDATA[0:31]CTRL/STATParведёт отладчикведёт кристаллTrn — линию не ведёт никто
Чтение регистра DPIDR и запись регистра CTRL/STAT по SWD с ответом OK. Под ячейками — уровни на линии; синим — биты, которые выдаёт отладчик, медным — кристалл, пунктир — такт смены направления.

Порядок бит и чётность. Все поля идут младшим битом вперёд: адрес A[3:2] на линии выглядит как A2, A3, а ответ OK = 0b001 — как 1, 0, 0. Бит чётности дополняет число единиц до чётного: в запросе — по полям APnDP, RnW, A2, A3, в данных — по 32 битам; биты подтверждения в чётность не входят (IHI 0031G, разд. B4.1.5 и B4.1.6).

Пример (наш расчёт). Чтение DPIDR: APnDP = 0, RnW = 1, адрес 0x0 — единица одна, чётность 1. На линии 1, 0, 1, 0, 0, 1, 0, 1 — это байт 0xA5, если читать младшим битом вперёд. Запись в CTRL/STAT (адрес 0x4: A2 = 1, A3 = 0): единица тоже одна, чётность 1, на линии 1, 0, 0, 1, 0, 1, 0, 1 — байт 0xA9.

Ответы OK, WAIT и FAULT

ACK[2:0]На линииОтветЧто делает отладчик
0b0011, 0, 0OKпередаёт или принимает данные
0b0100, 1, 0WAITповторяет тот же запрос; после долгого ожидания — запись ABORT.DAPABORT
0b1000, 0, 1FAULTв порту выставлен флаг ошибки; читает CTRL/STAT, сбрасывает флаги через ABORT
другое—нет ответа или ошибка протоколасброс линии и повторное подключение

Учтите при чтении документации: в RM0090 (табл. 304) подтверждения записаны в порядке появления на линии — 100 для OK, 010 для WAIT, 001 для FAULT, то есть зеркально к значениям ACK[2:0] из спецификации Arm.

WAIT значит, что предыдущее обращение ещё не закончено: например, медленная шина или память не ответила. FAULT кристалл выдаёт, пока в CTRL/STAT взведён хотя бы один флаг ошибки. Три запроса он обязан выполнять сразу, без WAIT и без FAULT: чтение DPIDR, чтение CTRL/STAT и запись ABORT — чтобы отладчик всегда мог узнать состояние, сбросить флаги и прервать зависшую операцию (IHI 0031G, разд. B4.2.3 и B4.2.4).

Отложенное чтение AP. Чтение регистров порта доступа выполняется с задержкой на одну операцию: ответ на первое чтение AP — неизвестное значение, его отбрасывают; каждое следующее чтение AP возвращает результат предыдущего, а последний результат забирают чтением регистра DP RDBUFF (IHI 0031G, разд. B4.2.2). Это позволяет читать память потоком, не дожидаясь шины на каждом слове.

Подключение и сброс линии

У SWD нет вывода сброса. Сбросом линии служит не меньше 50 тактов SWCLK с SWDIO = 1, после них — не меньше двух тактов с нулём (простой). После сброса единственная разрешённая операция — чтение DPIDR (или команда переключения протокола); у STM32F4 без этого чтения кристалл отвечает FAULT на всё остальное (IHI 0031G, разд. B4.3.3; RM0090, разд. 38.8.3).

Если порт поддерживает и JTAG, и SWD (SWJ-DP), после включения питания выбран JTAG. Переход на SWD (IHI 0031G, разд. B5.2.2):

  1. Не меньше 50 тактов с SWDIO/TMS = 1 — автомат JTAG уходит в Test-Logic-Reset.
  2. 16 бит 0b0111 1001 1110 0111 старшим битом вперёд — то же, что 0xE79E младшим вперёд.
  3. Ещё не меньше 50 тактов с единицей — сброс линии SWD.

Последовательность подобрана так, что не сбивает другие TAP в цепочке и срабатывает независимо от того, был ли порт до этого в JTAG или в SWD. В ADIv5.2 Arm объявляет эти последовательности переключения устаревшими (deprecated) для кристаллов с состоянием покоя (dormant) и рекомендует переход через него (IHI 0031G, разд. B5.2.1); у STM32F4 используется описанная выше последовательность (RM0090, разд. 38.4.4).

Типичное подключение отладчика к STM32F4 (по IHI 0031G и RM0090):

# SWD connect sequence, SWDIO bits LSB first
>= 50 x SWCLK with SWDIO = 1           # line reset (JTAG TAP goes to Test-Logic-Reset)
0xE79E, 16 bits                         # JTAG-to-SWD select
>= 50 x SWCLK with SWDIO = 1           # line reset in SWD mode
>= 2 x SWCLK with SWDIO = 0            # idle
read  DP DPIDR      -> OK, 0x2BA01477   # Cortex-M4 SW-DP ID (RM0090, 38.8.3, table 306)
write DP ABORT      0x0000001E          # clear sticky error flags
write DP CTRL/STAT  0x50000000          # CSYSPWRUPREQ (bit 30) | CDBGPWRUPREQ (bit 28)
read  DP CTRL/STAT  -> 0xF0000000       # power-up acknowledged (bits 31 and 29)
write DP SELECT     0x00000000          # AP 0 (AHB-AP), register bank 0
write AP CSW        ...                 # 32-bit accesses
write AP TAR        0xE0042000          # DBGMCU_IDCODE
read  AP DRW        -> (posted)         # result comes with the next read
read  DP RDBUFF     -> 0x.....413       # DEV_ID = value & 0xFFF = 0x413: STM32F405/407/415/417

Значение для ABORT (сброс флагов ошибок записью единиц в биты 1–4) и точное содержимое CSW зависят от версии порта — сверяйтесь с IHI 0031G, гл. B2 и C2. Учтите и оговорку RM0090: у STM32F4 после записи нужно ещё два такта SWCLK с нулём на линии, чтобы запись дошла до внутренней логики. Особенно это важно после запроса включения питания отладки (RM0090, разд. 38.8.4).

Подтяжка и простой

Спецификация требует подтяжку SWDIO к питанию со стороны кристалла около 100 кОм: она держит линию в единице в такты смены направления и когда отладчик отключён. Подтяжка слабая и лишь удерживает уровень — если линию отпустить в нуле, она поднимется только через много тактов; поэтому перед отпусканием отладчик выставляет Park = 1 (IHI 0031G, разд. B4.2 и B4.3.2). У STM32F4 подтяжка SWDIO и подтяжка к земле на SWCLK встроены (RM0090, разд. 38.4.3). Если отладчик хочет остановить такт, он сначала выдаёт не меньше 8 тактов простоя с нулём на линии.

SWD с несколькими кристаллами. Версия 2 протокола позволяет подключить на одну пару SWDIO/SWCLK несколько кристаллов: после сброса линии отладчик выбирает нужный записью в регистр TARGETSEL и проверяет выбор чтением DPIDR (IHI 0031G, разд. B4.3.4). Идентификатор включает 4-битный номер экземпляра — поле TINSTANCE, — поэтому одинаковых кристаллов на линии может быть до 16 (IHI 0031G, разд. B4.1.7; поле TINSTANCE — гл. B2, регистры DLPIDR и TARGETSEL).

Порт доступа к отладке: DP и AP

И JTAG, и SWD — лишь транспорт. Отладчик через них работает с DAP (Debug Access Port) из двух частей (IHI 0031G, разд. A1.3):

  • DP (Debug Port) — порт отладки со стороны разъёма. Бывает SW-DP, JTAG-DP или SWJ-DP, который умеет оба протокола на общих выводах. Регистры DP: DPIDR (идентификатор), CTRL/STAT (флаги ошибок, запросы включения питания отладки и системы), SELECT (выбор AP и банка его регистров), RDBUFF (результат последнего отложенного чтения).
  • AP (Access Port) — порт доступа к ресурсам. Главный — MEM-AP: его регистры CSW (размер и режим обращения), TAR (адрес) и DRW (данные) превращают запись и чтение DRW в обычное обращение к шине по адресу из TAR. Есть и JTAG-AP — для доступа к старым ядрам с собственным TAP.
Порт доступа к отладке (DAP): DP, AP и шина микроконтроллераОтладчик подключается по SWD или JTAG к порту отладки DP. У DP свои регистры: DPIDR, CTRL/STAT, SELECT, RDBUFF. Через регистр SELECT отладчик выбирает порт доступа AP; MEM-AP (у STM32F4 — AHB-AP) с регистрами CSW, TAR и DRW превращает обращения отладчика в чтение и запись по шине кристалла. Так отладчик видит регистры отладки ядра, флеш-память, ОЗУ, периферию и ROM-таблицу, не останавливая программу.ОтладчикJ-Link, ST-LINKSWDJTAGDebug Port (DP)SW-DP / JTAG-DP (SWJ-DP)DPIDRCTRL/STATSELECTRDBUFFAPACCMEM-APу STM32F4 — AHB-APCSWTAR — адресDRW — данныеAPSEL в SELECT выбирает APшинаядро: DHCSR, DEMCRFPB, DWT, ITMфлеш и ОЗУпериферия, DBGMCUROM-таблицаОтладчик пишет адрес в TAR и читает или пишет DRW — это обычное обращение к шине.Чтение AP «отложенное»: результат приходит в следующей транзакции или из RDBUFF.
Порт доступа к отладке. Отладчик по SWD или JTAG обращается к регистрам DP; через SELECT выбирает порт доступа MEM-AP, а тот обращается к шине кристалла: регистрам отладки ядра, блокам FPB, DWT и ITM, памяти и периферии.

Через JTAG-DP доступ к DP и AP идёт командами в регистре IR длиной 4 или 8 бит (IHI 0031G, разд. B3):

IR (4 бита)РегистрДлинаНазначение
1000ABORT35 битпрервать зависшее обращение
1010DPACC35 битчтение или запись регистров DP
1011APACC35 битчтение или запись регистров AP
1110IDCODE32 битаидентификатор JTAG-DP
1111BYPASS1 битобход, требование IEEE 1149.1

35 бит DPACC и APACC — это 32 бита данных, два бита адреса A[3:2] и бит RnW на входе; на выходе вместо адреса и RnW приходит 3-битное подтверждение. Кодировка подтверждения у JTAG-DP своя: OK/FAULT = 0b010, WAIT = 0b001; ошибку отладчик узнаёт по флагам CTRL/STAT (IHI 0031G, табл. B3-3 и разд. B3.4.3; RM0090, табл. 301).

Поэтому для отладки Cortex-M все равно, JTAG или SWD: обе дороги ведут к одним и тем же AP. Спецификация требует, чтобы набор AP не зависел от выбранного протокола (IHI 0031G, разд. B5.1.1). Отладчик пишет в TAR адрес регистра управления ядром или ячейки флеш-контроллера и читает или пишет DRW — так работают останов и шаг, точки останова, загрузка программы в ОЗУ и прошивка флеш-памяти. MEM-AP обращается к шине параллельно с ядром, поэтому память и периферию можно читать, не останавливая программу.

SWO и трассировка

В режиме SWD освобождается вывод TDO. На нём микроконтроллер может выдавать SWO (Serial Wire Output) — асинхронный поток трассировки. У STM32F4 это вывод PB3: JTDO в режиме JTAG, TRACESWO при асинхронной трассировке (RM0090, разд. 38.4.1). По SWO идут пакеты ITM — отладочный printf без UART — и выборки DWT: счётчики, значения переменных, адреса выполнения. Как настроить вывод сообщений через ITM и SWO, разобрано в статье «Логирование в прошивке»; вывод через отладчик без SWO — semihosting.

SWO — один провод и ограниченная скорость. Для полной трассировки команд нужен параллельный порт TRACECLK и TRACEDATA[3:0] — он есть на 20-контактном разъёме Cortex Debug+ETM (Arm, Cortex-M Debug Connectors).

Выводы, разъёмы и уровни

У микроконтроллера сигналы отладки обычно делят выводы с портами. У STM32F4 (RM0090, разд. 38.4):

ВыводJTAGSWDПосле сброса
PA13JTMSSWDIOвход с подтяжкой к питанию
PA14JTCKSWCLKвход с подтяжкой к земле
PA15JTDI—вход с подтяжкой к питанию
PB3JTDOTRACESWO (если включена трассировка)выход без подтяжки
PB4NJTRST—вход с подтяжкой к питанию

Подтяжки встроены, внешние резисторы не нужны. При работе только по SWD программа может забрать PA15, PB3 и PB4 под обычные выводы (RM0090, разд. 38.4.4). PA13 и PA14 оставляют за SWD: если программа переназначит и их, подключиться можно будет только под сбросом. В спецификации Arm есть требование к разработчикам кристаллов: если протокол JTAG в микросхеме не используется вовсе, вход TDI порта SWJ-DP подтягивают к земле внутри кристалла (IHI 0031G, разд. B5.1.1). К плате это не относится: у STM32F4 на JTDI (PA15) встроена подтяжка к питанию (RM0090, разд. 38.4.3), и внешний резистор к земле на PA15 ставить не нужно.

Разъёмы. Arm предлагает два компактных разъёма с шагом 0,05″ (1,27 мм): Cortex Debug на 10 контактов — JTAG, SWD и SWO — и Cortex Debug+ETM на 20 контактов, где добавлены линии параллельной трассировки. Старые отладчики используют 20-контактный разъём IDC (Arm, Cortex-M Debug Connectors); у J-Link это вилка с ключом и шагом 2,54 мм (SEGGER, 20-pin J-Link Connector). Разводка всех трёх, а также STDC14 у STLINK-V3 и разъёмов ST-LINK/V2 — на странице «Распиновка JTAG и SWD».

VTref — опорное напряжение. Микроконтроллеры работают от 1,8, 2,5, 3,3 В и других напряжений, и отладчик должен выдавать и понимать те же уровни. По входу VTref адаптер узнаёт напряжение питания выводов кристалла и задаёт по нему пороги своих входных компараторов и уровни выходов. VTref не питает плату: его соединяют прямо с шиной VDD выводов, без последовательного резистора. Если подключить его нельзя, у современных J-Link напряжение задают вручную — Fixed VTref. С неверным VTref отладчик использует чужие пороги, и связь сбоит (SEGGER, VTref).

RTCK. Некоторые кристаллы синхронизируют входы JTAG со своим внутренним тактом и не успевают за быстрым TCK. Они возвращают такт на вывод RTCK, и отладчик с адаптивным тактом ждёт, пока каждый фронт TCK вернётся, прежде чем выдать следующий; если RTCK нет, вывод соединяют с землёй (SEGGER, 20-pin J-Link Connector). У Cortex-M адаптивный такт обычно не нужен.

Типичные проблемы

  • Отладчик не видит кристалл. Проверьте общий провод, VTref и разводку разъёма — подробный список на странице распиновки. Затем снизьте частоту SWCLK: длинные провода искажают фронты.
  • Программа отключила SWD. Выводы PA13/PA14 переназначены или кристалл ушёл в глубокий сон — подключайтесь под сбросом с проводом NRST, чтобы отладчик успел перехватить ядро до запуска программы.
  • FAULT после первого же запроса. Отладчик не прочитал DPIDR после сброса линии или в CTRL/STAT остались флаги ошибок от прошлой сессии — их сбрасывают записью в ABORT.
  • Бесконечный WAIT. Обращение AP зависло на шине: например, к периферии без тактирования или к выключенному домену питания. Помогает ABORT.DAPABORT и проверка, какой адрес читается.
  • Неверная длина цепочки JTAG. У STM32F4 в цепочке два TAP, и сдвиг IR — 9 бит, а не 4. Отладчики узнают цепочку автоматически по IDCODE, но в ручной настройке OpenOCD и программах граничного сканирования длину IR каждого TAP задают явно.
  • TDO и SWO перепутаны в ожиданиях. В режиме SWD на выводе TDO нет данных JTAG — только трассировка SWO, если её включили.

Про программаторы и отладчики — ST-LINK, J-Link, CMSIS-DAP — в обзоре «Программаторы и отладчики», про ядра Cortex-M — в разделе ARM. Остальные интерфейсы — в разделе «Интерфейсы».

Частые вопросы

Чем SWD отличается от JTAG?

JTAG — стандарт IEEE 1149.1: линии TCK, TMS, TDI, TDO и необязательная TRST, автомат TAP, цепочка кристаллов, граничное сканирование. SWD — протокол Arm на двух линиях, SWCLK и двунаправленной SWDIO, с пакетами запрос — подтверждение — данные. Для отладки ядра Cortex-M они дают одно и то же: оба ведут к одному порту отладки DP. SWD экономит выводы, JTAG нужен для цепочек из нескольких кристаллов и граничного сканирования.

Что значат ответы SWD OK, WAIT и FAULT?

Это 3-битное подтверждение, которое кристалл отправляет после запроса. OK (0b001, на линии 1, 0, 0) — запрос принят, дальше идут данные. WAIT (0b010) — предыдущая операция ещё не закончилась, отладчик повторяет запрос. FAULT (0b100) — в порту отладки выставлен флаг ошибки, его надо сбросить через регистр ABORT. Если ответа нет вовсе, линия не синхронизирована, и отладчик делает сброс линии.

Сколько состояний у автомата JTAG TAP и как его сбросить?

Шестнадцать: Test-Logic-Reset, Run-Test/Idle и по семь состояний в ветвях регистра данных (DR) и регистра команд (IR) — Select, Capture, Shift, Exit1, Pause, Exit2, Update. Переходами управляет уровень TMS на нарастающем фронте TCK. Из любого состояния пять тактов с TMS = 1 приводят в Test-Logic-Reset; отдельный вывод TRST необязателен.

Зачем отладчику VTref?

По VTref адаптер узнаёт напряжение питания выводов микроконтроллера и по нему задаёт пороги своих входных компараторов и уровни выходов. Это опорное напряжение, а не питание: VTref соединяют прямо с шиной VDD выводов, без последовательного резистора. Если подключить VTref нельзя, у современных J-Link напряжение задают вручную — режим Fixed VTref. С неверным VTref адаптер работает с чужими порогами, и связь сбоит.

Что такое граничное сканирование?

Режим JTAG для проверки платы без программы: у каждого вывода микросхемы есть ячейка граничного регистра, и через TAP можно выставить уровни на выходах и прочитать входы. Так проверяют пайку и соединения между микросхемами. Описание ячеек конкретного кристалла производитель даёт в файле BSDL.

Источники

  1. Arm. Arm Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 (IHI 0031G, ID022122) — 2022: гл. A1 (DAP), B3 (JTAG-DP), B4 (SW-DP), B5 (SWJ-DP), C2 (MEM-AP)
  2. Texas Instruments. IEEE Std 1149.1 (JTAG) Testability Primer (SSYA002D) — 1997; стандарт IEEE 1149.1 — по этому руководству, гл. 3
  3. Texas Instruments. A Look at Boundary Scan From a Designer's Perspective (SCTA028) — 1996
  4. ST. RM0090: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 reference manual (Rev 21) — 2024, гл. 38 Debug support: выводы SWJ-DP, цепочка TAP, ID-коды, SW-DP
  5. Arm (Keil). Cortex-M Debug Connectors — Cortex Debug на 10 контактов и Cortex Debug+ETM на 20 контактов, шаг 0,05″
  6. SEGGER. VTref — VTref — опорное напряжение, Fixed VTref
  7. SEGGER. 20-pin J-Link Connector — RTCK и адаптивный такт, питание 5 В до 300 мА на контакте 19

Нашли ошибку?