小熊派 BearPi-HM Nano 鸿蒙开发板使用指南
如果你渴望快速踏入 HarmonyOS 设备开发的大门小熊派 BearPi-HM Nano 绝对是你的最佳拍档。这块专为鸿蒙系统打造的 IoT 开发板以其亲民的价格、丰富的例程和活跃的社区生态吸引了无数开发者从零开始探索鸿蒙设备开发的奥秘。本文将带你从硬件认知出发一步步完成环境搭建、编写代码、烧录运行最终实现 WiFi 连接与 MQTT 通信的物联网实战项目。一、开发板简介1.1 硬件规格一览BearPi-HM Nano 开发板外观尺寸为 73.2mm × 62.7mm × 11.1mm板载资源相当丰富类别规格详情主控芯片Hi3861RNIV100160MHz 主频存储资源SRAM 352KB ROM 288KB Flash 2MB无线通信2.4GHz Wi-Fi (IEEE 802.11b/g/n)内置 PA/LNA接口资源15× GPIO、3× UART、2× SPI、2× I2C、7× ADC、6× PWM、1× SDIO板载功能NFC Tag (NT3H1101)、CH340 串口芯片、复位按键×1、用户按键×2、LED×2扩展接口E53 标准接口兼容所有 E53 扩展板供电方式USB Type-C (5V/1A)核心芯片 Hi3861是一款高度集成的 Wi-Fi SoC封装为 QFN-32 (5mm×5mm)工作温度范围 -40℃ ~ 85℃。它内嵌完整的 IEEE 802.11b/g/n 基带和 RF 电路支持 STA 和 AP 两种工作形态。作为 AP 时最大支持 6 个 STA 接入足以满足小型物联网项目的组网需求。1.2 板载资源解读开发板采用三段式布局设计各区域功能清晰左侧区域E53 扩展接口预留了完整的 GPIO、SPI、I2C、ADC、UART 等引脚方便连接各类传感器扩展板中间区域Hi3861 主控芯片、NFC 线圈与芯片实现 HarmonyOS 碰一碰配网、用户 LED 指示灯右侧区域USB Type-C 接口供电烧录、CH340 串口芯片、复位按键、两个用户自定义按键实战心得开发板出厂自带测试固件上电后红色 LED 会闪烁说明基础功能正常。如果 LED 不亮首先检查 USB 线是否支持数据通信部分充电线仅支持充电。1.3 硬件架构图二、开发环境搭建2.1 推荐的纯 Windows 开发方案2024 年以后HUAWEI DevEco Device Tool 3.1 版本已支持纯 Windows 环境开发 Hi3861大大简化了环境配置的复杂度。相比传统的 Linux 虚拟机方案纯 Windows 开发有以下优势编译速度更快首次编译仅需 2 分 30 秒烧录更便捷一键烧录约 30 秒环境配置步骤精简为三步安装 DevEco Device Tool → 下载源码 → 配置工具链环境配置步骤下载安装 DevEco Device Tool从华为开发者官网下载devicetool-windows-tool-3.1.x.zip解压后双击运行安装程序获取 Hi3861 SDK推荐通过 DevEco Marketplace 导入hi3861_hdu_iot_application项目SDK 大小仅约 413MB配置工具链在 Project Settings → compiler_bin_path 中选择DevTools_Hi3861V100_v1.0文件夹避坑提示Windows 路径长度限制 260 字符务必将项目放在磁盘根目录如D:\bearpi_project否则编译会莫名其妙失败首次编译会自动下载 Python 依赖建议配置国内 pip 镜像加速2.2 硬件连接方式开发板通过 USB Type-C 线与电脑连接即可完成供电、烧录、调试三大功能。连接时注意使用数据线而非仅充电线可通过观察是否能识别到 CH340 串口来判断烧录时需要按住复位键再上电或在烧录工具中选择重启进入烧录模式三、入门示例LED 闪烁与按键检测3.1 LED 控制代码LED 控制是最基础的入门实验。BearPi-HM Nano 板载一颗红色 LED连接在 GPIO 9 上低电平点亮。以下是完整的 LED 闪烁代码#includeohos_init.h#includecmsis_os2.h#includeiot_gpio.h#includehi_gpio.h#includehi_io.h#defineLED_GPIO_PIN9// LED连接GPIO9// GPIO初始化staticvoidGpioInit(void){// 初始化GPIO功能IoTGpioInit(LED_GPIO_PIN);// 设置GPIO为输出模式IoTGpioSetDir(LED_GPIO_PIN,IOT_GPIO_DIR_OUT);}// LED任务控制LED以500ms间隔闪烁staticvoidLED_Task(void*arg){(void)arg;GpioInit();while(1){// 输出低电平点亮LEDIoTGpioSetOutputVal(LED_GPIO_PIN,IOT_GPIO_VALUE0);osDelay(50);// 500ms (10ms × 50)// 输出高电平熄灭LEDIoTGpioSetOutputVal(LED_GPIO_PIN,IOT_GPIO_VALUE1);osDelay(50);}}// 创建LED任务staticvoidLED_Entry(void){osThreadAttr_tattr{.nameLED_Task,.stack_size4096,.priorityosPriorityNormal,};if(osThreadNew(LED_Task,NULL,attr)NULL){printf([LED] Failed to create LED task!\r\n);}}// 使用SYS_RUN启动任务SYS_RUN(LED_Entry);实战要点SYS_RUN()宏会在系统启动时自动执行无需手动调用main()osDelay()的单位是 10ms因此osDelay(50)表示 500msLED 电路采用低电平驱动设计GPIO 输出低时电流从 VCC 经 LED 流向 GPIO3.2 按键检测代码板载两个用户按键KEY1 和 KEY2可用于触发交互事件。按键电路采用中断方式设计#includeohos_init.h#includecmsis_os2.h#includeiot_gpio.h#includehi_gpio.h// 按键GPIO定义#defineKEY1_GPIO5// GPIO5 连接 KEY1#defineLED_GPIO9// GPIO9 连接 LEDstaticuint32_tkey_press_count0;// 按键中断回调函数staticvoidKey1_ISR(uint32_tgpioIrqNum){(void)gpioIrqNum;key_press_count;printf([KEY] Button pressed! Count: %u\r\n,key_press_count);// 翻转LED状态staticuint8_tled_state0;led_state!led_state;IoTGpioSetOutputVal(LED_GPIO,led_state?IOT_GPIO_VALUE1:IOT_GPIO_VALUE0);}// GPIO与中断初始化staticvoidGpioInterruptInit(void){// 初始化GPIOIoTGpioInit(KEY1_GPIO);IoTGpioInit(LED_GPIO);// 设置KEY1为输入模式IoTGpioSetDir(KEY1_GPIO,IOT_GPIO_DIR_IN);// 设置LED为输出模式IoTGpioSetDir(LED_GPIO,IOT_GPIO_DIR_OUT);// 配置GPIO5为下降沿触发中断按键按下时触发IoTGpioRegisterIsrFunc(KEY1_GPIO,IOT_INT_TYPE_EDGE,IOT_GPIO_EDGE_FALL_LEVEL_LOW,Key1_ISR,NULL);}staticvoidKeyDemo_Entry(void){GpioInterruptInit();printf([KEY Demo] Started. Press KEY1 to toggle LED.\r\n);}SYS_RUN(KeyDemo_Entry);调试技巧使用串口调试助手MobaXterm 或 PuTTY连接开发板波特率设为 115200按下按键时可在串口终端看到按键计数信息。四、进阶示例WiFi 连接与 MQTT 通信4.1 WiFi STA 连接代码WiFi 连接是物联网项目的基础能力。Hi3861 支持 STAStation模式连接到无线路由器#includeohos_init.h#includecmsis_os2.h#includehi_wifi_api.h#includelwip/netifapi.h#includelwip/sockets.h#includestring.h// WiFi配置参数修改为你的热点信息#defineWIFI_SSIDYourSSID#defineWIFI_PASSWORDYourPasswordstaticvolatileintg_connect_success0;staticstructnetif*g_lwip_netifNULL;// WiFi连接状态回调staticvoidWifiConnectionHandler(uint8_tstate,WifiLinkedInfo*info){(void)info;if(stateWIFI_STATE_CONNECTED){printf([WiFi] Connected to AP successfully!\r\n);g_connect_success1;}else{printf([WiFi] Disconnected, state: %d\r\n,state);}}// WiFi扫描完成回调staticvoidWifiScanDoneHandler(uint8_tstate,uint8_tsize){(void)state;printf([WiFi] Scan finished, found %d APs\r\n,size);}// WiFi初始化与连接staticintWiFiConnect(void){intret;// 注册WiFi事件回调WifiEvent event{.onWifiConnectionChangedWifiConnectionHandler,.onWifiScanStateChangedWifiScanDoneHandler,};retRegisterWifiEvent(event);if(ret!WIFI_SUCCESS){printf([WiFi] Register event failed: %d\r\n,ret);return-1;}// 使能WiFi STA模式retEnableWifi();if(ret!WIFI_SUCCESS){printf([WiFi] Enable WiFi failed: %d\r\n,ret);return-1;}// 配置要连接的热点WifiDeviceConfig config{0};strncpy(config.ssid,WIFI_SSID,sizeof(config.ssid)-1);strncpy(config.password,WIFI_PASSWORD,sizeof(config.password)-1);intnetworkId-1;retAddDeviceConfig(config,networkId);if(ret!WIFI_SUCCESS||networkId0){printf([WiFi] Add config failed: %d, networkId: %d\r\n,ret,networkId);return-1;}// 连接到热点retConnectTo(networkId);if(ret!WIFI_SUCCESS){printf([WiFi] Connect failed: %d\r\n,ret);return-1;}// 等待连接成功最多等待15秒intwait_count0;while(!g_connect_successwait_count150){usleep(100000);// 100mswait_count;}if(!g_connect_success){printf([WiFi] Connection timeout!\r\n);return-1;}// 获取网络接口并启动DHCPg_lwip_netifnetifapi_netif_find(wlan0);if(g_lwip_netifNULL){printf([WiFi] Netif not found!\r\n);return-1;}retnetifapi_netif_set_default(g_lwip_netif);retdhcp_start(g_lwip_netif);// 等待DHCP完成printf([WiFi] Waiting for DHCP...\r\n);for(inti0;i30;i){osDelay(20);if(dhcp_is_bound(g_lwip_netif)ERR_OK){printf([WiFi] DHCP OK!\r\n);// 打印获取的IP信息ip4_addr_tip,gw,mask;netifapi_netif_get_addr(g_lwip_netif,ip,netmask,gw);printf([WiFi] IP: %s\r\n,ip4addr_ntoa(ip));return0;}}printf([WiFi] DHCP timeout!\r\n);return-1;}staticvoidWiFiTask(void*arg){(void)arg;if(WiFiConnect()0){printf([WiFi] Ready for network operations!\r\n);// 这里可以开始TCP/UDP/MQTT通信}else{printf([WiFi] Connection failed!\r\n);}}staticvoidWiFiDemo_Entry(void){osThreadAttr_tattr{.nameWiFi_Task,.stack_size4096,.priorityosPriorityNormal,};osThreadNew(WiFiTask,NULL,attr);}SYS_RUN(WiFiDemo_Entry);4.2 MQTT 客户端实现MQTT 是物联网领域最流行的消息传输协议。以下代码演示如何在 Hi3861 上实现 MQTT 客户端#includeohos_init.h#includecmsis_os2.h#includeMQTTClient.h#includelwip/sockets.h// MQTT服务器配置#defineMQTT_SERVER_IPbroker.emqx.io// 公共MQTT服务器#defineMQTT_SERVER_PORT1883#defineMQTT_CLIENT_IDBearPi_Hi3861#defineMQTT_USERNAMEdemo#defineMQTT_PASSWORDdemo#defineMQTT_TOPIC_PUBbearpi/temperature#defineMQTT_TOPIC_SUBbearpi/controlstaticMQTTClient mqtt_client;staticNetwork mqtt_network;staticunsignedcharmqtt_send_buf[1024];staticunsignedcharmqtt_recv_buf[1024];// MQTT消息回调staticvoidmqtt_message_arrived(MessageData*msg_data){if(msg_dataNULL)return;printf([MQTT] Received from topic %.*s: %.*s\r\n,msg_data-topicName-lenstring.len,msg_data-topicName-lenstring.data,msg_data-message-payloadlen,(char*)msg_data-message-payload);}// MQTT连接与通信staticvoidMqttTask(void){intret;// 初始化网络连接NetworkInit(mqtt_network);retNetworkConnect(mqtt_network,MQTT_SERVER_IP,MQTT_SERVER_PORT);if(ret!0){printf([MQTT] Network connect failed: %d\r\n,ret);return;}printf([MQTT] Network connected to %s:%d\r\n,MQTT_SERVER_IP,MQTT_SERVER_PORT);// 初始化MQTT客户端MQTTClientInit(mqtt_client,mqtt_network,3000,mqtt_send_buf,sizeof(mqtt_send_buf),mqtt_recv_buf,sizeof(mqtt_recv_buf));// 配置连接参数MQTTPacket_connectData connectDataMQTTPacket_connectData_initializer;connectData.keepAliveInterval30;connectData.cleansession1;connectData.clientID.cstringMQTT_CLIENT_ID;connectData.username.cstringMQTT_USERNAME;connectData.password.cstringMQTT_PASSWORD;// 连接MQTT服务器retMQTTConnect(mqtt_client,connectData);if(ret!SUCCESS){printf([MQTT] Connect failed: %d\r\n,ret);NetworkDisconnect(mqtt_network);return;}printf([MQTT] Connected to broker!\r\n);// 订阅主题retMQTTSubscribe(mqtt_client,MQTT_TOPIC_SUB,QOS1,mqtt_message_arrived);if(ret!SUCCESS){printf([MQTT] Subscribe failed: %d\r\n,ret);}else{printf([MQTT] Subscribed to: %s\r\n,MQTT_TOPIC_SUB);}// 循环发布消息intmsg_count0;while(1){// 模拟读取传感器数据实际项目中替换为真实传感器读取floattemperature25.0f(msg_count%20)*0.5f;charpayload[64];snprintf(payload,sizeof(payload),{\device\:\%s\,\temp\:%.1f,\humidity\:%.1f},MQTT_CLIENT_ID,temperature,60.0fmsg_count%30);MQTTMessage message{.qosQOS1,.retained0,.payloadpayload,.payloadlenstrlen(payload),};retMQTTPublish(mqtt_client,MQTT_TOPIC_PUB,message);if(retSUCCESS){printf([MQTT] Published to %s: %s\r\n,MQTT_TOPIC_PUB,payload);}osDelay(200);// 每2秒发布一次msg_count;}}staticvoidMqttDemo_Entry(void){osThreadAttr_tattr{.nameMQTT_Task,.stack_size8192,// MQTT任务需要更大的栈空间.priorityosPriorityNormal,};osThreadNew(MqttTask,NULL,attr);}SYS_RUN(MqttDemo_Entry);MQTT 测试工具开发电脑端可使用 MQTTX 或 Paho MQTT 客户端连接同一服务器订阅bearpi/temperature主题即可看到设备上报的数据向bearpi/control主题发送消息可控制设备行为。五、外设操作速查表5.1 常用 GPIO 引脚定义功能GPIO说明板载 LEDGPIO_9低电平点亮用户按键 KEY1GPIO_5按下为低电平用户按键 KEY2GPIO_8按下为低电平E53 接口 SCLGPIO_13I2C0 时钟E53 接口 SDAGPIO_14I2C0 数据UART0 TXGPIO_11调试串口发送UART0 RXGPIO_12调试串口接收5.2 I2C 传感器读取示例以读取光照强度传感器 BH1750 为例#includehi_i2c.h#defineBH1750_ADDR0x23// BH1750 I2C地址#defineBH1750_POWER_ON0x01// 开启测量命令#defineBH1750_CON_H0x10// 连续高分辨率模式// I2C初始化staticvoidI2C_Init(void){hi_i2c_idx_id i2c_idHI_I2C_IDX_0;hi_u32 baudrate400000;// 400KHz 高速模式hi_i2c_init(i2c_id,baudrate);hi_i2c_set_baudrate(i2c_id,baudrate);}// 读取光照强度单位luxstaticintBH1750_ReadLux(float*lux){hi_i2c_idx_id i2c_idHI_I2C_IDX_0;hi_u8 send_data[1]{BH1750_CON_H};hi_u8 recv_data[2]{0};// 发送测量命令if(hi_i2c_write(i2c_id,BH1750_ADDR,send_data,1)!HI_ERR_SUCCESS){return-1;}// 等待测量完成120msusleep(150000);// 读取两字节数据if(hi_i2c_read(i2c_addr,BH1750_ADDR,NULL,recv_data,2)!HI_ERR_SUCCESS){return-1;}// 计算光照强度// BH1750 分辨率 1 lux, 高位在前hi_u16 raw(recv_data[0]8)|recv_data[1];*luxraw/1.2f;return0;}六、常见问题与踩坑记录问题 1编译报错 “toolchain not found”解决方案检查 DevEco Device Tool 中compiler_bin_path是否正确配置为DevTools_Hi3861V100_v1.0文件夹路径。问题 2烧录失败提示 “Failed to connect device”解决方案确保开发板进入烧录模式——按住复位键上电后保持 2 秒串口应打印###HiBurn###提示。问题 3WiFi 连接成功但无法获取 IP解决方案确认路由器开启了 DHCP 功能或者手动设置静态 IPnetifapi_netif_set_addr(g_lwip_netif,ipaddr,netmask,gw);问题 4MQTT 连接服务器失败解决方案确认 WiFi 已成功连接并获取 IP检查 MQTT 服务器地址和端口是否正确部分企业网络需要配置代理或使用 WebSocket 方式连接七、总结小熊派 BearPi-HM Nano 开发板是入门 HarmonyOS 设备开发的绝佳选择。它麻雀虽小五脏俱全——Hi3861 芯片虽然资源有限但 Wi-Fi、NFC、GPIO、I2C、SPI、UART 等物联网核心能力一应俱全配合丰富的 E53 扩展板和海量的社区例程完全可以支撑从 LED 控制到云端对接的完整项目。