Начало работы с OPENOCD с использованием адаптера FT2232H для отладки SWD
Узнайте, как легко мигать ваш MCU на основе ARM, используя отладчик OpenOCD с адаптером FT2232H.
Старые MCU от таких поставщиков, как ATMEL и MICROCHIP, такие как PIC16F и семейства Atmega, имеют специальный программный интерфейс для программирования внутренней вспышки. Например, Atmega использовала штырьки SPI (MISO, MOSI, SCK) и PIC использовали два вывода (PGC, PGD) - один как часы, а другой как двунаправленную линию данных.
Новые MCU, особенно с ядром ARM, используют JTAG / SWD в качестве интерфейса программирования / отладки.
В чем разница между Joint Test Action Group (JTAG) и Serug Wire Debug (SWD) «text-align: center;»>

Сигналы интерфейса SWD
Обзор OpenOCD
Открытый On-Chip Debugger (OpenOCD) - это бесплатный проект с открытым исходным кодом, целью которого является предоставление отладки, внутрисистемного программирования и пограничного сканирования с использованием адаптера отладки. Адаптер - это аппаратный модуль, который обеспечивает правильные сигналы для понимания цели.
Отладчик OpenOCD поддерживает множество адаптеров отладки, которые можно просмотреть на веб-сайте OpenOCD.
Чтобы сделать работу OpenOCD, вы должны настроить ее с помощью команд или с помощью файлов конфигурации. Когда конфигурация завершена и установлено соединение с целью, OpenOCD начнет работать как демон. Daemon - это фоновый процесс, который отвечает на запросы служб. OpenOCD теперь будет ожидать подключения от GDB, Telnet или других других каналов и обрабатываемых команд.

Блок-схема OpenOCD
Обзор FT2232H
FT2232H - это двойной высокоскоростной USB-порт для универсальной UART / FIFO IC. Это означает, что это одночиповый USB с двумя портами.
Каждый порт оснащен двигателем, называемым Multi-Protocol Synchronous Serial Engine (MPSSE), который упрощает синхронный последовательный протокол (от USB до JTAG, I2C, SPI или бит-бит). Это позволяет пользователям настраивать канал с нужным протоколом. MPSSE доступны на канале A и канале B и могут быть настроены для разрешения любого синхронного последовательного протокола.
Будьте внимательны перед выбором OpenOCD
Выбор OpenOCD в качестве инструмента для отладки с помощью адаптера, такого как FT2232H, является очень хорошим выбором, если у вас нет большого бюджета для работы.
Помимо бесплатного и открытого исходного кода, OpenOCD также имеет хорошее сообщество поддержки. НО, как и в любом другом инструменте с открытым исходным кодом, вы можете столкнуться с ошибками, которые вам могут понадобиться исправить самостоятельно.
Мне потребовалось некоторое время, чтобы понять, как заставить OpenOCD работать и запускать мой MCU, и я надеюсь, что этот учебник станет хорошей и полной ссылкой.
Кроме того, я советую любому, кто ищет инструменты для отладки, выбирать с умом. Например, если вам нужен простой инструмент, я думаю, что OpenOCD, возможно, не лучший выбор для вас!
Другими хорошими альтернативными инструментами отладки являются:
- Segger J-Link
- ULINK
- Отладчики по умолчанию, встроенные в оценочные платы (например, STM32, EFM32 и другие семейства MCU) поставщиками кремния
В заключение, если у вас нет большого бюджета, времени или терпения, OpenOCD с FT2232H будет отличным выбором для вас.
Требования
Вот что вам нужно для завершения этого учебника:
- Платформа FT2232H
- ОС Windows или Linux с рабочей копией OpenOCD
- Целевая микросхема
Давайте рассмотрим каждую пьесу индивидуально.
FT2232H:
Вы можете получить дешевый от китайских поставщиков, таких как Taobao, Alibaba и AliExpress. Я заказал у меня из Taobao около 14 долларов.
Вы также можете заказать официальный модуль FTDI, мини-модуль FT2232H.


Платформы FT2232H
ОС Windows или Linux с рабочей копией OpenOCD:
Windows: вы можете получить исполняемую версию OpenOCD из неофициальных двоичных пакетов.
Linux: вы можете получить его из пула пакетов вашего дистрибутива Linux, такого как debian package.
Или вы можете построить его из исходного кода, трудный путь! Это маршрут, который я выбрал, лично. Вы можете найти полезные руководства о том, как это сделать, например, от Dangerous Prototypes (для Windows) или eLinux (для Linux). Вы также можете прочитать инструкции по компиляции из исходного кода OpenOCD (README. Windows и README).
Примечание. Некоторое время назад команда разработчиков OpenOCD решила больше не предоставлять никаких официальных бинарных файлов. Они предлагают только исходный код, ожидая, что поставщик оборудования JTAG создаст двоичные файлы. Убедитесь, что используемый вами двоичный файл поддерживает ваше оборудование JTAG.
Целевая микросхема:
Я выбрал мой прорыв с EFM32G200F32, микроконтроллером ARM Cortex-M3 (MCU), но любой другой поддерживаемый MCU будет работать.

Моя доска объявлений EFM32G200F32

Развязка EFM32G200F32
Как организован OpenOCD
Чтобы запустить OpenOCD, вам нужен только правильный файл конфигурации (.cfg), поставляемый в OpenOCD. Этот файл конфигурации имеет команды, которые являются расширениями для Jim-Tcl. Jim-Tcl - это язык программирования, который обеспечивает простой и расширяемый командный интерпретатор.
Файл каталога OpenOCD имеет папку под названием «скрипты». В этой папке вы увидите папки «interface», «board» и «target». И это в значительной степени единственные папки, которые вам нужны.
- Интерфейс: файлы конфигурации для аппаратных адаптеров, например «minimodule.cfg».
- Совет: файлы конфигурации для общих плат разработки, такие как «atmel_sam4s_xplained_pro.cfg» - «olimex_stm32_h107.cfg» - «stm32f4discovery.cfg» и т. Д. Вы можете видеть, что эти файлы повторно используют файлы конфигурации из интерфейса и целевого.
- Цель: файлы конфигурации для микросхем MCU.
Однако вы можете написать свои собственные файлы конфигурации, которые мы собираемся сделать в этом учебнике.
Когда мы запускаем OpenOCD, мы можем предоставить ему столько файлов конфигурации, сколько хотим:
openocd -f config1.cfg -f config2.cfg -f config3.cfg
Понимание основ конфигурации адаптера
Во-первых, нам нужно сообщить OpenOCD тип адаптера, с которым он будет работать, с помощью команды интерфейса.
Чтобы просмотреть полный список интерфейсов, поддерживаемых вашей версией OpenOCD, используйте следующую команду:
openocd -c interface_list
В нашем учебнике мы будем использовать адаптер с чипом FT2232H, поэтому мы будем использовать драйвер интерфейса FTDI:
интерфейс ftdi
Вы также должны сообщить OpenOCD дополнительную информацию об адаптере (интерфейсе). Например, вам нужно указать VID / PID, серийный номер или номер канала, который вы будете использовать для FT2232H, так как он имеет два канала.
ftdi_vid_pid 0x0403 0x6010
ftdi_channel 1
ftdi_serial "FTZ7O8O0"
Адаптер может поддерживать более одного транспортного протокола, поэтому OpenOCD позволяет выбрать транспортный протокол:
транспорт выбрать swd
Вы также должны сообщить OpenOCD исходные значения данных и регистров направления FTDI GPIO через команду ftdi_layout_init. Вы должны сначала поместить начальные значения 16 контактов канала, а затем направления. Зная, что «1» предназначен для выбора направления в качестве выхода, а «0» - для ввода, а каждый канал в ft2232H имеет 16 контактов.
ftdi_layout_init 0x0018 0x05fb
Это означает:
Низкие выходные данные = 0x18 // 0001 1000
Низкое направление = 0xfb // 1111 1011
Высокое направление = 0x05 // 0000 0101
Чтобы узнать больше о конфигурации адаптера, вы можете обратиться к руководству OpenOCD.
Подключение цели с помощью адаптера
Существует файл конфигурации, называемый swd-resistor-hack.cfg, который содержит схему подключения:

Проводка FT2232H с целевым
Файл содержит примечание:
«Подключите TDI к SWDIO через подходящий последовательный резистор (220-470 Ом или около того в зависимости от возможностей привода для цели и адаптера) подключите TDO напрямую к SWDIO».
Таким образом, без подключения этого резистора соединение не будет установлено.

Разбивка FT2232H
Все вместе
Попробуем теперь установить соединение между адаптером и мишенью с помощью OpenOCD.
Часть 1: создание необходимых проводных соединений

Подключение FT2232H с целью
Часть 2: Запустите OpenOCD
Сначала сделайте специальный файл конфигурации для нашего адаптера. Создайте новый txt-файл (ANYNAME.cfg). Не забудьте изменить VID / PID и серийный номер в соответствии с вашим чипом:
#This configuration file is created for a tutorial: #”Getting Started with OPENOCD Using FT2232H Adapter for SWD Debugging” #Written by:Yahya Tawil - yahya.tawil_at_gmail.com #Pulished on: //www.allaboutcircuits.com #Version of OpenOCD:0.9.0 interface ftdi transport select swd ftdi_vid_pid 0x0403 0x6010 #ftdi_device_desc "USB Serial Converter A" #ftdi_device_desc "FT2232H 开发板" ftdi_serial "FTZ7O8O0" #adapter_khz 8 ftdi_layout_init 0x0018 0x05fb ftdi_layout_signal SWD_EN -data 0 ftdi_layout_signal nSRST -data 0x0010
Примечание. Определение сигнала SWD_EN важно для работы с OpenOCD, даже если мы физически не подключаем его. Если мы этого не сделаем, появится ошибка:
Ошибка: режим SWD активен, но сигнал SWD_EN не определен
Окна:
После загрузки копии OpenOCD, как описано выше, запустите консоль CMD, затем перейдите в каталог, в котором присутствует OpenOCD. Например:
cd Desktop \ openocd-0.9.0 \ bin
Помните: у нас есть файл конфигурации (я назвал его SWD_FT.cfg), и цель является одним из чипов EFM32.
Затем в CMD введите:
openocd -f interface / ftdi / SWD_FT.cfg -f target / efm32.cfg
Linux:
В терминале введите:
Sudo openocd -f interface / ftdi / SWD_FT.cfg -f target / efm32.cfg
Теперь вы должны получить что-то вроде:
Информация: включен режим FTDI SWD
скорость адаптера: 1000 кГц
cortex_m reset_config sysresetreq
Информация: тактовая частота 1000 кГц
Информация: SWD IDCODE 0x2ba01477
Info: efm32.cpu: аппаратное обеспечение имеет 6 точек останова, 4 точки наблюдения
Если у вас возникли проблемы, ознакомьтесь с разделом устранения неполадок - это может быть плохая проводка или проблема с драйвером для пользователей Windows.
Часть 4: Открыть соединение Telnet
Откройте другое окно CMD и введите:
telnet localhost 4444
Часть 5: Общение с целью
Не забудьте остановить свою цель перед любыми операциями отладки:
сброс остановки
Вы получите что-то вроде:
целевое состояние: остановлено
цель остановлена из-за отладочного запроса, текущий режим: поток
xPSR: 0x01000000 шт.: 0x00000bbc msp: 0x20002000
Чтобы прочитать внутренние регистры из нашего чипа, введите:
р

Ответ команды reg
Чтобы прошивать изображение во внутреннюю вспышку, нам необходимо определить внутренние флэш-банки. Это может быть один банк, как наша нынешняя цель, «efm32.cfg» для нас. Чтобы убедиться, введите следующее:
Флеш-информация 0
Или
flash список
флеш-банки
Он вернет следующее:
# 0: efm32.flash (efm32) при 0x00000000, размер 0x00008000, ширина шины 0, ширина шины 0
Теперь, чтобы запустить нашу программу, используйте команду flash write_image.
Эта команда принимает файлы bin (двоичные), ihex (Intel hex), elf (файлы ELF), s19 (Motorola s19), mem или builder.
flash write_image erase "Desktop / FirstApp.hex"
Вы должны получить что-то вроде:
автоматическое стирание включено
написал 1536 байт из файла Desktop / FirstApp.hex в 0.124740s (12.025 KiB / s)
Теперь сделайте свою цель снова запущенной с помощью этой команды:
перезагрузка
Чтобы выйти из Telnet-подключения, просто введите:
выход
Прочтите руководство OpenOCD, чтобы узнать больше о мигающей памяти с помощью OpenOCD.
Исправление проблем
Пример ошибки 1:
Ошибка: невозможно открыть устройство ftdi: usb_open () не удалось
Эта ошибка может быть вызвана использованием драйвера libusb в Windows, в то время как в новых версиях OpenOCD используется драйвер WinUSB.
Во-первых, убедитесь, что вы остановили Windows от установки драйвера автоматически:


Затем удалите драйвер FTDI по умолчанию. Вы можете использовать инструмент из FTDI под названием CDM Uninstaller xx - Windows Device Driver Uninstaller: просто введите свой VID и PID.
Обратите внимание, что идентификатор поставщика FTDI по умолчанию - 0x0403. Идентификаторы продукта по умолчанию:
- Одноканальные устройства (R Chips): 0x6001
- Двухканальные устройства (2232C / D / H Chips): 0x6010
- Четырехканальные устройства (чипы 4232H): 0x6011
Подробнее читайте здесь.
Наконец, используйте Zadig Tool для установки драйвера WinUSB.
Пример ошибки 2:
-
Информация: тактовая частота 1000 кГц
в процедуре 'init'
в процедуре 'ocd_bouncer'
Эта ошибка вызвана неправильной проводкой или отсутствием резистора между TDI и TDO в «swd-resistor-hack.cfg», как мы упоминали выше.
Это также может быть вызвано плохой конфигурацией, например, отсутствующей командой ftdi_layout_init из файла конфигурации:
ftdi_layout_init 0x0018 0x05fb
Пример ошибки 3:
-
Ошибка: libusb_open () не удалось выполнить с помощью LIBUSB_ERROR_ACCESS
Ошибка: устройство не найдено
Ошибка: не удалось открыть ftdi-устройство с помощью vid 0403, pid 6010, описание '*' и серийный 'FTZ7O8O0'
Подобное сообщение об ошибке появится при запуске OpenOCD в Linux без разрешения. Убедитесь, что вы запускаете OpenOCD с помощью sudo, «sudo opeocd».
Рекомендации:
(1) Использование OpenOCD в качестве автономного FLASH-программиста (простой учебник) - Olimex
(2) Команды вспышки - Руководство по OpenOCD
(3) Конфигурация адаптера отладки - Руководство по OpenOCD
(4) Начало работы с компилятором ARM GCC для Windows, часть 5: Отладка с помощью OpenOCD
(5) Настройка OpenOCD для AT91SAM7S
(6) Общие команды - Руководство по OpenOCD
(7) OpenOCD - eLinux
(8) FT2232H DataSheet (PDF)