RN8302B智能电表芯片驱动开发与校表实战解析
简介针对智能电表领域资料较少的RN8302B芯片这份程序资料包面向有一定嵌入式基础的开发者旨在帮助其理解芯片特性、通信接口、电源管理及误差校准等关键开发点。压缩包共9个文件、约3.01MB主要包含C语言源码.c/.h、RN8302B用户手册PDF、上电配置过程文档以及函数参考库和工程压缩包覆盖从硬件手册到实际代码的完整参考链。已有2204人学习下载适合作为RN8302B智能电表程序开发的入门与进阶参考。通过研读用户手册可掌握芯片内部ADC与温度检测机制结合源码与官方参考库能快速搭建计量流程上电配置文档则对关键寄存器初始化和误差校准给出具体指引有助于规避常见开发陷阱。1. 为什么 RN8302B 这颗计量芯片让表计开发省了一半事智能电表方案选型时RN8302B 是很多工程师绕不开的一颗国产计量芯片。它把电压电流采样、功率计算、电能累加这些原本要 MCU 花大量算力去做的活都包了MCU 只负责读寄存器、做校准和通讯。对做电力物联网、导轨表、插座计量模块的开发者来说这意味着不用再去折腾精密电阻网络和离散的乘法器电路直接 SPI 或 UART 接上就能拿到有功、无功、视在功率和电能值。它能精确到 0.1 级甚至更高的计量精度配合外围互感器和分压电阻就能搭出一套完整的计量端。本文要拆的这份 RN8302B 智能电表芯片程序是一份可以直接落地的驱动与计算框架覆盖了从初始化到校表再到电压电流有效值读取的完整链路适合正在选型或已经踩进 RN8302B 调试坑里的开发者。2. 芯片内部的计量链路读懂寄存器才能调对参数2.1 从 ADC 采样到电能累加数据是分几级走的RN8302B 内部结构可以理解为三级流水线。第一级是三路 Sigma-Delta ADC分别采样 A 相电流、B 相电流、C 相电流和电压通道第二级是数字滤波和功率计算单元它同时算出有功功率、无功功率、视在功率以及电压电流有效值第三级是电能累加器把功率对时间积分得到电能。开发者面对的程序本质上是在操作第三级的寄存器。打开芯片手册看寄存器映射表时我最先关注的是 0x01 到 0x0C 这一段它们存放的是 A/B/C 三相的有功功率、无功功率和视在功率的瞬时值。这些值是 32 位有符号数补码形式符号位在最高位。而有效值寄存器是 16 位的存放的是经过 RMS 计算后的电压电流有效值没有符号位。在驱动层面上读这些寄存器的时候要特别注意大小端问题。RN8302B 的 SPI 输出默认是大端模式即高字节在前。但有一些固件版本支持配置为小端。如果程序和芯片配置不一致读出来的数据会出现高 16 位和低 16 位互换的怪异现象——功率值看起来大得离谱。我的习惯是初始化时固定配置为默认的大端模式不去碰那个配置位省得给自己找麻烦。2.2 程序里必须处理的尺度换算关系RN8302B 的寄存器值不是直接可用的物理量需要按照量程和采样通道的参数做一次线性映射。程序里最核心的换算公式是两个有功功率换算公式P_real P_reg × (Vref / (K_voltage × K_current × 2^23))电压有效值换算公式V_rms V_rms_reg × (Vref / (K_voltage × 2^15))其中 Vref 是 ADC 参考电压典型值是 1.2VK_voltage 是电压通道的分压比由外部电阻网络决定K_current 是电流通道的采样系数由互感器变比和采样电阻决定。程序里如果把这三个参数做成可配置项校表的时候就能省大量时间。程序中还需要区分功率寄存器的位宽。RN8302B 的有功功率寄存器是 32 位但有效位实际只有 24 位低 8 位是精度扩展位。程序在读取的时候需要做一次右移 8 位的操作否则算出来的功率值会有 256 倍的误差。这是我最早调试时踩过的一个坑读出来的有功功率比实际大 256 倍折腾了半天才发现不是寄存器地址错而是位宽处理错了。3. SPI 读写驱动实现时序、命令字与多字节传输3.1 RN8302B 的命令帧格式与 SPI 时钟配置RN8302B 的 SPI 接口是典型的寄存器读写模型所有的操作都围绕命令字节展开。读操作命令字节格式如下Bit7 : 1 表示读操作0 表示写操作 Bit6:0 : 寄存器地址7位而写操作命令字节格式Bit7 : 0 Bit6 : 0 表示写操作保留 Bit5:0 : 寄存器地址6位写操作只支持部分寄存器这个差异是程序里最需要注意的读操作支持完整的 7 位地址空间写操作只支持低 6 位地址。换句话说有些寄存器是只读的你向它发起写命令不会报错但不会生效。程序初始化配置时必须确认目标寄存器是否能写否则配置写进去却不生效表现出来就是芯片计量结果完全不对。SPI 参数的配置上RN8302B 要求时钟极性 CPOL0时钟相位 CPHA1。这意味着 SPI 空闲时时钟线为低电平数据在时钟的第二个边沿采样。如果配成 CPOL0、CPHA0大概率会读回全零或者乱码。程序初始化时我把 SPI 频率设置在 1MHz 以内虽然芯片规格书上宣称可以跑到 2.5MHz但实际走线如果 PCB 布局不好2MHz 以上就容易出现偶发的读错误。3.2 初始化与连续读取的驱动代码以下是一个基础的 RN8302B 驱动初始化函数兼容 STM32 的 HAL 库写法void rn8302b_init(void) { // 配置 SPI 接口CPOL0, CPHA1, 主机模式, 1MHz hspi1.Init.Mode SPI_MODE_MASTER; hspi1.Init.CLKPolarity SPI_POLARITY_LOW; hspi1.Init.CLKPhase SPI_PHASE_2EDGE; hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_64; HAL_SPI_Init(hspi1); // 软件复位让芯片进入默认状态 rn8302b_write_reg(0x00, 0x80); HAL_Delay(50); // 配置计量模式三相四线有功电能累加模式 uint8_t cfg_data[2]; cfg_data[0] 0x00; // 模式配置寄存器高字节 cfg_data[1] 0x21; // 三相四线、电能正向累加 rn8302b_write_reg(0x01, (cfg_data[0] 8) | cfg_data[1]); // 启动连续转换模式 rn8302b_write_reg(0x02, 0x0010); }这段代码的关键点有两个。第一个是写寄存器函数 rn8302b_write_reg 内部要处理 16 位数据的拆分发送RN8302B 的寄存器大多是 16 位宽写入时需要先发命令字节再发高八位最后发低八位。第二个是 0x02 寄存器 bit4 置 1 表示开启连续转换如果不写这一步芯片会处于单次触发模式只有收到触发命令才做一次采样电能累加完全没法用。读取电能累加器数据的代码int32_t rn8302b_read_energy(int32_t reg_addr) { uint8_t cmd 0x80 | (reg_addr 0x7F); // 读命令7位地址 uint8_t rx_data[4]; int32_t raw_value; HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(hspi1, cmd, 1, 100); HAL_SPI_Receive(hspi1, rx_data, 4, 100); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // 大端模式拼接4字节 raw_value ((int32_t)rx_data[0] 24) | ((int32_t)rx_data[1] 16) | ((int32_t)rx_data[2] 8) | ((int32_t)rx_data[3]); return raw_value; }这个函数用的是四字节连续读。RN8302B 在 SPI 读模式下CS 拉低后持续给 SCK芯片会自动把寄存器地址递增连续吐出四个字节。这里有一个值得注意的细节数据是在发完命令字节之后的第一个 SCK 上升沿开始输出的所以主控要先发命令字节再空读四个字节。有些工程师在调试时会先发命令然后立刻开始收数据但实际上在发命令的同一帧里芯片已经在 MISO 上输出数据了如果放在一个 TransmitReceive 的函数里做读取的时序就更紧凑。4. 校表参数整定把寄存器值变成真实物理量4.1 校表系数的理论公式与限定条件校表是整个 RN8302B 开发里最容易被低估的环节。程序做得再好校准系数不对计量出来的电能量就是错的而且这种错不是线性偏移那么简单在不同的功率因数和电流下表现还不一样。校表要解决的根本问题是两个系数电压通道增益校正值和电流通道增益校正值。RN8302B 提供了功率偏移寄存器Power Offset和增益校正寄存器Gain Calibration程序里需要根据标准表读数反推出校正值写入芯片。增益校正的计算公式如下// 目标增益校正值计算 // gain_target (标准表功率 / 芯片原始功率) × 2^15 // 写入寄存器时是补码形式 float gain_ratio std_power / raw_power; int16_t gain_code (int16_t)(gain_ratio * 32768.0f); // 写入A相有功增益校正寄存器 rn8302b_write_reg(0x14, (uint16_t)gain_code);这里的标准表功率是外部标准源给出的真实功率raw_power 是芯片在原始增益下读出的功率。计算出的 gain_code 是一个 16 位有符号数范围是 -32768 到 32767对应增益范围是 0.5 到 1.5。如果算出来的增益超出这个范围说明硬件设计有问题——电流采样电阻值选得不对或者互感器变比不合适这种问题改程序是解决不了的。4.2 校表流程中的三相独立校正策略RN8302B 支持三相独立校正A/B/C 各相有自己独立的增益寄存器。程序里做的校表流程分成三步第一步电压校正。在额定电压下读取各相电压有效值寄存器计算电压增益校正值并写入。这一步的前提是电压通道的分压电阻精度足够如果使用 0.1% 精度的电阻电压校正基本只需要做微调。第二步有功功率校正。在额定电流、功率因数为 1.0 的条件下读取各相有功功率寄存器的值和标准表比对计算增益校正值写入。第三步无功功率校正。在功率因数为 0.5 感性或容性条件下读取各相无功功率值计算校正值。配套的校表数据存储在外部 EEPROM 或 Flash 中程序上电时读取这些系数通过 SPI 写入 RN8302B 的增益寄存器。一个好的做法是在校表模式下MCU 通过串口接收上位机指令上位机负责读回原始数据并计算系数MCU 只做寄存器读写。这样算系数的浮点运算都放在上位机MCU 固件里不需要大量浮点库。程序里的校表保存结构体可以做如下设计typedef struct { float volt_gain_a; // A相电压增益 float volt_gain_b; float volt_gain_c; float active_gain_a; // A相有功增益 float active_gain_b; float active_gain_c; float reactive_gain_a; // A相无功增益 float reactive_gain_b; float reactive_gain_c; float phase_offset_a; // A相相位补偿 float phase_offset_b; float phase_offset_c; } rn8302b_calib_t;这个结构体在工程上很有用。校准完成后把这些系数保存到外部存储量产时每台表都要单独校准所以要有一个「校准模式」和「运行模式」的切换逻辑。校准模式下发命令让 MCU 把校正系数写入芯片运行模式下直接读取电能值即可。5. 数据读取链路与常见问题排查5.1 电能累加值读取与清零的边界处理电能累加器和瞬时功率寄存器有本质区别电能累加器是只读的芯片内部不断累加MCU 的读取动作不会影响累加过程。程序读取电能累加值时需要处理 32 位数据的拼接和符号扩展。累加值可能有正有负取决于电能流动方向所以要用有符号数接收。清零操作是程序里一个隐藏的坑位。RN8302B 的电能累加器清零是通过向模式配置寄存器写一个特定值实现的。有好几个电能累加寄存器共享一个清零位清零动作要格外小心// 清零A相有功电能累加器 // 先读回模式配置寄存器当前值再修改bit位 uint16_t reg_val rn8302b_read_reg(0x02); reg_val | 0x0002; // bit1置1触发清零 rn8302b_write_reg(0x02, reg_val); reg_val ~0x0002; // 清零完成后恢复 rn8302b_write_reg(0x02, reg_val);这里踩过的坑是清零位是「写1清零」还是「写1后保持1会持续清零」不同芯片型号定义不一样。RN8302B 的做法是上升沿触发清零所以写入 1 之后一定要写回 0否则芯片会一直处于清零状态电能累加值永远为 0。这属于那种查半天手册才发现的隐蔽行为如果在程序中不按上述顺序处理现场的表会表现出「有功电能不走字」的怪现象。5.2 驱动层和数据链路里常见的四个坑现象 1SPI 读回来的寄存器值全是 0xFF。原因SPI 时钟极性和相位不匹配。RN8302B 要求 CPOL0、CPHA1如果配置成模式 0CPOL0、CPHA0芯片不会正确输出数据。解决核对 SPI 初始化代码确认时钟相位配置为 SPI_PHASE_2EDGE 或等价的 1 模式。用逻辑分析仪看 MISO 线上是否有时钟沿对应的数据变化。现象 2读回来的功率值有符号位扩展问题小功率时读到 0xFFFFFFF0 这种值。原因32 位功率寄存器是补码表示但程序里用 uint32_t 接收后再转 float 时没有做有符号转换直接把无符号数当正数处理。解决把接收变量定义成 int32_t然后在做浮点换算前强制类型转换。代码里最大可能是用了 uint32_t 定义改成 int32_t 就好。现象 3电能累加值比其他通道快一倍。原因模式配置寄存器里的电能累加模式配错了。RN8302B 支持有功电能累加和视在电能累加两种模式如果程序里初始化时把累加通道设错会出现累加速率不对的情况。解决读取模式配置寄存器 0x01确认电能累加模式选择位正确。对照数据手册的寄存器说明检查 bit2-bit0 的组合值是否对应了有功电能累加。现象 4校表系数写完不生效芯片计量结果没变化。原因增益校正寄存器在写入后需要触发一次软复位或者写了低 6 位地址但寄存器实际用的是 7 位地址空间。解决每次校表完成后程序执行一次软复位命令向系统配置寄存器写 0x80然后延时 50ms 再继续。同时检查 SPI 分离的写使能逻辑确认增益寄存器是不是需要先解锁。6. 进阶应用把环温补偿做进计量链路RN8302B 芯片有一个被很多人忽略的特性温度漂移补偿。计量芯片内部的 ADC 和基准源会随温度变化产生误差在 -40℃ 到 85℃ 范围内典型漂移在 ±50ppm 左右。智能电表国标要求误差在更宽温度范围内控制在一定限值内所以仅靠芯片自带的补偿是做不到全温度范围高精度的。程序里加一环温度补偿是量产表的基本操作。做法是给硬件设计预留一个温度传感器接口可以是一颗 NTC也可以直接用 MCU 内部温度传感器。程序每隔一段时间读取芯片温度寄存器的值——RN8302B 内部有一个温度测量通道读出的是 ADC 编码值需要换算成实际温度。然后在增益上叠加一个温度系数修正// 温度补偿执行逻辑每30秒执行一次 float temp_offset (current_temp - 25.0f) * 0.0015f; // 温度系数单位/℃ float compensated_gain base_gain * (1.0f temp_offset); // 重新写入增益寄存器 int16_t gain_code (int16_t)(compensated_gain * 32768.0f); rn8302b_write_reg(0x14, (uint16_t)gain_code);温度系数 0.0015 这个值不是拍脑袋定的它应该通过高低温箱实测标定。常见做法是在 -40℃、-10℃、25℃、60℃、85℃ 五个温度点分别读取计量结果算出每个温度点的偏差曲线然后拟合成一个分段线性函数放进程序。购买过这种批量校表设备的同行都知道这一步做得好整批表的误差一致性会好很多。对于大多数只做普通物联网插座或导轨表的团队不接温度传感器也够用毕竟室内环境温度变化范围小。但如果做的产品要过电网公司的型式试验低温环境下误差超标是常见问题建议留出这个补偿接口。还有一个进阶用法是利用 RN8302B 的电能累加器走字时间做自检。程序可以定期读一次电能寄存器计算走字速率和当前功率做交叉验证。如果走字速率和功率对应不上说明芯片可能进入了异常状态此时程序执行一次完整的复位流程。从那以后我每次做电表相关的项目都会强制走一遍「初始化 → 校表 → 高温老化 → 复校」的流程温度补偿的逻辑也始终保留在程序里。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

SSL1082拦截导弹:LIS变体与Dilworth定理全面解析

SSL1082拦截导弹:LIS变体与Dilworth定理全面解析

第一次在题目列表里看到[SSL1082] 拦截导弹,我还以为又是一道入门 DP。后来仔细一读,才发现它把两个经典问题绑在一起:先让你算最长不上升子序列,再让你算最少需要的拦截系统数量,后者在不少资料里被标成最小路径覆盖。…

2026/10/16 17:52:38 阅读更多 →
Java数据库连接池五种实现原理与生产调优指南

Java数据库连接池五种实现原理与生产调优指南

1. 项目概述:为什么一个连接池要讲五种实现方式? “Java专题:数据库连接池,手动创建连接池dbcpC3P0DruiddbUtil”——这个标题乍看像一份老派的课堂笔记,但如果你真在生产环境里写过DAO层、调过慢SQL、查过线程堆栈&am…

2026/10/15 15:29:17 阅读更多 →
Android Camera2实战:从预览到手动曝光与帧数据采集

Android Camera2实战:从预览到手动曝光与帧数据采集

简介:面向 Android 开发者深入理解 Camera2 API 的完整资料包,围绕相机架构、CaptureRequest 控制、对焦与自动曝光、图像回调、录像、性能优化及兼容性等主题展开,适合已有 Android 基础、希望实现专业拍照或视频功能的中高级开发者。压缩包…

2026/10/15 15:29:17 阅读更多 →

最新新闻

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

VSCode配置Anaconda全指南:解决Python解释器与conda环境问题

配过的人都有体会——Anaconda装了,VSCode也装了,结果新建一个Python文件,import numpy直接给你飘红,运行的时候又说找不到模块。这时候大多数人第一个想法是“Anaconda没装好”“VSCode坏了”,但真正的原因往往是VSCo…

2026/10/16 17:55:24 阅读更多 →
分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

分布式存储选型与落地:Ceph、HDFS、GlusterFS、MinIO对比与避坑指南

简介:一份关于主流分布式存储技术的综述文档,适合大数据处理、云计算及后端存储方向的开发者与架构师阅读。内容以架构与演化两条主线展开,系统梳理了谷歌文件系统、Hadoop分布式文件系统、Minio对象存储等经典方案的设计思想与适用场景。压缩…

2026/10/16 17:55:24 阅读更多 →
Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

Matlab图像拼接实战:SIFT特征匹配+RANSAC单应估计+多频带融合

简介:本资源是一套基于Matlab实现的SIFT特征匹配与RANSAC鲁棒估计相结合的图像拼接与融合完整方案,面向计算机视觉初学者、图像处理课程学习者及科研入门人员,解决多视角图像自动对齐、宽视场全景图生成等典型问题。压缩包共20个文件&#xf…

2026/10/16 17:55:24 阅读更多 →
用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

用Python爬虫打造自动化SEO巡检工具:从TDK提取到反爬避坑

简介:面向网站优化人员与Python学习者的SEO数据采集与分析工具,以“SEO网络蜘蛛侠”命名,通过自动化爬虫帮助用户完成关键词挖掘、元信息检查、链接结构分析、内容质量与加载速度检测、死链排查等高频SEO任务。程序内置可执行版本&#xff0c…

2026/10/16 17:55:24 阅读更多 →
Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

Python快速可视化SEG-Y地震数据:三步实现剖面绘制与批量抽检

简介:这份资源面向地质勘探、地震预测与环境监测领域的技术人员及Qt开发者,提供一套基于Qt3.3框架的地震数据快速可视化实现方案,重点解决大规模地震记录的读取、处理与图形化展示问题。压缩包共77个文件,约2.07MB,以h…

2026/10/16 17:55:23 阅读更多 →
Android应用目录结构全解析:从Gradle配置到资源文件管理

Android应用目录结构全解析:从Gradle配置到资源文件管理

很多刚接触Android开发的朋友,第一次用Android Studio新建项目时,看到左侧那一大坨目录树往往会有点懵。我当年也是从一个个文件夹点开、再关掉,折腾了好几天才搞清楚哪个目录是存代码的、哪个目录是放图片的、哪个文件是注册Activity的。这篇…

2026/10/16 17:54:23 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

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

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →