Введение
Здравствуйте друзья, я хочу поделиться с вами своим опытом в отладке 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)
Spider55
00.00.0000 00:00-2Я конечно щас буду душнить, но что в этой прозе нового или не описаного в документации?
Если кто-то не разжевал, то уже не съедобно?
Fast1k Автор
00.00.0000 00:00+3Здравствуйте, я старался написать готовый мануал, который сэкономит время другим. Документация не достаточно хорошо описывает настройку отладчика в IDE(сугубо мое мнение)
jenya7
00.00.0000 00:00Спвсибо. А как настроить сам Eclipse? Там же надо прописать все пути на установленную среду (C:/Soft/Expressif).
Fast1k Автор
00.00.0000 00:00Здравствуйте, вы правы, не расписал этот момент. При первом запуску Eclipse, нам предлагают выбрать каталог, в котором будет расположено наше рабочее пространство(папка, в которой будут лежать все наши проекты, кастомизация IDE и.т.д). Так вот, при первом запуске Eclipce я рекомендую. выбрать каталог
С:/Soft/workspace, если вы случайно выбрали какой-то другой путь, то его всегда можно изменить с выбрав File->Switch Workspace. Это что касается рабочего пространства, остальные настройки для работы с ESP32 уже автоматически заданы, т.к. мы устанавливали Eclipce с помощью готового установщика. Надеюсь я правильно понял вам вопрос.
jenya7
00.00.0000 00:00спасибо.
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
ATmegAdriVeR
Спасибо за хороший мануал, ибо информация в интернете либо устарела, либо местами некорректна. Отдельное спасибо за UsbDriverTool, я использовал ZADIG, он не всегда корректно работает (Windows 11).
К сожалению, по опыту скажу, что OpenOCD - это универсальность, а вот со скоростью там вечная беда. По сравнению с родным софтом от Segger отладка и прошивка медленнее в разы (убеждался много раз с STM32). В связи с этим вопрос, может, кому-то удалось настроить родной Segger софт для работы с этим семеством микроконтроллеров? Я перебрал все более-менее подходящие настройки, но безрезультатно.
И ещё, рекомендую для разработки использовать ESP32S3, там отладчик сразу в микроконтроллере есть, ничего внешнего не требуется, и при этом работает шустро (шустрее OpenOCD + J-Link раза этак в 2).
jaha33
Встроенный USB-JTAG и в S и C семействе есть. Очень удобно кстати. На али есть готовые отладки с 2 разъемами USB, один стандартный, второй под отладчик
Fast1k Автор
А в какой IDE вы работаете с ESP32S3?
ATmegAdriVeR
Сейчас остановился на ESP-IDF. Глюков полно, но всё-же меньше, чем в PlatformIO. Пробовал VisualGDB (отличный плагин для Visual Studio Code) - но он платный.
Вообще, как ни странно это звучит, удобнее всего работать с ESP-семейством мне показалось при помощу консольных python утилит от Espressif. Однако, об отладке придётся забыть.
shushu
Эмх, openOCD всеравно нужно использовать с esps3.