Для разработки под микроконтроллер nRF51822 существует несколько комплектов от Nordic Semiconductor, все они достаточно дороги зато обеспечивают возможность удобной работы без возни с программаторами. При этом у китайских производителей можно обнаружить платы облегчающие отладку контроллеров за смешные деньги. Статья посвящена работе с клоном платы от Waveshare которая продаётся под названием BLE400.
![](https://habrastorage.org/r/w780q1/webt/qb/ok/tx/qboktxvnwsb1cxfb6yraxpk9rz8.jpeg)
Плата предназначена для использования совместно с модулями NRF51822, представляющие собой распаянный чип с антенной и парой кварцевых резонаторов. Стоимость комплекта из платы и модуля составляет около 20 долларов.
![](https://habrastorage.org/r/w780q1/webt/nu/es/r7/nuesr77fipst_y01tw0-ql9ss8k.jpeg)
BLE400 содержит на борту USB порт и преобразователь USB-UART на базе чипа CP2102 с выведенными сигналами RX, TX, CTS и RTS. На уровне схемы она частично совместима с PCA10001, отладочной платой от Nordic, пара светодиодов и две кнопки подключены к тем же портам, любителям помигать светодиодом это немного упростит жизнь. К сожалению плата не умеет выполнять роль программатора nRF51822, хотя прошивка позволяющая работать с загрузчиком типа Arduino в сети есть. Бегло перечислю что же именно встроено в плату, частично это будет перевод документации отсюда.
![](https://habrastorage.org/r/w780q1/webt/z4/wh/gl/z4whgl9fejx-fsbvruii05xntdw.jpeg)
Изначально в модуль прошит код для работы с nRF Toolbox for BLE от Nordic Semiconductor, для проверки его работоспособности этого достаточно. Подключаем плату к ПК, устанавливаем драйвера для CP2102 и подключаемся к плате при помощи терминала. Я воспользовался PuTTY, параметры порта: скорость 38400 дата бит 8, Стоповый бит один, управление потоком программное.
Подключаемся, в терминале вбиваем английский символ Y или y, получаем в ответ команду Start… — контроллер работает.
Теперь он доступен в списке BLE совместимых устройств на телефоне с именем Nordic_UART. Установив приложение для Android можно поиграться с передачей символов через виртуальный Bluetooth терминал и протестировать эмуляцию UART.
![](https://habrastorage.org/r/w780q1/webt/qg/jc/i0/qgjci0adipkt6njvr6tzlo1omvy.jpeg)
Переходим к программированию. Нам всё-таки понадобится программатор, оригинал от Segger будет немножко дорог, но благодаря автолюбителям на рынке достаточно клонов J-link ARM v8, стоят они около 15 долларов и для наших целей их более чем достаточно. Будем считать что драйвера на программатор (например J-Link Software v4.52b +) уже установлены. Подключаемся к плате стандартным JTAG кабелем от программатора или четырьмя проводами, достаточно соединить VTref, GND, SWDIO и SWCLK.
![](https://habrastorage.org/r/w1560/webt/al/83/dt/al83dtzch3x-sh0lkgrwr_s3pa8.png)
Для проверки подключения запустим JLink.exe и получим информацию о установленном чипе
Нам понадобится следующее ПО
Для получения Lite версии Keil MDK-ARM необходима регистрация, остальное доступно для скачивания так. nRFgo Studio версии 1.21.2 у меня так и не запустилась под Windows 10, но младшая версия 1.15.1 работает. Последняя версия SDK с поддержкой платы pca10001 это версия 6, скачиваем по ссылке. После установки SDK в папке куда установлена среда Keil появится каталог
Программировать плату можно не только через консоль J-Link Commander, но и через nRFgo Studio, через неё же мы можем очистить чип или залить SoftDevice для работы с Bluetooth. Делается это из меню nRF51 Programming. В чипе уже залито ядро BLE стека. Очистить его можно через пункт меню Erase all.
![](https://habrastorage.org/r/w1560/webt/9j/kr/rv/9jkrrvni-i4d2bbmbu61mqhnga0.png)
Следующая задача — помигать светодиодами, заботливо распаянными на плате. Как уже упоминалось ранее, светодиоды и кнопки совместимы с платой pca10001 от Nordic, значит используем пример оттуда, открываем в папке с Keil4
Собираем проект нажав F7 и прошиваем через меню Flash->Download. У меня по умолчанию не прошивалось из-за выбранной по умолчанию скорости заливки JTAG равной 2000 kHz. Исправить можно из меню Option for target -> Debug -> Setting. После замены на 100 kHz всё успешно заработало. Светодиоды LED0 и LED1 успешно перемигиваются, микроконтроллер работает. Если загрузить всё же не получается можно попробовать прошить HEX из из папки
![](https://habrastorage.org/r/w1560/webt/ts/v_/zj/tsv_zjf2jae7nrra3pew4gx60mo.png)
Светодиоды это замечательно, но нам всё же нужен Bluetooth, пример для работы лежит в папке
Изначально вместе с SDK идут заголовочные файлы для версии 7.0.0, но у меня эта версия ядра не стартовала. Теоретически работать должна любая версия стека, доступны для скачивания версии v6, v7, v8. С примерами из SDK седьмая и восьмая версия стека у меня не заработали, остановился на 6.2.1.
Скачиваем ядро, распаковываем в удобную для вас папку, например, Cores
SoftDevice необходимо прошить, для этого воспользуемся nRFgo Studio, выбираем из меню Device Manager пункт nRF51 Programming и убеждаемся что программатор не отвалился. В закладке Program SoftDevice выбираем файл с ядром
![](https://habrastorage.org/r/w1560/webt/er/qb/-a/erqb-ackdrou-sxsgmm7hzdeqvg.png)
Жмём кнопку Program. Карта памяти устройства теперь имеет следующий вид:
![](https://habrastorage.org/r/w1560/webt/5z/yl/-9/5zyl-9gcin0xykxdpcv8js-yppo.png)
Оперативной памяти стало меньше на 8кб, а первые 80 килобайт постоянной памяти заняло ядро. Меняем Target на цель со стеком s110, выбираем из меню nrf51822_xxaa_s110 (256К)
![](https://habrastorage.org/r/w1560/webt/hw/tz/dp/hwtzdpkbhqceo-zb5c7knngzbj8.png)
Для сборки примера с мигающим светодиодом при установленном SoftCore необходимо ввести коррективы в карту памяти, делается это из меню Options for Target – Target. Базовый адрес меняется на
![](https://habrastorage.org/r/w1560/webt/tv/mt/yq/tvmtyqm_m9h0yubwtvid1xmnc_8.png)
Так как при заливке скетча мы не должны затереть ядро, меняем настройки программатора. Делается это из меню Options for Target – Debug, кнопка Setting.
![](https://habrastorage.org/r/w1560/webt/bm/7t/ao/bm7taoxsrjucrzwyn25ktbqq_su.png)
Собираем проект и заливаем его в контроллер, если ядро установилось корректно мы получим те же мигающие светодиоды. Пора заливать прошивку имитирующую iBeacon, открываем проект из папки
Если все прошло успешно LED0 будет светиться, это индикатор что пакеты рассылаются. Устанавливаем на устройство Android или iOS приложение умеющее видеть iBeacon, я скачал
Beacon Scanner. UUID устройства совпадает с константой APP_BEACON_UUID в исходном коде, значит это наш маячок.
![](https://habrastorage.org/r/w1560/webt/lx/kd/al/lxkdalmvrrtvv6svwlkuzyf7wpa.png)
В принципе этой информации достаточно для быстрого и весьма недорогого старта работы с BLE. В минусах это поддержка устаревшего Keil 4 и нестабильная работа программатора на частотах 100 kHz и выше. Если среда разработки выдает ошибку загрузки уменьшайте скорость доступа до 50 kHz или даже менее. Иногда программатор отваливается и вернуть его к жизни можно только запуском JLink.exe, возможно это связано с тем что он является клоном оригинала.
![](https://habrastorage.org/webt/qb/ok/tx/qboktxvnwsb1cxfb6yraxpk9rz8.jpeg)
Плата предназначена для использования совместно с модулями NRF51822, представляющие собой распаянный чип с антенной и парой кварцевых резонаторов. Стоимость комплекта из платы и модуля составляет около 20 долларов.
![](https://habrastorage.org/webt/nu/es/r7/nuesr77fipst_y01tw0-ql9ss8k.jpeg)
BLE400 содержит на борту USB порт и преобразователь USB-UART на базе чипа CP2102 с выведенными сигналами RX, TX, CTS и RTS. На уровне схемы она частично совместима с PCA10001, отладочной платой от Nordic, пара светодиодов и две кнопки подключены к тем же портам, любителям помигать светодиодом это немного упростит жизнь. К сожалению плата не умеет выполнять роль программатора nRF51822, хотя прошивка позволяющая работать с загрузчиком типа Arduino в сети есть. Бегло перечислю что же именно встроено в плату, частично это будет перевод документации отсюда.
![](https://habrastorage.org/webt/z4/wh/gl/z4whgl9fejx-fsbvruii05xntdw.jpeg)
- Посадочное место под модуль NRF51822, ключей нет, вставить неправильно модуль можно но тогда он закроет батарею и антенна будет наоборот
- Дублирует пины модуля NRF51822, удобно для макетирования
- Выведенный для удобства подключения интерфейс I2C, дублирует соответствующие сигналы с гребёнки SDA — P0.00 SCL — P0.01 SMBA — P0.02 и питание, можно использовать готовые модули от Waveshare
- Интерфейс SPI, выведены сигналы MISO — P0.23 MOSI — P0.24 SCK — P0.25 NSS — P0.30
- Питание, при подключении по USB можно воспользоваться питанием 5 вольт, от батарейки и программатора доступно будет только 3.3. Питание сделано на RT9193 с максимальным током 300mA, сам модуль потребляем максимум 2mA и готов отдать в нагрузку максимум 3 пина по 5 mA или 1 пин с током в 15mA. Итого 250 мА на периферию в запасе есть
- Mini-USB гнездо для подключения питания или связи с ПК. 5 вольт порта напрямую подключено к гребёнке питания
- Упрощенный SWD интерфейс для программирования. Выведено питание 3.3в, SWDIO и SWCLK
- Продублированный UART, он же подключен к CP2102 и доступен для мониторинга на ПК через виртуальный COM порт. RX — P0.05 TX — P0.06 CTS — P0.07 RTS — P0.12
- Батарейка типоразмера CR1225, пригодится для автономного тестирования
- Набор светодиодов, подключены к P0.18 P0.19 P0.20 P0.21 P0.22. Светятся при подаче логической единицы. Здесь же можно посмотреть активность сигналов RX, TX и SPD
- Две кнопки подключенные к портам P0.16 и P0.17. При нажатии даёт логический ноль
- Кнопка сброса. Сбрасывает CP2102 и NRF51822 занулением сигнала SWDIO
- Контролер виртуального COM порта на CP2102, DTR и DSR не распаяны
- Джамперы для отключения интерфейса UART от CP2102
- Джамперы для отключения светодиодов и кнопок
Изначально в модуль прошит код для работы с nRF Toolbox for BLE от Nordic Semiconductor, для проверки его работоспособности этого достаточно. Подключаем плату к ПК, устанавливаем драйвера для CP2102 и подключаемся к плате при помощи терминала. Я воспользовался PuTTY, параметры порта: скорость 38400 дата бит 8, Стоповый бит один, управление потоком программное.
Подключаемся, в терминале вбиваем английский символ Y или y, получаем в ответ команду Start… — контроллер работает.
Теперь он доступен в списке BLE совместимых устройств на телефоне с именем Nordic_UART. Установив приложение для Android можно поиграться с передачей символов через виртуальный Bluetooth терминал и протестировать эмуляцию UART.
![](https://habrastorage.org/webt/qg/jc/i0/qgjci0adipkt6njvr6tzlo1omvy.jpeg)
Переходим к программированию. Нам всё-таки понадобится программатор, оригинал от Segger будет немножко дорог, но благодаря автолюбителям на рынке достаточно клонов J-link ARM v8, стоят они около 15 долларов и для наших целей их более чем достаточно. Будем считать что драйвера на программатор (например J-Link Software v4.52b +) уже установлены. Подключаемся к плате стандартным JTAG кабелем от программатора или четырьмя проводами, достаточно соединить VTref, GND, SWDIO и SWCLK.
![](https://habrastorage.org/webt/al/83/dt/al83dtzch3x-sh0lkgrwr_s3pa8.png)
Для проверки подключения запустим JLink.exe и получим информацию о установленном чипе
SEGGER J-Link Commander V4.74b ('?' for help)
Compiled Aug 19 2013 23:26:57
DLL version V4.74b, compiled Aug 19 2013 23:26:44
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware: V8.00
S/N: 20091135
Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBFull
VTarget = 3.293V
Info: Found SWD-DP with ID 0x0BB11477
Info: FPUnit: 4 code (BP) slots and 0 literal slots
Info: Found Cortex-M0 r0p0, Little endian.
Found 1 JTAG device, Total IRLen = 4:
Cortex-M0 identified.
JTAG speed: 100 kHz
Нам понадобится следующее ПО
Для получения Lite версии Keil MDK-ARM необходима регистрация, остальное доступно для скачивания так. nRFgo Studio версии 1.21.2 у меня так и не запустилась под Windows 10, но младшая версия 1.15.1 работает. Последняя версия SDK с поддержкой платы pca10001 это версия 6, скачиваем по ссылке. После установки SDK в папке куда установлена среда Keil появится каталог
\ARM\Device\Nordic\nrf51822
содержащий все необходимые файлы. Примеры рассчитаны на использование Keil версии 4, файл проекта имеет расширение uvproj в отличии от Keil 5 где расширение uvprojx. Собственно Keil 4 мы используем чтобы не запутаться в файлах конфигурации и совместимости примеров.Программировать плату можно не только через консоль J-Link Commander, но и через nRFgo Studio, через неё же мы можем очистить чип или залить SoftDevice для работы с Bluetooth. Делается это из меню nRF51 Programming. В чипе уже залито ядро BLE стека. Очистить его можно через пункт меню Erase all.
![](https://habrastorage.org/webt/9j/kr/rv/9jkrrvni-i4d2bbmbu61mqhnga0.png)
Следующая задача — помигать светодиодами, заботливо распаянными на плате. Как уже упоминалось ранее, светодиоды и кнопки совместимы с платой pca10001 от Nordic, значит используем пример оттуда, открываем в папке с Keil4
\ARM\Device\Nordic\nrf51822\Board\pca10001\blinky_example\arm\
файл проекта blinky.uvproj.Собираем проект нажав F7 и прошиваем через меню Flash->Download. У меня по умолчанию не прошивалось из-за выбранной по умолчанию скорости заливки JTAG равной 2000 kHz. Исправить можно из меню Option for target -> Debug -> Setting. После замены на 100 kHz всё успешно заработало. Светодиоды LED0 и LED1 успешно перемигиваются, микроконтроллер работает. Если загрузить всё же не получается можно попробовать прошить HEX из из папки
_build blinky_arm.hex
с использованием nRFgo Studio или из консоли программатора J-Link. Но сначала стоит убедить что в настройках Keil выбран программатор J-Link.![](https://habrastorage.org/webt/ts/v_/zj/tsv_zjf2jae7nrra3pew4gx60mo.png)
Светодиоды это замечательно, но нам всё же нужен Bluetooth, пример для работы лежит в папке
\ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_beacon
. Это реализация iBeacon, для нас он интересен работой с программным BLE стеком от Nordic. Пример рассчитан на версию стека s110, самую простую по возможностям, но для демонстрации работоспособности этого вполне достаточно. Ядро необходимо скачать отдельно и версий его достаточно много, при этом версия заголовков должна коррелировать с версией ядра. Скачать ядра можно по ссылке в разделе SoftDevices.Изначально вместе с SDK идут заголовочные файлы для версии 7.0.0, но у меня эта версия ядра не стартовала. Теоретически работать должна любая версия стека, доступны для скачивания версии v6, v7, v8. С примерами из SDK седьмая и восьмая версия стека у меня не заработали, остановился на 6.2.1.
Скачиваем ядро, распаковываем в удобную для вас папку, например, Cores
ARM\Device\Nordic\nrf51822\Cores\6.2.1
. Очищаем уже существующую папку \ARM\Device\Nordic\nrf51822\Include\s110
и копируем в неё заголовочные файлы из папки include распакованного ядра. SoftDevice необходимо прошить, для этого воспользуемся nRFgo Studio, выбираем из меню Device Manager пункт nRF51 Programming и убеждаемся что программатор не отвалился. В закладке Program SoftDevice выбираем файл с ядром
\ARM\Device\Nordic\nrf51822\Cores\6.2.1\s110_nrf51822_6.2.1_softdevice.hex
. Если файл правильного формата внизу будет указанна занимаемая ёмкость, для этой версии SoftDevice равная 80кб.![](https://habrastorage.org/webt/er/qb/-a/erqb-ackdrou-sxsgmm7hzdeqvg.png)
Жмём кнопку Program. Карта памяти устройства теперь имеет следующий вид:
![](https://habrastorage.org/webt/5z/yl/-9/5zyl-9gcin0xykxdpcv8js-yppo.png)
Оперативной памяти стало меньше на 8кб, а первые 80 килобайт постоянной памяти заняло ядро. Меняем Target на цель со стеком s110, выбираем из меню nrf51822_xxaa_s110 (256К)
![](https://habrastorage.org/webt/hw/tz/dp/hwtzdpkbhqceo-zb5c7knngzbj8.png)
Для сборки примера с мигающим светодиодом при установленном SoftCore необходимо ввести коррективы в карту памяти, делается это из меню Options for Target – Target. Базовый адрес меняется на
CODE_R1_BASE = 0x00014000
, а свободная память стартует с адреса 0x20002000.![](https://habrastorage.org/webt/tv/mt/yq/tvmtyqm_m9h0yubwtvid1xmnc_8.png)
Так как при заливке скетча мы не должны затереть ядро, меняем настройки программатора. Делается это из меню Options for Target – Debug, кнопка Setting.
![](https://habrastorage.org/webt/bm/7t/ao/bm7taoxsrjucrzwyn25ktbqq_su.png)
Собираем проект и заливаем его в контроллер, если ядро установилось корректно мы получим те же мигающие светодиоды. Пора заливать прошивку имитирующую iBeacon, открываем проект из папки
\ARM\Device\Nordic\nrf51822\Board\pca10001\s110\ble_app_beacon
. Меняем карту памяти по аналогии с мигающим светодиодом, собираем и заливаем в устройство. Если все прошло успешно LED0 будет светиться, это индикатор что пакеты рассылаются. Устанавливаем на устройство Android или iOS приложение умеющее видеть iBeacon, я скачал
Beacon Scanner. UUID устройства совпадает с константой APP_BEACON_UUID в исходном коде, значит это наш маячок.
![](https://habrastorage.org/webt/lx/kd/al/lxkdalmvrrtvv6svwlkuzyf7wpa.png)
В принципе этой информации достаточно для быстрого и весьма недорогого старта работы с BLE. В минусах это поддержка устаревшего Keil 4 и нестабильная работа программатора на частотах 100 kHz и выше. Если среда разработки выдает ошибку загрузки уменьшайте скорость доступа до 50 kHz или даже менее. Иногда программатор отваливается и вернуть его к жизни можно только запуском JLink.exe, возможно это связано с тем что он является клоном оригинала.