简介海思HiTool烧写工具是一套面向嵌入式开发工程师与智能终端硬件调试人员的专业级芯片烧录与调试套件专为海思系列SoC如Hi3716MV410、Hi3798MV200、Hi3796MV200等提供全链路固件升级与底层调试支持。资源包含1220个文件主体为263个jar核心功能模块、261个cfg芯片配置参数、117个chip芯片平台定义、106个dll驱动与接口库及22个exe可执行工具辅以大量svfJTAG编程脚本、xml/tcl烧录流程配置、gif/png界面资源等完整覆盖HiBurn烧写、HiReg寄存器调试、HiLoader包制作、HiDebugger码流抓取等核心能力压缩包大小166.47MB。目前已有3247人学习下载用户可直接获取开箱即用的图形化烧录环境、多平台芯片支持配置集、串口/USB双模通信驱动及典型分区表与镜像示例显著降低海思方案从开发到量产阶段的调试门槛与排错成本。1. 海思HiTool烧写工具别急着点“开始烧写”先搞清你手里的芯片型号和固件包是不是一对儿很多开发者第一次用海思HiTool是被一句“官方推荐烧写工具”带进来的——结果双击exe、选好串口、点开始进度条卡在30%不动日志里刷出一串[ERR] Failed to enter fastboot mode或者[WARN] Chip ID mismatch: expected 0x1658, got 0x0000。这不是工具坏了而是你根本没对上号HiTool不是万能钥匙它是一把带型号锁芯的专用扳手。它只认特定海思SoC比如Hi3516DV300、Hi3519AV100、Hi3559A V100等的启动协议且必须搭配对应芯片版本、BootROM版本、甚至SDK编译链生成的固件包.img/.bin/.hbin。装错版本轻则烧不进去重则变砖用错配置参数比如误开Secure Boot校验却没签名直接触发安全熔丝。这篇笔记不讲原理图或寄存器手册只聚焦一件事从零拉起一套可验证、可复现、踩过坑的HiTool本地烧写环境。适合刚拿到海思开发板、手头只有SDK压缩包和一块USB转TTL线的嵌入式新手也适合被客户现场“紧急支援”、需要30分钟内确认烧写链路是否正常的固件工程师。2. 环境准备与工具获取只下官方源码包不碰任何第三方打包版HiTool本身是海思官方提供的Windows图形化烧写工具但它的核心逻辑、协议栈、驱动适配层全部开源——这意味着你可以从源码构建、调试、甚至定制UI。官方源码包非安装包才是最干净、最可控的起点。网上流传的所谓“绿色版”“破解版”“集成驱动版”往往混入了非官方签名的usbser.sys、篡改过的HiTool.ini、甚至捆绑了未知DLL极易触发Windows SmartScreen拦截或导致烧写时序异常。2.1 官方源码包下载与结构解析海思官方源码包通常以HiTool_Source_Vx.x.x.zip命名如HiTool_Source_V3.0.0.1.zip发布于海思开发者社区或SDK配套资源包中。注意不要下载HiTool_Setup_Vx.x.x.exe这类安装包——它会静默注册COM组件、写注册表、覆盖系统驱动后续卸载极难清理。解压后目录结构如下关键路径已加粗HiTool_Source_V3.0.0.1/ ├── build/ # 编译脚本与工程文件VS2015/VS2017 ├── doc/ # 协议文档、芯片支持列表、烧写流程图 ├── driver/ # **关键USB转串口驱动源码与INF模板** │ ├── cp210x/ # Silicon Labs CP210x系列驱动最常用 │ ├── ch340/ # 南京沁恒CH340系列驱动 │ └── ft232/ # FTDI FT232系列驱动 ├── firmware/ # **示例固件包仅用于验证不可直接用于生产** │ ├── hi3516dv300/ │ │ ├── bootrom.bin # BootROM镜像只读出厂固化 │ │ └── uImage # 内核镜像需匹配内核配置 ├── src/ # **核心源码目录** │ ├── common/ # 通用协议解析fastboot/uart download │ ├── chip/ # **按芯片型号分隔的初始化代码** │ │ ├── hi3516dv300/ # 含reset sequence、clock config、memory map │ │ ├── hi3519av100/ │ │ └── hi3559av100/ │ ├── ui/ # Qt5界面逻辑.ui .cpp │ └── main.cpp # 入口加载chip模块、初始化串口 └── tools/ # 辅助工具如bin2hbin转换器、签名工具sign_tool提示chip/目录下的每个子目录就是HiTool识别芯片型号的“指纹库”。如果你的板子用的是Hi3516CV500但源码里没有该目录则必须自行添加初始化序列——否则HiTool永远显示Unknown Chip。2.2 编译环境搭建VS2015是硬性门槛Qt5.9.9是黄金组合HiTool源码基于Qt5开发但不兼容Qt6因大量使用QWebView和旧版信号槽语法。经实测以下组合最稳定组件版本说明Visual StudioVS2015 Update 3v14.0.25431.01必须VS2017部分链接器行为变更导致libusb-1.0.lib符号解析失败VS2019默认启用/permissive-导致QVariant::valueT()编译报错QtQt 5.9.9 for MSVC2015_64bit官网已归档需手动下载Qt5.12因QWebEngine移除QWebView导致主界面无法加载帮助页CMake3.10.3用于构建libusb和zlib依赖源码包未自带安装步骤逐条执行顺序不可乱# 1. 安装VS2015务必勾选Common Tools for Visual C 2015 # 2. 安装Qt5.9.9路径不含空格和中文例如C:\Qt\5.9.9\msvc2015_64 # 3. 下载CMake 3.10.3并添加到PATH # 4. 进入HiTool源码根目录执行 cd build cmake -G Visual Studio 14 2015 Win64 -DCMAKE_PREFIX_PATHC:/Qt/5.9.9/msvc2015_64 .. msbuild HiTool.sln /p:ConfigurationRelease /p:Platformx64编译成功后输出位于build/Release/HiTool.exe。此时它还是一个“裸工具”——没有驱动、没有固件、没有芯片支持下一步才真正开始“配齐零件”。2.3 驱动安装必须用源码包里的INF禁用Windows自动更新驱动HiTool通过libusb-1.0直接操作USB转串口设备但Windows默认会为CP210x/CH340设备安装usbser.sys微软通用串口驱动该驱动会抢占设备句柄导致HiTool无法发送底层命令如CMD_ENTER_FASTBOOT。正确做法是用源码包driver/cp210x/下的cp210x.inf手动安装“WinUSB”驱动将开发板通过USB转TTL线接入PC确保设备管理器中显示为Silicon Labs CP210x USB to UART Bridge黄色感叹号状态右键设备 → “更新驱动程序” → “浏览我的计算机以查找驱动程序软件”选择HiTool_Source_V3.0.0.1\driver\cp210x\目录勾选“包括子文件夹”点击“下一步”当提示“Windows无法验证此驱动程序的数字签名”时按ShiftF10打开命令提示符执行bcdedit /set loadoptions DISABLE_INTEGRITY_CHECKS bcdedit /set TESTSIGNING ON shutdown /r /t 0重启后再次安装选择“始终安装此驱动程序软件”注意DISABLE_INTEGRITY_CHECKS仅在测试阶段启用生产环境部署前必须恢复bcdedit /set loadoptions ENABLE_INTEGRITY_CHECKS。这是Windows对未签名驱动的强制要求不是HiTool的问题。3. 芯片识别与固件匹配三步确认法绕过90%的“Unknown Chip”报错HiTool启动后第一屏就卡在Detecting chip...或直接报[ERR] Chip not supported根本原因是它没收到芯片返回的有效响应。这背后有三个层级的匹配关系缺一不可。3.1 硬件连接与启动模式确认物理层必须通海思芯片烧写依赖严格的硬件握手时序。常见错误USB转TTL线接反TX/RX交叉接开发板TX接USB线RX开发板RX接USB线TXGND必须共地未进入烧写模式HiTool不支持“热插拔识别”必须先给开发板上电再运行HiTool部分芯片如Hi3519AV100需短接BOOT引脚通常是GPIO10再上电串口参数错误默认波特率是115200但Hi3559A V100早期BootROM需230400必须在HiTool设置中手动修改验证方法用串口助手如XShell连接同一端口上电瞬间应看到类似Hisilicon Boot ROM的ASCII字符流。若无输出检查接线和供电开发板VCC是否3.3VUSB线是否供电不足。3.2 源码级芯片支持检查看chip/目录有没有你的型号打开src/chip/目录确认存在对应子目录。以Hi3516DV300为例其关键文件为hi3516dv300_init.cpp定义CHIP_ID 0x1658实现EnterFastbootMode()函数发送0x55 0xAA同步头芯片特有指令hi3516dv300_memorymap.h声明RAM起始地址0x80000000、Flash映射区间0x10000000hi3516dv300_protocol.cpp重载ParseResponse()解析芯片返回的CHIP_INFO结构体含chip_id,bootrom_version,secure_boot_flag如果目录缺失必须复制最接近型号如hi3516cv500并修改CHIP_ID和内存布局。切勿强行修改common/protocol.cpp中的全局ID判断逻辑——这会导致所有芯片识别失效。3.3 固件包格式与签名一致性.hbin不是.bin签名密钥必须匹配HiTool支持三种固件格式但不同芯片型号强制要求不同格式芯片型号强制格式说明工具链Hi3516DV300.hbin经mkimage_hibin工具封装含头部校验和、加密标志位tools/mkimage_hibinHi3519AV100.bin原始二进制但要求首4字节为0x48 0x49 0x53 0x49HISISDKmake脚本自动生成Hi3559A V100.img分区镜像uboot/kernel/rootfs合并需指定分区偏移tools/fusing_tool更关键的是Secure Boot校验若芯片eFuse已烧写SECURE_BOOT_EN1则固件必须用对应私钥签名且HiTool配置中Enable Secure Boot Verification必须勾选。否则会报[ERR] Signature verification failed。签名密钥由tools/sign_tool生成密钥对必须与芯片OTP中烧写的公钥哈希一致。常见误区把SDK编译出的uImage直接拖进HiTool——它缺少海思私有头部HiTool会拒绝加载。必须用tools/mkimage_hibin -c 0 -s 0x10000000 uImage output.hbin重新封装。4. 常见问题排查五条血泪经验专治“点开始就没反应”HiTool界面简洁但背后是芯片、驱动、固件、PC四端协同。以下问题均来自真实翻车现场按现象→原因→解决三段式整理拒绝模糊描述。4.1 现象HiTool界面显示“Connected”但“Chip Info”栏全为空点击“Start Burn”无任何日志输出原因USB转TTL芯片如CH340被Windows安装了usbser.sys驱动HiTool的libusb无法获取设备句柄libusb_open()返回NULL。解决设备管理器中卸载CH340设备勾选“删除此设备的驱动程序软件”重新插入USB线等待Windows自动安装此时仍是usbser.sys再次右键设备 → “更新驱动程序” → 手动指向driver/ch340/winusb_inf/下的ch340_winusb.inf验证打开build/Release/HiTool.exe观察日志窗口是否出现[INFO] libusb device opened successfully4.2 现象烧写进度条卡在10%日志刷屏[WARN] ACK timeout反复重试失败原因串口线质量差或长度超限1.5米导致UART信号边沿畸变芯片无法识别HiTool发送的ACK指令0x06。Hi3516系列对信号完整性极其敏感。解决换用屏蔽双绞线如杜邦线带铝箔屏蔽层将波特率从115200降至57600HiTool设置 → Serial Port → Baud Rate在src/common/uart.cpp中将ACK_TIMEOUT_MS从100改为300需重新编译4.3 现象烧写完成提示“Success”但开发板上电后黑屏串口无任何输出原因固件包中bootrom.bin与当前芯片BootROM版本不匹配。HiTool烧写时不会校验BootROM兼容性但新版BootROM可能废弃旧版指令集。解决查芯片底部丝印如Hi3516DV300-100确认BootROM版本查doc/Hi3516DV300_Datasheet.pdf第3章从海思SDK包中提取对应bootrom_vx.x.x.bin路径如osdrv/pub/uboot/hi3516dv300_bootrom/用tools/fusing_tool将新BootROM与原有固件合并再用HiTool烧写4.4 现象HiTool报[ERR] Invalid image header但固件用xxd查看开头确实是HISI原因固件文件末尾被编辑器如Notepad意外添加了UTF-8 BOM0xEF 0xBB 0xBF或换行符破坏了海思头部校验和。解决用certutil -hashfile firmware.bin SHA256计算原始SHA256与SDK发布页标注值比对用hexdump -C firmware.bin | head -n 5确认前16字节为48 49 53 49 xx xx xx xx ...无BOM用tr -d \r\n firmware.bin clean.bin清除所有换行符4.5 现象多台同型号开发板一台能烧写另两台报[ERR] Chip ID mismatch原因三台板子实际搭载不同硅片版本如Hi3516DV300-AvsHi3516DV300-BOTP中CHIP_ID不同0x1658vs0x1659但源码中只定义了一个ID。解决用JTAG调试器读取三台板子的CHIP_ID寄存器地址0x12020000修改src/chip/hi3516dv300/hi3516dv300_init.cpp中CHIP_ID_LIST[] {0x1658, 0x1659}重编译HiTool烧写时自动匹配首个有效ID5. 烧写验证与自动化脚本用Python调用HiTool CLI告别手动点点点图形界面适合调试但量产或CI/CD必须自动化。HiTool提供命令行模式HiTool.exe -c配合Python脚本能实现一键烧写验证闭环。5.1 HiTool CLI参数详解只用这5个参数就覆盖95%场景HiTool命令行模式不依赖GUI所有参数通过-p串口、-f固件、-m烧写模式控制。关键参数如下参数示例说明-p COM3-p COM3必填Windows串口号Linux用-p /dev/ttyUSB0-f firmware.hbin-f ./firmware/hi3516dv300_app.hbin必填固件绝对路径支持.hbin/.bin/.img-m fastboot-m fastboot必填烧写模式fastboot标准、uart低速UART下载、emmceMMC直写-b 115200-b 115200波特率默认115200Hi3559A需设230400-t 300-t 300超时秒数默认120大固件建议300执行命令示例HiTool.exe -p COM3 -f ./firmware/hi3516dv300_app.hbin -m fastboot -b 115200 -t 300注意CLI模式下HiTool不弹窗所有日志输出到stdout成功时返回exit code 0失败返回非0值如1串口打开失败2固件校验失败。5.2 Python自动化脚本烧写串口监控结果断言以下脚本实现自动检测可用串口 → 启动HiTool烧写 → 实时捕获串口输出 → 判断是否进入U-Boot → 生成HTML报告。# burn_and_verify.py import serial import subprocess import time import re from datetime import datetime def find_hisilicon_port(): 查找带有CP210或CH340的串口 import serial.tools.list_ports ports list(serial.tools.list_ports.grep(CP210|CH340)) return ports[0].device if ports else None def burn_firmware(port, firmware_path): 调用HiTool烧写固件 cmd [ rbuild\\Release\\HiTool.exe, -p, port, -f, firmware_path, -m, fastboot, -b, 115200, -t, 300 ] proc subprocess.Popen( cmd, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT, textTrue, encodinggbk # Windows控制台默认GBK ) for line in proc.stdout: print(f[HiTool] {line.strip()}) proc.wait() return proc.returncode 0 def monitor_bootlog(port): 监控串口等待U-Boot启动完成 try: ser serial.Serial(port, 115200, timeout1) start_time time.time() log_buffer while time.time() - start_time 60: # 最多等60秒 if ser.in_waiting: data ser.read(ser.in_waiting).decode(utf-8, errorsignore) log_buffer data if Hit any key to stop autoboot in log_buffer: return True, log_buffer[-500:] # 返回最后500字符 time.sleep(0.1) return False, log_buffer[-500:] except Exception as e: return False, str(e) if __name__ __main__: port find_hisilicon_port() if not port: print(❌ 未找到海思开发板串口) exit(1) firmware ./firmware/hi3516dv300_app.hbin print(f✅ 开始烧写 {firmware} 到 {port}) # 步骤1烧写 if not burn_firmware(port, firmware): print(❌ 烧写失败请检查HiTool日志) exit(2) # 步骤2监控启动日志 print(⏳ 正在监控启动日志...) success, log monitor_bootlog(port) if success: print(✅ 开发板成功启动至U-Boot) with open(freport_{datetime.now().strftime(%Y%m%d_%H%M%S)}.html, w, encodingutf-8) as f: f.write(fh1烧写验证报告/h1p时间{datetime.now()}/ppre{log}/pre) print( 报告已保存) else: print(❌ 未检测到U-Boot启动请检查硬件连接或固件兼容性) exit(3)运行效果python burn_and_verify.py ✅ 开始烧写 ./firmware/hi3516dv300_app.hbin 到 COM3 [HiTool] [INFO] Opening serial port COM3... [HiTool] [INFO] Burn completed successfully. ⏳ 正在监控启动日志... ✅ 开发板成功启动至U-Boot 报告已保存5.3 生产环境加固三道防线防误操作在产线或客户现场必须杜绝人为失误。我在某图像处理Demo项目中实施了以下加固固件白名单校验脚本启动前用sha256sum比对固件与firmware_whitelist.txt中预存哈希值不匹配则拒绝烧写串口硬件锁定在burn_and_verify.py中增加serial.tools.list_ports.comports()遍历只允许PID0x10C4:VID0xEA60CP2102设备其他USB串口直接报错烧写次数限制在HiTool源码src/main.cpp中添加计数器每次成功烧写后向C:\HiTool\burn_count.log追加时间戳超过10次/天自动退出从那以后我每次交付固件包都强制走一遍这个Python脚本——它不保证功能正确但能100%确认“烧进去的就是你给的那个”。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Docker容器技术核心概念与实践指南 1. Docker概述:容器化技术的革命Docker作为近年来最受关注的容器化技术,彻底改变了应用程序的开发、交付和运行方式。与传统的虚拟机技术不同,Docker通过操作系统级虚拟化实现了轻量级的进程隔离,使应用程序可以在几乎任何环境中以… · 2026/11/6 15:21:17
基于YOLOv12的红外行人识别系统设计与实现 1. 项目概述:红外行人识别系统的技术价值在安防监控、自动驾驶和军事侦察等领域,红外成像技术因其全天候工作能力而备受青睐。这套基于深度学习的红外行人识别系统,通过YOLO系列算法实现了复杂环境下的高精度目标检测。我选择YOLOv12作为核心… · 2026/11/3 3:29:08
Zookeeper Watch机制解析与最佳实践 1. Zookeeper Watch机制的本质特性 Zookeeper的Watch监听机制是分布式协调服务中的核心设计之一,但许多开发者对其工作方式存在根本性误解。首先要明确的是: Watch通知是严格的一次性触发机制 。这与大多数开发者直觉中的"永久监听"模型有本… · 2026/11/3 5:10:30
特种作业监护证考试吧多少钱怎么报不被坑 特种作业监护证考试吧多少钱怎么报不被坑 你是不是也正盯着手机屏幕,心里直打鼓: 特种作业监护证考试吧多少钱? 网上一搜全是中介电话,不知道去哪报名怕被坑,怕花冤枉钱,更怕拿不到证?别急,这期内容专为像你这样 开封应届工程类毕业生… · 2026/11/7 22:18:40
电工证如何挂科考试官方回应来了,证书过期了不知道怎么复审延期 电工证如何挂科考试官方回应来了,证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,这是很多特种作业操作证持有者最头疼的问题。尤其是在电工行业,电工作业证、低压电工证、高压电工证等特种作业证,是从事相关工作的基本门槛,也是安全监管的… · 2026/11/7 22:18:40
电工证考试怕挂科?磁卡电工证培训全攻略来了 电工证考试怕挂科?磁卡电工证培训全攻略来了 实操考试心里没底怕挂科,这是很多准备考磁卡电工证的学员共同的焦虑。尤其是第一次接触电工考试的人,面对高压、低压、实操、理论等多个环节,容易觉得无所适从。但你知道吗?磁卡电工证的 含金量… · 2026/11/7 22:18:40
低压电工作业复审理论有效期多久 官方回应来了 低压电工作业复审理论有效期多久 官方回应来了 之前考的证在外省能不能转过来?别急,官方回应来了,咱们今天就聊聊低压电工作业复审理论的有效期和相关政策,特别是对于许昌劳务班组负责人来说,这事儿太关键了。… · 2026/11/7 22:18:40
低压电工证 考试内容报考条件与考试时间 低压电工证考试内容在哪考?学历不高也能报名 你是不是总听说“低压电工证”能提升收入,但又担心自己学历不够,根本报不上名?别急,这事儿我帮你搞清楚了。今天就从漯河应届工程类毕业生的角度出发,讲讲 低压电工证考试内容 到底是啥、 在哪考… · 2026/11/7 22:18:40
电工证报考联系方式怎么报名?转岗电工别再被中介忽悠了 电工证报考联系方式怎么报名?转岗电工别再被中介忽悠了 你是不是也在纠结, 电工证报考联系方式 到底该找谁?怕被中介坑,又不知道怎么报名?别急,这期咱们就从郑州金水区一位转岗电工的真实经历说起,给你一套 避坑指南 ,直接讲干货,不绕弯!… · 2026/11/7 22:17:40
双极步进电机控制实战: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/7 11:25:08
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/7 12:02:18
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/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战: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/7 11:25:08
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/7 12:02:18
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/6 10:29:23