STM32定时器主从模式实现高精度移相PWM输出
1. 项目概述从“波形”到“移相”的核心价值在嵌入式开发特别是工业控制、电力电子和精密测试领域我们常常需要生成特定频率、相位和幅度的波形信号。一个简单的方波或正弦波输出用通用定时器的PWM功能就能轻松实现。但当你遇到需要精确控制两个或多个同频信号之间相位差的需求时比如驱动全桥或半桥电路、实现谐振变换、或者构建相位干涉测量系统事情就变得有趣且具有挑战性了。这就是“基于STM32的移相波形输出”项目要解决的核心问题。简单来说这个项目不是要生成一个波形而是要生成一组“同步舞蹈”的波形。它们步调一致频率相同但彼此之间保持着精确的、可编程的“时间差”这个时间差换算成角度就是相位差。STM32作为一款资源丰富、性价比极高的ARM Cortex-M内核微控制器其高级定时器如TIM1, TIM8, TIM2, TIM3, TIM4, TIM5等提供了强大的支持来实现这一功能。我将通过这篇文章拆解如何利用STM32的定时器从硬件原理到软件配置一步步实现高精度、高稳定性的移相波形输出并分享我在实际项目中积累的配置技巧和避坑指南。2. 硬件原理与定时器选型解析2.1 为什么需要移相典型应用场景在动手写代码之前理解“为什么”至关重要。移相控制不是炫技而是解决实际工程问题的关键手段。场景一开关电源与电机驱动在全桥或半桥拓扑中上下桥臂的驱动信号必须严格互补且带有死区时间以防止直通短路。更高级的拓扑如移相全桥Phase-Shift Full-Bridge正是通过调节两个全桥臂之间的相位差来实现软开关和调节输出电压。此时你需要生成四路PWM且其中两两之间存在精确的相位关系。场景二信号发生与测量在通信系统或传感器激励中可能需要产生两路正交信号相位差90°用于I/Q调制解调。或者在阻抗测量中需要产生一个激励信号和一个与之有固定相位差的参考信号通过测量响应信号的相位差来计算阻抗特性。场景三多通道同步控制在需要多个执行器按特定时序协同工作的场合例如3D打印机的多轴联动、舞台灯光控制移相波形可以作为精确的时间基准确保各通道动作严格按序触发。2.2 STM32定时器实现移相的硬件基础STM32的定时器家族庞大但并非所有都适合做移相。实现移相输出的核心在于定时器的主从模式和输出比较通道的独立性。关键定时器高级控制定时器TIM1/TIM8和通用定时器TIM2-TIM5高级控制定时器TIM1, TIM8这是实现复杂PWM和移相的“瑞士军刀”。它们通常有4个独立的通道支持互补输出、死区插入、刹车功能并且最关键的是它们可以非常灵活地配置为主从模式。你可以让一个定时器作为主Master触发另一个定时器作为从Slave开始计数从而在两个定时器之间建立精确的相位差。通用定时器TIM2-TIM5这些定时器功能稍弱但同样支持主从模式。对于简单的两路移相它们通常也够用。它们的通道同样可以独立配置输出比较模式。实现移相的两种核心思路单定时器多通道法利用一个定时器的多个输出比较通道。所有通道共享同一个计数器和重载值通过为每个通道设置不同的“比较捕获寄存器CCRx”值来设定脉冲的占空比和相对于计数器开始点的相位。这种方法简单但所有通道的相位差是固定的难以在运行时动态、独立地调整。多定时器主从法这是实现动态、高精度移相的推荐方法。设置一个定时器为主定时器Master另一个或多个为从定时器Slave。主定时器通过其更新事件UEV或某个通道的比较匹配事件输出一个触发信号TRGO给从定时器。从定时器被配置为“触发模式”Slave Mode: Trigger Mode当收到触发信号时才开始或复位计数。通过设置从定时器的“重复计数器RCR”或延迟计数可以精确控制从定时器相对于主定时器的启动延迟这个延迟时间就是相位差。注意对于需要极高相位精度如纳秒级或频率非常高的场景需要仔细计算系统时钟、定时器预分频带来的最小分辨率并考虑GPIO输出延迟等硬件因素。对于大多数中低频应用如几十KHz以下的电机驱动、音频范围信号发生STM32的定时器完全能够胜任。3. 软件设计与配置实战理论讲完我们进入实战环节。我将以STM32CubeIDE/HAL库环境为例演示如何配置两个通用定时器TIM2和TIM3实现两路频率1kHz相位差为90°即1/4周期的PWM输出。假设系统主频为72MHz。3.1 系统时钟与定时器基础配置首先确保系统时钟正确配置。在main.c的SystemClock_Config()后我们初始化定时器。TIM2 配置主定时器时钟源内部时钟APB1在72MHz系统下若APB1预分频不为1定时器时钟会倍频需查数据手册确认。假设TIM2时钟为72MHz。预分频器PSC设置为71。这样定时器时钟 72MHz / (711) 1MHz即每个计数周期为1微秒。自动重载值ARR设置为999。这样PWM周期 (ARR1) * 计数周期 1000 * 1us 1ms对应频率1kHz。计数模式向上计数。PWM模式选择PWM模式1或2。以通道1为例设置为PWM模式1。脉冲宽度CCR1设置为500即占空比为50% (500/1000)。主模式配置将TIM2的“主从模式控制寄存器SMCR”中的主模式选择MMS设置为“更新事件Update”。这意味着每次TIM2计数器溢出产生更新事件时都会在其TRGO引脚上产生一个触发信号。TIM3 配置从定时器时钟源内部时钟同样APB172MHz。预分频器PSC设置为71与TIM2严格一致保证计数频率相同1MHz。自动重载值ARR设置为999与TIM2严格一致保证周期相同1ms。计数模式向上计数。PWM模式通道1配置为PWM模式1。脉冲宽度CCR1设置为500占空比50%。从模式配置这是关键将TIM3的“从模式控制寄存器SMCR”中的“触发选择TS”设置为“ITR1”这意味着选择内部触发源1对应的是TIM2的TRGO输出。具体对应关系需查芯片参考手册的“定时器内部触发连接”表格。将“从模式SMS”设置为“触发模式Trigger Mode, SMS‘110’”。在此模式下从定时器的计数器在收到有效的触发信号时启动。关键一步设置相位差 相位差90°对应的时间差是周期1ms的1/4即250us。由于计数频率是1MHz一个计数就是1us所以我们需要让TIM3相对于TIM2的触发信号延迟250个计数再开始。 如何实现这里有一个巧妙的方法设置从定时器TIM3的“重复计数器RCR”。在高级定时器中RCR用于延迟更新事件的发生。在通用定时器中我们可以利用一个特性在触发模式下从定时器可以在收到触发信号后延迟一段时间再启动。更通用的方法是使用一个中间定时器或通过主定时器的另一个通道产生带延迟的触发但对于简单的固定相位差我们可以通过软件在初始化时先手动设置从定时器的计数器CNT为一个初始值。 更直接且硬件精确的方法是利用主定时器的另一个输出比较通道来产生触发信号。配置TIM2的通道2为输出比较模式Output Compare设置其比较值CCR2为250代表250us。然后将TIM2的主模式输出MMS改为“比较匹配OC2REF”这样当TIM2计数到250时才会触发TRGO。TIM3收到此触发后开始从0计数那么TIM3的波形就天然比TIM2的波形晚了250us即90°相位差。3.2 HAL库代码实现示例以下是基于上述“主定时器比较匹配触发”思路的核心代码片段// 在 main() 函数中初始化部分 MX_TIM2_Init(); // 初始化TIM2为主定时器 MX_TIM3_Init(); // 初始化TIM3为从定时器 // 启动PWM输出 HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1); // 启动TIM2 CH1 HAL_TIM_PWM_Start(htim3, TIM_CHANNEL_1); // 启动TIM3 CH1 // 注意TIM3需要在触发模式下启动但HAL库的HAL_TIM_PWM_Start不会启动从模式计数器。 // 需要额外调用以下函数来使能从定时器等待触发。 HAL_TIM_Base_Start(htim3); // 启动TIM3的基单元使其处于等待触发状态MX_TIM2_Init函数的关键配置使用CubeMX生成后需微调htim2.Instance TIM2; htim2.Init.Prescaler 71; htim2.Init.CounterMode TIM_COUNTERMODE_UP; htim2.Init.Period 999; htim2.Init.ClockDivision TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload TIM_AUTORELOAD_PRELOAD_ENABLE; // ... 其他初始化 sConfigOC.OCMode TIM_OCMODE_PWM1; sConfigOC.Pulse 500; // CCR1占空比50% sConfigOC.OCPolarity TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_1); // 配置通道2为输出比较模式用于产生延迟触发 sConfigOC.OCMode TIM_OCMODE_ACTIVE; // 匹配时设置通道为有效电平 sConfigOC.Pulse 250; // CCR2相位差250个计数 HAL_TIM_OC_ConfigChannel(htim2, sConfigOC, TIM_CHANNEL_2); // 配置TIM2的主模式使用OC2REF作为触发输出(TRGO) __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_2, 250); // 设置CCR2值 TIM2-CR2 ~TIM_CR2_MMS; // 清除MMS位 TIM2-CR2 | TIM_TRGO_OC2REF; // 设置MMS为‘100’即OC2REF作为TRGOMX_TIM3_Init函数的关键配置htim3.Instance TIM3; htim3.Init.Prescaler 71; // 必须与TIM2相同 htim3.Init.Period 999; // 必须与TIM2相同 // ... 其他初始化与TIM2类似 // 配置TIM3的从模式触发源为ITR1(TIM2)模式为触发模式 __HAL_TIM_SET_INPUT(htim3, TIM_TS_ITR1); // 设置触发源 __HAL_TIM_SET_SLAVEMODE(htim3, TIM_SLAVEMODE_TRIGGER); // 设置从模式为触发3.3 动态调整相位差与频率上述配置实现了固定的90°相位差。如何在运行时动态调整呢调整相位差动态修改主定时器TIM2通道2的比较寄存器CCR2的值即可。因为相位差 (CCR2 / (ARR1)) * 360°。例如想改为180°相位差就将CCR2设置为500。使用__HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_2, new_phase_count)。调整频率同时修改主从定时器的自动重载值ARR和预分频PSC如果需要。注意修改主定时器ARR后相位差对应的CCR2值可能需要按比例缩放以保持角度不变。例如频率加倍周期减半ARR从999变为499那么原CCR2250应变为125以保持90°。更稳健的做法是先停止定时器修改ARR和CCR再重新使能。实操心得在动态修改定时器参数尤其是ARR时强烈建议先执行__HAL_TIM_DISABLE(htimx)停止定时器修改后再__HAL_TIM_ENABLE(htimx)重新使能。对于需要严格同步的场景可以同时操作主从定时器的使能位或使用定时器的预装载功能AutoReloadPreload ENABLE在更新事件发生时才将新值载入生效。4. 调试技巧与常见问题排查即使配置看起来正确实际用示波器测量时也可能遇到各种问题。以下是我在调试移相PWM时积累的一些经验和常见坑点。4.1 调试工具与观察方法示波器是必备工具至少需要双通道示波器来同时观察两路波形测量时间差。使用示波器的“光标”功能或“时间差测量”功能来精确测定相位延迟。利用IO口辅助调试在初始化代码的关键位置如定时器启动前、触发中断内翻转一个空闲的GPIO用示波器观察这个“调试信号”与PWM输出的关系可以清晰看到代码执行时序和触发是否发生。检查定时器状态寄存器通过调试器或串口打印查看主从定时器的状态寄存器SR特别是“触发中断标志TIF”和“更新中断标志UIF”确认触发事件是否按预期产生和捕获。4.2 常见问题速查表问题现象可能原因排查步骤与解决方案从定时器完全没有输出1. 从定时器未正确使能。2. 从模式配置错误SMS不是触发模式。3. 触发源选择错误TS未指向正确的主定时器。4. 主定时器未产生TRGO信号。1. 确认调用了HAL_TIM_Base_Start(htim_slave)。2. 检查SMCR寄存器SMS位是否为‘110’触发模式。3. 查阅芯片手册“内部触发连接表”确认ITRx与主定时器的对应关系。4. 检查主定时器CR2寄存器的MMS位确认已配置为更新或比较匹配输出。用示波器或调试IO观察主定时器是否运行。两路波形有相位差但值不对或不稳定1. 主从定时器时钟源或预分频不一致。2. 计算相位差对应的计数值有误。3. 在运行时动态修改参数时未处理同步问题。1. 确认主从定时器挂在同一APB总线且PSC设置完全相同。检查时钟树配置。2. 重新计算相位差计数 (相位角度 / 360°) * (ARR 1)。确保该值小于ARR。3. 修改ARR/CCR前停止定时器或使用预装载和更新事件。波形中有毛刺或偶尔错位1. 软件中断或高优先级任务打断了定时器关键操作。2. GPIO配置不当输出速度、模式。3. 硬件干扰或电源不稳。1. 避免在中断服务程序中进行复杂的浮点运算或耗时操作。修改定时器参数时临时关闭全局中断。2. 将PWM输出GPIO配置为高速模式如“Very High”推挽输出。3. 检查PCB布局确保电源去耦电容靠近MCU信号线远离噪声源。相位差在高频时误差变大1. 定时器时钟分辨率限制。2. 软件设置延迟。3. GPIO输出延迟差异。1. 提高定时器时钟频率减小PSC。计算最小相位分辨率 1 / 定时器时钟频率。2. 将相位设置操作放在定时器更新中断中并确保中断响应及时。3. 对于纳秒级精度要求需选择更高性能的MCU或使用专用PWM芯片。4.3 高级话题多路移相与更精确的控制对于需要多于两路移相或者需要360°范围内任意角度、高分辨率调整的场景可以考虑以下进阶方案级联多个从定时器TIM2作为主触发TIM3TIM3除了输出PWM其TRGO还可以触发TIM4如此级联。但需要注意累积误差。使用一个定时器的所有通道对于固定、非动态的移相可以精确计算每个通道的CCRx值实现多路固定相位差输出。这在某些步进电机驱动细分中很常见。结合DMA和预计算表对于需要生成复杂波形序列如正弦波PWM且要求多路移相的场景可以将一个周期的波形数据点预先计算好存入数组利用定时器触发DMA将数据依次搬运到各个通道的CCR寄存器中。通过为不同通道设置不同的数组起始偏移可以实现移相。这种方法灵活但对内存和DMA带宽有要求。使用高精度定时器HRTIM一些高端的STM32系列如STM32G4, STM32H7配备了高分辨率定时器HRTIM其分辨率可达皮秒级并且具有极其灵活的事件互连系统可以轻松实现复杂多路的同步和移相是高端数字电源和电机控制的理想选择。5. 项目总结与资源拓展通过这个项目我们深入挖掘了STM32定时器在波形生成特别是移相控制方面的强大能力。从理解移相的应用场景到剖析硬件定时器的主从模式原理再到一步步用HAL库完成配置并最终解决动态调整和调试中遇到的实际问题我们走完了一个完整的嵌入式功能开发闭环。我个人在实际操作中的体会是理解硬件寄存器远比单纯调用库函数更重要。CubeMX和HAL库极大地提高了开发效率但当你遇到时序要求苛刻或功能复杂的场景时直接查阅《参考手册》中关于定时器、触发互联的章节甚至直接操作寄存器往往是解决问题的捷径。例如主从模式中内部触发线ITR的映射关系在不同系列、不同型号的STM32上可能有细微差别库函数的抽象有时会隐藏这些细节。最后再分享一个小技巧在项目初期进行方案选型时不妨先用STM32CubeMX的图形化界面进行“纸上建模”。你可以通过拖拽配置定时器直观地看到它们之间的触发关系是否可行CubeMX会自动检查冲突并生成初始化代码框架这能帮你避免很多底层配置错误把精力集中在核心逻辑上。这个“基于STM32的移相波形输出”项目其核心思想——利用硬件定时器的同步机制来产生精确的时间差——可以延伸到许多其他领域比如生成SPWM、构建简易的DDS信号源、实现多轴插补运动控制等。希望这篇详细的拆解能为你打开一扇门让你手中的STM32释放出更强大的能量。

相关新闻

NE555呼吸灯电路:从原理到智能车集成的硬件实践指南

NE555呼吸灯电路:从原理到智能车集成的硬件实践指南

这次我们来看一个非常经典的硬件入门项目:用NE555定时器芯片搭建一个呼吸灯电路。这个项目不仅是电子爱好者的“Hello World”,更是智能车、机器人等嵌入式系统中常用的状态指示或氛围灯方案。它不依赖复杂的单片机编程,仅用几个基础元器件&a…

2026/8/7 2:21:25 阅读更多 →
情感化网页设计实战:从“甜蜜约会”项目看前端技术如何传递情感

情感化网页设计实战:从“甜蜜约会”项目看前端技术如何传递情感

1. 项目概述:从“甜蜜约会”看情感化设计的价值最近在复盘一个很有意思的私人项目,我把它称为“甜蜜约会”首页。这听起来可能不像一个严肃的技术项目,但恰恰是这种带有明确情感目标和场景定义的设计,最能考验一个前端开发者或产品…

2026/8/7 2:21:25 阅读更多 →
量化交易入门:从核心原理到Python实战,揭秘系统化投资方法论

量化交易入门:从核心原理到Python实战,揭秘系统化投资方法论

1. 量化交易:从神秘到可理解的入门提到“量化”,很多人的第一反应是华尔街、高频交易、复杂的数学模型和一群穿着西装、盯着多屏电脑的精英。它似乎被一层神秘的面纱笼罩,让人感觉高深莫测,离普通投资者很远。但事实上&#xff0c…

2026/8/7 2:21:25 阅读更多 →

最新新闻

AI辅助创作实践:QClaw如何成为悬疑小说的故事架构师

AI辅助创作实践:QClaw如何成为悬疑小说的故事架构师

1. 项目概述:当悬疑小说梦遇上AI创作工具作为一个悬疑故事的狂热爱好者,我脑子里总盘旋着各种离奇的情节和复杂的人物关系。但每次打开文档,面对空白的页面,那种“提笔忘字”的无力感就扑面而来。我知道故事的开头应该是一个雨夜&…

2026/8/7 3:07:49 阅读更多 →
MobTech SDK集成实战:聚合授权与内容发布到快手抖音B站

MobTech SDK集成实战:聚合授权与内容发布到快手抖音B站

最近在开发一个需要集成第三方登录功能的应用时,遇到了一个典型需求:用户希望能在快手、抖音、哔哩哔哩(B站)这几个主流短视频和内容平台分享内容,但我们的应用后端需要验证用户的身份。这引出了一个常见的技术选型问题…

2026/8/7 3:07:49 阅读更多 →
Keil工程迁移VsCode:彻底解决头文件报错与配置同步

Keil工程迁移VsCode:彻底解决头文件报错与配置同步

1. 从Keil到VsCode:嵌入式开发者的效率跃迁作为一名在嵌入式领域摸爬滚打了十多年的老鸟,我几乎见证了Keil MDK从经典到“经典”的全过程。不可否认,Keil(尤其是MDK-ARM和C51)在ARM Cortex-M和8051开发中,凭…

2026/8/7 3:07:49 阅读更多 →
数字孪生技术架构与工业设备预测性维护实践

数字孪生技术架构与工业设备预测性维护实践

1. 从概念到实践:我理解的数字孪生体技术最近几年,“数字孪生”这个词在工业、城市管理、甚至医疗领域被频繁提及,听起来很高大上,但很多刚接触的朋友可能会觉得它有点“虚”,像是一个包装出来的营销概念。作为一个在工…

2026/8/7 3:07:49 阅读更多 →
Node.js依赖管理实战:从package.json到锁文件,解决团队协作环境不一致问题

Node.js依赖管理实战:从package.json到锁文件,解决团队协作环境不一致问题

“这个项目本地跑得好好的,怎么一到你电脑上就报错了?”如果你在团队协作中听过这句话,大概率是 Node.js 依赖管理在作祟。很多开发者以为npm install就是 Node.js 的全部,直到遇到package-lock.json冲突、node_modules臃肿、或者…

2026/8/7 3:07:49 阅读更多 →
高效获取Steam创意工坊模组:WorkshopDL跨平台下载完整指南

高效获取Steam创意工坊模组:WorkshopDL跨平台下载完整指南

高效获取Steam创意工坊模组:WorkshopDL跨平台下载完整指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊的精彩模组而烦恼吗&#xf…

2026/8/7 3:06:49 阅读更多 →

日新闻

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南

为什么scrcpy成为Android投屏的终极解决方案:完整实战指南 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 想要将Android手机屏幕完美投射到电脑上,享受大屏操作的自…

2026/8/7 0:00:19 阅读更多 →
如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南

如何在5分钟内掌握Tom Select:打造现代化表单选择器的终极指南 【免费下载链接】tom-select Tom Select is a lightweight (~16kb gzipped) hybrid of a textbox and select box. Forked from selectize.js to provide a framework agnostic autocomplete widget wi…

2026/8/7 0:00:19 阅读更多 →
5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件

5分钟快速上手:NSZ压缩工具终极指南,轻松管理Switch游戏文件 【免费下载链接】nsz NSZ - Homebrew compatible NSP/XCI compressor/decompressor 项目地址: https://gitcode.com/gh_mirrors/ns/nsz 你是否在为Nintendo Switch游戏文件占用大量存储…

2026/8/7 0:00:19 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →