STM32开发三板斧:在线调试、看门狗与跑飞诊断实战指南
1. 项目概述STM32调试的“三板斧”搞STM32开发的兄弟尤其是做工业控制、汽车电子或者长时间运行设备的最怕什么不是代码写不出来而是代码“跑飞了”。你辛辛苦苦调试好的程序一上电跑个几天几夜或者现场环境一干扰单片机突然就“死”了或者行为变得诡异。这时候如果没有趁手的调试手段定位问题就像大海捞针。今天要聊的就是应对这种场景的“三板斧”在线调试、看门狗和跑飞调试。这不是三个孤立的技术而是一套组合拳是保证STM32项目稳定、可靠运行的必备技能。无论你是刚接触STM32的新手还是已经做过几个项目的老鸟这套方法都能帮你从“祈祷别出问题”的被动状态切换到“出了问题我能快速搞定”的主动状态。在线调试让你能在开发阶段洞悉程序的一举一动看门狗是程序最后的“保险丝”能在程序失控时强行拉回正轨而跑飞调试技巧则是当程序真的“飞”了之后你手里那把能定位“坠机地点”的钥匙。接下来我们就掰开揉碎了把这套组合拳的每一个招式讲清楚。2. 核心思路构建分层的可靠性防御体系处理STM32的异常不能指望单一手段一劳永逸。我的核心思路是构建一个从预防、监控到事后诊断的完整链条。这就像给程序穿上了一套铠甲在线调试是铠甲打造和试穿的过程确保合身无误看门狗是铠甲上的自动报警和复位机关而跑飞调试技巧则是铠甲破损后用来分析破损痕迹、找到攻击来源的工具箱。2.1 为什么需要组合使用很多新手会认为我加了看门狗程序就不会死了问题就解决了。这是一个巨大的误区。看门狗只能解决“程序是否在运行”的问题但解决不了“程序为什么跑飞”以及“跑飞前发生了什么”的问题。它更像一个粗暴的“重启按钮”按下去系统是活了但病根没找到下次还会犯。在线调试如JTAG/SWD作用在开发阶段。它允许你单步执行、设置断点、实时查看和修改变量、寄存器内存。它的目标是在问题发生前或在受控环境下主动发现并消灭逻辑错误、资源竞争如中断与主循环冲突、栈溢出等隐患。但它无法用于已部署在现场的设备。独立看门狗IWDG和窗口看门狗WWDG作用在产品运行阶段。它们是一种被动的、基于时间的监控机制。要求程序必须在规定时间内“喂狗”否则就强制复位。它的目标是确保系统在发生不可预知的软件错误如死循环、阻塞或轻微外部干扰时能够自动恢复运行保证功能可用性。但它不提供任何错误原因信息。跑飞调试技巧作用在问题诊断阶段。当看门狗复位发生后我们需要知道复位前程序死在了哪里、当时的系统状态如何。这依赖于一些“埋点”和“记录”技术比如分析复位标志寄存器、使用备份寄存器Backup Register或SRAM中特定区域保存错误代码、关键变量快照甚至利用串口输出最后的信息。它的目标是实现问题复现和根因分析。所以一个健壮的系统应该是开发时用在线调试精雕细琢产品中靠看门狗守住运行底线出问题时用调试技巧快速定位。三者环环相扣缺一不可。2.2 工具链与思想准备在动手之前我们需要统一“武器”和“思想”。硬件上一块支持SWD/JTAG的调试器如ST-LINK、J-Link是必须的。软件上Keil MDK、IAR或STM32CubeIDE任选其一它们都深度集成了调试和看门狗配置功能。我更推荐STM32CubeMX IDE的组合图形化配置能减少低级错误。思想上要明确调试不是碰运气而是有策略的侦查。你需要像侦探一样假设各种犯罪现场异常条件并提前布置好线索调试信息。永远不要相信程序“应该”不会出错要假设它“一定会”出错然后思考出错时你如何能知道。3. 核心细节解析看门狗的双重奏与调试接口这一章我们深入两个核心模块的内部理解它们的工作原理和配置要点这是正确使用它们的基础。3.1 独立看门狗IWDG与窗口看门狗WWDG的抉择STM32内置两种看门狗用途不同不能乱用。独立看门狗IWDG核心原理基于独立的低速内部时钟LSI约32kHz精度较差但可靠。一旦启用一个递减计数器开始从重载值向下计数计数到0则产生系统复位。你的程序必须在计数器减到0之前执行“喂狗”操作将重载值重新写入计数器使其重新开始递减。特点时钟独立于主系统即使主时钟失效如晶振停振IWDG依然工作。因此它主要防范由外部电磁干扰、晶振故障、软件死循环等引起的程序完全停滞。配置关键预分频器Prescaler和重载值Reload Value共同决定超时时间。Timeout (Reload_Value 1) * (Prescaler / LSI_Freq)。LSI频率有偏差设计时要留足余量比如计算40ms实际可能35ms或45ms。喂狗时机必须在主循环的“安全路径”上喂狗。绝对不能在某个可能被阻塞或无法定期执行的中断服务程序ISR中喂狗。一个经典错误是在串口接收中断里喂狗如果收不到数据中断不触发狗就饿死了。寄存器写保护IWDG的预分频器和重载值寄存器有写保护修改前需要先解锁向IWDG_KR写入0x5555修改后再锁定写入0x0000或直接喂狗写入0xAAAA。窗口看门狗WWDG核心原理基于APB1总线时钟PCLK1。它有一个“窗口”你只能在计数器值介于某个“窗口”上限W[6:0]和下限0x3F之间时喂狗。过早计数器值 窗口值或过晚计数器减到0x3F以下喂狗都会触发复位。特点用于监测程序是否跑得太快或出现了严重的时序偏离。例如一个本应运行50ms的任务如果因为某种错误在10ms内就完成了过早喂狗会触发复位。这适合监控由中断丢失、任务调度异常等引起的逻辑错误。配置关键窗口值Window Value和计数器初值超时时间 (计数器初值 - 0x3F) * (4096 * WWDG_Prescaler / PCLK1)。窗口时间 (计数器初值 - 窗口值) * ...。应用场景适用于对任务执行周期有严格要求的场景。比如一个每100ms必须执行一次但执行时间不能短于80ms的任务。注意对于大多数应用IWDG足以满足需求。WWDG配置相对复杂且需要更精确的时钟。除非有明确的窗口时间监测需求否则优先使用IWDG。3.2 SWD/JTAG在线调试接口深度探秘我们常用SWD接口因为它线少SWDIO SWCLK GND 可选RESET。但你知道调试器是如何“控制”CPU的吗调试核心ARM Cortex-M内核内置了调试访问端口DAP和嵌入式跟踪宏单元ETM/ITM。DAP是调试器与内核通信的桥梁而ITM指令跟踪宏单元是输出调试信息如printf重定向的硬件模块效率远高于串口。连接与初始化上电后调试器通过SWD线发送特定序列激活内核的调试逻辑。此时内核会暂停如果设置了复位后暂停等待调试器发号施令。这就是为什么连接调试器后程序有时不跑的原因。断点的秘密断点分为硬件断点和软件断点。Cortex-M通常提供有限的硬件断点单元如6个。设置断点时调试器会利用这些单元。当断点数量超过硬件限制时IDE会自动使用软件断点修改程序内存插入特殊断点指令但这在只读存储器如Flash中可能受限。实时变量查看这依赖于系统视图System Viewer功能。IDE通过DAP不断地、周期性地读取指定内存地址的内容。频繁查看大量变量会影响程序实时性在调试时间敏感代码时要注意。理解这些你就知道为什么有时候下载程序需要按复位键为什么断点设多了会失效以及为什么ITM打印比串口快得多。4. 实操过程从配置到问题复现现在我们动手把理论变成代码和操作。我会以STM32CubeMX和Keil MDK为例展示完整流程。4.1 使用STM32CubeMX配置双看门狗IWDG配置在Pinout Configuration标签页找到IWDG。Activated打勾。Prescaler选择64分频根据LSI32kHz 分频后时钟500Hz。Reload Value设置为4095。计算超时时间(40951) * (64 / 32000) ≈ 8.192秒。这是一个比较常见的值。Window Value对IWDG无效。生成代码后在main.c的while(1)循环中你会看到自动生成的HAL_IWDG_Refresh(hiwdg)语句。确保它在你主循环的“主干道”上不会被任何while死等或阻塞函数绕过。WWDG配置选做找到WWDG并激活。配置Prescaler为8。设置Counter Reload Value为127Window Value为80。计算假设PCLK136MHz WWDG时钟36MHz/84.5MHz 计数周期1/4.5MHz≈0.222us。超时时间 ≈(127-63)*0.222us ≈ 14.2us。窗口时间起点 ≈(127-80)*0.222us ≈ 10.4us。这意味着必须在计数器从127递减到80的这个时间窗口内约10.4us到14.2us之间喂狗。生成代码后需要在指定窗口内调用HAL_WWDG_Refresh(hwwdg)。4.2 在Keil中实施高级在线调试逻辑分析仪Logic Analyzer这是最被低估的调试功能之一。在调试模式下点击View - Analysis Windows - Logic Analyzer。点击左上角的Setup可以添加要观察的变量或GPIO引脚。例如添加GPIOA-ODR的某一位来观察一个LED控制信号的波形。设置采样周期。运行程序你可以像示波器一样看到信号随时间的变化对于调试时序问题、中断频率、PWM输出无比直观。事件查看器Event ViewerView - Analysis Windows - Event Viewer。它可以图形化显示中断的进入和退出、任务切换如果用了RTOS等事件。当你觉得程序响应慢或者中断好像没触发时用它一看便知。ITM重定向printf终极打印方案在Debug设置中确认Trace选项卡下Core Clock已设置并勾选了Trace Enable和ITM Stimulus Port 0。在代码中重写_write函数对于ARMCC或使用HAL库的ITM_SendChar。// 示例重定向printf到ITM #include stdio.h int _write(int file, char *ptr, int len) { for (int i 0; i len; i) { ITM_SendChar(*ptr); } return len; }在调试状态下打开View - Serial Windows - Debug (printf) Viewer。现在你的printf输出会实时显示在这里不占用串口速度极快且不影响程序实时性。4.3 实现跑飞信息捕获与诊断这是体现功力的地方。目标是在看门狗复位前把“犯罪现场”的信息保存下来。利用备份寄存器Backup Register备份寄存器位于备份域由VBAT供电主电源掉电后信息仍能保持如果接了电池。首先在CubeMX中使能RCC下的Backup Domain。在程序初始化时检查备份寄存器中的标志。例如我们约定BKP_DR1存放错误代码。// 程序启动时检查 HAL_PWR_EnableBkUpAccess(); // 使能备份域访问 if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) ! RESET) { // 发生了独立看门狗复位 uint32_t error_code HAL_RTCEx_BKUPRead(hrtc, RTC_BKP_DR1); printf(Last Error Code before IWDG Reset: 0x%lX\n, error_code); // 记录或发送错误代码 __HAL_RCC_CLEAR_RESET_FLAGS(); // 清除复位标志 } // 正常初始化...在程序可能出错的地方将错误代码写入备份寄存器。void Some_Critical_Function(void) { if (something_wrong) { HAL_PWR_EnableBkUpAccess(); HAL_RTCEx_BKUPWrite(hrtc, RTC_BKP_DR1, 0xDEADBEEF); // 写入特定错误码 while(1); // 故意死循环触发看门狗 } }利用未初始化变量区.noinit段这种方法不需要备份域信息在软复位后可能保留取决于具体型号和复位类型。在链接脚本中定义一个不被初始化的段或者在代码中声明一个位于特定地址的变量。// 在某个头文件中声明 __attribute__((section(.noinit))) volatile uint32_t g_last_error; __attribute__((section(.noinit))) volatile uint32_t g_program_counter_snapshot;在发生严重错误时将错误信息和可能的PC指针通过__current_pc()或类似内联汇编获取保存到这些变量中。程序复位后首先检查这些变量是否有有效值。注意上电复位会清除这些内容但看门狗复位可能不会。“死亡快照”法在SRAM中划定一块区域例如末尾的256字节定期将关键变量如循环计数器、状态机状态、传感器最新值、栈指针等拷贝过去。当看门狗复位发生时这块内存大概率保持原样。复位后优先将这块内存的内容通过串口或保存到Flash中读出来分析。这能帮你看到程序“死”前最后一刻的系统状态。5. 常见问题与排查技巧实录这里是我和同事们多年踩坑积累下来的经验很多在官方手册里找不到。5.1 看门狗相关“坑点”问题1看门狗复位了但好像没起作用程序还是死了。排查首先确认看门狗确实已正确配置并启动。在调试器中单步执行到初始化看门狗之后查看IWDG-KR寄存器值是否为0xCCCC表示IWDG已由硬件启用。更常见的原因是喂狗位置不当。检查你的喂狗函数HAL_IWDG_Refresh()是否放在了一个可能被长时间阻塞如HAL_Delay(10000)或根本执行不到的地方。一个确保喂狗的好方法是将它放在主循环while(1)的顶部或底部并确保所有分支最终都能回到这里。问题2调试时程序正常拔掉调试器就死机看门狗不断复位。排查这是初始化时序或中断优先级问题的典型表现。调试器连接时会轻微改变时序可能掩盖了竞争条件。重点检查系统时钟配置是否正确特别是使用外部晶振HSE时拔掉调试器后时钟源是否成功起振可以在初始化后读取RCC-CFGR寄存器确认时钟源。中断服务程序中是否有耗时过长的操作或者是否发生了中断嵌套导致某个低优先级中断一直无法响应高优先级中断中喂狗是危险的。堆栈Stack大小是否足够在startup_stm32xxxx.s文件或IDE的配置中增大堆栈大小试试。栈溢出是导致随机死机的元凶之一。问题3喂狗了但看门狗还是复位了。排查计算一下你的喂狗间隔是否真的小于看门狗超时时间。考虑最坏情况下的循环执行时间。如果使用了RTOS确保喂狗任务具有足够高的优先级且不会被其他任务长期阻塞。另外检查LSI时钟的精度实际超时时间可能比计算值短需要留出30%-50%的余量。5.2 在线调试疑难杂症问题4无法连接调试器Cannot connect to target。排查清单物理连接线是否接好SWDIO、SWCLK、GND、3.3V或VCC和RESET可选但推荐。尝试降低SWD时钟频率在调试器设置里。电源目标板供电是否稳定用万用表量一下3.3V。电流是否足够复位电路有些板子的复位电路设计特殊调试器无法可靠控制复位。尝试手动按一下板子的复位键再连接。芯片选项字节Option Bytes是否禁用了SWD接口通过STM32CubeProgrammer或ST-LINK Utility连接并读取选项字节检查SWD是否被禁用。如果是需要重新擦除并编程选项字节。Boot引脚确保BOOT0和BOOT1引脚处于从主Flash启动的模式通常都是下拉到地。问题5断点不生效或程序无法暂停。排查首先确认编译时开启了调试信息Debug配置下Generate Debug Information勾选。如果硬件断点用满了IDE会使用软件断点。软件断点通过修改Flash内容实现如果你在只读的Flash区域比如常量数组设断点可能会失败。尝试在代码的不同位置设断点。另外检查优化等级高优化等级如-O2 -O3可能会重组代码导致断点行号对不上尝试使用-O0无优化进行调试。5.3 跑飞诊断进阶技巧技巧1分析HardFault_Handler。 程序跑飞最常进入的就是硬错误中断。默认的HardFault_Handler是个死循环。你需要改造它从中提取错误信息。void HardFault_Handler(void) { __asm volatile ( tst lr, #4\n\t ite eq\n\t mrseq r0, msp\n\t mrsne r0, psp\n\t b HardFault_Handler_C\n\t ); }然后实现HardFault_Handler_C函数读取SCB-CFSR配置故障状态寄存器、SCB-HFSR硬错误状态寄存器、SCB-MMFAR内存管理故障地址寄存器和SCB-BFAR总线故障地址寄存器。把这些寄存器值保存下来或打印出去就能知道是总线错误、内存管理错误、用法错误中的哪一种甚至能定位到出错的指令地址。网上有很多现成的硬错误分析代码库可以直接集成。技巧2监控栈使用情况Stack Canary。在栈顶和栈底放置特定的“魔数”例如0xDEADBEEF。在喂狗函数或空闲任务中定期检查这些魔数是否被修改。如果被修改了说明栈已经溢出侵蚀到了这些区域立即记录错误并采取行动。这能帮你提前发现栈溢出问题而不是等到程序彻底崩溃。技巧3记录程序流程“面包屑”。在代码的关键分支、函数入口出口向一个循环缓冲区写入简短的ID或PC值。这个缓冲区可以放在.noinit段。当系统复位后分析这个缓冲区里的序列就能大致还原出复位前程序执行了哪些函数、经过了哪些分支对于诊断复杂的状态机错误非常有效。

相关新闻

大厂面试算法题解析与C++高性能编程实战

大厂面试算法题解析与C++高性能编程实战

1. 为什么大厂面试都爱考算法题?最近帮团队面试了几个C后端开发的候选人,发现一个有趣的现象:那些在算法题环节表现优秀的候选人,在实际编码和系统设计环节往往也能给出更优的解决方案。这让我想起自己当年准备面试时,…

2026/8/24 6:37:18 阅读更多 →
ECharts圆环图实战:解决多层嵌套、间隙与标题定位难题

ECharts圆环图实战:解决多层嵌套、间隙与标题定位难题

1. 从“能用”到“好看”:圆环图设计的三个核心痛点在数据可视化项目中,ECharts的饼图(type: pie)因其强大的定制能力,常被用来绘制各种圆环图。然而,从产品经理丢过来一张“参考图”到最终在页面上呈现一个…

2026/8/24 6:36:17 阅读更多 →
Rockchip平台双屏独立旋转调试:从DRM驱动到HWC的完整解决方案

Rockchip平台双屏独立旋转调试:从DRM驱动到HWC的完整解决方案

1. 项目概述:双屏旋转调试的“硬骨头”在嵌入式显示开发里,双屏异显(一个主屏一个副屏,显示不同内容)已经不算新鲜事,但当你需要在两块屏幕上分别实现不同的旋转方向时,比如主屏横屏显示仪表&am…

2026/8/24 6:36:17 阅读更多 →

最新新闻

Java面试全攻略:Spring与微服务核心技术解析

Java面试全攻略:Spring与微服务核心技术解析

1. 互联网大厂Java面试全攻略:从Spring到微服务实战解析作为一名经历过数十场技术面试的Java开发者,我深知大厂面试的考察重点和应对策略。今天我们就以"超好吃"同学的面试经历为蓝本,深度拆解Java技术栈的核心考点,不仅…

2026/8/24 7:19:30 阅读更多 →
Cesium Wind:三维地球动态风场可视化从原理到实战

Cesium Wind:三维地球动态风场可视化从原理到实战

1. 项目引入:当三维地球遇见动态风场如果你正在寻找一个能将枯燥的气象数据,变成在三维地球上流动、旋转、一目了然的动态风场可视化方案,那么你很可能已经听说过或者正在寻找类似“Cesium Wind”这样的工具。作为一个长期在WebGIS和三维可视…

2026/8/24 7:19:30 阅读更多 →
Yank Note:面向开发者的本地优先超级笔记环境与知识管理实践

Yank Note:面向开发者的本地优先超级笔记环境与知识管理实践

1. 从“信息收集”到“知识内化”的困境不知道你有没有这样的感觉:每天在电脑前工作,浏览器标签页越开越多,各种文档、代码片段、临时想法、会议记录散落在不同的角落——微信聊天记录、钉钉消息、网页文章、本地Markdown文件、甚至随手打开的…

2026/8/24 7:19:30 阅读更多 →
LTX-2.5多媒体AI工具:从环境搭建到生产部署的完整实践指南

LTX-2.5多媒体AI工具:从环境搭建到生产部署的完整实践指南

在计算机视觉和多媒体处理领域,图像和视频的质量增强、内容生成一直是核心且富有挑战性的任务。从老照片修复到高清视频制作,再到新兴的数字人内容创作,开发者们常常需要处理分辨率不足、细节模糊、帧率不稳等问题。LTX-2.5作为一个集成了多种…

2026/8/24 7:19:30 阅读更多 →
Oracle RAC一键自动化部署:从原理到实践,基于OL8.8与11gR2的集群环境搭建

Oracle RAC一键自动化部署:从原理到实践,基于OL8.8与11gR2的集群环境搭建

1. 项目缘起:为什么我们需要“一键安装”Oracle RAC?在数据库运维和架构领域,Oracle Real Application Clusters(RAC)一直是一个既让人向往又让人头疼的存在。向往的是它提供的高可用性、可扩展性和负载均衡能力&#…

2026/8/24 7:19:30 阅读更多 →
R语言交互效应图绘制:使用sjPlot包实现优雅可视化

R语言交互效应图绘制:使用sjPlot包实现优雅可视化

1. 从“能画”到“画好”:为什么交互效应图需要优雅呈现在数据分析,尤其是涉及回归模型的项目里,我们常常会碰到一个核心问题:如何向别人(无论是合作者、审稿人还是老板)清晰、直观地解释一个交互效应&…

2026/8/24 7:18:30 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/23 12:10:44 阅读更多 →
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/22 3:22:48 阅读更多 →