Добрый день, сообщество Хабра!


Вот и наступило время каникул у студентов технических ВУЗов. А значит пришло время для домашних проектов и покорения новых вершин микроэлектронной техники. Сегодня речь пойдет о моих изысканиях с платами на базе микросхемы NRF51822, которая является несколько устаревшим Bluetooth модулем от компании Nordic Semiconductor. Эта компания славится радио модулями с низким потреблением тока и микросхема NRF51822 — не исключение. Но не будем отвлекаться от темы. Поговорим про железо.


Создание отладочного стенда


Еще в октябре были заказаны платы yj-14015-nrf51822 для экспериментов с Bluetoth. Плохой идеей было покупать платы без распайки на штырьевые разъемы под стандартные провода для любителей электроники.


yj-14015-nrf51822

yj-14015-nrf51822


Расстояние между контактами менее 1 мм создали большие сложности для меня, человека с крайне скромным опытом пайки. Выходы на плате были не предназначены для пайки к проводам и их легко было оторвать. Эта судьба постигла единственный выход питания VDD. Но с помощью усилий соседа удалось подпаять провод к выводу конденсатора на плате. Совместными усилиями были распаяны выходы GND, SWDIO, SWCLK и некоторые другие выходы GPIO. В итоге получилось нечто, похожее своим видом на Франкенштейна:


Распаянная плата

Распаянная плата


Отлаживать и прошивать наш девайс будем с помощью ST-Link V2 Схема подключения предельно простая и логичная:


ST-Link V2 nrf51822
3.3V VDD
GND GND
SWDIO SWDIO
SWDCLK SCLK

В отличии от Франкенштейна одного разряда тока было не достаточно для оживления этого модуля. В первую очередь я попытался считать память nrf51822 с помощью STM32 ST-LINK utility. С некоторыми оговорками это работало с платами STM32 но только не с nrf. На этом моя работа с платой временно прекратилась. Чуть позже я нашел статью 1 и статью 2 про работу с nrf51822. В ней были приведены ссылки на SDK и детальное описание способа организации памяти nrf. Автор статей использовал более дорогой отладчик JLink в отличии от нас. Дешевизна решения очень важна, если вы нищий студент:).


Изучение SDK


Если вы хотите использовать bluetooth функционал, что довольно логично для bluetooth микросхемы, вы должны будете положить в начало программируемой памяти nrf5 так называемый "softdevice". Он поставляется в виде прошивки и содержит функционал bluetooth. В оставшуюся часть памяти записывается ваша прошивка. Из нее можно вызывать процедуры softdevice для настройки bluetooth.


Существует несколько разных softdevice-ов. Для nrf51 можно использовать s110 (для серверных приложений) и s130 (для серверных и клиентских приложений). Для понимания совместимости версий SDK и softdevice-ов есть матрица совместимости. Из нее видно, что для нашей платы подходят SDK до версии 12.3.0. Но мы остановимся на SDK 10.0.0 т.к. он поддерживает s110 и s130.


Настройка OpenOCD


В примерах из SDK и в статьях используется утилита nrfjprog для прошивки через JLink, а нам нужно прошивать через ST-Link V2. Вместо нее будем использовать крутую программу OpenOCD, скачать для Windows. Она позволяет прошивать и отлаживать туеву хучу огромное количество различных плат и микросхем. Существует конфигурация и для микросхемы nrf51. Чтобы заставить OpenOCD прошить нашу плату, необходимо выполнить команду формата, представленного ниже (предварительно добавив папку OpenOCD/bin в Path). Подробнее про команды OpenOCD можно прочесть в документации.


openocd -f interface/stlink.cfg -f target/nrf51.cfg -c init -c "reset halt" ^
-c "nrf51 mass_erase 0" -c "flash write_image <PATH_TO_HEX> <OFFSET>" ^ 
-c reset -c exit

Дьявол как всегда кроется в деталях:


  • "reset halt" посылает команду сброса микросхемы и останавливает девайс. В таком состоянии прошивка может быть стерта/записана
  • "nrf51 mass_erase 0" разрешает запись в секцию bootloader-а и стирает всю программируемую память микросхемы (поможет избежать ошибки загрузки прошивки в ряде случаев)
  • вместо <PATH_TO_HEX>нужно подставить путь к hex файлу
  • <OFFSET> задает смещение адреса записи прошивки. Параметр пригодится, если вы хотите прошивать свою прошивку отдельно от softdevice. Если вы хотите записать прошивку начиная с начала памяти (с адреса 0x0), то можно отбросить этот параметр
  • reset сбрасывает микросхему, для того чтобы она заработала с новой прошивкой

В SDK входят hex файлы softdevice-ов. Чтобы залить s130 на плату можно использовать следующую последовательность команд:


set file=<nRF5_SDK>/components/softdevice/s130/hex/s130_nrf51_1.0.0_softdevice.hex
openocd -f interface/stlink.cfg -f target/nrf51.cfg -c init -c "reset halt" ^
-c "nrf51 mass_erase 0" -c "flash write_image %file%" -c reset -c exit

Затем можно заливать нашу прошивку. Важно при этом убрать "nrf51 mass_erase 0", чтобы softdevice не стерся. А также не забыть про смещение. Для s130 смещение 0x1c000, а для s110 — 0x18000. Эти значения можно узнать в спецификации для s130 и s110.


set file=<PATH_TO_HEX>
openocd -f interface/stlink.cfg -f target/nrf51.cfg -c init -c "reset halt" ^
-c "flash write_image %file% 0x1c000" -c reset -c exit

Теперь в программируемой памяти nrf51822 должны лежать прошивка softdevice и наша. Для тестов я использовал пример из папки <nRF5_SDK>/examples/ble_peripheral/ble_app_beacon и приложение для Android под названием "nRF Connect". После выполнения команд я начал видеть устройство с названием nRF. Этого мы и добивались.


Настройка проекта CLion


SDK nrf51 содержит примеры на базе make- файлов. Для работы с CLion необходимо описать сборку проекта с помощью CMake- файлов. Гугление показало, что CMake проект для nrf51 уже есть на гитхабе. Он написан для использования с SDK 12.X.X. Из-за этого некоторые пути к файлам для нашего SDK 10.0.0 оказались прописаны не верно. Кроме того в проекте так же используется утилита nrfjprog. Поэтому пришлось повозиться с настройкой проекта и переписать таргеты для прошивки с помощью OpenOCD. Результат моей работы можно найти на гитхабе. В readme описана инструкция по настройке проекта и отладке в CLion.


P.S.


Многие технические детали, связанные с особенностями nrf51822, ускользнули из моего повествования. Надеюсь, я когда нибудь восполню пробелы, дополнив статью или написав новую.

Комментарии (8)


  1. dmitryrf
    06.02.2019 14:56

    Простите за прямоту, но мне и в голову не приходило, что фотка в инстаграме и запись в блоге — достаточный материал для статьи на хабр. Больше похоже на заметку вида: «смотрите, что я нагуглил».


    1. zzuummaa Автор
      06.02.2019 15:31
      -1

      Эта статья всего лишь мой опыт настройки железа и софта для разработки в CLion. CLion- очень приятная IDE. Но когда я начинал знакомиться с CLion и embeded, мне очень не хватало материала. Особенно по их связке. Как мне кажется, данная тема не достаточно освещена в интернете и рунете в частности. Поэтому я считаю, что моя статья будет полезна начинающим разработчикам и поможет им разобраться со вспомогательным софтом для embeded разработки с использованием CLion.

      А в чем цель вашего комментария? :)


      1. gudvinr
        06.02.2019 16:34

        CLion не самая дешёвая IDE для хоббистской разработки. Вы используете персональную/рабочую лицензию, или OpenSource вариант?


        Если кто-то забредёт сюда, то может быть, вам подойдёт VSCode вместе с CMake Tools и Cortex Debug.


        1. zzuummaa Автор
          06.02.2019 18:48
          +2

          Я использую студенческую персональную лицензию.


  1. holomen
    07.02.2019 02:21
    +1

    Автор статей использовал более дорогой отладчик JLink в отличии от нас. Дешевизна решения очень важна, если вы нищий студент:).

    А как-же голь на выдумки хитра, навыки гуглежа и прочее?
    Это я намекаю что стлинк прекрасно перешивается в JLink-OB не привязанный к стм…

    И да, жилы от витой пары для таких работ — не лучшее решение. Хорошо себя показал провод из обмотки двигателя cd-rom — в лаке, диаметр 0,3мм, нормально зачищается паяльником в процессе залуживания, но при этом при перепаиваниях лак не слазит. В общем рекомендую к применению.


    1. zzuummaa Автор
      07.02.2019 02:40

      Спасибо за ценные советы. Особенно на счёт перепрошивки ST-Link. Разве что CD-ROM я давно не встречал.


      1. hardegor
        08.02.2019 20:20

        Для таких вещей нужен многожильный провод, но если у вас нет подходящего, то можно использовать шлейф от флопика или IDE — там достаточно тонкие проводники, их можно зачистить и аккуратно припаять. Паять лучше не на один, а хотя-бы на 5-10 контактов на стороне, да и распускать шлейф тоже лучше группами, и не на всю длину.


  1. Zuy
    07.02.2019 05:23

    Паечка — огонь! Раздобудьте провод МГТФ и жизнь заиграет новыми красками.