在 WSL 上搭建小熊派 BearPi-HM Nano 开发环境(完整实操 + 踩坑记录)
环境:Windows 10 + WSL2
目标:在 WSL 里把 代码编译出Hi3861_wifiiot_app_allinone.bin,然后在 Windows 侧烧录到板子上。
结行:编译在 WSL,烧录在 Windows。整个链路可以跑通,实测BUILD SUCCESS。
1. 准备 WSL
在 Windows PowerShell(管理员) 中执行:
wsl --install -d Ubuntu-22.04
wsl --set-default-version 2
wsl --list --verbose # 确认 VERSION = 2
wsl
进入 WSL 后先换源、更新(国内网络强烈建议换源,否则 apt update 会很慢):
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's@http://archive.ubuntu.com/ubuntu/@https://mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list
sudo sed -i 's@http://security.ubuntu.com/ubuntu/@https://mirrors.tuna.tsinghua.edu.cn/ubuntu/@g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
以下教程可以直接复制到Claude code ,Codex ,opencode 等Agent中辅助完成
2. 安装系统依赖
sudo apt install -y \
build-essential gcc g++ make cmake \
git curl wget unzip tar \
python3 python3-pip python3-setuptools python3-venv \
python3-dev libffi-dev libssl-dev zlib1g-dev \
dos2unix file
3. 搞一份源码
cd ~
git clone https://gitee.com/bearpi/bearpi-hm_nano.git
cd bearpi-hm_nano
如果 clone 卡住,可以在 Windows 侧下载 zip 再拷贝进 WSL。
源码目录里最关键的两个位置:
bearpi-hm_nano/
├── applications/BearPi/BearPi-HM_Nano/sample/ # 所有示例代码
└── out/BearPi-HM_Nano/ # 编译产物(编译后出现)
4. 安装交叉编译工具链(三个组件)
需要三样东西:gcc_riscv32(编译器)、gn(工程生成)、ninja(构建执行器)。
4.1 下载
官方给的下载地址(也可以从 bearpi-hm_nano 仓库 的 README 里找最新链接):
mkdir -p ~/tools && cd ~/tools
# 1) riscv32 交叉编译器
wget -c https://repo.huaweicloud.com/harmonyos/compiler/gcc_riscv32/7.3.0/linux/gcc_riscv32-linux-7.3.0.tar.gz
# 2) gn
wget -c https://repo.huaweicloud.com/harmonyos/compiler/gn/1523/linux/gn.1523.tar
# 3) ninja
wget -c https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar
4.2 解压
cd ~/tools
tar -xzf gcc_riscv32-linux-7.3.0.tar.gz
tar -xf gn.1523.tar
tar -xf ninja.1.9.0.tar
ls ~/tools
# gcc_riscv32 gn ninja
解压后目录结构应是这样(gn 和 ninja 是单个可执行文件,不是多层目录):
~/tools/gn/gn ← 可执行文件
~/tools/ninja/ninja ← 可执行文件
~/tools/gcc_riscv32/bin/riscv32-unknown-elf-gcc
验证一下:
~/tools/gn/gn --version
~/tools/ninja/ninja --version
~/tools/gcc_riscv32/bin/riscv32-unknown-elf-gcc --version
4.3 写进 PATH(持久化)
cat >> ~/.bashrc <<'EOF'
# ==== BearPi-HM Nano toolchain ====
export PATH=~/tools/gn:$PATH
export PATH=~/tools/ninja:$PATH
export PATH=~/tools/gcc_riscv32/bin:$PATH
EOF
source ~/.bashrc
验证:
which gn ninja riscv32-unknown-elf-gcc
5. Python 环境
build.py 会用 Python 做 gn 调用、镜像签名和打包。
5.1 装 Python 依赖
pip3 install --user pycryptodome ecdsa six kconfiglib SCons
5.2 Ubuntu 22.04 没有 python 命令
构建脚本内部(gn 的 exec_script)会直接调用 python,而 Ubuntu 22.04 默认只提供 python3,报错长这样:
.../build.py: line 1: python: command not found
# 或者 gn 报 exec_script 失败,返回码 127
最省事的修法(全局软链,构建系统就认这个名字):
sudo ln -sf /usr/bin/python3 /usr/bin/python
python --version # Python 3.10.12
也可以用
update-alternatives或 pyenv,但对这个老构建系统来说,直接软链最稳。
不要在项目里建venv然后指望python指向它——build.py是#!/usr/bin/env python,路径不可控。
5.3 别被「Crypto 缺失」骗了
如果看到类似 ModuleNotFoundError: No module named 'Cryptodome' 的提示,
这个项目用的是 Crypto(pycryptodome),不是 Cryptodome(pycryptodomex)。
验证用的是哪一个:
python3 -c "import Crypto; print(Crypto.__version__)" # 3.23.0 ✅
如果 Crypto 报错才需要 pip3 install --user pycryptodome。
如果误装了 pycryptodomex,把 Cryptodome 目录删掉,别让它混淆。
5.4 import scons 报错是正常的
pip 装的是 SCons,导入名是大写的:
python3 -c "import scons" # ❌ ModuleNotFoundError
python3 -c "import SCons; print(SCons.__version__)" # ✅ 4.x
这个项目实际上主要靠 build.py + gn + ninja,基本不直接调 scons,
但装上有备无患(某些脚本会 import SCons)。
5.5 一次校验全部依赖
python3 - <<'EOF'
mods = ["Crypto", "six", "ecdsa", "kconfiglib", "SCons"]
for m in mods:
try:
__import__(m)
print(f"[OK] {m}")
except Exception as e:
print(f"[FAIL] {m}: {e}")
EOF
全部 [OK] 就可以编译了。
6. 编译
cd ~/bearpi-hm_nano
python build.py BearPi-HM_Nano
- 首次编译比较慢(几分钟,取决于机器);
- 中途看到一堆
warning是正常的(OpenHarmony 1.x 老代码 + GCC 7.3); - 成功时结尾会出现(
build/lite/compile_process.py里的原文):
=== start build ===
...
ohos BearPi-HM_Nano build success!
看到 ohos BearPi-HM_Nano build success! 就是成了。
6.1 产物在哪
out/BearPi-HM_Nano/
├── Hi3861_wifiiot_app_allinone.bin ← 烧录用这个
├── Hi3861_wifiiot_app_burn.bin
├── Hi3861_boot_signed.bin
├── Hi3861_loader_signed.bin
└── ...
只需要 Hi3861_wifiiot_app_allinone.bin,它已经把 boot / loader / 应用打包在一起了。
6.2 增量重编
# 改了代码,直接重跑即可(ninja 增量编译很快)
python build.py BearPi-HM_Nano
7. 切换要编译的示例
小熊派所有示例都在 applications/BearPi/BearPi-HM_Nano/sample/ 下,
但同一时间只会编译 BUILD.gn 里启用的那一个。
打开 sample/BUILD.gn,你会看到类似:
deps = [
#"B1_basic_led_blink:led_example",
#"B2_basic_button:button_example",
...
"D10_iot_cloud_oc_manhole_cover:cloud_oc_manhole_cover", # ← 当前启用
#"D11_iot_cloud_oc_infrared:cloud_oc_infrared",
]
规则很简单:把想跑的那一行前面的 # 去掉,其余行加上 #,保证只有一行是启用的。
编译规则:一行都不能多。如果同时启用两个含 main() 的示例,链接阶段会报 multiple definition of 'main'。
8. 烧录(回 Windows 做)
8.1 烧录
在 Windows 资源管理器里直接访问:
\\wsl$\Ubuntu-22.04\root\bearpi-hm_nano\out\BearPi-HM_Nano
⚠️ 别在 WSL 里直接用 /mnt/c 下编辑源码再编译,跨文件系统 IO 极慢,而且换行/权限容易出问题。源码放 WSL 原生路径,只把产物拷出去。
8.2 装驱动 & 烧录
- Windows 装 CH341SER.EXE(CH340 串口驱动),插上板子后在设备管理器里确认有
USB-SERIAL CH340 (COMx); - 打开 Hiburn(华为官方烧录工具,BearPi 资料包里自带);
- 选择
Hi3861_wifiiot_app_allinone.bin; - 波特率 921600,勾选 Auto burn;
- 点 Connect,然后按一下板子上的 RESET 键;
- 看到进度条走完、提示成功即可。
烧录失败 99% 是这三件事:串口被别的软件占用(先关掉串口助手)、没按 RESET、波特率没设成 921600。
8.3 看日志
用任意串口助手(MobaXterm / XCOM / PuTTY / Arduino IDE 串口监视器):
复位后应该能看到 Hi3861 的启动日志。注意烧录用 921600,日志用 115200,两个别搞混。
9. 跑通第一个程序:LED 闪烁
-
改
sample/BUILD.gn,只启用 B1:deps = [ "B1_basic_led_blink:led_example", #"B2_basic_button:button_example", ... ] -
编译:
cd ~/bearpi-hm_nano python build.py BearPi-HM_Nano -
用 Hiburn 烧录(921600);
-
复位板子,板载 LED 开始闪烁 → 环境搭建完成。