1. 为什么我选择折腾BL616这块RISC-V芯片第一次拿到博流BL616的时候我其实没抱太大期望。这几年RISC-V芯片满天飞各家都说自己生态好、工具链全实际一上手往往就是另一回事。但BL616这块芯片有点不一样——它把Wi-Fi 6、蓝牙5.0和RISC-V内核塞进了一颗很小的封装里而且官方给的SDK是完整开源的不是那种只丢几个头文件让你自己猜的“伪开源”。这就让我有了认真搭一套开发环境的兴趣。BL616的核心是一颗带浮点单元的32位RISC-V处理器主频能跑到320MHz片上带了640KB的SRAM和可选配的PSRAM接口外设方面USB、SPI、I2C、PWM、ADC这些常规角色一个不少。它最吸引我的地方在于无线部分Wi-Fi 6支持OFDMA和MU-MIMO蓝牙部分同时兼容经典蓝牙和BLE 5.0。这意味着你可以用一颗芯片做完整的物联网网关、智能家居中控或者无线音频设备而不需要再外挂一颗无线芯片。对于做嵌入式的人来说少一颗芯片就意味着少一份功耗、少一份BOM成本、少一堆调试麻烦。但问题也恰恰出在这里。RISC-V的生态和ARM比起来还年轻工具链的成熟度、调试体验、社区资料的丰富程度都有差距。BL616虽然官方支持做得不错但网上能找到的完整搭建教程并不多很多帖子写到一半就断了或者只讲Windows不讲Linux或者只讲IDE不讲命令行。我在搭建过程中踩了不少坑有些是工具链版本不匹配有些是USB驱动的问题还有些是SDK子模块拉取时的网络问题。所以这篇文章我打算把Windows和Linux两个平台下的完整搭建过程都写清楚包括每一步为什么要这么做、遇到问题怎么排查让你少走弯路。这篇文章适合谁看如果你是有一定嵌入式基础、想入门RISC-V开发的工程师或者你已经在用STM32、ESP32这类芯片想试试RISC-V平台那这篇内容应该能帮到你。如果你是完全零基础的小白也不用怕我会把每个命令、每个配置项都解释清楚你照着做就行。我自己的习惯是搭建环境这种事第一次一定要跟着靠谱的教程走一遍把流程跑通后面再慢慢理解每个环节的原理。2. 搭建之前必须搞清楚的核心概念2.1 RISC-V工具链和ARM工具链到底差在哪很多从STM32转过来的朋友第一个困惑就是为什么RISC-V的工具链这么麻烦在ARM的世界里你装一个Keil或者IAR或者用gcc-arm-none-eabi基本上就搞定了。但RISC-V这边工具链的命名规则、前缀、编译选项都不一样而且不同厂商可能基于不同版本的GCC做定制。BL616用的是T-Head平头哥的RISC-V核具体来说是E907这个型号。这意味着你不能随便拿一个通用的riscv64-unknown-elf-gcc来编译因为E907有一些自定义的扩展指令比如平头哥自己的Xthead扩展。如果你用通用工具链编译可能会遇到指令不识别的问题或者编译出来的二进制跑不起来。所以博流官方推荐使用他们提供的专用工具链这个工具链是基于GCC 10.2版本定制的前缀是riscv64-unknown-elf-。这里有个细节值得注意BL616是32位芯片但工具链前缀是riscv64这不矛盾。RISC-V的工具链通常用riscv64作为前缀但通过-march和-mabi参数来指定实际的目标架构。BL616的编译参数一般是-marchrv32imafc -mabiilp32f表示32位整数指令集加上乘除法、原子操作、单精度浮点和压缩指令。这些参数在SDK的Makefile里已经配好了你不需要手动改但理解它们有助于你排查编译问题。2.2 为什么需要双平台方案我一开始只在Linux下搭建因为嵌入式开发用Linux确实更顺手命令行工具丰富脚本自动化方便。但后来发现很多同事和读者用的是Windows而且博流官方的一些烧录工具在Windows下体验更好。所以我把两个平台都跑了一遍总结出各自的优缺点。Linux平台的优势在于工具链安装简单直接解压就能用编译速度快因为文件系统性能好脚本自动化方便可以用Makefile和shell脚本做批量操作调试工具链完整OpenOCD和GDB的配合很顺畅。缺点是USB转串口驱动有时候需要手动配置特别是CH340、CP2102这些芯片烧录工具的选择少一些官方提供的命令行工具需要自己编译。Windows平台的优势在于图形化烧录工具更成熟博流提供了专门的烧录软件USB驱动安装有向导不容易出错IDE选择多比如VS Code加插件、或者官方的Bouffalo Lab Dev Cube。缺点是工具链路径不能有空格和中文否则会出各种奇怪的问题编译速度受限于文件系统比Linux慢不少命令行环境需要额外配置比如MSYS2或者WSL。我的建议是如果你主要做开发用Linux如果你需要频繁烧录和调试或者团队里有人不熟悉Linux那Windows也要配一套。两个平台的SDK是同一套代码只是编译和烧录的工具不同所以切换成本不高。2.3 BL616 SDK的目录结构解析在动手之前先搞清楚SDK的目录结构这样后面遇到问题你知道去哪里找。博流的SDK仓库叫bouffalo_sdk克隆下来之后大概是这样bouffalo_sdk/ ├── bsp/ # 板级支持包不同开发板的配置 │ ├── board/ # 具体板子的定义 │ └── common/ # 公共驱动 ├── components/ # 组件库 │ ├── bl616/ # BL616芯片相关的驱动 │ ├── wireless/ # Wi-Fi和蓝牙协议栈 │ ├── fs/ # 文件系统 │ └── utils/ # 工具函数 ├── examples/ # 示例代码 │ ├── helloworld/ # 最简单的例子 │ ├── wifi/ # Wi-Fi相关示例 │ └── ble/ # 蓝牙相关示例 ├── tools/ # 工具链和烧录工具 │ ├── toolchain/ # 编译工具链 │ └── flash/ # 烧录工具 ├── CMakeLists.txt # 顶层CMake配置 └── Makefile # 顶层Makefile这个结构很清晰bsp放板级配置components放驱动和协议栈examples放示例代码。你编译的时候实际上是在examples下面选一个项目然后通过CMake调用components里的驱动最终生成可执行文件。理解这个结构之后你就知道改板级配置要去bsp/board下面找改驱动要去components/bl616下面找。3. Linux平台从零搭建完整流程3.1 系统准备和依赖安装我用的环境是Ubuntu 22.04 LTS这是目前最稳定的选择。Ubuntu 24.04也可以但有些包的版本变化比较大可能会遇到兼容性问题。如果你用的是其他发行版比如Fedora或者Arch包管理命令不一样但思路是一样的。首先更新系统并安装基础依赖sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git cmake ninja-build python3 python3-pip \ libusb-1.0-0-dev libudev-dev pkg-config autoconf automake libtool \ minicom screen picocom这些包各有用途build-essential提供gcc、make这些基础编译工具cmake和ninja-build是SDK构建系统需要的python3用于运行一些脚本libusb和libudev是烧录工具需要的minicom、screen、picocom是串口终端工具选一个你用顺手的就行。这里有个坑要注意Ubuntu 22.04默认的Python是3.10但有些脚本可能需要3.8或3.9。如果你遇到Python相关的报错先检查版本。另外如果你之前装过其他版本的RISC-V工具链建议先清理掉避免PATH冲突。3.2 获取SDK和工具链博流的SDK在GitHub上但国内访问可能不稳定。我的做法是先配置好git的代理或者用镜像源。如果你有稳定的网络环境直接克隆就行git clone --recursive https://github.com/bouffalolab/bouffalo_sdk.git cd bouffalo_sdk注意--recursive参数因为SDK依赖了一些子模块比如无线协议栈、文件系统等。如果克隆的时候忘了加这个参数后面可以用git submodule update --init --recursive补上。但实测下来子模块拉取失败的概率挺高的特别是网络不好的时候。我的建议是分步来先克隆主仓库然后进入目录再逐个拉取子模块这样出错了知道是哪个模块的问题。工具链的获取有两种方式一是从博流官方下载预编译好的工具链二是自己从源码编译。我强烈建议用预编译的因为自己编译GCC工具链至少要一个小时而且容易出错。官方工具链的下载地址在SDK的文档里有下载下来是一个tar.gz包解压到/opt目录下sudo tar -xzf riscv64-unknown-elf-gcc-10.2.0-2022.04.12.tar.gz -C /opt/然后配置环境变量把工具链的bin目录加到PATH里。你可以临时用export命令也可以写到~/.bashrc里永久生效echo export PATH/opt/riscv64-unknown-elf-gcc-10.2.0-2022.04.12/bin:$PATH ~/.bashrc source ~/.bashrc验证一下工具链是否可用riscv64-unknown-elf-gcc --version如果输出了GCC 10.2.0的版本信息说明工具链配置成功了。如果提示command not found检查PATH是否正确或者工具链的目录名是否和你解压的一致。3.3 编译第一个示例程序SDK里自带了一个helloworld示例我们就用它来验证环境。进入示例目录cd examples/helloworld这个目录下有一个CMakeLists.txt和一个main.c。编译之前你需要确认板级配置是否正确。BL616有不同的开发板比如BL616DK、M0S Dock等板级配置在bsp/board目录下。默认情况下SDK会使用一个通用的配置但如果你用的是特定开发板最好在编译时指定。编译命令很简单mkdir build cd build cmake .. -DBOARDbl616dk -DCMAKE_BUILD_TYPERelease make -j$(nproc)这里-DBOARDbl616dk指定了目标板-DCMAKE_BUILD_TYPERelease表示发布模式编译优化级别更高。make -j$(nproc)表示用所有CPU核心并行编译加快速度。编译成功后在build目录下会生成一个.bin文件和一个.elf文件。.bin是烧录到芯片里的二进制.elf是带调试信息的可执行文件用于GDB调试。你可以用ls命令看一下ls -lh *.bin *.elf如果编译报错最常见的原因是工具链路径不对或者CMake找不到工具链。你可以检查build目录下的CMakeCache.txt看看CMAKE_C_COMPILER这一项指向的是不是正确的工具链路径。3.4 烧录和串口验证烧录之前先把开发板通过USB连接到电脑。BL616DK开发板上有两个USB接口一个是USB转串口用于烧录和串口输出一个是原生USB用于USB功能开发。烧录用的是串口那个。先确认串口设备是否被识别ls /dev/ttyUSB*如果看到/dev/ttyUSB0或者类似的设备说明驱动正常。如果没有可能是CH340或CP2102驱动没装。Ubuntu 22.04默认带了这些驱动但有些精简版系统可能没有。你可以用dmesg | tail看一下内核日志确认USB设备是否被识别。烧录工具在SDK的tools/flash目录下有一个bflb_iot_tool或者类似的命令行工具。用法大概是./bflb_iot_tool --chipname bl616 --port /dev/ttyUSB0 --baudrate 2000000 \ --firmware build/helloworld.bin --addr 0x0这个命令的意思是目标芯片是BL616串口是/dev/ttyUSB0波特率2000000烧录的固件是helloworld.bin烧录地址是0x0。波特率可以根据你的串口芯片调整CH340最高支持2MCP2102也差不多如果烧录失败可以降到115200试试。烧录完成后用串口终端工具查看输出picocom -b 2000000 /dev/ttyUSB0如果看到Hello World或者类似的输出说明整个流程跑通了。按CtrlA再按CtrlQ退出picocom。注意烧录的时候一定要确保开发板处于烧录模式。BL616DK上有一个BOOT按钮按住BOOT再按RESET然后松开RESET再松开BOOT芯片就进入烧录模式了。如果直接烧录失败先检查是不是没进烧录模式。4. Windows平台搭建的完整方案4.1 工具链和开发环境的准备Windows下搭建BL616开发环境我推荐用MSYS2作为命令行环境因为它提供了类Unix的shell和包管理同时又能直接调用Windows的程序。当然你也可以用WSL但WSL的USB透传比较麻烦烧录的时候容易出问题所以我还是倾向于原生Windows加MSYS2。首先下载安装MSYS2安装完成后打开MSYS2 UCRT64终端安装必要的工具pacman -Syu pacman -S --needed base-devel git cmake ninja python3然后下载博流官方的Windows工具链。注意要下载Windows版本的不是Linux版本的。下载下来是一个zip包解压到一个没有空格和中文的路径下比如C:\riscv_toolchain\。这一点非常重要因为Windows下的Make和CMake对路径中的空格处理不好如果路径里有空格编译的时候会报各种奇怪的错误。解压完成后把工具链的bin目录加到系统PATH里。你可以通过系统属性-高级-环境变量来添加也可以在MSYS2的~/.bashrc里添加echo export PATH/c/riscv_toolchain/bin:$PATH ~/.bashrc source ~/.bashrc验证工具链riscv64-unknown-elf-gcc --version4.2 SDK获取和编译配置Windows下获取SDK的方式和Linux一样用git克隆。但要注意Windows的文件系统对大小写不敏感而SDK里有些文件名大小写不同可能会导致问题。所以建议在MSYS2的终端里操作不要用Windows自带的CMD或PowerShell。git clone --recursive https://github.com/bouffalolab/bouffalo_sdk.git cd bouffalo_sdk如果子模块拉取失败可以手动进入每个子模块目录用git pull拉取。或者你可以从博流官方的Gitee镜像下载速度会快很多。编译过程和Linux基本一样cd examples/helloworld mkdir build cd build cmake .. -DBOARDbl616dk -DCMAKE_BUILD_TYPERelease -G Ninja ninja这里用-G Ninja指定用Ninja作为构建工具因为Ninja在Windows下的性能比Make好很多。如果你没装Ninja也可以用-G MinGW Makefiles但编译速度会慢一些。4.3 烧录工具的使用和串口调试Windows下的烧录工具是图形化的叫Bouffalo Lab Dev Cube。这个工具可以直接从博流官网下载安装后打开选择BL616芯片然后配置串口和固件路径。具体操作步骤打开Dev Cube在Chip Type里选BL616然后点Browse选择编译好的.bin文件Serial Port选开发板对应的COM口Baudrate选2000000然后点Download。如果一切正常进度条会走完然后提示烧录成功。串口调试可以用Putty或者SecureCRT也可以用VS Code的串口监视器插件。我一般用Putty配置简单Connection type选SerialSerial line填COM口Speed填2000000然后Open就行。注意Windows下COM口的编号可能会变特别是你插拔USB或者换USB口的时候。如果烧录工具找不到串口先去设备管理器里确认COM口号然后在工具里刷新一下。4.4 双平台编译产物的差异和注意事项虽然Linux和Windows用的是同一套SDK代码但编译出来的二进制可能会有细微差异。这主要是因为两个平台上的工具链版本可能略有不同或者编译时的路径信息被嵌入到了二进制里。不过对于功能验证来说这些差异不影响使用。有一个坑我要特别提醒Windows下编译的时候如果SDK路径里有中文CMake会报错。这是因为CMake在处理中文路径时编码有问题。所以你的SDK一定要放在纯英文路径下比如C:\work\bouffalo_sdk\不要放在桌面或者文档目录下因为那些路径里可能包含中文用户名。另外Windows下编译速度明显比Linux慢特别是全量编译的时候。我的实测数据是同一个helloworld项目Linux下大约15秒编译完Windows下要40秒左右。如果你需要频繁编译建议还是在Linux下开发Windows只用来烧录和调试。5. 搭建过程中最容易踩的坑和排查方法5.1 工具链相关的常见问题问题一编译时报错unrecognized command line option -marchrv32imafc这个错误通常是因为你用的工具链不支持RV32架构或者工具链版本太老。博流官方的工具链是支持RV32的但如果你用了系统自带的riscv64-linux-gnu-gcc可能就不支持。解决方法是确认你用的是riscv64-unknown-elf-gcc而不是riscv64-linux-gnu-gcc。这两个工具链的目标不同前者用于裸机开发后者用于Linux应用开发。问题二链接时报错undefined reference to __libc_init_array这个错误说明链接器找不到C库的初始化函数。原因可能是你用的工具链没有提供newlib库或者链接参数不对。博流SDK默认使用newlib作为C库如果你自己编译工具链要确保编译时启用了newlib。用官方工具链一般不会遇到这个问题。问题三烧录时报错Failed to connect to chip这个错误最常见的原因是芯片没进入烧录模式。BL616需要在上电时检测BOOT引脚的电平如果BOOT引脚被拉低就进入烧录模式。所以你要按住BOOT按钮然后按一下RESET按钮再松开BOOT按钮。如果还是不行检查USB线是不是只供电不传数据有些便宜的USB线没有数据线芯。5.2 SDK编译和配置的典型问题问题一CMake报错Could not find toolchain file这个错误说明CMake找不到工具链文件。博流SDK里有一个cmake/toolchain.cmake文件里面定义了编译器路径和编译参数。如果这个文件找不到可能是因为你的SDK不完整或者CMake的版本太老。解决方法是确认SDK目录下有cmake/toolchain.cmake文件并且CMake版本在3.15以上。问题二编译时提示fatal error: bl616_glb.h: No such file or directory这个错误说明头文件路径不对。BL616的头文件在components/bl616/include目录下CMake应该自动把这个目录加到include路径里。如果没加可能是你的CMakeLists.txt配置有问题或者你用的不是官方的示例项目。解决方法是检查CMakeLists.txt里有没有include_directories相关的配置。问题三子模块拉取失败编译时提示缺少文件前面提到过SDK依赖一些子模块比如无线协议栈、文件系统等。如果子模块没拉取完整编译时会提示找不到某些源文件。解决方法是进入SDK根目录执行git submodule update --init --recursive如果还是失败可以手动进入每个子模块目录用git pull拉取。或者从Gitee镜像下载完整的SDK包。5.3 烧录和串口通信的排查技巧问题一串口能识别但烧录失败这种情况通常是波特率太高导致的。BL616支持的最高烧录波特率是2M但有些USB转串口芯片在2M下不稳定。你可以把波特率降到115200或者921600试试。另外烧录的时候要确保没有其他程序占用串口比如串口终端工具。问题二烧录成功但串口没有输出首先检查串口终端的波特率是否和程序里配置的一致。BL616的默认串口波特率是2000000但有些示例程序可能用的是115200。你可以看main.c里的uart配置确认波特率。其次检查串口线是否接对了BL616DK的串口输出是UART0对应的引脚是GPIO21和GPIO22。问题三程序运行不稳定偶尔死机这种情况可能是电源问题。BL616在Wi-Fi和蓝牙同时工作时峰值电流可能达到300mA以上。如果你的USB口供电不足或者开发板上的LDO容量不够就会导致芯片复位。解决方法是换一个供电能力强的USB口或者在开发板上加一个大的滤波电容。6. 环境搭建完成后的下一步环境搭好之后我建议你先跑几个官方示例把Wi-Fi扫描、蓝牙广播、GPIO控制这些基础功能都试一遍。这样你对SDK的API和开发流程就有感觉了。然后可以试着改一改示例代码比如改一下Wi-Fi的SSID和密码或者改一下GPIO的输出频率看看效果。如果你要做实际项目接下来需要关注的是如何配置分区表、如何烧录文件系统、如何使用PSRAM、如何做OTA升级。这些内容SDK里都有示例但文档不算特别详细需要你结合代码去理解。我后面也会写一些关于BL616实战开发的文章比如用BL616做一个Wi-Fi温湿度传感器、或者做一个蓝牙遥控小车感兴趣的话可以关注一下。最后说一个我自己的习惯每次搭建新环境我都会把整个过程录屏或者写成文档包括遇到的错误和解决方法。这样下次换电脑或者帮同事搭建的时候直接照着文档走就行不用重新踩坑。这次BL616的环境搭建我也整理了一份检查清单你可以对照着检查自己的环境是否完整检查项LinuxWindows工具链版本riscv64-unknown-elf-gcc 10.2.0同左CMake版本3.15以上3.15以上Python版本3.8以上3.8以上串口驱动CH340/CP2102CH340/CP2102烧录工具bflb_iot_toolBouffalo Lab Dev Cube串口终端picocom/minicomPutty/SecureCRT路径要求无特殊要求纯英文无空格这个表格你可以保存下来搭建的时候逐项确认能省不少时间。
企业数字化 ERP 产品动态
相关推荐
第 2 篇:数字在内存里怎么排队(零门槛入门系列) 上一篇:第 1 篇《推理引擎到底在干什么》 | 下一篇:第 3 篇《权重文件的解剖》 一句话导读:机器里没有"表格",只有一条长长的队伍;形状是你和它约好的切法,"第几行第几列"只… · 2026/9/23 7:29:14
Akka Persistence Query 实战指南:用统一异步流接口构建 CQRS 读侧查询 Akka Persistence Query 实战指南:用统一异步流接口构建 CQRS 读侧查询 【免费下载链接】akka-core A platform to build and run apps that are elastic, agile, and resilient. SDK, libraries, and hosted environments. 项目地址: https://gitcode.com/gh_mir… · 2026/9/23 7:29:07
SCADA与视频安防联动方案深度解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 7:29:07
MVVM架构在健身小程序中的实践与优化 1. 项目概述:MVVM架构在健身小程序中的实践去年接手一个健身工作室的数字化转型项目时,我面临着一个典型的两难选择:既要快速交付一个功能完备的移动应用,又要保证后期可维护性。最终我们选择了微信小程序MVVM的解决方案ÿ… · 2026/9/23 9:00:27
JAVA八股文面试题 1. JDK、JRE、JVM之间的区别jdk包含jre,jre包含jvm。jvm是java实现整个跨平台最核心的部分,负责运行字节码文件,jre中则还包括一些jvm运行时需要的类库,jdk中则还包括java编译器。2. 面向对象a.封装:封装的意义&#x… · 2026/9/23 9:00:27
人人商城互动直播配置修复与抖音接口对接实战指南 简介:这份资源面向正在使用人人商城互动直播插件、却卡在服务器连接与直播源抓取环节的开发者与运维人员,提供配置修复方案并新增抖音接口支持。压缩包共4个文件,包含2个php脚本、1个txt说明与1个pdf文档,整体约404KB,… · 2026/9/23 9:00:27
OpenSpec 接口规范实践:从契约定义到代码生成与契约测试 1. 从“规范”到“可执行”:OpenSpec 到底在解决什么问题第一次听到 OpenSpec 这个名字,很多人会下意识把它归类到“又一个 API 文档工具”或者“又一个接口管理平台”里。我一开始也是这么想的,直到真正把它拉进一个多人协作的项目里跑了一遍… · 2026/9/23 9:00:20
5个实战项目优化橄榄菜图片加载,告别卡顿 5个实战项目优化橄榄菜图片加载,告别卡顿 配置环境就卡半天?别急,这不是你的锅。 在多个 实战项目 中,我见过太多团队因为一张“橄榄菜图片”导致页面首屏加载时间飙升至 4 秒以上。用户等不了,直接关页。这不仅是体验问题,更是性能事故。… · 2026/9/23 9:00:20
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29