Введение

Здравствуйте друзья, я хочу поделиться с вами своим опытом в отладке ESP32 с помощью отладчиков, реализующих интерфейс JTAG. Данная задача кажется тривиальной (она такая и есть), при мысли об программировании микроконтроллеров. Но при старте работы с микроконтроллерами ESP32 я столкнулся с рядом проблем, о которых я хочу рассказать и от которых хочу уберечь вас.

Почему, зачем, для кого написана эта статья?

  • Для кого? Данная статья написана для тех, кто хочет поглубже познакомиться с микроконтроллерами семейства ESP32, а для более глубокого знакомства вам определенно не хватит отладки через терминал.

  • Почему и зачем? Я решил написать эту статью, т.к. не нашел готового решения на просторах интернета, в котором было бы описано как связать JLINK с ESP32.

    Прочитав документацию официального производителя на тему отладки по ссылке, я приступил к выполнению всех описанных шагов, и столкнулся с проблемой - отладка отказалась работать. Я потратил целый день и кучу нервов, прежде чем разобрался с проблемой. Поэтому хочу сэкономить ваше время.

Начнем с самого начала

Я решил проделать свой пройденный путь с вами с самого начала, чтобы ни у кого не было никаких вопросов. Начнем с постановки задачи, у меня есть отладочная палата ESP32 DEVKITV1 и я хочу начать освоение данного МК. Для этого мне необходим отладчик и загрузчик. Загрузчик на данной микросхеме уже есть, это простейший USB-UART СP2102. В качестве отладчика (так же он может выступать в роли загрузчика) я буду использовать JLINK, вы можете выбрать любой другой из этого списка поддерживаемых программаторов с сайта официального производителя.

Снизу прикладываю фото отладочной платы и программатора.

Установка IDE и необходимого софта, отладка через терминал, первый hello world

Производитель предоставляет нам несколько способов работы с их микроконтроллерами, на основе Arduino IDE, на основе Eclipse и на основе Visual Studio Code. Я выбрал Eclipse, т.к. часто в нем работал. Далее у нас есть два варианта, установить IDE как плагин к Eclipse или воспользоваться установщиком. Я пробовал установить IDE как плагин к Eclipse, но у меня не получилось собрать OpenOCD (Open On-Chip Debugger) — это открытое ПО для программирования и отладки различного железа. Его нужно собирать через командную строку, по корявой инструкции, в общем не рекомендую (либо это у меня руки кривые, либо документация недостаточно подробная). Так вот, пойдем по простому пути, будем пользоваться готовым установщиком.

Cсылка на документацию производителя

Необходимо выбрать диалог GetStardet->Introduction и найти ссылку на установщик. На момент написания статьи это актуальная ссылка.

Выбираем пункт где нам предлагают установить IDE со всем необходимым

Далее рекомендую сразу создать каталог на жестком диске, где будет расположена IDE и ваше рабочее пространство для проектов.

Лично я создал каталог по такому пути

C:/Soft
С:/Soft/workspace

Далее, после того как, скачали установщик, открываем его и выбираем нужный нам каталог для установки, а именно C:/Soft и соглашаемся со всем(на момент написания статьи можно было со всем согласиться ????)

Далее наш экран будет выглядеть примерно так, это командная строка IDE, через которую можно собрать проект, мы же воспользуемся графической средой.

Переходим в каталог ниже (версия может отличаться) и находим файл espressif-ide.exe

 C:\Soft\Espressif\tools\espressif-ide\2.8.1 

Далее нам необходимо выбрать расположение нашего workspace, выбираем заранее созданные каталог

С:/Soft/workspace

Далее открывается сам интерфейс IDE, создадим тестовый проект, точнее скопируем, выбираем File->New->Espressif IDF Project

Дадим имя нашему проекту, например Example, и жмем далее

Ставим галочку, что хотим использовать один из примеров и выбираем hello world.

Далее собираем проект, нажав на кнопку build и ждем пока проект соберется.

Не пугайтесь, если Eclipse выдаст какие-то ошибки после сборки, они связанный с индексацией, либо “г-кодом” примера. После сборки проекта неплохо проверить, работает ли вообще контроллер и проект. Подключаем плату к компьютеру, выбираем launch target: esp32, и выбираем нужный COM port.

Сразу же настроим терминал

Посмотрим внимательнее на код в примере

void app_main(void)
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    uint32_t flash_size;
    esp_chip_info(&chip_info);
    printf("This is %s chip with %d CPU core(s), WiFi%s%s, ",
           CONFIG_IDF_TARGET,
           chip_info.cores,
           (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
           (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    unsigned major_rev = chip_info.revision / 100;
    unsigned minor_rev = chip_info.revision % 100;
    printf("silicon revision v%d.%d, ", major_rev, minor_rev);
    if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {
        printf("Get flash size failed");
        return;
    }

    printf("%uMB %s flash\n", flash_size / (1024 * 1024),
           (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    printf("Minimum free heap size: %d bytes\n", esp_get_minimum_free_heap_size());

    for (int i = 10; i >= 0; i--) {
        printf("Restarting in %d seconds...\n", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    printf("Restarting now.\n");
    fflush(stdout);
    esp_restart();
}

Из примера интуитивно понятно, что программа должна выводить информацию о своих параметрах и затем перезагружаться спустя 10 секунд.

Отлично, теперь прошиваем контроллер, жмем RUN и открываем Terminal, там мы должны увидеть следующее

Теперь у нас есть понимание, что контроллер работоспособен. Из примера мы узнали, что с помощью функции printf() и окна термина, можно отлаживать проект. Но что делать с пошаговой отладкой, с точками отставки и возможностью мониторить регистры и значения переменных?

Отладка с помощью JLINK

Для начала необходимо подключить отладочную плату к программатору, для этого находим нужную плату на сайте производителя

https://www.espressif.com/en/support/documents/technical-documents

и находим описание пинов, ниже представлена схема подключения платы ESP32-WROOM-32

Далее подключаем соответствующие пины на плате к пинам на JLINK.

ESP32

JLINK

3,3

VTref

GND

GND

D12

TDI

D14

TMS

D13

TCK

D15

TDO

Конечный результат

Далее, нам нужно сообщить IDE, что мы хотим работать с проектом в режим отладки, для этого переходим на вкладку launch configuration, и создаем новую конфигурацию типа ESP-IDF GDB OpenOCD Debugging

Далее соглашаемся со стандартными настройками. Теперь рассмотрим конфиг внимательнее, для этого перейдем в настройки только что созданного конфига

Нам интересна вкладка Debug, в диалогом окне Config options прописаны команды, по умолчанию там прописаны такие команды

-s ${openocd_path}/share/openocd/scripts -f board/esp32-wrover-kit-1.8v.cfg

-s ${openocd_path}/share/openocd/scripts – путь к каталогу

-f board/esp32-wrover-kit-1.8v.cfg – путь к скрипту

Теперь давайте посмотрим, что делает скрипт, перейдем в каталог ниже(у вас он может отличаться, т.к. версии меняются)

C:\Soft\Espressif\tools\openocd-esp32\v0.11.0-esp32-20221026\openocd-esp32\share\openocd\scripts\board  

И найдем файл esp32-wrover-kit-1.8v.cfg

Внутри него прописаны пути к скриптам, внутри этих скриптов, настройки для отладчика от компании Espressif, вы можете найти все эти скрипты, и посмотреть, что внутри них. Если вы хотите использовать другой отдатчик, то вам нужно убрать скрипты по умолчанию и прописать нужные, по примеру из стандартных. Я приведу пример для отладчика JLINK.

Здесь мы видим, что по умолчанию выбран интерес FTDI, скорее всего, это интерфейс их собственного программатора, закомментируем эту строчку, и добавим вместо нее две команды, которые сообщат, что отладка будет производиться по интерфейсу JTAG, скорость будет равна 1кГц. Файл конфигураций должен выглядеть следующим образом:

# SPDX-License-Identifier: GPL-2.0-or-later
#
# Example OpenOCD configuration file for ESP32-WROVER-KIT board.
#
# For example, OpenOCD can be started for ESP32 debugging on
#
#   openocd -f board/esp32-wrover-kit-1.8v.cfg
#

transport select jtag
adapter speed 1000

# Source the JTAG interface configuration file
#source [find interface/ftdi/esp32_devkitj_v1.cfg]
set ESP32_FLASH_VOLTAGE 1.8
# Source the ESP32 configuration file
source [find target/esp32.cfg]

Осталось только добавить тип отладчика, для этого возвращаемся на пункт назад к Debug-> Config options, там вместо строки

s ${openocd_path}/share/openocd/scripts -f board/esp32-wrover-kit-1.8v.cfg

Напишем

-s ${openocd_path}/share/openocd/scripts -c 'set ESP32_FLASH_VOLTAGE 1.8' -f interface/jlink.cfg -f board/esp32-wrover-kit-1.8v.cfg

Тем самым выбрав интерфейс отладки, JLINK.

Остался последний шаг, скачиваем программу UsbDriverTool

https://visualgdb.com/UsbDriverTool/

Устанавливаем ее и при подключённом адаптере JLINK меняем драйвера JLINK на (WinUsb)

Теперь все готово)

Нажимаем кнопку DEBUG, ставим точку остановки и нажимает Start, всё должно заработать

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


  1. ATmegAdriVeR
    00.00.0000 00:00
    +1

    Спасибо за хороший мануал, ибо информация в интернете либо устарела, либо местами некорректна. Отдельное спасибо за UsbDriverTool, я использовал ZADIG, он не всегда корректно работает (Windows 11).

    К сожалению, по опыту скажу, что OpenOCD - это универсальность, а вот со скоростью там вечная беда. По сравнению с родным софтом от Segger отладка и прошивка медленнее в разы (убеждался много раз с STM32). В связи с этим вопрос, может, кому-то удалось настроить родной Segger софт для работы с этим семеством микроконтроллеров? Я перебрал все более-менее подходящие настройки, но безрезультатно.

    И ещё, рекомендую для разработки использовать ESP32S3, там отладчик сразу в микроконтроллере есть, ничего внешнего не требуется, и при этом работает шустро (шустрее OpenOCD + J-Link раза этак в 2).


    1. jaha33
      00.00.0000 00:00

      Встроенный USB-JTAG и в S и C семействе есть. Очень удобно кстати. На али есть готовые отладки с 2 разъемами USB, один стандартный, второй под отладчик


    1. Fast1k Автор
      00.00.0000 00:00

      А в какой IDE вы работаете с ESP32S3?


      1. ATmegAdriVeR
        00.00.0000 00:00

        Сейчас остановился на ESP-IDF. Глюков полно, но всё-же меньше, чем в PlatformIO. Пробовал VisualGDB (отличный плагин для Visual Studio Code) - но он платный.

        Вообще, как ни странно это звучит, удобнее всего работать с ESP-семейством мне показалось при помощу консольных python утилит от Espressif. Однако, об отладке придётся забыть.


    1. shushu
      00.00.0000 00:00

      Эмх, openOCD всеравно нужно использовать с esps3.


  1. Spider55
    00.00.0000 00:00
    -2

    Я конечно щас буду душнить, но что в этой прозе нового или не описаного в документации?

    Если кто-то не разжевал, то уже не съедобно?


    1. Fast1k Автор
      00.00.0000 00:00
      +3

      Здравствуйте, я старался написать готовый мануал, который сэкономит время другим. Документация не достаточно хорошо описывает настройку отладчика в IDE(сугубо мое мнение)


  1. jenya7
    00.00.0000 00:00

    Спвсибо. А как настроить сам Eclipse? Там же надо прописать все пути на установленную среду (C:/Soft/Expressif).


    1. Fast1k Автор
      00.00.0000 00:00

      Здравствуйте, вы правы, не расписал этот момент. При первом запуску Eclipse, нам предлагают выбрать каталог, в котором будет расположено наше рабочее пространство(папка, в которой будут лежать все наши проекты, кастомизация IDE и.т.д). Так вот, при первом запуске Eclipce я рекомендую. выбрать каталог С:/Soft/workspace, если вы случайно выбрали какой-то другой путь, то его всегда можно изменить с выбрав File->Switch Workspace. Это что касается рабочего пространства, остальные настройки для работы с ESP32 уже автоматически заданы, т.к. мы устанавливали Eclipce с помощью готового установщика. Надеюсь я правильно понял вам вопрос.


      1. jenya7
        00.00.0000 00:00

        спасибо.


        1. ATmegAdriVeR
          00.00.0000 00:00

          Если скачать Eclipse у Espressif (он называется ESP IDF), там всё это можно сделать в полуавтоматическом режиме. Ссылка на документацию по этому поводу: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html