ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

K210开发实例-K210介绍和开发环境搭建:从RISC-V SDK到CMake工程配置一次跑通

K210开发实例-K210介绍和开发环境搭建:从RISC-V SDK到CMake工程配置一次跑通 1. K210 开发环境搭建前必须搞清楚的几件事K210 是一颗面向边缘计算的 RISC-V SoC双核 64 位、带独立 FPU片上 8MB SRAM其中 2MB 专供 KPU 做神经网络推理还集成了 KPU、APU、FFT 加速器和 AES/SHA256 硬件加密模块。它能跑人脸检测、目标分类、声源定向、语音唤醒这类视觉与听觉任务适合做智能门禁、语音小车、离线识别盒子这类产品原型。如果你手上是一块 Maix Bit、Maix Dock 或者 K210 开发板想从零把固件编译出来并烧进去这篇就是按这个链路写的。很多人第一次接触 K210 会卡在三个地方一是不知道 SDK 和工具链到底该下哪个版本二是 CMake 工程里PROJ变量没改对导致编译报错三是烧录时串口波特率选太高直接失败。我试过在 Windows 上从零搭一遍把每一步的命令和配置都记下来了你可以直接照着做。K210 的软件栈和 STM32 那套 Keil 工程不太一样它用的是 CMake 管理工程交叉编译工具链是 RISC-V 的 GCC。整个链路是装 CMake → 装 RISC-V 工具链 → 配环境变量 → 拉 SDK → 改CMakeLists.txt选工程 → 编译出.bin→ 用 K-Flash 烧录 → 串口看输出。下面按这个顺序展开每一步都给可复制的配置。需要说明的是K210 的 SDK 有 standalone 和 FreeRTOS 两个版本初学者建议先用 standalone SDK结构简单、依赖少编译一次就能跑通。等你熟悉了再上 FreeRTOS 做多任务。本文以 standalone SDK 0.5.6 为例工具链用 kendryte-toolchain 8.2.0。2. TaoToken 前置准备给 K210 工程配一个稳定的模型调用入口K210 本身是离线推理芯片但你在开发过程中大概率会用到模型转换、代码辅助、文档查询这些环节。比如把训练好的 YOLO 模型转成 K210 能吃的 kmodel 格式或者让模型帮你生成一段 KPU 初始化代码这时候一个稳定的 API 入口就很有用。TaoToken 在这里的角色是提供统一的模型调用地址你不需要在本地折腾各种环境直接拿 Key 就能调。先说清楚它是什么TaoToken 是一个大模型 API 聚合入口能做什么你可以用它调用对话模型来辅助写 K210 的驱动代码、解释报错、生成 CMake 配置片段。适合谁适合正在做嵌入式开发、需要边写边查边验证的开发者。它的 API 地址是https://taotoken.net/api官网是https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。拿 Key 的步骤不复杂但我不在这里展开注册流程重点说配置。你需要在控制台创建一个 API Key然后把它写进你的开发工具配置里。如果你用的是 Claude Code 或者 Cline 这类支持自定义 Base URL 的工具配置三件套是Base URL 填https://taotoken.net/apiKey 填你创建的那串Model ID 填你选的模型名。这三样缺一不可少一个就会报 401 或者 model not found。对于 K210 开发场景我建议把模型调用用在两个地方一是生成外设初始化代码比如 I²C 接 OLED 的驱动二是解释编译报错把 CMake 的 error log 贴进去让它帮你定位。这样比纯靠搜索引擎快很多。控制台地址是https://taotoken.net/consoleAPI Keys 管理在https://taotoken.net/api-keys接入文档在https://taotoken.net/doc。如果你长期做编码和 Agent 任务可以看 Coding Planhttps://taotoken.net/coding-plan。这里要提醒一句TaoToken 是模型调用入口不是替代你的编辑器或编译工具链。K210 的编译还是靠本地 RISC-V GCC 和 CMakeTaoToken 只是帮你写代码和查问题的辅助。两者不要混为一谈。3. 可复制配置K210 SDK 的 CMakeLists 与工具链设置这一节是核心直接给可复制的配置片段。先假设你已经把 standalone SDK 解压到了D:\k210\kendryte-standalone-sdk-0.5.6工具链解压到了D:\k210\kendryte-toolchain。第一步配环境变量。把工具链的 bin 目录加到系统 PATH# Windows PowerShell 临时生效当前会话 $env:Path ;D:\k210\kendryte-toolchain\bin # 验证工具链是否可用 riscv64-unknown-elf-gcc --version如果输出 GCC 版本号说明工具链配好了。如果提示找不到命令检查路径里是不是有bin这一层。第二步改 SDK 根目录的CMakeLists.txt。K210 的工程是按目录管理的src下每个子目录是一个独立工程。你要编译哪个工程就把PROJ变量改成对应的目录名。比如编译hello_world# 文件位置kendryte-standalone-sdk-0.5.6/CMakeLists.txt set(PROJ hello_world) # basic config if (NOT PROJ) get_filename_component(PROJ ${CMAKE_CURRENT_BINARY_DIR} DIRECTORY) get_filename_component(PROJ ${PROJ} NAME) string(REPLACE _ PROJ ${PROJ}) message(STATUS PROJ not set, use ${PROJ} as PROJ.) endif()注意PROJ的值必须和src下的目录名完全一致大小写敏感。如果你写Hello_World而目录是hello_worldCMake 会报找不到源文件。第三步配置工具链文件。SDK 的cmake目录下一般有toolchain.cmake内容大致如下你可以对照检查# 文件位置kendryte-standalone-sdk-0.5.6/cmake/toolchain.cmake set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR riscv64) set(TOOLCHAIN_PREFIX riscv64-unknown-elf-) set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}g) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc) set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) set(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) set(CMAKE_C_FLAGS -marchrv64imafdc -mabilp64d -mcmodelmedany) set(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})这里的-marchrv64imafdc对应 K210 的 RV64GC 指令集-mabilp64d是双精度浮点 ABI。这两个参数不能改错否则链接阶段会报 ABI 不匹配。第四步如果你用 VSCode 的 CMake Tools 插件在.vscode/settings.json里指定工具链和生成器{ cmake.generator: MinGW Makefiles, cmake.buildDirectory: ${workspaceFolder}/build, cmake.configureSettings: { CMAKE_TOOLCHAIN_FILE: ${workspaceFolder}/cmake/toolchain.cmake, PROJ: hello_world }, cmake.buildArgs: [-j8] }如果你在 Windows 上没装 MinGW也可以用Ninja作为生成器把cmake.generator改成Ninja即可。前提是ninja.exe在 PATH 里。第五步命令行编译。进入 SDK 根目录执行mkdir build cd build cmake .. -G MinGW Makefiles -DPROJhello_world -DCMAKE_TOOLCHAIN_FILE../cmake/toolchain.cmake make -j8编译成功后build目录下会生成hello_world.bin。这个文件就是你要烧进 K210 的固件。如果编译报错undefined reference to _start检查链接脚本lds目录下的kendryte.ld是否被正确引用。4. 验证请求与成功结果串口确认固件跑起来编译出.bin只是第一步真正要确认的是固件在板子上跑起来了。这一步用 K-Flash 烧录然后用串口工具看输出。烧录前先确认板子的串口驱动装好了。Maix Bit 用的是 CH340 或 CP2102设备管理器里能看到 COM 口就行。打开 K-Flash选择.bin文件选对 COM 口波特率建议先用115200或1500000。注意K-Flash 的下载串口最大支持 2000000如果你选 4000000 会出现不可预料的错误这是踩过的坑。烧录完成后打开串口终端。Windows 上可以用 PuTTY 或者 VSCode 的 Serial Monitor 插件。配置如下# 串口参数 波特率: 115200 数据位: 8 停止位: 1 校验位: None 流控: None复位板子你应该能看到hello_world工程的输出。如果是标准的 hello_world 示例串口会打印类似Hello World如果串口没有任何输出先检查三件事一是烧录是否真的成功K-Flash 有没有报错二是串口线是不是接在了正确的 UART 上K210 的 UART0 通常是调试口三是波特率是否匹配。K210 的 UARTHSUART0支持高达 5Mbps但实际用 115200 最稳。如果你想验证更复杂一点的功能比如 GPIO 翻转可以在src/hello_world/main.c里加一段#include stdio.h #include fpioa.h #include gpiohs.h #include sleep.h int main(void) { fpioa_set_function(12, FUNC_GPIOHS0); gpiohs_set_drive_mode(0, GPIO_DM_OUTPUT); while (1) { gpiohs_set_pin(0, GPIO_PV_HIGH); msleep(500); gpiohs_set_pin(0, GPIO_PV_LOW); msleep(500); printf(toggle\n); } return 0; }重新编译烧录后串口会每 500ms 打印一次toggle同时用万用表量 IO12 能看到电平翻转。这就说明整个链路——从 CMake 配置到工具链编译再到烧录运行——全部打通了。5. 本篇常见错排查401、local proxy failed、reading choices 与 OAuth这一节把开发过程中最容易撞到的报错列出来对照着查。报错一401 Unauthorized。这个通常出现在你调用模型 API 的时候不是 K210 编译的问题。原因一般是 Key 没填对或者 Base URL 写错了。检查你的配置里 Base URL 是不是https://taotoken.net/apiKey 是不是从https://taotoken.net/api-keys里复制的那串。如果用的是 Claude Code确认ANTHROPIC_BASE_URL和ANTHROPIC_API_KEY两个环境变量都设了。报错二local proxy failed。这个报错说明你的工具在尝试走本地代理但连不上。检查你的网络配置确认没有多余的代理设置干扰。如果你在 Cline 或类似工具里配了自定义 endpoint把 Base URL 直接写成https://taotoken.net/api不要加额外的路径后缀。报错三reading choices 相关错误。这个一般出现在调用对话模型时返回体里没有choices字段。原因可能是 Model ID 填错了或者请求格式不对。确认你填的 Model ID 是服务端支持的模型名请求体是标准的 OpenAI 兼容格式。如果你不确定 Model ID去https://taotoken.net/doc查一下可用模型列表。报错四OAuth 相关错误。如果你用的是 Codex 或者 Claude Code 这类需要认证的工具OAuth 失败通常是 token 过期或者回调地址不对。重新走一遍认证流程确认auth.json里的配置和实际一致。Codex 的auth.json里需要填 Base URL、Key 和 Model ID 三件套缺一个都会认证失败。报错五CMake 报PROJ not set。这个不是 API 的问题是 K210 工程配置的问题。检查 SDK 根目录CMakeLists.txt里的set(PROJ xxx)是否和src下的目录名一致。如果你用命令行传了-DPROJhello_world确认拼写和大小写都对。报错六编译时报riscv64-unknown-elf-gcc: command not found。工具链没配进 PATH。重新检查环境变量或者在 CMake 命令里显式指定-DCMAKE_C_COMPILERD:/k210/kendryte-toolchain/bin/riscv64-unknown-elf-gcc.exe。报错七烧录时 K-Flash 卡住或报错。先降波特率到 115200 试试再检查 COM 口是否被其他串口工具占用。烧录前把串口终端关掉否则会冲突。6. 语义一致 CTA把环境搭好之后继续往下走环境搭通只是起点。K210 真正有意思的是 KPU 跑模型、APU 做声源定向、FPIOA 灵活映射外设这些能力。你接下来大概率要做的是找一个现成的 kmodel写一段 KPU 初始化代码把摄像头画面喂进去做实时检测。这个过程里你会需要查文档、生成代码、排查报错TaoToken 的模型对话入口可以帮你省不少时间https://taotoken.net/api。如果你已经在用 Claude Code 做嵌入式开发把 Base URL 配成https://taotoken.net/apiKey 从控制台拿Model ID 选一个适合代码生成的三件套配好就能在终端里直接问 K210 的寄存器怎么配。接入文档在https://taotoken.net/docAPI Keys 在https://taotoken.net/api-keys。长期做编码和 Agent 任务的看 Coding Planhttps://taotoken.net/coding-plan。最后给一个实用建议K210 的 SDK 里src目录下有很多官方示例比如face_detect、nn_case、i2s_loopback你不需要从零写。先把hello_world跑通然后直接把PROJ改成face_detect重新编译烧录看串口输出。这样比从头读数据手册快得多。工具链和 CMake 配置一旦跑通后面换工程只是改一个变量的事。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进