Всем привет! Из этого руководства вы узнаете, как подключиться для отладки практически к любому ARM-чипу с помощью Arm Development Studio — когда ни J-Link, ни ST-Link сделать этого не могут (по разным причинам).

Этой инструкцией со мной когда-то поделился бывший коллега (за что ему огромное спасибо), и я решил спустя много лет, что такому полезному материалу не место в переписках в Telegram — его нужно публиковать.

Кому будет полезно

Материал пригодится тем, кому в работе или в рамках хобби регулярно приходится отлаживать код на устройствах с китайскими ноунейм-чипами на архитектуре ARM. Если ваш отладчик (J-Link, ST-Link или любой другой) не видит на чипе интерфейсы JTAG или SWD — или видит, но не может или не хочет подключаться — это руководство для вас. Даже если ваш аппаратный отладчик успешно работает со всеми устройствами, уверен, вы узнаете из статьи что-то новое.

JTAG или SWD есть, а подключения нет

Если при подключении по SWD или JTAG вы видите сообщение, похожее на скриншот ниже, или J-Link сообщает, что к условному Cortex-A76 можно подключиться только при помощи J-Link Pro, или дело не идёт дальше получения DPIDR по SWD, — ситуацию можно исправить либо с помощью OpenOCD (не всегда), либо через Arm Development Studio (Arm DS).

Неудачная попытка подключения J-Link к чипу от вендора SigmaStar
Неудачная попытка подключения J-Link к чипу от вендора SigmaStar

Необходимое оборудование

Сразу отмечу: Arm DS не умеет работать с J-Link. Зато поддерживает ST-Link, конвертеры на базе FTDI (например, FT2232HQ) и CMSIS-DAP-отладчики. Вот полный список поддерживаемых типов:

Список поддерживаемых отладчиков
Список поддерживаемых отладчиков

Из перечисленных у меня есть Tigard (для JTAG) и CMSIS-DAP-отладчик, сделанный на базе STM32F103C8T6 BluePill (для SWD). Последний, кстати, лучше не покупать готовым (у меня с такими были проблемы при подключении), а прошить самостоятельно: советую ознакомиться с репозиториями dap42 и dapboot.

Настройка платформы

Открываем Arm DS, выбираем в меню FileNewOtherConfiguration Database:

Окно выбора Configuration Database
Окно выбора Configuration Database

Жмём Next и указываем осмысленное имя для файла базы. В ней будут храниться параметры подключения к нашим устройствам, и позже мы сможем добавлять новые конфигурации:

Окно указания имени Configuration Database
Окно указания имени Configuration Database

Нажимаем Finish. После этого в окне Project Explorer разворачиваем созданную базу и выбираем FileNewOtherPlatform Configuration, Next:

Окно выбора Platform Configuration
Окно выбора Platform Configuration

В окне Create Platform Configuration выбираем пункт Advanced platform detection or manual creation:

Окно создания Platform Configuration
Окно создания Platform Configuration

Нажимаем Next, затем в окне Platform Information заполняем данные о производителе и названии чипа, жмём Finish:

Окно Platform Information
Окно Platform Information

В результате в Project Explorer (в каталоге Boards) появится ветка с именем производителя и чипа, в которой создастся файл с расширением .sdf, а также откроется окно Platform Configuration Editor:

Окно Platform Configuration Editor
Окно Platform Configuration Editor

Подключение Arm DS к отладчику

В появившемся окне в разделе Probe Connection в зависимости от интерфейса выбираем:

  • JTAG → FTDI MPSSE JTAG,

  • SWD → CMSIS-DAP.

Для примера я подключаюсь к чипу Atmel ATSAM3X8E на Arduino DUE по JTAG, используя в качестве отладчика Tigard:

Tigard и Arduino DUE
Tigard и Arduino DUE
Tigard и Arduino DUE
Tigard и Arduino DUE

На Tigard переключатель ставим в режим JTAG, питание задаём как 3V3. После этого в Arm DS нажимаем кнопку Browse (кстати, использовать этот отладчик с Arm DS в режиме SWD не получится). Если вы работаете с отладчиком на правильном FTDI-контроллере (есть чипы без поддержки MPSSE — например, FT232R, FT232B, FT232L), появится такое окно:

Окно выбора канала FTDI-чипа
Окно выбора канала FTDI-чипа

В Tigard применяется двухканальный чип FT2232H, поэтому в окне два варианта. В моём случае правильный канал — Channel B, выделяем его и жмём Select. Затем, в разделе Debug System в поле Clock Speed (Hz) указываем частоту, которую поддерживает ваш FTDI. Например, для FT2232H максимум — 30 МГц (на всякий случай, поле позволяет вводить значение вручную).

Убеждаемся, что отмечены пункты Enumerate APs, Read CoreSight ROM Tables и Read Trace Topology, затем нажимаем Advanced Options и проверяем, чтобы в поле ProbeMode был выбран JTAG. Теперь можно нажать Autodetect Platform. Если подключения не произошло (ошибка Autodetection Failed в окне Console) , пробуем уменьшить частоту или проверяем пайку/провода:

Ошибка подключения
Ошибка подключения

В случае успеха в окне Console появится лог подключения, где последней строкой будет Autodetection Complete:

Успешное подключение
Успешное подключение

В левой части окна Platform Configuration Editor появятся обнаруженные Debug Port (DP), доступные Access Point (AP) и другие элементы таблицы Rom Table:

Окно Platform Configuration Editor
Окно Platform Configuration Editor

Если некоторые элементы отмечены жёлтым треугольником, возможно, адрес Rom Table выбран неверно. В таком случае выбираем нужный AP (например, CSMEMAP) и в таблице Device Information в поле ROM_TABLE_BASE_ADDRESS вписываем новое значение, например 0x80800000, после чего в контекстном меню AP выбираем пункт Read CoreSight ROM Tables:

Поле ROM_TABLE_BASE_ADDRESS
Поле ROM_TABLE_BASE_ADDRESS
Контекстное меню AP
Контекстное меню AP

Чтобы сформировать и сохранить результаты сканирования, в контекстном меню ранее созданного SDF-файла выбираем Build Platform. В результате появятся файлы dtsl_config_script.py и project_types.xml.

Отладка через JTAG

Для подключения к ARM-чипу необходимо создать отладочное подключение (Debug Connection). Для этого в окне Debug Control выбираем Create a debug connection… или идём в FileNewHardware Connection:

Окно Debug Control
Окно Debug Control

В появившемся окне New Debug Connection выбираем тип Hardware Connection и жмём Next:

Окно New Debug Connection
Окно New Debug Connection

Затем в окне Hardware Connection вписываем имя подключения (например, debug_conn), выбираем пункт Associate debug connection with an existing project, выделяем созданную ранее базу debug_configs и нажимаем Next:

Окно Hardware Connection
Окно Hardware Connection

В окне Target Selection выбираем созданного производителя и его чип (в моём случае AtmelATSAM3X8E), затем Finish:

Окно Target Selection
Окно Target Selection

После этого откроется окно Edit configuration and launch, где нужно выбрать ядро для отладки (в моём случае единственный вариант — Cortex-M3), в поле Target Connection снова указать FTDI MPSSE JTAG, нажать Browse и выбрать Channel B для Tigard:

Окно Edit Configuration
Окно Edit Configuration

Жмём Select, затем — Apply. На вкладке Files можно дополнительно загрузить ELF-файлы с символами или SVD для идентификации регистров:

Окно выбора дополнительных файлов
Окно выбора дополнительных файлов
Окно выбора дополнительных файлов
Окно выбора дополнительных файлов

Вот теперь можно нажимать Debug. В результате в окне Debug Control отобразятся все запущенные ядра. Доступных ядер может быть больше одного, если выбрать SMP-цель для отладки. В этом случае типичным названием для неё будет, например, Cortex-A76x4 SMP:

Окно Debug Control
Окно Debug Control

Если нажать на кнопку паузы (или клавишу F9), появится окно Disassembly с исполняемым в текущий момент кодом, а выполнение на ядре приостановится:

Окно Disassembly
Окно Disassembly

В окне Registers можно увидеть все доступные регистры, включая управляющие, Aarch64 (если применимо) и многие другие:

Окно Registers
Окно Registers
Окно Registers
Окно Registers

Как видите, список регистров достаточно объёмный. На этом с отладкой через JTAG закончим и перейдём к SWD.

Отладка через SWD

Для отладки через этот интерфейс я использую ранее упомянутый BluePill с прошивкой dap42 и загрузчиком dapboot. Сборка и прошивка файлов этих проектов в вашу «пилюлю» в статье не рассматривается. Но отмечу, что важно собирать прошивку в режиме HID. После прошивки на BluePill будет задействована следующая распиновка SWD:

  • SWDIO → PB14,

  • SWCLK → PB13,

  • GND → GND.

Подключение BluePill к Raspberry Pi 5
Подключение BluePill к Raspberry Pi 5

В качестве тестового устройства использую Raspberry Pi 5 с чипом Broadcom BCM2712. Чтобы включить отладку по SWD на «малине», нужно добавить строку enable_jtag_gpio=1 в файл config.txt раздела /boot.

В большинстве шагов отладка по SWD не отличается от JTAG, поэтому отмечу только разницу. Обратите внимание на скриншот ниже:

  • выбрана частота 2 МГц,

  • выбран отладчик CMSIS-DAP с указанием серийного номера.

Подключение отладчика CMSIS-DAP
Подключение отладчика CMSIS-DAP

В ProbeMode выбираем SWD, а в SWJEnable обязательно указываем True:

Таблица Advanced Options
Таблица Advanced Options

После нажатия кнопки Autodetect Platform должна появиться длинная портянка доступных ядер, с возможностью отладки как физических ядер (Bare Metal Debug), так и ядра Linux (Linux Kernel and/or Device Driver Debug):

Списк доступных ядер, AP и DP
Списк доступных ядер, AP и DP

На этом всё. Спасибо за внимание! Надеюсь, статья окажется для вас полезной.

Спойлер

P.S. У нашей исследовательской лаборатории есть телеграм-канал: [@bizone_hwlab](https://t.me/bizone_hwlab), в который мы периодически выкладываем разные интересные штуки, связанные с аппаратной безопасностью. Заходите, всем будем рады:)

Комментарии (16)


  1. EmCreatore
    12.02.2026 13:00

    Непонятна проблема.
    На первом скриншоте изображена удачное подключение.
    Дальше хоть Keil хоть VS Code, везде должно отлаживаться.


    1. DrMefistO Автор
      12.02.2026 13:00

      Нет. В случае с SigmaStar это подключение, которое не позволит ничего отлаживать. J-Link не смог распарсить Rom Table.


      1. EmCreatore
        12.02.2026 13:00

        Скриптами J-Link Commander легко находится ROM Table по всем AP.
        Потом делаем стартовый .JLinkScript с явным указанием CORESIGHT_CoreBaseAddr
        Все! Отлаживайте в любой IDE.
        Claude Opus такие скрипты влёт создает.

        Так что статья чуть опоздала. Да и слишком усложнена.
        Лучше промпты правильные бы написали.


        1. DrMefistO Автор
          12.02.2026 13:00

          Попробуйте тогда в следующий раз обойти скриптами ограничение J-Link на подключение к Cortex-A76, мол, у вас обычная EDU, а надо Pro, не меньше.


          1. misha_ruchk0
            12.02.2026 13:00

            SEGGER, я думаю, вправе решать как продавать то, что он создал.


            1. DrMefistO Автор
              12.02.2026 13:00

              Так вопросов к этому нет никаких. Только отлаживать A76 всё равно нужно как-то.


              1. EmCreatore
                12.02.2026 13:00

                Ох уж эти "отладчики"
                Скажем прямо - ломать.
                Ну так этих ломаных линков как с...к на алике.
                Мне что ли учить "реверс-инжинера"


        1. VelocidadAbsurda
          12.02.2026 13:00

          J-Link, например, не умеет работать с отладочными компонентами через AHB-AP (недавно попался девайс на Cortex-R4, требовавший такого). Прописываю нужный AP руками, а он говорит «выбранный АР - не APB-AP, ничего делать не буду, до свидания». Чисто искусственное ограничение, OpenOCD с правильным конфигом взял такое без проблем.


  1. almaz1c
    12.02.2026 13:00

    Жду и надеюсь, что когда-нибудь появится гайд по отладке ядра линукс в embedded)


    1. DrMefistO Автор
      12.02.2026 13:00

      Arm DS умеет. Можно даже свои эльфы подгрузить от ядра. В конце статьи про это есть


  1. radiolok
    12.02.2026 13:00

    С Debug проблемы более-менее понятны, как бы Trace освоить не покупая J-Trace Pro за 333 тыщщи рублей? Некоторые Real-Time проблемы с внешними устройствами можно разрешить только аппаратной трассировкой.


    1. DrMefistO Автор
      12.02.2026 13:00

      Купить DSTREAM за 500к руб?:)


      1. radiolok
        12.02.2026 13:00

        А вы мне точно заплатите?:)

        Просто TRACE интерфейс физически очень простой, каждая вторая плиса справится. Мне пока не удалось найти openSource проекты для ETM трейсинга. Хотя бы для кортекс-м.

        Вопрос конечно еще что там в J-Trace внутри делается с этим потоком, как ужимают и складывают чтобы их софт потом мог задекодировать...


        1. DrMefistO Автор
          12.02.2026 13:00

          Я знаю, что DSTREAM делает это куда быстрее J-Trace. Увы, это всё, что я знаю:)


        1. VelocidadAbsurda
          12.02.2026 13:00

          У меня такое ощущение, что многие дорогие «коробки» для трассировки - инерция мышления старых времён, когда было проблематично завести такой поток данных напрямую в РС и приходилось буферировать его в самой коробке. Сейчас же эти несчастные 4 бита на частоте ядра можно задёшево пустить напрямую в РС через USB 3.x и разбирать уже там.


        1. VelocidadAbsurda
          12.02.2026 13:00

          И вот таки нашёлся open source проект: https://orbcode.org/orbtrace-mini/