TMS320F206 Flash编程干扰与三重读取增强算法实践
1. 项目概述与核心挑战在嵌入式DSP系统的开发中尤其是基于TMS320F20x系列芯片的项目将最终的程序代码固化到片内Flash存储器是产品发布的最后一步也是最关键的一步。然而很多工程师在实验室环境下编程、验证无误的代码到了现场或经过长期运行后却可能出现偶发性的数据错误或程序跑飞。这类问题往往难以复现排查起来如同大海捞针。其根源很可能就隐藏在Flash存储单元的编程过程中。TMS320F206的嵌入式Flash EEPROM模块其存储单元密度高物理结构精密。当你对一个存储位bit进行编程即将‘1’写为‘0’时施加的高电压脉冲产生的电场可能会对同一列bit line上其他已经编程好的位产生微弱的“应力”导致其阈值电压发生漂移。这种漂移虽然微小但足以让一个原本在标准读取电压下稳定的‘0’位在更严格的验证电压下读回‘1’或者在高温、低电压等边际条件下发生数据翻转。这就是所谓的“编程干扰”Program Disturbance。传统的一次性编程-验证流程很难发现这种潜在的、累积性的干扰。它只能保证在编程完成的瞬间数据是正确的。而“三重读取与增强算法”正是为了解决这一深层次可靠性问题而生的。它不是一个简单的编程工具而是一套完整的、用于在编程后评估和增强每一位数据存储“健壮性”的验证与补偿方法论。其核心价值在于通过算法手段主动暴露潜在弱点并对其进行“加固”从而为每一位数据赢得足够的“编程裕量”Programming Margin确保其在产品的整个生命周期内都能稳定可靠。2. 核心算法原理深度解析要理解这套算法的精妙之处我们需要暂时跳出简单的“读写”思维深入到Flash存储单元的电气特性和可靠性测试的层面。2.1 为何需要“三重读取”单一验证的不足标准的Flash编程流程通常包含一个“验证读”Verify Read例如在F206中常用的Ver0读使用6.5V的读取电压。这个电压比正常的Vcc如5V或3.3V要高目的是为了确认被编程的‘0’位有足够的“强度”——即其阈值电压足够高即使在工作电压略有波动时也能被明确地识别为‘0’。然而这个单一的验证点存在两个盲区它无法检测“过应力”漂移如果一个已编程的‘0’位因为后续对同列其他位的编程操作其阈值电压被“推高”了超过0.5V那么它在6.5V的Ver0读电压下就可能无法导通读回‘1’从而验证失败。但实际上这个位在正常的Vcc电压下读取仍然是正确的‘0’。单一的Ver0读无法区分这是一个“真失败”位已损坏还是一个“过应力导致的验证失败”位仍可用但裕量不足。它无法评估速度特性嵌入式Flash作为程序存储器CPU需要在其上进行取指操作。当CPU以最高速度运行时对存储单元的访问时序要求极为苛刻。相邻存储单元存储着不同极性的数据一个‘0’挨着一个‘1’时可能会因为电容耦合效应在高速访问时引入额外的延迟或噪声影响取指的稳定性。这是单一的功能性验证无法覆盖的。2.2 三重读取算法的三位一体检测三重读取算法通过三种不同模式的读取操作构建了一个立体的、多维度的可靠性检测网2.2.1 快速读取Fast Read操作使用单次TBLR指令进行读取模拟CPU在最佳条件下的高速取指。检测目标擦除位的充足性。主要检查那些应为‘1’已擦除的位。如果快速读取失败说明这些位的阈值电压不够低擦除不充分在高速读取时可能无法被正确识别为‘1’。这关系到程序代码中所有未使用或值为1的位的可靠性。2.2.2 慢速读取Slow Read操作使用三次连续的TBLR指令进行读取人为降低读取速度增加检测的严格度。检测目标编程位的充足性。主要检查那些应为‘0’已编程的位。慢速读取相当于施加了一个更“苛刻”的读取环境。如果某个‘0’位的编程裕量不足阈值电压偏低在慢速读取的反复检测下就可能被读成‘1’。这个测试专门用于发现那些在Ver0读中可能漏网的、裕量处于临界状态的弱编程位。2.2.3 异或读取XOR Read操作将Flash中的实际数据与其地址值进行异或XOR操作然后读取结果。这实际上是一种特殊的“棋盘格”模式测试它确保相邻的存储单元被写入相反的数据因为地址值在高低位交替变化。检测目标单元间耦合干扰与速度路径。这是最精妙的一环。它模拟了CPU执行最坏情况指令序列频繁在相邻地址跳转访问极性不同的数据时Flash阵列内部可能出现的信号完整性问题。如果异或读取失败而快速和慢速读取都通过这可能暗示着Flash阵列与CPU之间的某条路径存在延迟或者单元间的耦合干扰在高速下变得显著。这类问题在20MHz以下频率可能隐匿但在更高主频下就会暴露导致系统不稳定。实操心得可以把这三重读取理解为对Flash存储器的一次“全面体检”。快速读是“心肺功能”基础性能慢速读是“耐力测试”长期稳定性异或读是“协调性测试”极端条件下的协同工作能力。只有三项全过才能认为这片Flash区域是真正健壮的。2.3 增强算法为弱位“打补丁”当三重读取中的“慢速读取”检测到某些‘0’位的编程裕量不足时即这些位是“弱位”增强算法就登场了。它的逻辑非常直接且高效定位算法会记录下所有在慢速读取中失败的位的位置。精准补偿仅对这些特定的弱位重新施加一个编程脉冲。逻辑由于这些位之前已经接受过标准编程脉冲再次施加的脉冲时间通常很短是“增强”而非“重新编程”目的是将它们的阈值电压稍稍提升使其跨过安全裕量的门槛。因为只对极少数位进行操作所以对阵列其他部分产生新干扰的风险极低。这种方法相比对整个扇区或整个阵列进行“擦除-重编程”的笨办法具有显著优势速度快、代码体积小、对Flash寿命影响最小Flash的擦写次数是有限的尤其适合在远程现场进行固件更新后的可靠性增强操作。3. 工程实现与代码集成详解理解了原理我们来看如何将这套机制落实到你的TMS320F206项目中。TI提供的示例代码给出了两种集成模式独立测试模式和与控制模块集成模式。我将以更常见的“集成模式”为例拆解关键步骤。3.1 环境准备与项目配置首先你需要获取TI的应用报告SPRABE8及其附带的源代码包。代码通常包含以下几个核心文件C2xx_bbx.asm/C2xx_brx.asm 主控制模块文件分别对应Boost和Triple Read。sutils20.asm 通用工具函数库包含延时、Flash操作等底层函数。boost.asm/triple_read.asm 增强算法和三重读取算法的具体实现。对应的链接器命令文件.cmd和工程文件.pjt。步骤一设置编译变量在汇编或编译环境中你需要正确定义编译变量。这是代码灵活性的关键。PRG2xx 必须设置为1。这个变量告诉代码它将被集成到C2xx_bbx/brx控制框架中运行而不是独立运行。DBUG(仅Boost算法) 这是一个调试变量。DBUG 0 正常增强模式不输出调试映射。DBUG 1 仅映射记录弱位的位置但不执行增强操作。用于前期分析。DBUG 2 映射弱位并执行增强操作。这是开发和验证阶段的常用设置。步骤二理解内存映射与链接仔细分析提供的链接器命令文件如C2xx_bbx(_CCS).cmd至关重要。它定义了代码和数据在DSP内存空间中的布局。MEMORY { PAGE 0 : PROG: origin 0xfe00, length 0x100 /* 算法核心代码放在B0 RAM配置为程序空间*/ PAGE 0 : SPROG: origin 0x8000, length 0x400 /* 其他算法子程序段 */ PAGE 1 : VARS: origin 0x0300, length 0x10 /* 变量区 */ PAGE 1 : DATA: origin 0x0320, length 0xd0 /* 数据缓冲区 */ ... } SECTIONS { PRG_text: {} PROG PAGE 0 /* 主控制代码段 */ boost: {} PROG PAGE 0 /* Boost算法代码段 */ ... }关键点算法代码特别是PRG_text和boost段被明确地链接到0xFE00开始的B0 RAM区。这是因为Flash编程算法本身不能从正在被编程或擦除的Flash中执行否则会引发总线冲突导致芯片锁死或数据错误。必须将这段代码先加载到RAM中然后从RAM中运行。工具PRG_2XX(W).EXE会自动在下载前将CNF位设置为1将B0配置为程序空间。注意事项如果你是自己编写引导加载程序Bootloader来集成这些算法你必须确保在跳转到算法代码执行前已完成以下操作将算法代码从Flash或通信接口拷贝到指定的RAM区域如B0。正确设置CNF位配置B0为程序存储器。关闭全局中断防止Flash操作期间被中断打断。确保堆栈指针等处于安全状态。3.2 算法调用流程与参数传递在集成模式下你不是直接调用boost或triple_read的子函数而是通过C2xx_bbx.asm或C2xx_brx.asm定义的标准入口和参数表来调用。以执行Boost算法为例一个典型的调用流程如下准备参数块在内存中定义一个结构化的参数区域通常位于DSPAD1段如0x310。参数包括目标Flash块的起始地址。数据缓冲区的地址存放待编程数据或用于校验。数据长度字数。算法选择标志调用Boost还是Triple Read。初始化并跳转将算法代码加载到RAM后将参数块的地址放入某个约定的寄存器如ACC然后跳转到控制模块的初始化入口如PRG_init。算法执行控制模块根据参数调用底层的boost算法函数。该函数会对指定Flash区域执行慢速读取识别弱位。根据DBUG标志决定是仅记录还是记录并增强。对弱位施加一个短促的增强编程脉冲。可选地再次执行读取以验证增强效果。结果返回算法执行完毕后通过状态寄存器或指定的内存位置返回结果成功、失败、检测到的弱位数量等。代码片段示例概念性说明; 假设参数已设置在0x310开始的区域 LDP #0h ; 设置数据页 SPLK #0x8000, 0x310 ; 参数Flash起始地址 (0x8000) SPLK #0x0300, 0x311 ; 参数数据缓冲区地址 SPLK #0x0040, 0x312 ; 参数数据长度 (64个字) SPLK #0x0002, 0x313 ; 参数操作码 (2代表Boost with debug) LACC #0x310 ; 将参数块首地址放入ACC CALL PRG_init ; 跳转到RAM中的算法控制模块 ; ... 后续处理返回值 ...3.3 擦除脉冲的优化调整应用报告的第5节提到一个重要的实践细节随着芯片制造工艺的成熟可以将擦除脉冲从标准的7毫秒缩短至5毫秒。这是一个工艺改进带来的红利。为什么可以缩短更先进的工艺使得Flash存储单元的隧道氧化层质量更优、更均匀在更短的电场作用下就能达到相同的擦除效果。如何操作你需要找到代码中负责发送擦除命令和等待擦除完成的延时循环或定时器配置部分。通常位于sutils20.asm或类似的底层驱动文件中。将对应的延时参数从7ms调整到5ms。有何好处缩短擦除时间可以加快整个编程流程减少芯片处于高电压状态的时间从理论上说对Flash的耐久性也有细微的正面影响。实操心得在修改擦除时间前务必在你当前批次的芯片上进行验证。虽然报告建议5ms但最稳妥的方法是在你的硬件上用5ms参数执行完整的“擦除-编程-验证”循环并辅以三重读取测试确保可靠性。可以建立一个简单的测试工程批量对多片芯片进行操作并统计成功率。4. 现场应用策略与故障排查实录将三重读取和增强算法集成到你的产品工作流程中而不仅仅是实验室工具是发挥其最大价值的关键。4.1 构建健壮的现场编程流程一个考虑周全的现场固件更新In-Field Programming, IFP流程应包含以下环节擦除 使用优化后的5ms脉冲擦除目标扇区。编程与标准验证 写入新数据并进行传统的Ver0读验证。三重读取测试 对新编程的区域执行完整的三重读取快、慢、异或。这是质量关口。条件判断与增强如果三重读取全部通过恭喜该区域编程质量极高可直接进入下一步。如果仅慢速读取失败这是最典型的情况表明存在编程裕量不足的弱位。此时自动调用Boost算法对失败地址进行增强。增强后必须再次执行三重读取以确保增强操作本身没有引入新问题且所有测试通过。如果快速读取或异或读取失败这通常意味着更严重的问题如擦除不彻底、硬件故障或时钟/电源不稳定。不应简单调用Boost而应记录错误中止编程流程并上报“硬件可能异常”的诊断信息。对于异或读失败而快/慢读通过的情况报告特别指出这可能意味着该芯片不适合在高于20MHz的频率下运行应考虑降频或更换芯片。完整性校验 最后执行一次整个镜像的CRC或Checksum校验确保数据整体无误。4.2 常见问题与排查技巧在实际集成和调试中你可能会遇到以下问题问题1算法代码下载后一运行就跑飞或硬件错误。排查思路内存配置检查CNF位是否在跳转到RAM代码前已正确设置B0配置为程序空间。用仿真器查看CNF位和ST1寄存器的状态。代码定位使用.map文件确认PRG_text、boost等段是否严格按照链接器文件指定加载到了0xFE00B0 RAM地址而不是错误地留在了Flash区域。堆栈冲突确保算法使用的堆栈空间如果使用不会覆盖算法代码或关键数据区。临时将堆栈指针指向一个宽敞的、未使用的RAM区域中断确认在Flash操作期间所有中断特别是定时器、看门狗已被禁用。问题2Boost算法执行后部分位依然无法通过慢速读取。排查思路增强脉冲强度Boost算法中的编程脉冲电压和宽度是可调的通常在代码中定义为常量。尝试略微增加脉冲宽度但需在数据手册绝对最大值范围内。注意这会影响Flash寿命需谨慎评估。检查电源质量Flash编程对Vcc电压的稳定性非常敏感。在Boost操作期间用示波器测量DSP核心电压确保没有跌落或噪声。劣质的电源或PCB布局会导致编程电压实际值不足。单元寿命耗尽如果某个物理存储单元已经被擦写接近极限次数通常为1万到10万次其性能会退化可能无法被有效增强。考虑将该部分代码或数据转移到Flash的其他扇区。问题3异或读取XOR Read间歇性失败但产品功能似乎正常。排查思路核心电压与频率这是最可能的原因。异或读对时序最敏感。尝试在算法执行时稍微提高一点核心电压如从3.3V调到3.45V或者暂时降低系统时钟频率看测试是否通过。如果通过则证实了速度路径存在问题。PCB信号完整性检查连接到DSP的时钟线是否干净有无过冲或振铃。糟糕的时钟信号会在高速下导致建立/保持时间违例。芯片个体差异如文档所述这可能是特定芯片的固有特性。如果仅在异或读失败而产品运行频率低于20MHz风险相对较低。但如果运行频率高建议将此作为筛选标准更换芯片。问题4如何将这套算法移植到自己的Bootloader中关键步骤提取核心函数从boost.asm和triple_read.asm中剥离出最核心的算法循环和判断逻辑移除与TI特定控制框架C2xx_bbx.asm强耦合的部分。重建底层驱动你需要基于你的硬件平台重新实现或适配sutils20.asm中的底层函数如FLASH_WRITE、DELAY_US等。这些函数直接操作Flash控制寄存器必须与你的DSP型号和时钟配置严格匹配。设计简洁接口为你的Bootloader设计一个清晰的API例如int Flash_ProgramAndVerifyWithMargin(uint32_t addr, uint16_t *data, uint32_t length)在这个函数内部封装标准编程、三重读取和条件增强的逻辑。充分测试在移植后的Bootloader上对空白芯片、已编程芯片进行反复的编程-验证-三重读测试并与原版TI工具的结果进行交叉比对确保功能完全一致。最后我想分享一点个人在多个工业级项目中使用此方案后的体会将三重读取和增强算法视为产品Flash编程的“标准工序”而非“可选测试”是提升产品现场可靠性的最具性价比的投资之一。它增加的代码量和执行时间可能几百毫秒微乎其微但却能拦截掉绝大多数因工艺离散性、电源噪声或编程干扰导致的潜在早期失效。在车间生产线上它是一道可靠的质量防火墙在现场它则是确保远程升级万无一失的“安全气囊”。当你面对成千上万的已部署设备时这套机制带来的信心远比那一点点额外的编程时间宝贵得多。

相关新闻

车载Android系统启动优化:从8秒目标到异构并行实战

车载Android系统启动优化:从8秒目标到异构并行实战

1. 项目概述与核心挑战在车载信息娱乐系统这个领域里,用户对“开机速度”的容忍度几乎为零。想象一下,你坐进车里,按下启动按钮,如果中控大屏要等上二三十秒才亮起来,导航、音乐、倒车影像统统没反应,那种体…

2026/10/18 10:22:55 阅读更多 →
边缘AI实战:从MLPerf基准测试看TDA4VM处理器如何实现高能效推理

边缘AI实战:从MLPerf基准测试看TDA4VM处理器如何实现高能效推理

1. 项目概述:为什么我们需要重新审视边缘AI的“性能”与“能效”在智能摄像头、工业机器人或者一台正在仓库里穿梭的自动导引车(AGV)内部,一场静默但至关重要的计算正在发生。这不再是云端服务器集群的轰鸣,而是嵌入在…

2026/10/17 22:43:00 阅读更多 →
TMS320R281x电气规格与低功耗模式实战解析

TMS320R281x电气规格与低功耗模式实战解析

1. 项目概述:从数据手册到设计蓝图每次拿到一颗新的DSP芯片,我做的第一件事不是急着画原理图,而是翻到数据手册的电气规格章节。这就像给一个运动员做体检,你得先知道他的极限心率、最佳血压和工作耐力,才能制定出科学…

2026/10/17 18:26:05 阅读更多 →

最新新闻

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

最近我在几个 Flutter 项目里试了用 Claude Code 和 Codex 来写代码,效果确实惊艳,但翻车概率也一点都不低。最典型的情况是:AI 能独立完成一个小功能,却会在你根本没注意到的地方破坏既有约定——混用状态管理方案、跳过异常处理…

2026/10/19 3:17:05 阅读更多 →
YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

1. 项目概述:为什么一个“基建裂缝检测系统”值得用YOLOv8重做一遍你可能已经见过不少用YOLO系列做裂缝识别的Demo——拍张照片,框出几条灰白细线,再打个“裂缝:0.87”的标签,就叫“智能巡检”。但真把它拉进某高铁桥墩…

2026/10/19 3:17:05 阅读更多 →
基于Python与深度学习的植物病虫害识别系统设计与实现

基于Python与深度学习的植物病虫害识别系统设计与实现

1. 项目整体设计与技术选型植物病虫害识别这几年一直是农业信息化里的热门方向,真正落地做过的朋友都知道,难点不在模型本身,而是“识别”这个动作如何被最终用户方便地使用。我这次做的这套基于Python的植物病虫害识别系统,目标很…

2026/10/19 3:17:05 阅读更多 →
基于Python的植物病虫害识别系统实战:从模型训练到前后端部署

基于Python的植物病虫害识别系统实战:从模型训练到前后端部署

1. 项目价值与整体定位看到“基于Python的植物病虫害识别系统”这个标题时,我第一反应是这应该是一个典型的“算法工程”相结合的综合型项目。它既要解决“能不能识别出来”的算法问题,又要解决“别人怎么用”的工程落地问题。前后端源码意味着它不仅仅是…

2026/10/19 3:17:05 阅读更多 →
二进制部署Kubernetes高可用:从单master到双master+双LB实践

二进制部署Kubernetes高可用:从单master到双master+双LB实践

做二进制方式部署 Kubernetes 的人,多少带点“倔”——不想被 kubeadm 那堆自动生成的证书和静态 Pod 挡住视线,就想亲手把 etcd、apiserver、controller-manager、scheduler 一个个进程拉起来,看它们到底是怎么协作的。我前阵子刚把一套“单…

2026/10/19 3:17:05 阅读更多 →
Metadef实践指南:CANN自定义算子开发的基石

Metadef实践指南:CANN自定义算子开发的基石

Metadef 这个名字在自定义算子开发圈子里,说实话一开始很容易被忽略。很多人刚接触 CANN 算子开发时,目光全放在 kernel 怎么实现、tiling 怎么切分上,等真正动手写第一个算子才发现,最卡脖子的不是计算逻辑,而是“这个…

2026/10/19 3:16:05 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →