Общие сведения
В последнее время, становится всё популярнее стандарт передачи данных Bluetooth Low Energy (BLE). BLE по сути несколько упрощенный протокол Bluetooth. Основное назначение BLE это обмен небольшим объемом данных с различными низкопотрбляющими устройствами (датчики, фитнес браслеты, велокомпьютеры и т.д.).
У многих производителей уже есть микроконтроллеры с интегрированной радиочастотной частью. Подобные чипы есть у ведущих производителей: Silabs, Texas Instuments, Cypress и т.д. Но как следует из названия статьи речь пойдет о МК фирмы Nordic. Мой выбор МК этой фирмы объясняется довольно просто — это доступность отладочного набора и самого чипа. Стоит сказать, что доступность довольно относительная, чипы и отладочные платы богато представлены на aliexpress, а в наших магазинах только под заказ. Для меня это не является недостатком, тем более стоимость чипов и плат , значительно ниже конкурентов. Поэтому NRF51 отлично подойдет для каких-то домашних поделок с использованием стека BLE.
Описание железа.
На аликспресс продаются модули на основе чипа NRF51822, к ним для удобства работы можно купить плату расширения BLE400. Так же очень полезным приобретением будет сниффер BLE — PCA10031. PCA10031 — официальное название платы сниффера от Nordic, на али можно найти его дешевую копию. Сниффер позволяет просматривать BLE пакеты с помощью популярной программы Wireshark. Более подробно я опишу работу с данным устройством в другой статье.
NRF51822 представляет из себя микроконтроллер с ядром Cortex-M0 с объемом ПЗУ 256Кb, а объем ОЗУ составляет 32Кб. Имеет на борту стандартную периферию GPIO, таймеры, UART и т.д. Самое интересное это конечно блок RF, также стоит отметить встроенный понижающий DC-DC преобразователь. Возможно, в некоторых случаях он поможет сэкономить на внешнем преобразователе и сделать плату максимально компактной.
Большой плюс данного МК в том, что есть открытое описание RF части, поэтому теоретически можно использовать свой протокол передачи данных. Пример создания со стеком BLE проекта я опишу в отдельной статье.
Чип программируется по SWD протоколу. В качестве программатор я использую дешевый китайский программатор J-link OB.
Создание простейшего проекта.
Перейдем к созданию проекта в среде Keil uVision 5 с использованием Software Packs. В данном примере я покажу, как использовать NRF51822 в качестве обычного микроконтролера т.е. не используя RF часть. Дело в том, что с использованием стека BLE есть тонкости. Как сделать проект с поддержкой RF я расскажу в отдельной статье. А в данном примере я покажу, как скачать софт пакеты для поддержки чипа микровиженом и создания проекта моргалки светодиодами. И так приступим к делу.
Первое, что мы должны сделать, это скачать софт пакеты с поддержкой нашего чипа. Я не стал экономить и скачал все пакеты относящийся к семейству NRF51. Суть софт пакетов в том, что с их помощью можно автоматом подцепить различный исходные или бинарные файлы. Например, драйвера периферийных устройств, стек LWIP, библиотеку для работы со стеком BLE и т.д. Пакеты поддерживаются производителем и периодически обновляются. Также подгружаются и примеры (вкладка Examples).
Теперь стандартным способом создадим новый проект. Я назвал свой BLE400_blinky, чип выбираем NRF51822_xxAC. Теперь перед нами появится окно с нашими софт пакетами. Давайте сейчас добавим только самые необходимые пакеты, чтобы потом посмотреть, как можно добавлять и удалять пакеты из уже созданного проекта.
Выберем:
- CMSIS -> CORE
- Device -> Startup
- Device -> StartupConfig
Теперь создадим файл main.c со следующем кодом.
#include <stdbool.h> #include <stdint.h> #include "nrf_delay.h"//функции задержки #include "nrf_gpio.h"//драйвер gpio #define LED0 (18)//в скобках номер пина #define LED1 (19)//пины подключены к светодиодам #define LED2 (20)//на плате BE400 #define LED3 (21) #define LED4 (22) int main(void) { //Выводы на выход nrf_gpio_cfg_output(LED0); nrf_gpio_cfg_output(LED1); nrf_gpio_cfg_output(LED2); nrf_gpio_cfg_output(LED3); nrf_gpio_cfg_output(LED4); while(true) { nrf_gpio_pin_clear(LED0); nrf_gpio_pin_set(LED1); nrf_gpio_pin_clear(LED2); nrf_gpio_pin_set(LED3); nrf_gpio_pin_clear(LED4); nrf_delay_ms(500); nrf_gpio_pin_set(LED0); nrf_gpio_pin_clear(LED1); nrf_gpio_pin_set(LED2); nrf_gpio_pin_clear(LED3); nrf_gpio_pin_set(LED4); nrf_delay_ms(500); } }
При попытке сборки проекта закономерно получим ошибку:
main.c(3): error: #5: cannot open source input file «nrf_delay.h»: No such file or directory
Давайте добавим соответствующий пакет к проекту. Manage Run-Time Environment -> nRF_Drivers -> nrf_delay, в этом же разделе добавим nrf_gpio. Новая попытка сборки должна окончится успешно. Прошиваем и наслаждаемся красочным переключениям светодиодов. Думаю описание кода не требуется, по названиям функций легко понять из каких софт пакетов они взяты.