Можно ли подключить несколько микроконтроллеров к одному отладчику по SWD?
Обновлено Редакция GAW
Обычный SWD — соединение точка — точка: отладчик посылает запрос, и единственный подключённый кристалл отвечает по линии SWDIO. Второй кристалл на той же паре проводов ответил бы одновременно с первым. Чтобы этого не было, Arm добавила в SWD версии 2 режим multidrop: после сброса линии отладчик пишет в регистр TARGETSEL, и отвечает только выбранное устройство.
Кто это умеет
| Кристалл | SWD multidrop | Источник |
|---|---|---|
| RP2040 | да: по DAP на каждое ядро плюс Rescue DP на общей шине | даташит RP2040, разд. 2.3.4 |
| STM32 с поддержкой multidrop | да, если разные TargetSel; в STM32CubeProgrammer — только запись флеш-памяти и байтов конфигурации | UM2237, разд. 3.2.10 |
| STM32F103 | нет: идентификатор SW-DP 0x1BA01477, поле версии — DPv1 (наш разбор) | RM0008, разд. 31 |
Варианты для чипов без multidrop
- Отдельный разъём SWD на каждый чип — проще всего; распиновки — на странице «Распиновка JTAG и SWD».
- Цепочка JTAG — TDO одного на TDI другого, TCK и TMS общие. В STM32F103 два TAP, поэтому длина регистра команд в цепочке из двух чипов — 2 · (5 + 4) = 18 бит (наш расчёт по RM0008).
- Переключатель линий SWDIO и SWCLK между чипами.
Как устроены оба протокола, разобрано в статье «JTAG и SWD», а термины — в словаре на странице SWD.
Похожие вопросы
Можно ли просто соединить SWDIO и SWCLK двух STM32F103 параллельно?
Нет. Без multidrop оба кристалла ответят на один и тот же запрос и будут одновременно управлять линией SWDIO — данные испортятся, а выходы могут конфликтовать. Ставят отдельный разъём на каждый чип или переключатель линий.
Как устроена цепочка JTAG из нескольких STM32F103?
TDO одного чипа соединяют с TDI следующего, а TCK и TMS подают на все параллельно. В каждом STM32F103 два TAP подряд, поэтому в цепочке из двух чипов четыре TAP, и отладчик должен уметь переводить лишние в BYPASS — это поддерживают не все отладчики и программы.
Сколько чипов поддерживает multidrop?
Архитектура SWD версии 2 по спецификации Arm допускает практически неограниченное число устройств, ограничивает только электрика линии. На деле ограничение — уникальность TARGETSEL: два кристалла с одинаковым идентификатором на одной шине не различить. Некоторые чипы позволяют его менять: у RP2040 номер экземпляра — старшие 4 бита адреса DAP — задаётся регистром sysconfig, что даташит прямо предлагает для систем из нескольких микросхем; значение 0xF занято Rescue DP.
Источники
- Arm. Arm Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 (IHI 0031G, ID022122) — разд. B4.1: SWD протокола версии 2 — многоточечная архитектура: двухпроводное подключение ко многим устройствам, число устройств ограничено только электрикой, совместимость с отладчиками без multidrop, неактивные устройства могут отключать питание и не нагружают линию; требует состояния dormant; разд. B2.2.11 — регистр TARGETSEL выбирает устройство сразу после сброса линии, во время ответа на запись никто не управляет линией; TARGETSEL есть в DPv2
- STMicroelectronics. UM2237 STM32CubeProgrammer software description, Rev 29 (November 2025) — разд. 3.2.10 SWD Multidrop: один интерфейс SWD для нескольких устройств на одной шине, поддерживаются только запись флеш-памяти и байтов конфигурации; команда -getTargetSelList показывает устройства на шине; параметр подключения TargetSel=<значение>; одновременно можно подключить только устройства с разными TargetSel; старая прошивка ST-LINK — нужна обновлённая; подробности в AN6382
- STMicroelectronics. RM0008 Reference manual STM32F101/F102/F103/F105/F107, Rev 21 (February 2021) — разд. 31.5: в STM32F10xxx два последовательно соединённых TAP — boundary scan (регистр команд 5 бит) и Cortex-M3 (4 бита), неиспользуемый TAP переводят в BYPASS; после выбора SWD TAP boundary scan отключается; идентификатор SW-DP 0x1BA01477
- Raspberry Pi Ltd. RP2040 Datasheet — разд. 2.3.4: отладка через независимые DAP каждого ядра на общей шине SWD multidrop (SWD v2), каждый DAP отвечает только на свой TARGETSEL, остальные отпускают линию; отдельный Rescue DP; адреса по умолчанию: ядро 0 — 0x01002927, ядро 1 — 0x11002927, Rescue DP — 0xf1002927; номер экземпляра (старшие 4 бита) меняется регистрами sysconfig PROC0/PROC1_DAP_INSTID для многокристальных систем, 0xF зарезервирован; рекомендуемая частота SWD до 24 МГц, при плохих или длинных проводах — до 1 МГц
Нашли ошибку?
Смотрите также
- JTAG и SWDTAP из 16 состояний, IR/DR, пакеты SWD, ACK, DP и AP, SWO, VTref
- SWDSerial Wire Debug: отладка и прошивка Cortex-M по двум проводам
- TAP-контроллер JTAGКонечный автомат JTAG из 16 состояний, которым управляют TMS и TCK
- JTAG и SWDARM JTAG 20, Cortex Debug 10, STDC14, ST-LINK
- RP2040: выводы и функции GPIO30 GPIO: выводы QFN-56, функции F1–F9, АЦП, QSPI, SWD, питание, токи