首页 > 评测 > BLE 5遇见96Boards——BLE Nitrogen评测

BLE 5遇见96Boards——BLE Nitrogen评测

BLE5   96Boards   Nitrogen   Linux   Nordic   nRF52832   
  • 作者:SATURN
  • 来源:
  • [导读]
  • 虽然是一个小板子,但是受到了我们的关注,有几个重要的点:1-这是一款96boards, 2-搭载了Nordic nRF52832实现BLE5的功能,3-使用Zephyr做为开发环境。不过BLE Nitrogen的GPIO口采用1.8V输出,这是我们的一个黑点。。。

#ifndef LED0_GPIO_CONTROLLER

#define LED0_GPIO_CONTROLLER LED0_GPIO_PORT

#endif

#define LED_PORT LED0_GPIO_CONTROLLER

/* Change this if you have an LED connected to a custom pin */

#define LED LED0_GPIO_PIN

/* 1000 msec = 1 sec */

#define SLEEP_TIME 1000

void main(void)

{

int cnt = 0;

struct device *dev;

dev = device_get_binding(LED_PORT);

/* Set LED pin as output */

gpio_pin_configure(dev, LED, GPIO_DIR_OUT);

while (1) {

/* Set pin to HIGH/LOW every 1 second */

gpio_pin_write(dev, LED, cnt % 2);

cnt++;

k_sleep(SLEEP_TIME);

}

}

这段代码掩盖了太多的细节!

RTOS体现在哪里?多任务是怎么实现的?Zephyr使用类似内核编译的模式,将大部分细节都隐藏在底层,用户只需要关心自己要实现的任务即可。这一点可以使用如下的命令行来得到验证

make BOARD=Nitrogenmenuconfig

这样会得到一个菜单式的配置工具,如下

rId25.png

与硬件配置相关的操作都可以在里面选择,然后得到一个.config文件,接下来使用make就可以根据用户设置进行编译并到最终的elf及hex文件。

然而这里并没有牵涉到线程的配置,默认情况下,Zephyr为我们生成两个线程,一个idle线程和一个main线程,可以在代码中使用KTHREADDEFINE 来定义一个新线程,其函数原型如下

K_THREAD_DEFINE(name, stack_size, entry, p1, p2, p3, prio, options, delay)

如果要定义多个线程,可以参考如下代码

K_THREAD_DEFINE(blink1_id, STACKSIZE, blink1, NULL, NULL, NULL,

PRIORITY, 0, K_NO_WAIT);

K_THREAD_DEFINE(blink2_id, STACKSIZE, blink2, NULL, NULL, NULL,

PRIORITY, 0, K_NO_WAIT);

K_THREAD_DEFINE(blink3_id, STACKSIZE, blink3, NULL, NULL, NULL,

PRIORITY, 0, K_NO_WAIT);

为了体验一下,我们尝试将代码修改如下

/*

* Copyright (c) 2016 Intel Corporation

*

* SPDX-License-Identifier: Apache-2.0

*/

#include

#include

#include

#include

/* Change this if you have an LED connected to a custom port */

#ifndef LED0_GPIO_CONTROLLER

#define LED0_GPIO_CONTROLLER LED0_GPIO_PORT

#endif

#define LED_PORT LED0_GPIO_CONTROLLER

/* Change this if you have an LED connected to a custom pin */

#define LED LED0_GPIO_PIN

/* 1000 msec = 1 sec */

#define SLEEP_TIME 2000

void main(void)

{

while(1) {

k_sleep(100);

}

}

void blink(void) {

int cnt = 0;

struct device *dev;

dev = device_get_binding(LED_PORT);

/* Set LED pin as output */

gpio_pin_configure(dev, LED, GPIO_DIR_OUT);

while (1) {

/* Set pin to HIGH/LOW every 1 second */

gpio_pin_write(dev, LED, cnt % 2);

cnt++;

k_sleep(SLEEP_TIME);

}

}

K_THREAD_DEFINE(blink_id, 512, blink, NULL, NULL, NULL,

7, 0, K_NO_WAIT);

只是一个简单的修改,将原来main里的代码放到新定义的线程中去,main里面什么也没有做。

编译并上传到开发板,发现LED还是按我们的要求开始闪烁了!

然而这只不过是冰山一角,Zephry里面还有更多的细节需要我们去探索。不过接下来我们要开始体验BLE功能了,示例里的bluetooth目录下包含大量的演示程序,我们选择peripheral_dis来查看下实际运行的效果。

代码就不再贴出来了,实际运行的效果我们通过nRF Connect手机APP来查看,如下

rId26.png

找到的设备,连接后可以通过APP来读取要显示的字符串

rId27.png

可以看到正确读取了开发板通过BLE提供的字符串信息。

下图显示的是读取另一个例程peripheral_hr的信息

rId28.png

该程序通过模拟心率数据并暴露给Central设备,通过Notify的方式连续显示。

BLE Nitrogen为我们带来全新的BLE 5的体验,虽然在我们的体验过程中,BLE5的优势并没充分体现出来,然而BLE更高传输率及更远的传输距离,必定会给基于BLE5的产品带来更好的体验。使用Zephyr做为开发环境,在社区强大的动力之下,必然也会为开发者带来更强有力的保障及更快的开发速度。

只是由于目前BLE Nitrogen提供的API接口仍然只专注于BLE部分,其它如GPIO、I2C等接口仍然没有完全添加进来,要使用这些功能还得等待或自行添加,对开发者来说,算是一个不好的消息!不过Zephyr向来都号召大家为Zephyr添砖加瓦,也许很快就会有了我们需要的功能!

另外也有人对96Boards的1.8V破多非议,难道真的只是为了低功耗?

  • 本文系21ic原创,未经许可禁止转载!

网友评论