На данном уроке мы попробуем подключить схему для отладки кода. Как мы знаем, ESP32 отлаживается по интерфейсу JTAG, поэтому и плата для отладки должна быть выбрана с поддержкой работы с данным интерфейсом.
Для данных целей было принято решение использовать недорогую плату с чипом FT232H, который наряду с многими интерфейсами поддерживает также преобразование кода, поступившего по USB и в протокол для интерфейса JTAG.
Выглядит данная плата следующим образом
Снизу мы видим назначение контактов. Подключается данная плата для отладки к плате с контроллером ESP32 следующим образом:
FT232H | ESP32 |
AD0 | GPIO13 |
AD1 | GPIO12 |
AD2 | GPIO15 |
AD3 | GPIO14 |
GND | GND |
Следуя данной таблице, подключим данную плату к нашей DevKit
В подключении, я считаю, сложностей никаких не будет, я постарался ракурс выбрать такой, чтобы было максимально видно, к каким именно ножкам подведены провода. Сложности будут немного позже.
Для начала подключим к ПК только плату с чипом FTDI
В диспетчере устройств мы увидим, что у нас появился новый порт
Чтобы этот порт виделся в отладчиком, нужно установить на него специальный драйвер. Для этого используем специальную программу Usb Driver Tool, которую легко найти. Тем не менее архив с данной программой я приложу внизу статьи. Устанавливать эту программу не нужно, достаточно распаковать архив, открыть каталог с программой и запустить файл UsbDriverTool.exe.
Запустим данный файл и увидим в числе устройств наш FTDI
Жмём на нём правой кнопкой мыши и в контекстном меню выбираем установку драйвера WinUSB для данного порта
Как только драйвер установится, строка приобретёт следующий вид
Также в диспетчере мы увидим, что порт наш исчез из списка устройств
Этого бояться не нужно. Так должно и быть.
Теперь подключим отладочную плату с контроллером ESP32 на борту
Данный виртуальный порт уже будет виден в диспетчере устройств
Через этот порт будет происходить прошивка, а через порт WinUSB — отладка.
Теперь запустим Espressif IDE, там откроем, например, проект из 3 урока с именем BLINK01, соберём его и зальём собранную прошивку в наш контроллер.
Теперь нам нужно создать и настроить отдельный Launcher для отладки.
Откроем список таких конфигураций вот здесь
Там встанем вот на этот пункт
Создадим новую конфигурацию, нажав эту кнопку
Назовём нашу конфигурацию так, чтобы она была легче узнаваема при выборе
Оставляем здесь всё по умолчанию. Если у кого-то настройки другие, то нужно, чтобы были именно такие.
Переходим на вкладку Debugger
Здесь также всё должно быть так, как на картинке — состав строк, установленные и неустановленные галки.
Обращаем внимание, что в Config Options подключен интерфейс FTDI.
Следующая вкладка — Startup.
Здесь настройки вот такие
Во вкладке Common можно добавить запись в лог-файл
Сохраним конфигурацию и попробуем отладить наш проект, для чего выберем нашу конфигурацию и выберем вариант Debug
Жмём вот эту кнопку и ждём процесса отладки. Не сразу может пойти всё хорошо. Но не стоит думать, что у нас неправильные настройки. Нужно попробовать отключить поочерёдно, а затем подключить платы, потом заново попробовать войти в отладку. Если не помогло, закрыть проект, закрыть среду, запустить среду, открыть проект и попробовать заново.
Если всё-таки мы попали в отладку, то жмём вот эту кнопку для запуска кода на выполнение
Ну а дальше как обычно — точки останова, переходы, просмотр значений переменных, дизассемблирование и т.д. С этим процессом мы знакомы, так как пользовались отладчиком в Eclipse, когда занимались отладкой кода в программах под Windows.
Давайте попробуем в процессе выполнения кода установить вот здесь точку останова
Если всё хорошо, то выполнение кода остановится на данной точке
Теперь можем посмотреть значения переменных, например, переменной s_led_state.
Для этого где-нибудь в коде выделяем её имя и в контекстном меню выбираем следующий пункт
Имя переменной, её тип и значение появятся в этом окне
У вас может быть единичка. Это зависит от того, в какой момент вы остановите код. Нажмём ещё раз кнопку Resume, код отработает следующий цикл и значение переменной должно будет измениться
Данная переменная у нас глобальная. Чтобы видеть значение локальных переменных, надо полностью отключить оптимизацию. Для этого остановим отладку, перейдём в окно проекта, зайдём в конфигуратор (sdkconfig) и в пункте Compiler Options выберем следующее значение в поле Optimization Level
Ясное дело, что после таких изменений нужно будет проект пересобрать и перепрошить, а уж потом продолжать процесс отладки. Внесём данные изменения и объявим в функции app_main файла main.c следующую локальную переменную
1 2 3 |
void app_main(void) { int cnt=0; |
В бесконечном цикле проинкрементируем её
1 2 |
while (1) { cnt++; |
Соберём код, прошьём контроллер, зайдём в отладку, добавим точку останова в том же месте заранее, запустим код на выполнение, код остановится на точке. Добавим в окно просмотра нашу переменную и посмотрим её значение
Как видим, значение данной переменной мы вполне можем наблюдать и оно уже равно единице, так как через процесс инкрементирования мы прошли. Понажимаем кнопку Resume несколько раз, каждый раз дожидаясь остановки кода и увидим, что значение нашей переменной будет увеличиваться
Также мы можем посмотреть сгенерированный ассемблерный код
Вот здесь мы отчётливо можем наблюдать процесс инкрементирования
Итак, на данном уроке мы научились пользоваться отладкой, подключив для этого недорогую плату к контроллеру ESP32 по интерфейсу JTAG, что позволит нам в дальнейшем ещё более глубоко мониторить работу нашего кода.
Всем спасибо за внимание!
Предыдущий урок Программирование МК ESP32 Следующий урок
Недорогие отладочные платы ESP32 можно купить здесь Недорогие отладочные платы ESP32
Логический анализатор 16 каналов можно приобрести здесь
Многофункциональный переходник JTAG UART FIFO SPI I2C можно приобрести здесь CJMCU FT232H USB к JTAG UART FIFO SPI I2C
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)
Добавить комментарий