Недавно при написании библиотеки к ESP-32 возникла необходимость ловить дедлоки, которые возникали иногда из-за моей криворукости, что породило необходимость покупки платы-отладчика с интерфейсом JTAG. Что из этого вышло — читайте под катом.


Приборы и материалы


Наша главная героиня, а точнее — цель отладки:



Плата на основе чипа ESP-WROOM-32. Ссылку не дам, т. к. в том месте уже всё раскупили.


Теперь — сама плата отладки:




CJMCU FT232H


Не заморачивался и заказал на алиэкспрессе за 740,08 руб. вместе с доставкой ePacket. Плата приходит с неприпаянными ногами, что нам только на руку, поскольку они нам не нужны.


Набор проводов, 6 шт.: один конец паять, другой — к ESP-32.


Ещё очень рекомендую USB-удлинитель, без него будет туго…


Компьютер с (X)Ubuntu 18.04.


Настройка


Установка OpenOCD для ESP-32


Тут можно смело ссылаться на доки самой esp-idf:


sudo apt-get install make libtool pkg-config autoconf automake texinfo libusb-1.0 libftdi1-2 git
git clone --recursive https://github.com/espressif/openocd-esp32.git # Или скачиваем релиз из https://github.com/espressif/openocd-esp32/releases
cd openocd-esp32
./bootstrap
./configure # Убеждаемся, что FTDI-based adapters включены
make -j6
sudo make install

Отдельно отмечу, что я ставил эту версию OpenOCD в систему (sudo make install), что неприемлемо, когда у вас разные OpenOCD для разных устройств.


Настройка OpenOCD под нас


На этом этапе я разделил конфиг для платы отладки и самой ESP-32. Получилось так:
board.cfg:


transport select jtag
adapter_khz 20000 # С этим можно поиграться
# set ESP32_ONLYCPU 1 # Только первое ядро
# set ESP32_RTOS none # Убрать поддержку RTOS
source [find target/esp32.cfg]

interface.cfg:


interface ftdi
ftdi_vid_pid 0x0403 0x6014
ftdi_layout_init 0x0c08 0x0f1b

Пишем правило Udev


Из-за проблем с правами мы не сможем получить доступ к USB-устройству. Это можно исправить одной строчкой правила udev:


echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6014", GROUP="plugdev, MODE="0666"' | sudo tee /etc/udev/rules.d/99-JTAG.rules
sudo systemctl restart udev.service
sudo udevadm control --reload-rules

Вспомогательный скрипт


Кроме всего прочего, весьма удобен скрипт вроде такого:


openocd_command:


#!/bin/bash
echo "$@" | telnet localhost 4444

Он позволит быстро посылать команды напрямую демону OpenOCD. Но об этом — позже.


Подключаем плату CJMCU к ESP-32


Тут нам понадобятся провода и паяльник, без этого никак. Ниже приведена таблица, что к чему подключать и зачем.


Контакт CJMCU Назначение JTAG Контакт ESP-32
AD0 TCK 13
AD1 TDI 12
AD2 TDO 15
AD3 TMS 14
+5V VIN (читать подробно!)
+3.3V 3V3 (читать подробно!)
GND GND (внезапно)

Про VIN и 3V3


Если вы не хотите тянуть от компа отдельный провод к ESP-32 devkit'у, то можно подключить +5V к VIN. Прошивка при этом будет идти через JTAG, что, как показал личный опыт, гораздо быстрее. Один минус этого варианта — нет возможности смотреть лог UART, но ИМХО отладчик напрочь убирает необходимость сего действия.


Как заметили в комментариях, на сам ESP-32 подавать 5V нельзя, только на devkit'ы. Если вам нужно отладить отдельный чип, можно запитаться от преобразователя самого CJMCU, подключив +3.3V на нём к 3V3 на ESP-32. Но про то, хватит ли мощности преобразователя, ничего не могу сказать, лучше возьмите отдельный источник питания. И да, подключать 5V и 3.3V одновременно не стоит.


При этом GND подключать обязательно всегда!


Проверяем OpenOCD


Запускаем OpenOCD так:


openocd -s 'куда вы кидали interface.cfg и board.cfg'  -f interface.cfg -f board.cfg

Если всё прошло успешно, вам покажут что-то вроде этого:


Open On-Chip Debugger 0.10.0-dev (2018-08-22-14:47)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
adapter speed: 20000 kHz
esp32 interrupt mask on
Info : ftdi: if you experience problems at higher adapter clocks, try the command "ftdi_tdo_sample_edge falling"
Info : clock speed 20000 kHz
Info : JTAG tap: esp32.cpu0 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : JTAG tap: esp32.cpu1 tap/device found: 0x120034e5 (mfg: 0x272 (Tensilica), part: 0x2003, ver: 0x1)
Info : esp32: Debug controller was reset (pwrstat=0x5F, after clear 0x0F).
Info : esp32: Core was reset (pwrstat=0x5F, after clear 0x0F).
Info : Detected debug stubs @ 3ffb3134 on core0 of target 'esp32'
cpu0: Current bits set: BreakIn BreakOut RunStallIn
cpu1: Current bits set: BreakIn BreakOut RunStallIn

Это говорит о том, что всё заработало!


Важно: процесс OpenOCD должен крутиться всё время, пока вы заняты отладкой.


Задействуем Eclipse


Тут есть целый ряд шагов, который прекрасно описан в официальной документации, и я их не буду повторять.


Советы по отладке в Eclipse


  1. Забудьте про кнопку EN аки reset на плате. Перезапуск делайте только через "Terminate and relaunch".


  2. Для прошивки используйте


    openocd_command 'program_esp32 абсолютный_путь/файл.bin 0x10000 verify'

    Можете добавить это как цель сборки, поставив openocd_command кастомной командой, а в поле "имя цели" вписать аргументы (без кавычек).


  3. Вы можете получить не то, что ожидали, после остановки и возобновления. Моя библиотека для воспроизведения звука после этого тараторит как ненормальная из-за приколов с таймером.



На этом мой текущий опыт работы с данной системой заканчивается. Желаю плодотворной отладки (будем честны, приятной она не бывает)!

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


  1. FGV
    26.08.2018 14:13

    Хм, наверное все таки не контакт ESP-32 VIN, а контакт на плате «ESP32 DEVKIT ...».
    Если на сам ESP32 WROOM подать 5В, он скорее всего сгорит.


    1. vyo Автор
      26.08.2018 15:01

      Ваша правда.


  1. jaiprakash
    26.08.2018 16:57

    Как вариант: покупал плату под FT2232H, там можно одновременно с JTAG вывести UART (или что-нибудь другое), на microsin.ru.


  1. r0mik
    26.08.2018 20:05

    750 руб дорого. китайские клоны blue_pill у меня под боком продаются по цене грязи, а уж на али… и переделываются в полноценный swd/jtag бесплатно, путем простой прошивки в Black Magic Probe, даже паять не нужно ничего. кстати, отладку поддерживают напрямую через gdb, то есть без openOCD, что иногда тоже удобно…
    только почему-то у нас этот отладчик не получил должного распространения. на хабре был один лишь обзор, да и тот скромно умалчивает о легкости прошивки практически любых плат на stm32 в этот отладчик.
    вот, для интересующихся — satoshinm.github.io/blog/171223_jtagswdpillblink_jtagswd_debugging_via_black_magic_probe_on_an_stm32_blue_pill_and_blinking_a_led_using_stm32cubemx_libopencm3_and_bare_metal_c.html


    1. Exeland
      27.08.2018 13:46

      интересно… А скорость отладки при этом ниже наверное?


  1. Intelligent
    26.08.2018 23:26

    В другом дешевом адаптере — Baite я так понял можно и JTAG и UART, если его прошить — microsin.net/programming/arm/swd-jtag-adapters.html


  1. PKav
    27.08.2018 14:18

    Какое совпадение. Всю прошлую неделю собирал именно такую схему.
    Не удалось только заставить Eclipse автоматически определить структуру данных, когда добавляешь в Watch системные регистры, типа LEDC или GPIO. Если указать тип — то все работает, но это неудобно.

    Кнопка EN иногда помогает, когда ядра входят в ступор и постоянно перезагружаются.

    По питанию — там не очень хватает и родных конденсаторов, иногда чип при активации WiFi перезагружается по Brown out, приходится допаивать еще конденсаторы.

    Кстати, никого не смущает закрытость библиотек управления WiFi частью? Разработчики говорят, что это чтобы хакеры не создавали на основе этих чипов всякие злые устройства, нарушающие работу сетей и не очерняли имя начинающего разработчика микроконтроллеров.


    1. FGV
      28.08.2018 08:07

      По питанию — там не очень хватает и родных конденсаторов, иногда чип при активации WiFi перезагружается по Brown out, приходится допаивать еще конденсаторы.

      а от скольки питаете? при питающем 3.3В не замечал перезагрузки по brownout а вот когда попытался перейти на 2.5В — уходит в постоянный перезагруз :(


      1. PKav
        28.08.2018 08:33

        От 3.3 и питаю, но тем не менее. На 8266 такая же проблема была.

        Кстати, ещё странность — GPIO6-11 идут на внутреннюю флеш-память модуля WROOM, но так же зачем-то выведены наружу, хотя использовать их невозможно. При этом пины 20, 24, 28-31 на модуле не выведены. Очень странный дизайн. Благо есть PICO-D4 версия.


        1. FGV
          28.08.2018 09:04

          От 3.3 и питаю, но тем не менее. На 8266 такая же проблема была.

          Очень странно. И 8266 и 32 кормил от импульсника на tps560200 на 3.3В перезагрузки по питанию не наблюдал.


          Кстати, ещё странность — GPIO6-11 идут на внутреннюю флеш-память модуля WROOM, но так же зачем-то выведены наружу, хотя использовать их невозможно.

          почему невозможно? на них можно повесить spi ram (например как у wrover).


          При этом пины 20, 24, 28-31 на модуле не выведены.

          они вроде и физически из чипа не выведены.


          Очень странный дизайн.

          согласен, но ценник подкупает :)