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.
Как читать схему (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).
Чтобы добраться до ядра, отладчик сдвигает в 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):
- Запрос, 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, которую выдаёт отладчик.
- Подтверждение, 3 бита, от кристалла: OK, WAIT или FAULT.
- Данные, 33 бита: 32 бита и бит чётности — от кристалла при чтении, от отладчика при записи. Обычно фаза есть только после ответа OK; исключение — включённый флаг CTRL/STAT.ORUNDETECT: тогда фаза данных следует и за WAIT и FAULT (IHI 0031G, разд. B4.1.1).
Когда направление линии меняется, вставляется такт смены направления (turnaround, Trn): линию не ведёт никто, и её состояние не определено (IHI 0031G, разд. B4.1.3) — подтяжка лишь удерживает прежний уровень. По умолчанию он длится один такт: после запроса, после подтверждения на запись и после данных чтения.
Порядок бит и чётность. Все поля идут младшим битом вперёд: адрес 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] | На линии | Ответ | Что делает отладчик |
|---|---|---|---|
| 0b001 | 1, 0, 0 | OK | передаёт или принимает данные |
| 0b010 | 0, 1, 0 | WAIT | повторяет тот же запрос; после долгого ожидания — запись ABORT.DAPABORT |
| 0b100 | 0, 0, 1 | FAULT | в порту выставлен флаг ошибки; читает 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):
- Не меньше 50 тактов с SWDIO/TMS = 1 — автомат JTAG уходит в Test-Logic-Reset.
- 16 бит 0b0111 1001 1110 0111 старшим битом вперёд — то же, что 0xE79E младшим вперёд.
- Ещё не меньше 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.
Через JTAG-DP доступ к DP и AP идёт командами в регистре IR длиной 4 или 8 бит (IHI 0031G, разд. B3):
| IR (4 бита) | Регистр | Длина | Назначение |
|---|---|---|---|
| 1000 | ABORT | 35 бит | прервать зависшее обращение |
| 1010 | DPACC | 35 бит | чтение или запись регистров DP |
| 1011 | APACC | 35 бит | чтение или запись регистров AP |
| 1110 | IDCODE | 32 бита | идентификатор JTAG-DP |
| 1111 | BYPASS | 1 бит | обход, требование 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):
| Вывод | JTAG | SWD | После сброса |
|---|---|---|---|
| PA13 | JTMS | SWDIO | вход с подтяжкой к питанию |
| PA14 | JTCK | SWCLK | вход с подтяжкой к земле |
| PA15 | JTDI | — | вход с подтяжкой к питанию |
| PB3 | JTDO | TRACESWO (если включена трассировка) | выход без подтяжки |
| PB4 | NJTRST | — | вход с подтяжкой к питанию |
Подтяжки встроены, внешние резисторы не нужны. При работе только по 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.
Источники
- 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)
- Texas Instruments. IEEE Std 1149.1 (JTAG) Testability Primer (SSYA002D) — 1997; стандарт IEEE 1149.1 — по этому руководству, гл. 3
- Texas Instruments. A Look at Boundary Scan From a Designer's Perspective (SCTA028) — 1996
- 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
- Arm (Keil). Cortex-M Debug Connectors — Cortex Debug на 10 контактов и Cortex Debug+ETM на 20 контактов, шаг 0,05″
- SEGGER. VTref — VTref — опорное напряжение, Fixed VTref
- SEGGER. 20-pin J-Link Connector — RTCK и адаптивный такт, питание 5 В до 300 мА на контакте 19
Нашли ошибку?
Смотрите также
- JTAG и SWDARM JTAG 20, Cortex Debug 10, STDC14, ST-LINK
- Программаторы и отладчикиUSBasp, ST-LINK, J-Link, PICkit 5, Snap, CMSIS-DAP, WCH-LinkE: сравнение
- Логирование и трассировкаprintf через UART, ITM и SWO, SEGGER RTT, уровни журнала, метки времени
- ARM Cortex-MЯдра M0–M85: архитектуры, FPU, DSP, MPU, TrustZone, выбор
- Cortex-M3Регистры, карта памяти, bit-banding, NVIC, SysTick, MPU, старт, пример
- JTAGПоследовательный интерфейс тестирования и отладки по IEEE 1149.1: TCK, TMS, TDI, TDO
- SWDSerial Wire Debug: отладка и прошивка Cortex-M по двум проводам
- SWO (вывод трассировки)Однопроводный вывод трассировки и отладочных сообщений Cortex-M
- ИнтерфейсыUART, RS-232, RS-485, I²C, SPI, CAN: уровни, схемы, выбор
- Что делать, если ST-LINK пишет «No target connected»?Питание и земля, SWDIO/SWCLK, напряжение VTref, частота SWD, подключение под сбросом
- Нужны ли подтягивающие резисторы на линиях SWD?У STM32 подтяжки встроены; внешние — по даташиту кристалла, около 100 кОм
- Почему отладчик теряет связь со STM32, когда тот уходит в режим Stop?В Stop гаснут такты; бит DBG_STOP в DBGMCU_CR оставляет их для отладки