Введение
Здравствуйте друзья, я хочу поделиться с вами своим опытом в отладке 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->Esspresife 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
Внутри него прописаны пути к скриптам, внутри этих скриптов, настройки для отладчика от компании Expressive, вы можете найти все эти скрипты, и посмотреть, что внутри них. Если вы хотите использовать другой отдатчик, то вам нужно убрать скрипты по умолчанию и прописать нужные, по примеру из стандартных. Я приведу пример для отладчика 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, всё должно заработать

ссылка на оригинал статьи https://habr.com/ru/post/721882/
Добавить комментарий