В форумах и чатах посвященных МТС хабам и которые я встречал, описывают программирование ZigBee адаптера с помощью ST-Link. Судя по комментариям, многие идут покупать ST-Link, а значит имеют мало опыта в Embedded.
Ниже некоторые заметки по "расширению дверей сознания": "что" и "почему так" делается. Понимание что/почему, надеюсь, поможет снизить число вопросов связанных с "а у меня не программируется".
Disclaimer: у меня мало опыта в ST-Link, J-Link, OpenOCD, STM и nRF, но есть достаточный опыт работы с другими МК-платформами. Так как многие моменты являются общими и "понятными" для меня, поэтому могу высказать свои суждения 😉
1. Соединения
Часто встречается инструкция, где указывается что для подключения нужны 2 провода от программатора: левый SWDIO, правый SWCLK (или наоборот - смотря с какого ракурса сделано фото))

Да, это так, но "за кадром" остается факт того, что на самом деле еще присутствуют GND (земля) и Vdd (питание).
В случае программирования от ПК (программатор подключен к ПК) и питания МТС шлюза от отдельного источника питания/ повер-банка или др. - GND программатора и GND МТС-а оказываются не соединенными вместе. В этом случае успешное программирование ZigBee модуля будет под вопросом.
Решение: питать МТС шлюз и программатор от ПК, т.е. от ПК два USB шнурка - один к МТС, другой к программатору.
В случае программирования ZigBee модуля вне шлюза - к плате нужно подключить GND от программатора и подать питание, т.е 4 провода.
Мой выбор - подключение программатора прямо к МТС: тут и земли общие и питание от МТС-а и всего два проводка, как на фото выше.
2. J-Link
Не то чтобы я отрицаю ST-Link, просто "обидно" за его прародителя J-Link ))


Китайские варианты ST-Link имеют SWD интерфейс и, возможно (см.: Disclaimer), для него SWD является интерфейсом "по умолчанию". Jlink имеет поддержку интерфейсов JTAG и SWD, и для программирования nRF ему нужно указать на выбор интерфейса SWD. Для Nordic nRF52 в составе OpenOCD есть нужная конфигурация: board/nordic_nrf52_dk.cfg , который содержит три строки:
source [find interface/jlink.cfg]
transport select swd
source [find target/nrf52.cfg]
Т.е. задается конфигурация программатора (jlink.cfg), выбирается интерфейс (transport select swd) и конфигурация для микроконтроллера (target/nrf52.cfg).
Итого: команду на программирование с помощью ST-Link:
openocd -f interface/stlink.cfg -f target/nrf52.cfg -c "init" -c "reset init" -c "halt" -c "nrf5 mass_erase" -c "flash write_image ncp-nrf52840dk_nrf52840-v2.9.0-115200.hex" -c "reset" -c "exit"
Можно преобразовать на команду программирования с помощью JLink:
openocd -f board/nordic_nrf52_dk.cfg -c "init" -c "reset init" -c "halt" -c "nrf5 mass_erase" -c "flash write_image ncp-nrf52840dk_nrf52840-v2.9.0-115200.hex" -c "reset" -c "exit"
Что получаем?
Получаем программирование с помощью J-Link, который, помимо SWD, еще поддерживает JTAG и является более универсальным чем ST-Link (при той же стоимости на Али)