Введение
Здравствуйте друзья, я хочу поделиться с вами своим опытом в отладке 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кГц( СТОИТ ЗАПОМНИТЬ, ЧТО, ВОЗМОЖНО, СКОРОСТЬ НУЖНО БУДЕТ УВЕЛИЧИТЬ ДО 20000, ЕСТЬ БУДЕТ ОШИБКА ТАЙМАУТА). Файл конфигураций должен выглядеть следующим образом:
# 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, всё должно заработать
Возможные ошибки
Таймаут
Спустя пару недель, после написания статьи, я встретил такую ошибку. Суть которой заключается в ошибки времени запуска сервера OpenOCD. Почитав форумы, удалось решить эту проблему, ниже привел все проделанные этапы, некоторые из них, возможно, можно не влияют на решение проблемы, но я привел все проделанные мною этапы.
В IDE находим вкладку Window->Prefernces. Выбираем Espressif и ставим GDB server launch timeous(s): 100
Заходим в Launch Configuration (как в него зайти есть в этой стать) выбираем Debug и в поле Commands ставим
set remotetimeout 100
Заходим в проводник находим файл конфигураций вашей платы в моем случае это esp32-wrover-kit-1.8v.cfg в каталоге ниже
C:\Soft\Espressif\tools\openocd-esp32\v0.11.0-esp32-20221026\openocd-esp32\share\openocd\scripts\board
Открываем и меняем скорость на 20000 данной строчкой кода
adapter speed 20000
В моем случае файл стал выглядеть так
# 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
adapter speed 20000
# 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]
После всех манипуляций, отладка заработала, в консоле IDE пишет, что максимальная скорость 15000, и что она автоматически снизила скорость, так что не буду ничего менять.
По поводу увеличения скорости до 15кГц, не уверен, что это правильное решение т.к. в IAR и Keil всегда выставлял 1кГц и всё всегда нормально работало, почему в Espressif не всегда работает с 1кГц, я не понял, но пока все работает)