首页/新闻资讯/正文详情

RK3588 SDK编译实战:从交叉编译到NPU部署YOLOv8

发布时间:2026/11/3 18:14:54 来源:云帆数科 栏目:资讯中心
RK3588 SDK编译实战:从交叉编译到NPU部署YOLOv8
1. 从一块RK3588开发板说起为什么SDK编译是嵌入式AI开发的第一道坎拿到RK3588开发板的第一天大多数人会经历这样一个心理曲线兴奋地拆箱插上电源连上串口然后发现——除了一个能跑起来的出厂固件什么都动不了。想改个设备树得重新编译内核。想加个NPU的算子得重新编译整个SDK。想把自己的YOLOv8模型塞进去跑那更得从SDK编译开始一步步把整个工具链、运行时库、模型转换工具全部打通。这就是RK3588 SDK编译这件事的真实分量。它不是“跑个hello world”那种入门操作而是ARM嵌入式AI开发的分水岭——编译通了后面模型部署、NPU加速、MIPI屏幕适配、外设驱动开发才有地基编译不通后面全是空中楼阁。我见过太多人卡在这一步。有人卡在交叉编译工具链的版本匹配上有人卡在repo sync的网络问题上有人卡在设备树和内核配置的依赖关系里还有人编译通过了但烧录后板子起不来回头查了三天才发现是分区表配错了。这些问题在官方文档里往往只有一句话带过但在实际操作中每一个都能耗掉你一整天。这篇内容面向的是所有准备在RK3588上做嵌入式AI开发的人——不管你是刚接触ARM开发的学生还是从x86转过来的后端工程师或者是做边缘计算网关的产品开发者。我会把SDK编译这件事从“为什么”到“怎么做”到“踩过的坑”全部拆开讲清楚让你拿到一块RK3588板子之后知道每一步在干什么、为什么要这么干、出了问题往哪个方向查。2. 先搞清楚你在编译什么RK3588 SDK的整体架构拆解2.1 SDK里到底有什么从Bootloader到根文件系统的全链路很多人拿到SDK压缩包之后看到一堆目录就懵了。u-boot、kernel、buildroot、debian、external、device、docs……这些目录之间是什么关系编译的时候谁先谁后为什么有时候只编译内核就行有时候必须全量编译RK3588的SDK本质上是一个完整的嵌入式Linux发行版构建系统。它包含了从芯片上电到系统跑起来的所有环节U-Boot负责最底层的硬件初始化加载内核。RK3588用的是U-Boot 2017.09版本瑞芯微在此基础上做了大量定制包括支持他们的启动流程、烧录协议、安全启动等。KernelLinux 5.10内核不同SDK版本可能略有差异包含了RK3588的所有驱动——GPU、NPU、VPU、MIPI DSI/CSI、PCIe、USB、以太网等等。Rootfs根文件系统可以选择Buildroot轻量适合嵌入式产品或者Debian完整适合需要apt包管理的场景。Buildroot构建出来的镜像小启动快但软件包少Debian镜像大但开发方便。External各种外部库和工具包括RKNN-Toolkit2NPU模型转换和推理工具、mpp媒体处理平台、rga图形加速、gstreamer插件等。Device设备树和配置文件针对不同板型EVB、自定义板的硬件描述。Buildroot/Debian根文件系统的构建脚本和配置。编译流程上SDK提供了一个统一的构建脚本build.sh它封装了各个组件的编译命令。你可以选择全量编译./build.sh也可以单独编译某个模块./build.sh kernel、./build.sh u-boot等。理解这个分层结构之后你就能根据实际需求决定编译范围而不是每次都傻等全量编译跑完。2.2 为什么SDK编译这么容易出问题三个核心矛盾RK3588 SDK编译之所以让很多人头疼根本原因在于三个矛盾第一个矛盾是版本匹配。SDK里的U-Boot、Kernel、Buildroot、交叉编译工具链这四个东西的版本必须严格匹配。你用SDK自带的工具链编译内核没问题但如果你从网上下了一个更新的GCC想试试大概率会编译失败或者编译出来的内核跑不起来。瑞芯微的SDK是经过大量验证的工具链版本、内核配置、驱动代码之间形成了紧密的耦合关系随意替换任何一个环节都可能引入难以排查的问题。第二个矛盾是依赖关系。SDK编译不是简单的“make”就能搞定。Buildroot在构建根文件系统时会去下载大量的第三方源码包比如busybox、dropbear、alsa-lib等这些包的下载地址很多都在国外网络不稳定就会导致编译中断。而且Buildroot的依赖检查很严格某个包编译失败整个构建过程就会停在那里。第三个矛盾是硬件差异。RK3588的SDK默认配置是针对官方EVB开发板的。如果你用的是自定义板子设备树、引脚配置、电源管理、DDR参数都需要修改。这些修改如果不到位编译能过但烧录后板子起不来而且报错信息往往很模糊排查起来非常费劲。2.3 编译环境的硬性要求别在这上面省钱在开始编译之前先确认你的编译主机配置。RK3588的SDK全量编译对机器要求不低配置项最低要求推荐配置说明CPU4核8核以上全量编译涉及大量并行任务内存8GB16GB以上Buildroot构建时内存占用较高硬盘100GB200GB SSDSDK源码编译产物工具链系统Ubuntu 18.04Ubuntu 20.04官方验证过的版本网络能访问外网稳定外网国内镜像下载第三方源码包我实测下来用16GB内存的机器全量编译一次大约需要40分钟到1小时8GB内存的机器会频繁触发swap时间可能翻倍甚至编译失败。硬盘一定要用SSD机械硬盘在Buildroot构建阶段会成为严重瓶颈。注意不要在Windows的WSL里编译RK3588 SDK虽然理论上可行但USB设备透传、串口访问、烧录工具兼容性都会出问题。老老实实装一个Ubuntu物理机或者用VMware虚拟机记得开USB直通。3. 交叉编译工具链ARM嵌入式开发的第一把钥匙3.1 为什么需要交叉编译ARM和x86的本质差异这个问题看起来基础但我发现很多从Python或Web转过来的人确实没想明白。你的编译主机是x86架构的而RK3588是ARM架构的。x86的CPU只能执行x86指令ARM的CPU只能执行ARM指令。你在x86机器上直接用gcc编译出来的程序放到RK3588上根本跑不起来因为指令集不兼容。交叉编译就是解决这个问题的在x86机器上运行一个特殊的编译器这个编译器本身是x86程序但它生成的代码是ARM指令。这样你就能在性能强劲的x86工作站上编译出能在RK3588上运行的程序。RK3588的SDK自带交叉编译工具链通常放在prebuilts/gcc/linux-x86/aarch64/目录下。这个工具链是Linaro GCC版本一般是10.3或11.3取决于SDK版本。你不需要自己去下载ARM Compiler 5或者其他工具链SDK里自带的经过瑞芯微验证兼容性最好。3.2 工具链的组成和验证方法一个完整的交叉编译工具链包含以下组件aarch64-none-linux-gnu-gccC编译器aarch64-none-linux-gnu-gC编译器aarch64-none-linux-gnu-ld链接器aarch64-none-linux-gnu-as汇编器aarch64-none-linux-gnu-objdump反汇编工具aarch64-none-linux-gnu-strip符号剥离工具sysroot目标系统的头文件和库文件验证工具链是否正常工作可以写一个最简单的C程序测试// test.c #include stdio.h int main() { printf(Hello from ARM64\n); return 0; }然后用工具链编译aarch64-none-linux-gnu-gcc -o test test.c file test如果输出显示ELF 64-bit LSB executable, ARM aarch64说明工具链工作正常。你可以把这个test文件拷贝到RK3588板子上运行应该能正常输出。3.3 工具链使用的常见坑坑一PATH设置错误。很多人把工具链路径加到PATH里之后系统里原有的x86 gcc被覆盖了导致编译主机上的其他程序出问题。正确的做法是在当前终端会话中临时设置PATH或者用绝对路径调用工具链。坑二sysroot路径不对。交叉编译时编译器需要知道目标系统的头文件和库在哪里。如果sysroot设置错误会出现“找不到头文件”或“链接库版本不匹配”的问题。SDK的构建脚本会自动设置这些环境变量但如果你手动编译某个模块需要自己指定--sysroot参数。坑三静态库和动态库混用。交叉编译时链接的库必须是ARM版本的。如果你不小心链接了x86版本的库编译能过但运行时会报“无法执行二进制文件”或“格式错误”。用file命令检查每个库的架构确保都是ARM aarch64。实操心得我习惯在编译前先执行source envsetup.shSDK里通常有这个脚本它会自动设置好工具链路径、sysroot、编译选项等环境变量。这样就不用手动配置了也避免了环境变量污染的问题。4. SDK编译全流程实操从零到烧录镜像4.1 源码获取与目录结构梳理RK3588的SDK源码通常通过repo工具管理包含多个git仓库。如果你从官方渠道拿到了SDK压缩包解压后应该能看到以下目录结构rk3588_sdk/ ├── build.sh # 顶层构建脚本 ├── envsetup.sh # 环境设置脚本 ├── u-boot/ # U-Boot源码 ├── kernel/ # 内核源码 ├── buildroot/ # Buildroot构建系统 ├── debian/ # Debian根文件系统 ├── external/ # 外部库和工具 │ ├── rknn-toolkit2/ │ ├── mpp/ │ ├── rga/ │ └── ... ├── device/ # 设备树和板级配置 │ └── rockchip/ │ └── rk3588/ ├── prebuilts/ # 预编译工具链 └── docs/ # 文档第一次编译之前先执行source envsetup.sh然后运行./build.sh lunch选择目标板型。这个命令会列出所有支持的板型配置比如rk3588-evb1-lp4-v10、rk3588s-evb1-lp4x-v10等。选择与你手头板子匹配的配置后续编译会基于这个选择生成对应的设备树和配置文件。4.2 全量编译一条命令背后的完整流程全量编译的命令很简单./build.sh但这条命令背后做的事情非常多。它会依次执行以下步骤检查编译环境确认工具链、依赖包、磁盘空间等是否满足要求。编译U-Boot生成uboot.img和loader。编译Kernel生成boot.img包含内核和设备树。编译Rootfs根据选择的根文件系统类型构建Buildroot或Debian镜像。打包固件把所有镜像打包成update.img用于烧录。整个过程如果顺利大约40分钟到1小时。如果中途某个包下载失败编译会中断你需要根据报错信息手动下载对应的源码包放到buildroot/dl/目录下然后重新编译。4.3 分模块编译提高效率的关键全量编译虽然省心但每次改一行代码就全量编译一次时间成本太高。实际开发中更常用的是分模块编译# 只编译U-Boot ./build.sh uboot # 只编译内核 ./build.sh kernel # 只编译根文件系统 ./build.sh buildroot # 或 ./build.sh debian # 只编译RKNN工具 ./build.sh external/rknn-toolkit2分模块编译的前提是你已经做过一次全量编译各个模块的依赖关系已经建立好了。如果你只改了内核的设备树文件只需要./build.sh kernel几分钟就能出新的boot.img。4.4 设备树修改让SDK适配你的板子设备树是ARM Linux里描述硬件配置的文件。RK3588的SDK里设备树文件放在kernel/arch/arm64/boot/dts/rockchip/目录下。官方EVB的设备树是rk3588-evb1-lp4-v10.dts你的自定义板子需要基于这个文件修改。常见的修改包括引脚配置修改GPIO的复用功能、上下拉、驱动能力。电源管理配置PMIC电源管理芯片的输出电压和上电时序。DDR参数如果换了DDR颗粒需要修改DDR初始化参数。外设使能打开或关闭某个外设比如MIPI DSI、PCIe、USB3.0。修改完设备树之后重新编译内核./build.sh kernel生成的boot.img会包含新的设备树。烧录后如果板子起不来可以通过串口查看U-Boot和内核的启动日志定位问题。注意修改设备树时不要直接改官方EVB的文件而是新建一个自己的dts文件然后在Makefile里添加对应的编译目标。这样SDK升级时不会覆盖你的修改。4.5 烧录镜像从编译产物到板子跑起来编译完成后镜像文件在rockdev/目录下主要包括uboot.imgU-Boot镜像boot.img内核设备树rootfs.img根文件系统update.img全量升级包烧录工具有两种Windows下的RKDevTool和Linux下的upgrade_tool。我习惯用Linux下的upgrade_tool因为编译和烧录在同一台机器上不用来回拷贝文件。烧录步骤板子进入Maskrom模式按住Recovery键再上电或者短接Maskrom测试点。连接USB Type-C线到编译主机。执行upgrade_tool uf update.img烧录全量包或者upgrade_tool di -b boot.img单独烧录内核。烧录完成后板子自动重启。如果一切正常串口会输出内核启动日志最后进入登录界面。5. NPU开发环境搭建从SDK编译到YOLOv8部署5.1 RKNN-Toolkit2的编译与安装RK3588的NPU是它最大的卖点之一6TOPS的算力在边缘计算场景里非常能打。但要跑NPU推理需要RKNN-Toolkit2这个工具链。它包含两部分PC端工具运行在x86主机上负责把ONNX、TensorFlow、PyTorch等模型转换成RKNN格式。板端运行时运行在RK3588上负责加载RKNN模型并执行推理。PC端工具通过pip安装pip install rknn-toolkit2板端运行时库在SDK的external/rknn-toolkit2/rknpu2/目录下编译SDK时会自动编译出librknnrt.so。你需要把这个库拷贝到板子的/usr/lib/目录下。5.2 YOLOv8模型转换与部署流程YOLOv8是目前最流行的目标检测模型之一在RK3588上部署YOLOv8的流程如下导出ONNX模型在PC上用Ultralytics的YOLOv8导出ONNX格式。ONNX转RKNN用RKNN-Toolkit2把ONNX转换成RKNN格式这个过程会做量化通常是INT8量化和算子融合。板端推理在RK3588上加载RKNN模型用librknnrt.so执行推理。模型转换的Python脚本大致如下from rknn.api import RKNN rknn RKNN() rknn.config(mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrk3588) rknn.load_onnx(modelyolov8n.onnx) rknn.build(do_quantizationTrue, dataset./dataset.txt) rknn.export_rknn(yolov8n.rknn)量化时需要提供一个校准数据集dataset.txt里列出图片路径通常用几十张代表性图片就够了。量化后的模型精度会有一定下降但推理速度会大幅提升。5.3 NPU推理性能调优的实操经验在实际项目中NPU推理性能受多个因素影响模型量化方式INT8量化比FP16快很多但精度损失也更大。如果精度要求高可以尝试混合量化。输入分辨率YOLOv8默认输入是640x640降低到320x320可以显著提升帧率但小目标检测效果会下降。多核NPU调度RK3588有3个NPU核心可以通过RKNN的API设置使用哪些核心。对于单个模型通常用单核就够了如果要同时跑多个模型可以分配到不同核心。内存带宽NPU推理需要频繁访问DDR如果系统内存带宽被其他任务占用推理速度会下降。建议把NPU任务和其他高带宽任务比如视频编码错开执行。我实测下来YOLOv8n在RK3588上INT8量化后单核推理640x640输入大约需要20-25ms三核并行可以降到10ms左右。这个性能对于大多数边缘视觉场景已经够用了。6. 常见问题与排查技巧实录6.1 编译阶段常见错误速查表错误现象可能原因解决方法repo sync卡住或失败网络问题配置国内镜像源或手动下载缺失的仓库Buildroot下载包失败国外源不稳定手动下载放到buildroot/dl/目录编译报错“找不到头文件”sysroot路径错误执行source envsetup.sh重新设置环境链接报错“undefined reference”库版本不匹配确认链接的是ARM版本的库编译通过但烧录后板子起不来设备树配置错误通过串口查看启动日志定位出错节点NPU推理报错“模型加载失败”RKNN模型版本不匹配确认PC端工具和板端运行时版本一致6.2 串口调试嵌入式开发的生命线RK3588的串口是排查问题的第一手段。板子上的调试串口通常是UART2波特率1500000。你需要一个USB转TTL模块连接到板子的TX、RX、GND三个引脚。串口终端推荐用minicom或picocompicocom -b 1500000 /dev/ttyUSB0启动日志会显示U-Boot版本、DDR初始化信息、内核加载地址、设备树解析结果等。如果板子起不来日志通常会停在某个阶段根据最后几行输出就能大致判断问题所在。6.3 我踩过的三个典型坑坑一DDR参数不匹配导致随机死机。有一次我用自定义板子DDR颗粒和EVB不同但忘了改DDR初始化参数。板子能启动但跑一段时间就随机死机。后来用瑞芯微提供的DDR测试工具重新生成了参数问题才解决。这个坑的教训是换DDR颗粒一定要重新生成DDR参数不要心存侥幸。坑二Buildroot的overlay目录被覆盖。我在Buildroot的overlay目录里放了一些自定义配置文件结果每次全量编译都被覆盖。后来发现是build.sh在编译前会清理overlay目录。解决方法是在device/rockchip/rk3588/目录下创建自己的配置文件而不是直接改Buildroot的overlay。坑三NPU推理结果和PC端不一致。模型在PC上跑得好好的转到RK3588上结果就偏了。排查后发现是量化时的校准数据集不够代表性导致某些层的量化参数偏差较大。后来增加了校准图片的数量和多样性问题解决。这个坑的教训是量化校准数据集要尽可能覆盖实际场景的各种情况。6.4 性能优化的小技巧编译加速用ccache缓存编译结果第二次编译时速度能提升50%以上。在build.sh里加上export CCACHE_DIR~/.ccache即可。镜像瘦身如果不需要Debian的完整包管理用Buildroot构建的镜像可以小到几十MB启动时间也能缩短到几秒。内核裁剪通过make menuconfig去掉不需要的驱动和功能可以减小内核体积加快启动速度。NPU频率调节RK3588的NPU频率可以通过sysfs调节在性能要求高的场景下可以锁定最高频率。7. 从SDK编译到产品落地一些个人体会RK3588的SDK编译这件事说难不难说简单也不简单。它不像写Python脚本那样改一行跑一行而是涉及多个组件的协同工作。我的体会是不要试图跳过任何一个环节去“抄近路”。该全量编译就全量编译该看文档就看文档该用串口调试就用串口调试。每一步都走扎实了后面做NPU部署、做产品开发才会顺利。另外SDK的版本管理很重要。每次修改设备树或内核配置之前先用git提交一次这样出了问题可以快速回滚。我见过有人改了一堆配置之后编译不过又不知道改了哪里最后只能重新解压SDK从头来。这种时间浪费完全可以避免。最后分享一个小技巧如果你只是做应用层开发不需要改内核和设备树那其实可以跳过SDK编译直接用官方发布的固件然后在板子上通过apt或pip安装你需要的库。只有当你要改硬件配置、加驱动、或者深度优化NPU性能时才需要从头编译SDK。分清自己的需求能省下大量时间。

相关推荐

STM32智能门禁实战:指纹识别、密码验证与蓝牙通信全链路拆解
STM32智能门禁实战:指纹识别、密码验证与蓝牙通信全链路拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 18:14:54

STM32+数字隔离器实现SPI隔离的完整设计实战
STM32+数字隔离器实现SPI隔离的完整设计实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 18:14:54

工业级隔离SPI通信实战:MAX14431BAEE+与STM32F401RB全链路设计指南
工业级隔离SPI通信实战:MAX14431BAEE+与STM32F401RB全链路设计指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 18:14:54

分布式文件系统核心架构与优化实践
分布式文件系统核心架构与优化实践

1. 分布式文件系统概述分布式文件系统(Distributed File System, DFS)是现代计算架构中不可或缺的基础设施组件。它通过将文件存储和管理功能分布在多个服务器节点上,实现了数据的高可用性、可扩展性和容错能力。与传统的本地文件系统相比&am… · 2026/11/3 21:48:51

高性能压缩库技术选型与优化实践指南
高性能压缩库技术选型与优化实践指南

1. 高性能压缩库的核心价值与应用场景在数据爆炸式增长的时代,高性能压缩库已经成为现代计算架构中不可或缺的基础组件。我曾在多个分布式存储项目中亲历这样的场景:当原始数据量达到PB级别时,未经压缩的传输和存储成本会呈指数级上升。这时一… · 2026/11/3 21:48:51

从零构建可审计的AI工程流水线
从零构建可审计的AI工程流水线

1. 项目概述:这不是“从零开始学AI”,而是亲手锻造AI工程流水线“ai-engineering-from-scratch”这个标题,乍看像极了某门MOOC课程的副标题,但如果你真把它当成“手把手教写神经网络”的入门课,那第一行代码还没敲&… · 2026/11/3 21:48:51

HarmonyOS RcText组件优化:多语言渲染与性能提升
HarmonyOS RcText组件优化:多语言渲染与性能提升

1. 项目背景与组件定位在HarmonyOS 6的UI框架升级中,RcText作为文本渲染的核心组件经历了重大重构。这个历时半年的改造项目源于我们在实际开发中遇到的三大痛点:多语言混合排版时的基线对齐问题、富文本动态更新时的性能瓶颈,以及特殊字符渲… · 2026/11/3 21:48:51

Buzz技术概念解析:从声学噪声到数字传播热词
Buzz技术概念解析:从声学噪声到数字传播热词

我无法根据当前输入生成符合要求的博文。原因在于:您提供的输入内容中,项目标题仅为“buzz”,且后续所有字段(项目正文、关键词、摘要描述)均为空或未提供有效信息。根据我的角色设定与创作原则,博文必须严… · 2026/11/3 21:48:51

Hadoop参数传递实战:Configuration对象与分布式缓存详解
Hadoop参数传递实战:Configuration对象与分布式缓存详解

1. Hadoop参数传递概述在Hadoop生态系统中,参数传递是开发过程中最基础也最关键的环节之一。作为一名长期使用Hadoop进行大数据处理的开发者,我深刻体会到参数传递方式的选择直接影响着作业的灵活性、可维护性和执行效率。Hadoop参数传递的本质是将配置信… · 2026/11/3 21:47:50

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码