最近拿到一块聆思科技的CSK-6-NanoKit开发板,据说可广泛应用于家居家电、智能车载、智能教育、智能办公、智能安防、工业智能化和消费电子等领域。
乍一看,好像是一块普通的MCU。
再认真看一下配置……
跟普通的MCU不太一样,带NPU和DSP的。
采用安谋科技“星辰”STAR-MC1 + HIFI4 双核架构,主频最高支持300MHz。
集成为神经网络操作设计的NPU,深度适配科大讯飞AI算法,算力达128GOPS。
不过让人意外的是,这款开发板默认支持的操作系统不是久负盛名的FreeRTOS,也不是国货之光RT-Thread和OpenHarmony,而是Zephyr RTOS。
Zephyr RTOS是一款由Linux基金会主导的、针对资源受限设备进行优化过的开源RTOS,为高性能、低功耗的物联网应用而设计。因为其先进的特性,很多芯片厂商也将Zephyr RTOS作为其优先适配的操作系统。
聆思科技CSK6 沿用了 Zephyr 的设计, 采用 SDK 与 项目工程 分离的形式,通过构建系统,将项目工程的代码与 SDK 进行关联编译。
这意味着 SDK 与 项目源码 是可以存放在不同的路径下的。
这样做有两个好处,一方面是可以最大的保证项目源码的简洁,另一方面 SDK 也可以进行小版本的快速升级,而应用程序不会受其影响。
嵌入式系统工具和SDK的部署
聆思科技在这里贴心的为大家准备了Windows、MacOS、Ubuntu三款流行操作系统的安装工具。
Windows用户(下载后安装):
https://castor.iflyos.cn/castor/v3/lisaPluginZephyr/download?platform=windows
MacOS和Ubuntu用户(命令行执行):
curl -o- https://cdn.iflyos.cn/public/cskTools/lisa-zephyr-install.sh | bash
有了这个工具,大家就可以在命令行下安装相关SDK和开发环境了。
相关命令:lisa zep install
检查一下环境是否安装成功。
这里主要是安装Git和一些核心插件,如果的机器上已经满满当当,可以放心下一步。
拉取CSK6对应的SDK之后,就可以正式开始测试了。
此次重点测评的四个特性
A、Hello World(实时输出)
B、点亮LED(GPIO控制)
C、Wi-Fi连接
D、MicroPython交互
一、Hello Word
这个开发板上有个实时复位的按键,我们这里来完成一个每次按键就能输出一行字符的功能。
执行命令:lisa zep create
,然后选择其中的“hello_world”。
它会自动生成一个项目,我们进入该项目文件夹,可以看到源码目录和其它的一些配置文件。
进入src目录,修改main.c文件为我们所要的效果。
再执行编译命令:lisa zep build -b csk6002_9s_nano
如果编译没有出错,接下来就可以烧录进开发板了。
由于NanoKit开发板集成了DAPLINK烧录器,因此支持使用pyocd进行代码烧录。
连接好开发板的USB线,执行以下命令:
lisa zep flash
烧录完成后,运行Putty,选择连接开发板后生成的串口,波特率设置为115200。
我这里已经可以看到结果了。
二、GPIO点灯
大部分外设的调试,都是从点灯开始的。
这也几乎是嵌入式工作的一项基本操作,重点就是考察开发板的“通用输入输出”功能。
还是执行命令:lisa zep create
然后选择basic目录里的blinky,系统会自动创建blinky这个项目文件夹。
在prj.conf文件中添加项目基础组件配置:
CONFIG_GPIO=y
然后再编辑src目录里的main.c文件。
我这里的示例代码是:
#include <zephyr.h>
#include <device.h>
#include <devicetree.h>
#include <drivers/gpio.h>
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
#if DT_NODE_HAS_STATUS(LED0_NODE, okay)
#define LED0 DT_GPIO_LABEL(LED0_NODE, gpios)
#define PIN DT_GPIO_PIN(LED0_NODE, gpios)
#define FLAGS DT_GPIO_FLAGS(LED0_NODE, gpios)
#else
/* A build error here means your board isn't set up to blink an LED. */
#error "Unsupported board: led0 devicetree alias is not defined"
#define LED0 ""
#define PIN 0
#define FLAGS 0
#endif
void main(void)
{
const struct device *dev;
bool led_is_on = true;
int ret;
dev = device_get_binding(LED0);
if (dev == NULL) {
return;
}
ret = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS);
if (ret < 0) {
return;
}
while (1) {
gpio_pin_set(dev, PIN, (int)led_is_on);
led_is_on = !led_is_on;
k_msleep(SLEEP_TIME_MS);
}
}
继续编译固件:lisa zep build -b csk6002_9s_nano
确保通过USB连接PC,烧录固件。lisa zep flash --runner pyocd
一切顺利的话,应该能看到开发板上的绿色LED每隔一秒亮1次了。
三、Wi-Fi连接
作为一款多功能开发板,Wi-Fi是最基本的。
这里实现一个连接Wi-Fi热点,并打印相关信息到串口的操作。
我先设置一个Wi-Fi热点。
SSID:Meegoo
密码:abcd1234
然后继续创建项目:lisa zep create
依次选择boards → csk6 → network → wifi_sta。
我这里是把SSID和密码写进Kconfig文件的。
相关main.c代码内容:
/*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdlib.h>
#include <sys/printk.h>
#include <sys/sys_heap.h>
#include <net/net_if.h>
#include <net/net_core.h>
#include <net/net_context.h>
#include <net/net_mgmt.h>
#include "csk6/csk_wifi.h"
static csk_wifi_event_cb_t wifi_event_cb;
static struct net_mgmt_event_callback dhcp_cb;
static void handler_cb(struct net_mgmt_event_callback *cb, uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
printk("Your address: %s\n", net_addr_ntop(AF_INET, &iface->config.dhcpv4.requested_ip, buf, sizeof(buf)));
printk("Lease time: %u seconds\n", iface->config.dhcpv4.lease_time);
printk("Subnet: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->netmask, buf, sizeof(buf)));
printk("Router: %s\n", net_addr_ntop(AF_INET, &iface->config.ip.ipv4->gw, buf, sizeof(buf)));
}
static void wifi_event_handler(csk_wifi_event_t events, void *event_data, uint32_t data_len, void *arg)
{
if (events & CSK_WIFI_EVT_STA_CONNECTED) {
printk("[WiFi sta] connected\n");
} else if (events & CSK_WIFI_EVT_STA_DISCONNECTED) {
printk("[WiFi sta] disconnected\n");
} else {
abort();
}
}
void main(void)
{
csk_wifi_init();
wifi_event_cb.handler = &wifi_event_handler;
wifi_event_cb.events = CSK_WIFI_EVT_STA_CONNECTED | CSK_WIFI_EVT_STA_DISCONNECTED;
wifi_event_cb.arg = NULL;
csk_wifi_add_callback(&wifi_event_cb);
csk_wifi_sta_config_t sta_config = {
.ssid = CONFIG_EXAMPLE_WIFI_SSID,
.pwd = CONFIG_EXAMPLE_WIFI_PASSWORD,
.encryption_mode = CSK_WIFI_AUTH_WPA2_PSK
};
继续生成镜像并烧录,然后重置(按复位按钮),查看结果。
可以看到,已经成功连接Wi-Fi热点,并获取IP地址了。
接下来,数据传输什么的功能,可以自己添加了。
四、MicroPython交互
前面三个功能都是经典C语言实现的,
其实聆思科技还有一个重头戏 —— 适配MicroPython。
这是Python 在微处理器上运行一个轻量化的版本,可以帮助产品设计者快速实现原型。
聆思科技在搭建 MicroPython 应用开发环境的同时,完完全全的保留了 Zephyr 原生应用开发的环境,使得你既可以快速的从原生应用上加入对 MicroPython 的支持,也可以在 MicroPython 应用项目内增加原生代码(如 C 语言)的业务实现。
执行命令:lisa install @lisa-plugin/micropython -g
这个包有点大,要耐心等一会儿。成功装完之后是这样的。
我这里主要使用的lisa版本和MicroPython版本分别是:
listenai/lisa - 2.4.2
micropython - 0.1.3
安装好插件后,继续拉取 MicroPython SDK 相关源码。这些源码将会在编译 MicroPython 应用时被引用。lisa mpy use-sdk
友情提示:
1、我这里常规Windows命令行状态有报“process.title cannot be used as a valid name”的错误,但在Powershell状态下可以顺利运行。
2、如果你希望在新建MicroPython项目时,pip某个库文件。可以用:“lisa mpy pip:install 库名”的方式。
然后继续编译,烧录……
注:这个过程很慢,你可以先去泡杯咖啡再回来。
如果没有报错的话,你应该可以通过串口进行相关Python操作了(我这里是COM6)。
小结:
首先,聆思科技对Zephyr RTOS确实做到了高度适配。
为了方便开发者,提供了大量的工具包和示例。
即使Zephyr RTOS在国内算“小众”嵌入式系统,他们的工具和文档也可以让新手快速进入开发状态。
比如这个名为“Lisa”的核心配置工具,确实是一款非常省事的利器。
不过由于开发板刚推出没多久,他们的各种线上资源也在不停的升级,所以各位尝鲜的朋友或多或少会遇到一些坑。等他们发布正式版之后应该会好很多。
当然,我这里只是抛砖引玉,用到了CSK-6-NanoKit的一些基础功能。
实际这个板子还有大量潜力可以挖掘,音频处理、人工智能识别……都可以整起来。