Программирование и отладка NRF52 под ST-LinkV2
Официально программирование/отладка поддерживается хорошо лишь с J-Link, но он стоит в районе 500$, а прям ощутимого профита от его использования я особо не заметил ) Так зачем платить больше? По крайней мере для домашних проектов…
На текущий момент в OpenOCD 0.10 нет драйвера флеш-памяти для NRF52, потому “из коробки” будет доступна только отладка, а стирание/прошивание чипа – нет.
К счастью имеется уже готовый патч для OpenOCD, а так же инструкция как что собирать, которую я нашёл вот в этом обсуждении.
На всякий пожарный повторю здесь инструкции + дополню своими:
Для начала при сборке в Windows придётся поставить кросс компилер, например, из msys или cygwin. Я предпочитаю mingw-w64 для x64 системы из msys, скачать можно тут.
Запускаем mingw64.exe, ставим зависимости и инструменты, необходимые для сборки. Точный список уже не помню, но как минимум это я ставил:
pacman -S git
pacman -S curl
pacman -S make
pacman -S automake
pacman -S autoconf
pacman -S libtool
pacman -S pkg-config
pacman -S texinfo
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw64/mingw-w64-x86_64-dlfcn
pacman -S mingw64/mingw-w64-x86_64-libusb
pacman -S mingw64/mingw-w64-x86_64-libusb-usbdk
pacman -S mingw64/mingw-w64-x86_64-hidapi
pacman -S mingw64/mingw-w64-x86_64-libftdi
Клонируем репозиторий:
git clone git://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code
Теперь необходимо применить патч, добавляющий поддержку NRF52. Однако я бы порекомендовал файл src/flash/nor/Makefile.am предварительно забэкапить )
git pull http://openocd.zylin.com/openocd refs/changes/15/3215/2
Патч приводит к конфликтам в двух файлах, конфликты можно просто поправить вручную. Суть конфликта – в каждом из файлов добавляется инклуд NRF52 сорцов, однако порядок строк инклудов изменён и получается странный конфликт.
gedit src/flash/nor/drivers.c
gedit src/flash/nor/Makefile.am
Во втором файле ещё и формат путей инклудов поменялся, потому там вообще ад, и как раз для этого я выше рекомендовал src/flash/nor/Makefile.am забэкапить, после чего его восстановить и вручную прописать инклуд NRF52. То есть к NOR_DRIVERS добавить файл %D%/nrf52.c и это всё, что там надо поменять.
Следующий шаг:
./bootstrap
После чего настраиваем сборку:
./configure
--prefix=/Your-path/openocd-git_install //Заменить на свой путь утановки
--enable-aice
--enable-amtjtagaccel
--enable-armjtagew
--enable-cmsis-dap
--enable-dummy
--enable-ftdi
--enable-gw16012
--enable-jlink
--enable-jtag_vpi
--enable-opendous
--enable-openjtag_ftdi
--enable-osbdm
--enable-legacy-ft2232_libftdi
--enable-parport
--disable-parport-ppdev
--enable-parport-giveio
--enable-presto_libftdi
--enable-remote-bitbang
--enable-rlink
--enable-stlink
--enable-ti-icdi
--enable-ulink
--enable-usb-blaster-2
--enable-usb_blaster_libftdi
--enable-usbprog
--enable-vsllink
И собираем проект:
make
make install
Готово, OpenOCD собран. Теперь, для запуска его без предварительного добавления mingw директорий в PATH, необходимо рядом с OpenOCD.exe положить dll, от которых он зависит:
libftdi1.dll
libhidapi-0.dll
libusb-0-1-4.dll
libusb-1.0.dll
Найти их все можно в папке msys64mingw64bin
И казалось бы всё, готово, можно пользоваться. Да, но почти ) OpenOCD запускается и прекрасно себя чувствует, однако при попытке отладки любого st-link устройства каждый раз получаю ошибку:
stlink_usb_open(): stlink_usb_open
stlink_usb_open(): transport: 1 vid: 0x0483 pid: 0x374b serial:
stlink_usb_open(): open failed
Долго я думал что не так! И сорцы OpenOCD пытался править и очередные баги в исходниках libusb искать, но решил в итоге проблему намного проще )) Качаем бинарники libusb https://sourceforge.net/projects/libusb/files/libusb-1.0/
Заменяем корявую libusb-1.0.dll, взятую из mingw64, на нормальную из архива MinGW64dlllibusb-1.0.dll и всё, программатор открывается.
Пример *.cfg файла для OpenOCD
source [find interface/stlink-v2.cfg]
transport select "hla_swd"
source [find target/nrf52.cfg]