STM32定时器中断:从原理到实战,掌握嵌入式实时控制核心
1. 从“轮询”到“中断”为什么定时器中断是嵌入式开发的基石如果你刚开始玩STM32可能还在用HAL_Delay或者自己写个for循环来“数数”实现延时。这没问题就像学走路先从爬开始。但当你需要让单片机同时“一心多用”——比如一边控制LED闪烁一边等待按键按下还要定时去读取传感器数据时这种“轮询”的方式就会让你捉襟见肘。CPU会像个焦虑的监工不停地去检查“按键按了吗没有。时间到了吗没有。” 绝大部分时间都浪费在无效的查询上真正要干的活反而被耽搁了。这时“中断”机制就是你的救星。而“定时器中断”则是中断家族中最常用、最核心的成员之一。它就像一个精准的闹钟你设定好“每隔1秒响一次”然后就可以放心地去干别的事。时间一到闹钟定时器会“打断”CPU当前的工作CPU立刻去处理你预设的“响铃任务”中断服务函数比如翻转一下LED的状态处理完再回来继续刚才的活。整个过程是自动的、抢占式的效率极高。STM32F103的定时器TIM功能非常强大从基本定时、输出PWM波、输入捕获到编码器接口而这一切高级功能的基础往往都离不开定时器中断。理解了定时器中断你就拿到了开启STM32实时控制世界大门的钥匙。这篇文章我就以最常用的通用定时器TIM2为例手把手带你从原理到代码彻底吃透STM32F103的定时器中断并分享几个我踩过的大坑和调试技巧。2. 核心原理拆解定时器是如何“定时”并产生中断的在深入代码之前我们必须先搞清楚定时器工作的几个核心概念。很多人配置失败不是代码写错了而是根本没理解这些参数之间的关系。2.1 时钟源与分频定时器的“心跳”从哪里来STM32的定时器不是凭空计时的它需要一个稳定的“心跳”——时钟信号。对于STM32F103定时器的时钟源通常来自APB1总线TIM2、3、4或APB2总线TIM1。以TIM2为例它的时钟挂载在APB1上。这里有个关键点在标准库的默认初始化后如果APB1的预分频系数不为1定时器的时钟频率会是APB1时钟的2倍。例如系统时钟为72MHzAPB1预分频器设为2分频即36MHz那么连接到定时器的实际时钟CK_INT会是72MHz。这是硬件设计上的一个倍频机制目的是为了让定时器在总线频率较低时仍能获得较高的计时精度。在HAL库中这个倍频关系是自动处理的我们通常只需要关注最终的定时器时钟频率即可。假设我们最终得知TIM2的时钟源频率TIMxCLK是72MHz。2.2 预分频器与自动重装载值如何设定“闹钟”间隔定时器有了72MHz的心跳这太快了一秒钟能数7200万次我们需要通过两个寄存器来把这个速度降下来设定成我们需要的周期。预分频器PSC, Prescaler 它的作用是对输入时钟进行分频。这是一个16位的寄存器值可以是0~65535。写入PSC的值实际的分频系数是PSC 1。为什么是PSC1这是硬件设计。如果你写PSC0则不分频1分频写PSC71就是72分频。计算 假设我们写入PSC 7199。那么分频系数 7199 1 7200。经过预分频器后定时器的计数时钟频率就变成了CK_CNT TIMxCLK / (PSC 1) 72,000,000 Hz / 7200 10,000 Hz。这意味着现在定时器每秒钟可以计数10000次或者说计数一次的时间是 1/10000 秒 0.1 毫秒。自动重装载寄存器ARR, AutoReload Register 这是定时器计数的上限。定时器从0开始向上计数每来一个CK_CNT脉冲就加1当计数器的值等于ARR中设定的值时就会发生一次“更新事件”并且计数器清零重新开始计数。计算中断周期 结合PSC和ARR我们就可以算出定时器产生一次更新事件也就是触发一次中断的周期。公式定时中断周期 T (ARR 1) * (PSC 1) / TIMxCLK举例 如果我们想要一个1秒1000毫秒的定时中断。我们已经知道CK_CNT 10,000 Hz即计数一次0.1ms。那么要让0.1ms累加到1000ms需要计数的次数就是1000ms / 0.1ms 10000次。所以我们设置ARR 10000 - 1 9999。因为计数器是从0数到ARR总共是ARR1次。代入公式验证T (99991) * (71991) / 72,000,000 10000 * 7200 / 72,000,000 1秒。简单记忆PSC负责控制定时器“数数”的快慢ARR负责控制“数多少下”算一轮。两者配合共同决定了中断的周期。2.3 中断使能与更新事件如何让“闹钟”响铃配置好PSC和ARR只是设好了闹钟的时间和周期要让闹钟“响”产生中断还需要打开几个开关更新中断使能 需要设置定时器的中断使能寄存器如TIM_IT_UPDATE告诉定时器“当你发生更新事件计数到ARR时要产生一个中断请求。”NVIC配置 NVIC嵌套向量中断控制器是STM32的中断“总调度”。你需要在这里开启对应定时器的中断通道例如TIM2_IRQn并设置它的优先级。即使定时器自己产生了中断请求如果NVIC没开绿灯CPU也收不到。中断服务函数ISR 这是中断发生后CPU要去执行的函数。对于STM32标准库函数名是固定的比如TIM2_IRQHandler。在HAL库中你需要在回调函数里处理。清除中断标志 在中断服务函数里必须要检查并清除对应的中断标志位如TIM_SR_UIF。如果不清除中断会连续不断地触发导致CPU一离开中断又立刻进入仿佛卡死。这是新手最常踩的坑之一。注意 定时器中断属于“内部事件中断”由芯片内部外设触发区别于GPIO引脚触发的外部中断。其响应速度极快稳定性高是执行周期性任务的理想选择。3. 两种开发环境下的实战代码从CubeMX到寄存器理论懂了我们来点实在的。我会分别用STM32CubeMXHAL库和标准库两种方式演示如何配置TIM2实现1秒定时中断并闪烁一个LED。3.1 使用STM32CubeMX HAL库配置推荐新手HAL库封装性好CubeMX图形化配置直观能快速上手。CubeMX工程配置在Pinout Configuration标签页左侧选择Timers-TIM2。将Clock Source设置为Internal Clock内部时钟。在下方的Parameter Settings中Prescaler (PSC - 16 bits value) 填入7199。 (根据你的系统时钟调整目标是让Counter Clock接近10KHz)Counter ModeUp向上计数。Counter Period (AutoReload Register - 16 bits value) 填入9999。auto-reload preload 使能Enable推荐可避免在更新时产生毛刺。此时下方会计算并显示Update event的频率为 1 Hz 周期为 1000 ms。这正是我们想要的。转到NVIC Settings标签勾选TIM2 global interrupt使能NVIC中断。生成代码与用户代码编写 CubeMX生成代码后在main.c中我们需要启动定时器并编写中断回调函数。/* 在main函数初始化部分启动定时器中断 */ HAL_TIM_Base_Start_IT(htim2); // 启动TIM2并以中断模式运行 /* 在main.c文件末尾或单独的stm32f1xx_it.c中找到TIM2的中断服务函数但HAL库已处理好了框架。 我们需要重写定时器更新中断的回调函数 */ /* 在main.c的USER CODE BEGIN 4区域或者自己新建的文件中 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* 判断是否是TIM2触发的中断 */ if (htim-Instance TIM2) { // 在这里执行你的周期性任务例如翻转LED HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); } }HAL库的优点 中断标志的清除由库函数HAL_TIM_IRQHandler(htim2)在TIM2_IRQHandler中自动完成我们只需要关心业务逻辑回调函数。结构清晰不易出错。3.2 使用标准库配置深入理解标准库更接近寄存器有助于理解本质。我们以最常见的72MHz系统时钟为例。#include stm32f10x.h void TIM2_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 第1步开启时钟 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* 第2步配置定时器时基单元 */ TIM_TimeBaseStructure.TIM_Period 9999; // ARR值设定为10000-1 TIM_TimeBaseStructure.TIM_Prescaler 7199; // PSC值7200分频 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频与死区相关基本定时不用管 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStructure.TIM_RepetitionCounter 0; // 重复计数器高级定时器用通用定时器写0 TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); /* 第3步使能定时器更新中断 */ TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); /* 第4步配置NVIC */ NVIC_InitStructure.NVIC_IRQChannel TIM2_IRQn; // TIM2中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; // 抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; // 子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); /* 第5步启动定时器 */ TIM_Cmd(TIM2, ENABLE); } /* 第6步编写中断服务函数通常在stm32f10x_it.c中 */ void TIM2_IRQHandler(void) { /* 检查是否是更新中断 */ if (TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { /* 清除中断标志位 -- 这一步至关重要 */ TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /* 用户任务例如翻转LED */ GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5))); } }标准库的关键点 你必须手动在中断服务函数中检查并清除中断标志位TIM_IT_Update。忘记清除标志位是导致程序“跑飞”或表现异常的经典原因。4. 避坑指南与高级应用那些数据手册没明说的事配置代码跑起来LED开始闪烁这只是第一步。在实际项目中你会遇到更多复杂情况。4.1 中断服务函数执行时间过长中断服务函数ISR应该尽可能短小精悍。如果你的ISR里做了复杂的运算、调用了printf、或者进行了长时间的延时如HAL_Delay会导致两个严重问题错过其他中断 高优先级的中断虽然能打断低优先级的ISR但如果ISR本身太长同级或低优先级的中断可能因为等待时间过长而丢失。影响主循环 CPU大部分时间被困在ISR里主循环的代码得不到执行程序响应变慢。解决方案标志位法 在ISR中只设置一个全局的标志变量如volatile uint8_t tim2_update_flag 0;然后在主循环的while(1)中检查这个标志位并执行实际任务。// 在中断中 void TIM2_IRQHandler(...) { if(...) { TIM_ClearITPendingBit(...); tim2_update_flag 1; // 仅设标志 } } // 在主循环中 while(1) { if(tim2_update_flag) { tim2_update_flag 0; // 执行耗时的任务 ProcessData(); } // ... 其他任务 }使用DMA 对于定时触发的数据搬运如ADC规则转换后传输应使用DMA让硬件在后台完成完全不占用CPU。4.2 定时不准的排查思路你觉得设了1秒但用示波器或逻辑分析仪一看可能是1.001秒或者0.999秒甚至偏差更大。检查时钟树 这是最根本的。你的HSE外部高速晶振是多少HSI内部RC精度较差不推荐用于精确定时。在SystemInit()或CubeMX的Clock Configuration中确认最终供给APB1的时钟频率是否真的是你计算时假设的值如72MHz。APB1预分频系数会影响定时器输入时钟。检查PSC和ARR的计算 确保你的计算没有错误。记住公式定时周期 (ARR1) * (PSC1) / TIMxCLK。ARR和PSC都是16位寄存器最大值65535如果需要很长的定时可能需要组合使用。中断响应延迟 从定时器溢出到CPU真正开始执行ISR存在微小的延迟中断响应时间。对于us级别的精确定时这个延迟不可忽略。但对于ms、s级别的定时其影响微乎其微。ISR本身耗时 如果ISR执行时间过长且中断频率很高会累积误差。确保ISR轻量。4.3 多个定时器中断的优先级管理当你的系统中有多个中断源如TIM2中断、USART1接收中断、EXTI按键中断时合理的优先级设置至关重要。NVIC的中断优先级分为抢占优先级和子优先级。抢占优先级 高抢占优先级的中断可以打断正在执行的低抢占优先级的中断。类似于医院的急诊插队。子优先级 当两个中断同时发生且抢占优先级相同时子优先级高的先执行。如果它们同时挂起子优先级高的先被响应。配置原则对实时性要求最高的任务如电机控制PWM、紧急故障保护赋予最高的抢占优先级。对实时性要求一般的周期性任务如数据采样、LED闪烁赋予中等或较低的抢占优先级。对于非紧急任务如串口打印、按键扫描可以放在主循环或低优先级中断中。在CubeMX的NVIC Configuration中可以图形化地分配优先级。注意STM32F103使用4位优先级分组你可以通过HAL_NVIC_SetPriorityGrouping()设置分组来决定多少位用于抢占优先级多少位用于子优先级。4.4 定时器中断与其他模式的联动定时器中断不仅仅是简单的定时。它是许多高级功能的触发器PWM输出 可以在更新中断中动态修改CCR捕获/比较寄存器的值实现PWM占空比的动态调整或复杂的波形序列。输入捕获 结合更新中断和捕获中断可以高精度测量脉冲宽度或频率。例如在更新中断中记录“溢出次数”在捕获中断中记录当前计数值两者结合可以测量远长于单个定时周期的脉冲。编码器模式 定时器在编码器模式下计数器会根据正交编码器的旋转方向自动增减。你可以开启更新中断在计数器溢出或下溢时进行位置计数的软件扩展实现多圈计数。5. 调试技巧与实战心得最后分享几个我调试定时器中断时觉得非常实用的技巧。1. 用IO口翻转来测量中断响应时间和ISR执行时间这是最直观的硬件调试方法。在ISR的入口和出口分别用一条语句翻转一个空闲的GPIO引脚。void TIM2_IRQHandler(void) { GPIO_SetBits(GPIOA, GPIO_Pin_6); // 入口拉高 if(TIM_GetITStatus(...)) { // ... 处理中断 } GPIO_ResetBits(GPIOA, GPIO_Pin_6); // 出口拉低 }然后用示波器或逻辑分析仪探头连接这个GPIOPA6你就能看到一个脉冲。脉冲的上升沿到下降沿的宽度就是ISR的执行时间。脉冲的周期就是你的定时中断周期。如果脉冲几乎连续不断说明你没清中断标志如果脉冲间隔不均匀说明有其他更高优先级的中断在干扰。2. 在调试器中观察定时器寄存器在IDE如Keil、IAR的调试模式下打开Peripherals-Timers-TIM2窗口你可以实时看到CNT计数器值、ARR、PSC、SR状态寄存器包含中断标志位等寄存器的值。单步执行时观察这些值的变化能帮你深刻理解定时器的工作流程。3. 关于volatile关键字在中断和主循环共享的全局变量如我们前面提到的tim2_update_flag前必须加上volatile关键字。这告诉编译器这个变量可能被未知流程如中断改变禁止对其进行优化如缓存到寄存器确保每次访问都从内存中读取最新值。不加volatile可能会导致标志位检查失效出现极其诡异且难以复现的Bug。定时器中断是STM32乃至所有嵌入式MCU编程的必修课。它看似简单但涉及到时钟系统、NVIC、寄存器操作、编程思想等多个层面。从能“用起来”到能“用得好”、“用得稳”中间需要大量的实践和思考。希望这篇长文能帮你搭建起清晰的知识框架剩下的就是在具体的项目中去应用和深化了。当你能够熟练地运用多个定时器中断协同工作并处理好它们之间的优先级和资源共享问题时你对嵌入式系统的理解就又上了一个台阶。

相关新闻

【短期风电功率预测】近端梯度算法求解LASSO分位数回归-短期风电功率预测研究附Matlab代码

【短期风电功率预测】近端梯度算法求解LASSO分位数回归-短期风电功率预测研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/8/5 23:47:01 阅读更多 →
Chrome 80+ Cookie加密机制解析与Python实战解密

Chrome 80+ Cookie加密机制解析与Python实战解密

1. 从一次数据迁移需求说起最近在做一个自动化工具,需要把A账号在Chrome浏览器里保存的登录状态,完整地“搬运”到B账号的Chrome里。听起来像是某种“黑科技”,其实核心需求很简单:用户不想在几十个网站上重新登录一遍。这个需求直…

2026/8/5 23:47:01 阅读更多 →
【语音增强】组稀疏信号去噪:非凸正则化,凸优化研究附Matlab代码

【语音增强】组稀疏信号去噪:非凸正则化,凸优化研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…

2026/8/5 23:47:01 阅读更多 →

最新新闻

UE5第三人称相机系统深度解析:SpringArm与Camera组件实战优化指南

UE5第三人称相机系统深度解析:SpringArm与Camera组件实战优化指南

1. 项目概述:为什么Character相机与弹簧臂是UE5项目的基石在UE5里折腾过角色移动和视角控制的开发者,大概都经历过这样的阶段:一开始觉得不就是个相机跟着角色跑嘛,用个AttachToComponent绑上去不就行了?结果角色一转身…

2026/8/6 0:38:19 阅读更多 →
ChatGPT对话数据导出实战:浏览器脚本实现本地化高效备份

ChatGPT对话数据导出实战:浏览器脚本实现本地化高效备份

1. 项目概述:为什么我们需要导出ChatGPT对话数据?作为一名深度依赖ChatGPT进行内容创作、代码调试和知识管理的用户,我发现自己越来越离不开这个强大的对话工具。但随之而来的是一个很实际的问题:那些充满灵感的头脑风暴、精心调试…

2026/8/6 0:37:19 阅读更多 →
小米/安卓手机自带应用能删 90%?手把手教你免 Root ADB 卸载系统 App

小米/安卓手机自带应用能删 90%?手把手教你免 Root ADB 卸载系统 App

不刷机、不 root、不动 /system 分区,一条 pm uninstall --user 0 就能把厂商预装、用不上的系统 App 从当前用户里"请出去"——干净、可逆、随时能装回。适用场景:车机 / 手机 / 平板上那些删不掉又占资源的预装应用(钱包、商城、…

2026/8/6 0:37:19 阅读更多 →
OpenCV C++基于CNN模型的图像分类

OpenCV C++基于CNN模型的图像分类

这个程序使用OpenCV加载一个Caffe模型进行图像分类。输入图像左边是一只小猫咪,右边是个航天飞机:程序运行后输入如下:id为285的是埃及猫:id为812的是航天飞机:代码:int main() {Mat img imread("cat…

2026/8/6 0:37:19 阅读更多 →
开源目标检测数据集深度汇总|全网独家整理多尺度样本适配方案、通用航拍遥感工业全覆盖、助力YOLO小目标检测与工业缺陷高精度落地

开源目标检测数据集深度汇总|全网独家整理多尺度样本适配方案、通用航拍遥感工业全覆盖、助力YOLO小目标检测与工业缺陷高精度落地

目录 一、研究前言:目标检测数据集选型核心痛点与优化价值 二、目标检测数据集分类逻辑与核心评价维度 三、六大类开源目标检测数据集全维度详解 3.1 通用基准类数据集(学术评测、模型预训练、基线对比首选) 3.1.1 Pascal VOC2007+2012 3.1.2 MS COCO 2017 3.1.3 Ope…

2026/8/6 0:37:19 阅读更多 →
追求源于热爱创业首秀:万志强发布 PANDAER 新品及DreamGoGo 众筹平台

追求源于热爱创业首秀:万志强发布 PANDAER 新品及DreamGoGo 众筹平台

追求源于热爱科技公司(DreamGoGo,简称"热爱科技")今日正式举办创业发布会。这家由魅族前 CMO 万志强创办,聚合原魅族产品、研发、Design、营销体系精英团队及 PANDAER 创始团队原班人马的新公司,首次对外披露…

2026/8/6 0:36:19 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

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

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

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

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

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

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

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

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

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

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘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/5 21:00:14 阅读更多 →
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 阅读更多 →