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

射频自动化测试序列配置框架:从扫频实战到二次开发避坑

发布时间:2026/11/3 10:53:23 来源:云帆数科 栏目:资讯中心
射频自动化测试序列配置框架:从扫频实战到二次开发避坑
简介面向高通芯片测试、射频验证与产线调试工程师的技术文档围绕QSEQ测试序列系统梳理序列设计、环境与参数配置、执行记录及结果分析等核心环节帮助读者理解如何组织复杂测试流程、定位执行异常并衔接QRCT相关操作。压缩包内共1个PDF文件约2.58MB内容为系统概览类资料涵盖QSEQ XTT/XML、运行与日志、代码与工厂实现、参数说明、配合测试设备辅助端口的Diversity测试以及手动调试思路等模块目录组织便于按主题查阅。已有1028人学习适合需要快速建立QSEQ整体认知、对照实际项目排查配置问题或补充测试序列管理知识的中高级技术人员参考。1. 从一次 40 分钟的扫频说起序列测试框架要解决的到底是什么四十个频段、每个频段三个功率点、每个点再跑一轮误块率统计如果靠人在测试台上一条一条敲命令一个下午就没了中间手抖点错一次整轮数据还得重跑。序列测试sequence testing也叫 list mode testing就是把这几百条「配功率、切信道、发命令、读结果」的动作提前写成配置编译成一棵能反复执行的树点一次运行机器自己跑完。这套序列配置框架面向的是要把射频验证做成流水线的人——产线抽检、认证前回归、多频段批量扫描而不是偶尔抓一帧 log 看看波形对不对的调参场景。它跟单步调试工具不是替代关系是把你已经确认过的那套动作固化下来。2. 架构拆解测试树、XML 算法段与执行器三层怎么分工2.1 三层各管一段边界别弄混第一次接触这套东西最容易犯的错是把它当成一个大脚本。实际上它是三层每层的输入输出都不一样改错层就会出现「改了 XML 但运行结果没变」这种玄学现象。最上面是测试树XTT可以理解成一棵图形化的执行计划。树的每个节点是一个抽象动作「启动序列会话」「选择技术与频段」「加载脚本」「执行」「记录日志」。测试树本身不含射频参数它只决定顺序和范围。所以想新增一个频段通常是在树上加一个节点而不是去改底层脚本。中间是参数层也就是一堆 XML。几乎所有的射频参数——信道、功率、RB 数、调制方式、门限——都落在 XML 里一个 XML 文件描述一段连续的测试动作业内叫 AlgorithmSegment。一次完整的扫频需要好几个 XML 拼起来先做切换再改参数测量最后降功率再测一次。最下面是执行侧。引擎本体是 C 写的以源码形式分发方便二次开发上层跑的是一个用 C# 写的测试执行器负责把测试树翻译成一串调用把 XML 里的参数喂给引擎和仪表驱动。引擎和测试执行器之间是进程内调用仪表和被测设备靠驱动层挂在引擎上设计上是插件式的运行时可以往里加新设备。这三层的分工决定了改东西的顺序想改测试流程 → 改树想改参数 → 改 XML想接新仪表 → 改驱动插件。提示先把这三层的对应关系画在纸上再动手改配置比直接在目录里翻文件快得多。2.2 安装目录里到底有什么拿到分发包之后先别急着跑把目录扫一遍能省掉后面大量时间。典型结构是这样的路径按你本地安装位置替换# 配套工具套件默认安装根目录x64 系统 C:/Program Files (x86)/Vendor/Toolkit/ ├── XTT/ │ └── SubSysVFS/ # 序列测试子系统的可执行体与资源 ├── Databases/ │ ├── SEQ_DeviceConfig.xml # 设备与资源的总配置文件 │ └── calDB_NET.xml # 路径损耗校准库 └── Drivers/ # 仪表与串口驱动XTT/SubSysVFS/是运行时的家目录测试树在找脚本时会从这里往下搜。Databases/下那个设备配置文件是全套配置的入口后面第三章会逐字段拆。校准库单独放一个文件是因为不同实验室、不同夹具的损耗表不一样换台子只需要换这一个文件不用动主配置。有些分发包不是走完整工具套件而是走内部打包系统单独给一个压缩包压缩包里是同一套 XTT 和 XML只是版本跟工具套件不一定同步。血泪经验是这两条来源不要混用混用之后报错信息会指向一个根本不存在的节点排查半天。2.3 一个 AlgorithmSegment 的完整结构XML 是参数层的主体先看一个最小可用段。字段名按你手上版本可能有出入但结构大同小异?xml version1.0 encodingutf-8? !-- 单个算法段先做一次切换到目标频段再改参数并测量 -- AlgorithmSegment NameLTE_FDD_B3_HO_MEAS !-- 第一步下发被测设备命令完成频段切换 -- DUTCommand TypeNonSignaling CommandSET_BAND/Command Param nameband value3/ Param namebw value20/ !-- 带宽 MHz -- TimeoutMs5000/TimeoutMs /DUTCommand !-- 第二步改仪表侧参数RB 数与调制方式一起下发 -- InstrumentCommand Instrument rolePRIMARY/ CommandCONF_RB_MOD/Command Param namerb value50/ Param namemod value64QAM/ /InstrumentCommand !-- 第三步测量并判定结果进日志 -- Measurement NamePower Expect unitdBm min-40 max-20/ JudgePASS_FAIL/Judge /Measurement /AlgorithmSegment !-- 下一段可以继续追加例如把目标功率降到 -36.8 dBm 再测一遍 --这里三个子块对应三种动作类型给被测设备发非信令命令、给仪表发配置命令、做一次测量判定。TimeoutMs别嫌它土仪表响应慢的时候没有这个超时整个序列会卡死在原地日志上什么也不显示黑匣子一样。Judge决定这段是软测量只记录还是硬判定失败即中止或继续工厂场景一般要求硬判定研发阶段建议先设成记录模式跑一轮看分布。一个 XML 文件里可以放多个 AlgorithmSegment引擎会按声明顺序依次执行。这里有个容易忽略的约束段与段之间是顺序的前一段的仪表状态会带到后一段。如果前一段把功率拉到很低后一段测灵敏度时忘了重置结果会莫名偏小。2.4 最终脚本是怎么合并出来的单独一个 XML 是跑不起来的工具侧执行的是一份「最终脚本」由多个 XML 按顺序拼接并展开参数得到。拼接规则大致是测试树按节点顺序取 XML同名的参数以后出现的为准公共参数频段、带宽、校准表路径在拼接时统一替换。这个「后出现的为准」是双刃剑。好处是一份基础 XML 可以被多个频段复用只在后置的小文件里覆盖频段号坏处是覆盖关系不可见最终脚本里到底生效的是哪个值光看单个 XML 看不出来。我的习惯是每个可覆盖参数在文件头用注释标一句「由 XXX 覆盖」出问题直接搜注释。拼接完成后建议先导出一份最终脚本存盘再运行。这一步多花十秒后面查「为什么这个信道没测到」能省一小时。3. 设备配置一份 DeviceConfig 里每个字段写错的后果3.1 移动端连接串的三种类型设备配置入口是一个总 XML测试树的「启动序列会话」节点会引用它。移动端部分的核心是一条连接串!-- 被测设备连接串类型|端口|超时 -- DeviceGroup nameDUT0 ConfigStringCONNECTQPST|COM12|TIMEOUT_SEC30/ConfigString /DeviceGroupCONNECT后面的三段分别是连接类型、端口号、超时秒数。连接类型一般有三种可选——基于串口服务的类型、基于手机管理服务的类型、用户自定义类型。前两种走厂商自带的端口服务装好驱动就能用第三种留给自研的通道需要自己实现接口。端口号在设备管理器里能看到但插拔之后可能变所以实验室机器建议在驱动里固定端口别让它自己飘。超时值需要设置得稳妥一些。默认值偏小遇到设备刚上电、固件还在初始化的时候会话会直接失败报出来的却是「配置错误」很容易误判。常见做法是上电后先等设备枚举完成或者首次连接把超时放到 60 秒稳定之后再收到 30 秒。3.2 仪表端的 VISA 地址与射频端口选择仪表侧连接串由仪表厂商的驱动定义格式通用写法是 VISA 资源地址加射频端口映射DeviceGroup nameINST0 ConfigStringCONNECTGPIB0::12::0::INSTR|RF_PORT_IDSMAIN,MAIN/ConfigString /DeviceGroup地址里三段数字分别是总线号、主地址、副地址。总线号跟你的 GPIB 卡编号对应主地址就是仪表面板上设的那个副地址多数情况填 0。RF_PORT_IDS是接收链路的端口映射两个值对应两条接收链都填MAIN表示双链同端口做分集测试时第二条链要指到辅助端口这就是后面做分集验证的配置基础。这段最容易翻车的地方在于地址写错时驱动不会立刻报错而是在第一次真正下发命令时超时现象看起来像是仪表死机。所以配完之后先用仪表自带的连接测试验一遍地址别直接进序列。3.3 响应载荷配置与 Resource 注册同一份配置文件里还有两块常被忽略的内容。第一块是响应载荷配置!-- 响应格式压缩方式|同步方式默认不压缩 异步 -- ResponsePayloadConfigCOMPRESSED|SYNC/ResponsePayloadConfig第一个字段选是否压缩第二个字段选同步还是异步。压缩能把回传的数据量显著减小经验数据大概是四比一频段多、点数密的时候对总时长影响不小。但压缩必须配同步模式异步加压缩的组合会拿到半截数据。这条约束写死在配置语义里配错了症状是解析出的值偶尔对偶尔错非常难查。第二块是资源注册。资源是一套灵活的管理机制核心类可以被继承自定义资源类注册到工厂管理器之后每次创建设备组时会自动实例化一份并挂到该组上组内设备按字符串标识取用。路径损耗管理器就是典型例子Resources Resource nameSEQ_RESOURCE_PATHLOSSMANAGER config../Databases/calDB_NET.xml/ /Resources名字必须和代码里注册的标识完全一致大小写都不能差否则运行时拿不到资源表现出来是测量值整体偏几个 dB 却没有任何报错。校准表路径用相对路径时基准目录是配置文件所在目录不是当前工作目录这一点在迁移整套配置到另一台机器时经常出事。4. 跑起来从装环境到第一张扫频报表4.1 依赖清单与安装顺序装环境这事看着简单顺序错了能折腾一整天。按依赖从底往上装顺序组件作用注意1USB 驱动 端口服务让主机认到被测设备装完重启一次2GPIB 卡驱动仪表通信底层卡插好再装否则找不到设备3VISA 运行时统一仪器资源访问版本跟驱动匹配4XML 解析库解析参数文件缺了会在加载配置时崩5工具套件本体提供执行器与 XTT装完确认环境变量6序列子系统分发包提供 XTT 与 XML覆盖到工具套件对应目录第六步的分发包解压后直接覆盖到工具套件的XTT/SubSysVFS/下即可不要解压到别的盘再建快捷方式执行器是按住目录结构去找脚本的。装完先开一次测试执行器能正常打开、能看到测试树节点说明基础环境通了再去搞设备。提示所有组件装完先做一次设备识别和仪表连接测试两个都通了再碰序列配置能把问题范围砍掉一半。4.2 从单段跑到整段扫频不要一上来就跑全频段。正确的打开方式是先只跑一个 AlgorithmSegment确认设备和仪表都在正常响应再跑一个频段的完整脚本最后才放开多频段扫描。第一轮建议在测试树里只勾选一个节点直接把目标定为「切到一个固定频段测量一次功率」能读到合理数值就算成功。这一步验证的是连接串、端口、超时、校准表四样东西任何一样错这里就会暴露。第二轮加参数覆盖。改 RB 数、改调制方式、改目标功率每次只改一个看结果是否跟着变。有经验的人在这一步会故意把功率改到一个明显的值比如从默认值直接改成 -36.8 dBm测量结果不跟着动就说明参数没生效别往下走了。第三轮才开多频段。多频段扫频的时长跟频段数是线性关系但日志体积是累加的别在第三轮就把所有频段都放开先选三个相邻频段把合并逻辑和日志切分验证一遍。4.3 日志落在哪、慢在哪、怎么定位失败日志一般分两类序列级日志记录每个段的开始、结束、耗时和判定结果设备级日志记录每一次命令的下发与回读。两者默认都落在XTT/SubSysVFS/下的日志目录里按时间戳或会话 ID 分文件。排查失败先看段耗时。一个正常的测量段通常是几百毫秒到两秒如果某段耗时接近你设的超时值基本可以断定是设备或仪表没响应而不是参数算错了。段耗时正常但判定失败才去看设备级日志里的回读值比对期望区间。日志里还有一类隐形问题段执行成功但结果是空值。这种情况多数是响应载荷配置里压缩和同步搭错了或者资源没取到、返了个默认对象。压缩默认不打开先按默认配置跑通再开压缩做性能优化不要一上手就配最省时的组合。5. 避坑清单连接、脚本、结果三类翻车现场5.1 连接与设备类现象一点运行之后一秒内直接报配置错误设备一次都没动。原因是连接串里的端口号在系统重启后变了执行器拿着旧端口去连失败得很快。解决方式是打开设备管理器确认当前端口把配置里的COM号改过来长期做法是在驱动设置里固定端口号或者在启动脚本里先枚举一次可用端口。现象二序列跑到一半卡住界面不动日志停在某个段不往下走。仪表层面超时了但设备侧超时被设得比仪表超时大很多所以在仪表已经放弃的情况下引擎还在等设备回话。解决办法是把两边的超时设成接近的值设备侧略大一点即可同时给每个仪表命令段加上合理的超时别默认留空。现象三同一套配置换一台实验室机器就连不上仪表。RF_PORT_IDS或者 VISA 地址里的总线号是跟机器绑定的。换机器要重新确认真实资源地址用仪表驱动自带的面板确认一遍再改配置。别直接复制旧机器的整份配置文件至少这几行要手改。5.2 脚本与参数类现象四改了 XML 里的功率值跑出来的测量结果一点没变。最终脚本是多个 XML 合并的你的值被后面加载的文件覆盖了。最快的定位方式是运行前导出最终脚本搜参数名看实际生效的是哪一份。根治办法是减少可覆盖参数的数量把真正需要按频段变的参数集中到一个覆盖文件里。现象五某个频段总是被漏测测试树里明明勾了。频段列表在测试树的频段节点和脚本里可能各有一份两处不一致时以其中一处为准。检查测试树节点展开后的频段勾选状态以及脚本里的频段枚举保证两处完全对齐。这种漏测最坑的地方在于它不报错只是报表里少一行。现象六加上压缩之后结果偶尔正确偶尔乱值。响应载荷配了压缩但同步方式还是异步。压缩必须搭配同步否则数据流会被切在包的中间。改回不压缩先验证逻辑再改成压缩加同步两轮对比一下结果是否一致。5.3 结果与判定类现象七所有测量值整体偏低两三个 dB重复性很好但就是不对。十有八九是路径损耗没生效。检查资源注册的名字和代码里的标识是否一致检查校准表路径的相对基准检查当前夹具体用的损耗表是不是你要测的那个频段。这类系统误差比随机误差更危险因为它看起来「很稳定」容易让人误信。现象八开发机上跑得好好的判定规则搬到另一台机器上全部失败。判定门限写在了 XML 里而两台机器的校准表不同实际功率基线不一样。门限应该跟校准表一起管理或者按校准结果动态生成别把绝对门限硬编码在脚本里跨机器复用。6. 二次开发把一台新仪表接进插件体系的三个改造点真正需要动手写代码的时候八成是手上来了一台新仪表或者要往序列里插一段自定义测量。这套框架在这方面的设计是留了口子的但三个改造点必须一起动只改一个会跑不起来。第一处是驱动层。新仪表要实现统一的仪器接口包括连接、下发命令、读回响应、查询状态这几个方法。写法上不用追求通用直接按仪表手册的 SCPI 命令逐条包一层就够了重点是异常要抛得干净——连不上、超时、返回格式不对三种情况分开抛别都包成一个通用错误。下面是一个结构示意// 新仪表驱动的最小骨架继承统一接口并注册 class MyInstrumentDriver : public InstrumentBase { public: // 连接失败时必须抛出可区分的错误类型 bool Connect(const std::string visaAddr) override { if (!visa_.open(visaAddr)) { throw InstrumentConnectError(visaAddr); // 连不上 } return true; } // 下发命令超时单独抛出便于上层判断是设备慢还是命令错 void Send(const std::string scpi, int timeoutMs) override { if (!visa_.write(scpi, timeoutMs)) { throw InstrumentTimeoutError(scpi); // 超时 } } // 读回并解析格式不对直接抛不要返回默认值 double QueryPower() override { std::string raw visa_.read(2000); double v 0.0; if (!ParseDouble(raw, v)) { throw InstrumentParseError(raw); // 返回格式不对 } return v; } }; REGISTER_INSTRUMENT(MY_INSTR, MyInstrumentDriver); // 注册到工厂关键在最后那行注册宏。引擎是按字符串标识从工厂里取驱动的注册名要和设备配置里CONNECT的类型段对应上大小写敏感。异常分三类抛出去是为了让上层能在日志里写明到底是哪一步出的问题否则现场只剩一句「仪表错误」排查起来非常难受。第二处是资源层。如果你要往设备组里挂一个跨段共享的东西比如自定义的补偿表或者多端口切换器状态就继承资源基类并注册到资源工厂管理器。注意资源是跟着设备组走的一个设备组一份实例别把全局状态塞进去多组并行时会互相踩。第三处是脚本层。把新仪表的能力包装成 XML 里可声明的命令类型这样测试工程师不用改代码就能用。包装的时候建议给每个命令定一个明确的必填参数集合缺参数时在加载阶段就报错不要等到运行到那一段才失败——加载阶段报错能一次把所有脚本问题暴露出来。验证方法我习惯分三步走每步都有明确的可判读结果阶段验证内容通过标准单元驱动单独连接、单条命令收发连续 50 次收发无超时读数与面板一致集成加入一个测量段跑通段耗时稳定判定结果与手工测量偏差在校准范围内回归原有频段全跑一遍原有结果与改造前逐行对比无明显漂移第三步最容易偷懒。新驱动挂进去之后很可能因为命令时序变了影响了同一台仪表上其他频段的测量顺序结果不报错但数值有细微漂移。所以我把「改造前后各跑一遍全频段导出 CSV 逐行 diff」当成固定动作不接受「看着差不多」这种结论。从那以后我每次接新仪表都强制先跑通单元验证那 50 次收发再谈集成——省下来的返工时间比写代码的时间长得多。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

卷积码与Viterbi译码MATLAB仿真及误码率排查
卷积码与Viterbi译码MATLAB仿真及误码率排查

简介:这份文档围绕卷积码编译码算法研究与实现展开,面向学习数字通信、信道编码及维特比译码的本科生与工程入门者,可用于课程设计、毕业设计选题参考和MATLAB仿真复现。包内仅含1个doc文件,压缩包约991KB,主体为排版完… · 2026/11/3 10:53:23

电磁波吸收材料市场:82%集中度下,先进材料2%渗透率如何撬动7.56%增长
电磁波吸收材料市场:82%集中度下,先进材料2%渗透率如何撬动7.56%增长

简介:这份文档面向电子、通信、军工及材料领域的研究人员与市场分析从业者,系统梳理全球电磁波吸收材料行业的市场格局与技术演进路径,帮助读者理解传统吸波材料与先进吸波材料之间的替代趋势及竞争态势。压缩包内为1个docx文件,约… · 2026/11/3 10:53:23

医疗AI战略计划拆解:价值链、证据链与工程接口
医疗AI战略计划拆解:价值链、证据链与工程接口

简介:这份PDF是美国卫生与公众服务部(HHS)于2025年1月发布的《医疗卫生人工智能战略计划》官方文本,面向医疗AI研究者、政策制定者、医疗产品研发人员及公共卫生管理者,系统回答AI如何在医疗研究、产品开发与公共卫生服… · 2026/11/3 10:53:23

Redis键过期机制原理与实战应用详解
Redis键过期机制原理与实战应用详解

1. Redis键过期机制的核心原理Redis作为内存数据库的标杆产品,其键过期机制的设计直接影响着内存使用效率和应用稳定性。当我们在Redis中设置过期时间时,实际上是在操作一个独立的过期字典(expires字典),这个字典与主字… · 2026/11/3 11:43:23

专业内容创作指南与处理不完整信息建议
专业内容创作指南与处理不完整信息建议

1. 理解输入内容的缺失根据您提供的输入信息,项目标题为"111111",其他字段均为空。这种情况通常意味着:可能是测试输入或占位符用户可能误操作提交了不完整信息系统传输过程中出现了数据丢失2. 专业内容创作的基本原则作为专业内容… · 2026/11/3 11:43:23

SQL索引优化实战:从原理到性能提升150倍的秘诀
SQL索引优化实战:从原理到性能提升150倍的秘诀

1. 为什么SQL索引如此重要? 我至今还记得第一次遇到生产环境SQL查询超时的场景——一个原本只需要0.1秒的简单查询,在数据量增长到百万级后突然需要15秒才能返回结果。当时紧急排查发现,问题就出在没有正确使用索引上。这个教训让我深刻认识到… · 2026/11/3 11:43:23

Git版本回退原理与实战指南
Git版本回退原理与实战指南

1. 为什么我们需要版本回退? 在团队协作开发中,代码库就像是一个不断生长的有机体。想象一下这样的场景:你花了三天时间开发一个新功能,提交了十几个commit后突然发现——这个功能方向完全错了!或者更糟,你… · 2026/11/3 11:43:23

UE5 JSON解析:TJsonReader类族与性能优化实践
UE5 JSON解析:TJsonReader类族与性能优化实践

1. UE5 JSON解析基础与TJsonReader类族概述在Unreal Engine 5的C开发中,处理JSON数据是日常开发中无法回避的任务。引擎内置的JSON解析系统提供了一套高效、类型安全的处理方案,其核心就是TJsonReader类及其派生类。这套解析器采用流式处理模式&#xff… · 2026/11/3 11:43:23

WinForms开发中的死锁问题与解决方案
WinForms开发中的死锁问题与解决方案

1. 死锁的本质与四大必要条件 在WinForms应用开发中,当我们在UI线程与后台任务之间频繁切换时,稍不注意就可能陷入死锁的泥潭。死锁就像两个人在狭窄走廊相遇,谁也不肯后退一步,结果谁都过不去。从技术角度看,死锁是指… · 2026/11/3 11:42:22

双极步进电机控制实战: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

了解更多?预约专属演示

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

企业微信二维码