STM32 ADC与高级定时器实战:电压测量与互补PWM控制详解
1. 项目背景与核心任务拆解最近在整理蓝桥杯嵌入式比赛的备赛资料翻到了第六届决赛那道关于“电压测量与互补PWM信号输出”的真题。这道题可以说是把STM32的ADC和高级定时器TIM1/8的核心功能玩到了极致综合性非常强。很多同学第一次看到题目要求特别是“互补PWM”和“电压测量控制占空比”这两个点联动时会感觉有点无从下手。其实拆开来看它就是两个经典模块的深度应用与组合一个是用ADC精确测量外部模拟电压另一个是用高级定时器生成带死区时间的互补PWM波并且让前者实时控制后者的一个通道。这恰恰是电机控制、开关电源等工业场景的简化模型。今天我就结合自己当年备赛和后来做项目的经验把这道题的实现思路、关键配置、代码细节以及最容易踩的坑从头到尾捋一遍。无论你是正在备赛蓝桥杯还是想深入学习STM32的ADC与高级定时器这篇文章都能给你提供一份可以直接“抄作业”的实战指南。我们先明确一下题目的核心要求这决定了我们代码的骨架。通常这类题目会提供一个包含LCD、按键、LED等基础外设的竞赛板如CT117E核心芯片是STM32F103系列。具体要求可以归纳为三点第一需要配置一个ADC通道比如PA1来测量外部输入的可调电压0-3.3V并将测量值实时显示在LCD上第二需要配置高级定时器如TIM1的两个通道如CH1和CH1N输出一对互补的PWM信号这两个信号不能同时为高或同时为低中间必须插入一段“死区时间”以防止短路第三也是最关键的逻辑联动需要用测量到的电压值来实时控制这对互补PWM信号中某一个通道比如CH1的占空比实现“电压调光”或“电压调速”的模拟效果。理解了这个闭环我们的程序结构就清晰了。2. 硬件平台分析与外设引脚映射工欲善其事必先利其器。在写代码之前必须吃透手里的开发板原理图。蓝桥杯嵌入式官方板CT117E的MCU是STM32F103RBT6资源有限引脚复用严重所以引脚规划是第一步走错了后面全乱。2.1 核心功能引脚锁定根据题目要求我们需要锁定几个关键引脚ADC电压测量通常使用板载的可调电阻Rb2连接的引脚。查看原理图可调电阻一端接3.3V一端接GND中间抽头接在PA1上。所以我们的ADC通道必须选择ADC1的通道1IN1。互补PWM输出互补PWM是高级定时器TIM1或TIM8的专属功能。在CT117E板上TIM1的通道1CH1和它的互补通道CH1N通常被引出到排针上。查看原理图PA8是TIM1_CH1PB13是TIM1_CH1N。这一对引脚就是我们输出互补PWM波的地方。显示与交互LCD基于LCD12864或类似驱动占用一组GPIO按键通常4个独立按键连接在特定引脚上这些在官方提供的底层驱动库lcd.c,key.c中已经封装好我们直接调用API即可但心里要知道它们大概用了哪些引脚避免冲突。2.2 外设时钟使能顺序STM32的任何外设使用前必须先开启对应的时钟。这里的顺序很重要建议遵循“先总线时钟后外设时钟”的原则。// 在初始化函数中最先配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); // ADC1在APB2总线 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); // TIM1是高级定时器也在APB2总线注意RCC_APB2Periph_AFIO复用功能时钟一定要开否则配置引脚复用功能比如PWM输出可能不生效。3. 模拟量采集ADC的精准配置与滤波处理电压测量是系统的“感知”环节其稳定性和准确性直接决定了后续PWM控制的好坏。STM32F103的ADC是12位的理论精度很高但实际容易受到噪声干扰。3.1 ADC单通道单次转换配置比赛环境下通常采用单次转换、软件触发的方式简单可靠。我们需要配置ADC的工作模式、采样时间、对齐方式等。void ADC1_Init(void) { ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 1. 配置PA1为模拟输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; // 模拟输入模式至关重要 GPIO_Init(GPIOA, GPIO_InitStructure); // 2. ADC基础参数配置 ADC_InitStructure.ADC_Mode ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode DISABLE; // 单通道禁用扫描 ADC_InitStructure.ADC_ContinuousConvMode DISABLE; // 单次转换非连续 ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; // 软件触发 ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel 1; // 转换通道数为1 ADC_Init(ADC1, ADC_InitStructure); // 3. 配置ADC通道1PA1的采样时间采样时间越长精度越高但速度越慢 // ADC_SampleTime_55Cycles5 是较慢但较稳定的选择 ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // 4. 使能ADC ADC_Cmd(ADC1, ENABLE); // 5. ADC校准非常重要能显著减少零点误差 ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }这里有几个细节值得注意第一GPIO必须设置为GPIO_Mode_AIN这是ADC专用模式浮空输入模式会导致测量值不准。第二校准流程必须执行且要等待校准完成这是很多初学者忽略但实际影响很大的步骤。3.2 软件滤波与电压值计算单次ADC采样值跳动很大必须滤波。在实时控制系统中常用的是一阶滞后滤波也称指数加权平均滤波它能在平滑度和响应速度之间取得较好平衡。#define FILTER_COEFFICIENT 0.1f // 滤波系数越小越平滑响应越慢 float ADC_Filter(float new_sample) { static float filtered_value 0; filtered_value filtered_value * (1 - FILTER_COEFFICIENT) new_sample * FILTER_COEFFICIENT; return filtered_value; } uint16_t Get_Adc_Value(void) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件启动转换 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换结束 return ADC_GetConversionValue(ADC1); // 读取12位原始值 (0-4095) } float Get_Voltage(void) { uint16_t adc_raw Get_Adc_Value(); float filtered_adc ADC_Filter((float)adc_raw); // 计算电压值: 3.3V参考电压12位分辨率 float voltage filtered_adc / 4095.0f * 3.3f; return voltage; }在LCD上显示时可以将这个voltage变量格式化为字符串保留2位小数显示。滤波系数的选择需要权衡在决赛现场如果发现旋钮转动时LCD数值抖动严重可以适当减小系数如0.05如果感觉响应迟钝跟不上旋钮变化则可以适当增大系数如0.2。这是一个需要根据实际情况调整的参数。4. 互补PWM信号生成高级定时器TIM1深度配置这是本项目的核心难点。互补PWM意味着两路信号相位相反且为了防止上下桥臂在电路中同时导通导致短路必须插入死区时间。STM32的高级定时器硬件支持这些复杂功能我们需要正确配置。4.1 GPIO引脚复用输出配置PA8和PB13需要配置为复用推挽输出以输出PWM信号。void PWM_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // PA8 - TIM1_CH1 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // PB13 - TIM1_CH1N (互补通道) GPIO_InitStructure.GPIO_Pin GPIO_Pin_13; GPIO_Init(GPIOB, GPIO_InitStructure); }4.2 TIM1时基与输出通道配置这里配置定时器的核心频率、PWM模式、互补输出使能以及死区时间。void TIM1_PWM_Init(uint16_t arr, uint16_t psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; // 1. 时基单元配置 TIM_TimeBaseStructure.TIM_Period arr; // 自动重装载值决定PWM频率 TIM_TimeBaseStructure.TIM_Prescaler psc; // 预分频器 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; // 时钟分频 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式 TIM_TimeBaseStructure.TIM_RepetitionCounter 0; // 重复计数器高级定时器特有通常为0 TIM_TimeBaseInit(TIM1, TIM_TimeBaseStructure); // 2. 输出比较通道1配置 (PWM模式1) TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // PWM模式1 TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; // 主输出使能 TIM_OCInitStructure.TIM_OutputNState TIM_OutputNState_Enable; // 互补输出使能 TIM_OCInitStructure.TIM_Pulse 0; // 初始占空比后续由ADC值控制 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 主输出高电平有效 TIM_OCInitStructure.TIM_OCNPolarity TIM_OCNPolarity_High; // 互补输出高电平有效 TIM_OCInitStructure.TIM_OCIdleState TIM_OCIdleState_Reset; // 空闲状态主输出低 TIM_OCInitStructure.TIM_OCNIdleState TIM_OCNIdleState_Reset; // 空闲状态互补输出低 TIM_OC1Init(TIM1, TIM_OCInitStructure); // 初始化通道1 // 3. 刹车和死区时间配置 (关键) TIM_BDTRInitStructure.TIM_OSSRState TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_DeadTime 72; // 死区时间具体计算见下文 TIM_BDTRInitStructure.TIM_Break TIM_Break_Disable; // 刹车功能禁用 TIM_BDTRInitStructure.TIM_BreakPolarity TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; // 自动输出使能 TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure); // 4. 使能TIM1的主输出MOE这是互补PWM输出的总开关 TIM_CtrlPWMOutputs(TIM1, ENABLE); // 5. 使能TIM1计数器 TIM_Cmd(TIM1, ENABLE); }这段代码信息量很大我解释几个关键点PWM频率计算频率 TIM1_CLK / ((arr1)*(psc1))。TIM1的时钟TIM1_CLK通常是72MHz。如果设置arr999,psc71则频率 72,000,000 / (1000*72) 1000Hz (1kHz)。这是一个常用的测试频率。死区时间计算TIM_DeadTime是一个8位寄存器值DTG[7:0]。其实际死区时间需要根据数据手册公式计算。当DTG[7:5]0时死区时间 DTG[4:0] *T_dts。其中T_dts是定时器时钟周期经过TIM_CKD分频后的时间。通常系统时钟72MHzTIM_CKD_DIV1T_dts1/72us。设置DeadTime72则死区时间 ≈ 72 * (1/72)us 1us。这个值需要根据实际驱动的功率器件开关速度来调整1-2us是常见的实验值。自动输出使能AutomaticOutput这个位必须使能否则在发生刹车事件后输出可能被锁定无法恢复。TIM_CtrlPWMOutputs这是高级定时器独有的函数用于使能主输出。如果忘记调用即使配置正确PWM也不会输出。5. 系统联动逻辑ADC值动态控制PWM占空比现在我们有了“眼睛”ADC和“手脚”PWM需要建立它们之间的神经连接。核心思想是将ADC测量到的电压值0-3.3V线性映射到PWM的脉冲宽度0到arr。5.1 映射函数的设计在main函数的循环中我们需要不断采样电压并更新PWM占空比。int main(void) { // 系统初始化 System_Init(); // 初始化系统时钟等 LCD_Init(); // 初始化LCD ADC1_Init(); // 假设PWM频率为1kHzarr999 TIM1_PWM_Init(999, 71); float voltage 0; uint16_t pwm_duty 0; while(1) { // 1. 获取电压 voltage Get_Voltage(); // 2. 将电压值映射为PWM占空比 // 电压范围: 0.0V ~ 3.3V // 占空比范围: 0 ~ 999 (对应ARR值) // 线性映射公式: duty (voltage / 3.3) * 999 pwm_duty (uint16_t)((voltage / 3.3f) * 999.0f); // 3. 限制占空比范围防止计算溢出 if(pwm_duty 999) { pwm_duty 999; } // 4. 更新TIM1通道1的捕获比较寄存器CCR1即改变占空比 TIM_SetCompare1(TIM1, pwm_duty); // 5. 在LCD上显示电压值和占空比百分比 char disp_buf[32]; sprintf(disp_buf, Voltage: %.2fV, voltage); LCD_DisplayStringLine(Line0, (uint8_t*)disp_buf); sprintf(disp_buf, Duty: %3d%%, pwm_duty * 100 / 999); LCD_DisplayStringLine(Line2, (uint8_t*)disp_buf); // 6. 加入适当延时控制刷新频率例如50ms刷新一次 Delay_ms(50); } }这个映射关系是线性的也是最直观的。但有时候题目可能会要求非线性映射比如电压在中间段变化时占空比变化更灵敏。这时就需要设计一个映射函数或查表法来实现。5.2 实时性与系统优化上面的while循环中ADC采样、计算、更新PWM、显示都在顺序执行。这里存在一个潜在问题当Get_Voltage()函数中的滤波计算或LCD显示耗时较长时PWM占空比的更新频率会下降导致控制响应变慢感觉“不跟手”。一个更专业的做法是使用定时器中断。我们可以设置一个基本定时器如TIM2每1ms中断一次在中断服务函数中只做ADC采样和PWM更新这两件最紧急的事。而LCD显示这种耗时操作可以放在主循环中用一个标志位来控制比如每20个中断20ms更新一次显示。这样就把实时控制任务高频和人机交互任务低频分离开了系统响应会快很多也更稳定。这是嵌入式系统编程中一个重要的设计模式。6. 调试技巧与示波器实测分析代码写完下载到板子上LCD有显示了但怎么知道PWM波到底对不对互补和死区时间有没有生效这时候一台示波器是必不可少的。6.1 互补PWM与死区时间的波形验证将示波器的两个探头分别接到PA8CH1和PB13CH1N地线接板子GND。调整示波器为双通道显示并设置合适的时基如500us/div和电压档位3.3V/div。你应该能看到两路频率相同、相位相反的PWM方波。关键验证点一互补性。仔细观察当CH1为高电平时CH1N是否为确定的低电平当CH1为低电平时CH1N是否为确定的高电平严禁出现两路同时为高桥臂直通短路或同时为低取决于电路拓扑可能也是不允许的的情况。关键验证点二死区时间。将波形放大聚焦在电平跳变的边缘。使用示波器的光标功能测量从CH1下降沿到CH1N上升沿之间的时间以及从CH1N下降沿到CH1上升沿之间的时间。这两个时间应该大致相等且等于你代码中配置的死区时间例如1us。你会看到一段两者都为低电平的“空白区”这就是死区。死区时间太小起不到保护作用太大会降低有效输出电压需要折中。6.2 电压控制线性度测试旋转板载的可调电阻观察LCD上电压值的变化同时用示波器测量PA8CH1的PWM波形。随着电压从0V升到3.3VPWM的占空比应该从0%线性增加到100%。你可以记录几组数据电压值 实测占空比在坐标纸上画出来看是否是一条直线。如果非线性可能是ADC参考电压不准、可调电阻非线性、或映射公式有误。6.3 常见问题排查没有PWM输出检查TIM_CtrlPWMOutputs(TIM1, ENABLE);是否调用。检查GPIO模式是否为GPIO_Mode_AF_PP复用推挽输出。用万用表测量引脚电压如果一直是0V或3.3V可能是定时器根本没启动检查TIM_Cmd(TIM1, ENABLE);和时钟使能。只有一路有输出互补路没输出检查TIM_OCInitStructure.TIM_OutputNState是否设置为Enable。检查TIM_BDTRInitStructure.TIM_AutomaticOutput是否使能。死区时间不生效检查TIM_BDTRConfig函数是否被正确调用。确认TIM_DeadTime参数的计算是否正确可以尝试设置一个较大的值如200在示波器上应该能看到明显的死区。ADC采样值跳动大确认GPIO模式是GPIO_Mode_AIN。检查电源和地是否稳定模拟部分最好单独滤波。增加软件滤波的强度减小滤波系数。适当增加ADC采样时间ADC_SampleTime。7. 从竞赛到实战项目思维的延伸完成这个题目绝不仅仅是为了比赛。它封装了一个经典的“模拟感知-数字处理-功率控制”闭环。在实际项目中比如做一个直流电机调速器可调电阻换成手柄电位器PWM输出后经过驱动电路如MOSFET桥去控制电机整个逻辑一模一样。再比如一个LED调光器PWM直接驱动MOS管来控制LED灯的亮度。你可以在此基础上做很多扩展加入按键控制用按键设定一个目标电压系统通过PID算法控制PWM输出使实际测量电压快速、稳定地达到目标值。这就是一个简单的闭环控制系统。改变PWM模式尝试配置中心对齐模式TIM_CounterMode_CenterAligned1/2/3这种模式在电机控制中常用于减少谐波。多通道ADC除了电压再测量一路温度如NTC实现温度过高时自动降低PWM占空比过温保护。通信功能将电压和占空比数据通过串口发送到上位机用曲线显示出来方便分析和调试。通过这样一个综合性的项目你真正掌握的不是STM32的某个孤立的模块而是如何让多个模块协同工作去解决一个实际问题的系统能力。这种能力无论是应对蓝桥杯这样的赛事还是未来的嵌入式开发工作都是最核心的竞争力。最后我强烈建议你不要只停留在看代码和文章上一定要亲手在板子上实现一遍用示波器看看波形拧一拧电位器感受一下变化遇到问题并解决它这个过程中收获的远比最终的结果要多。

相关新闻

畅游引擎开发岗校招笔试复盘:从C++内存到渲染管线的硬核考点

畅游引擎开发岗校招笔试复盘:从C++内存到渲染管线的硬核考点

2020年秋招那阵子,我手里攥着一份投递列表,搜狐畅游的引擎开发工程师排在挺靠前的位置。游戏引擎岗在当年算得上竞争比较狠的方向,一方面是因为做游戏引擎的机会本身就少,另一方面是很多人对这个岗位的理解停留在“会写C就能上”&…

2026/8/29 22:41:51 阅读更多 →
搜狐畅游引擎开发校招笔试复盘:C++与图形学考点解析

搜狐畅游引擎开发校招笔试复盘:C++与图形学考点解析

一、聊聊那次笔试的整体印象前阵子整理电脑里的旧文件,翻到2020年参加搜狐畅游校招笔试的记录,顺手复盘了一遍。当时投的是引擎开发工程师方向,说实在的,这份卷子考察的面比预想中广,难度也足够筛掉一批人。如果你正准…

2026/8/29 22:41:51 阅读更多 →
前端校招笔试高频考点全解析:从异步原理到工程化实战

前端校招笔试高频考点全解析:从异步原理到工程化实战

“前端笔试”这四个字,对于2020年那会儿的应届生来说,基本等同于“八股文面试”的同义词。但其实回过头看,像乐信这种体量、业务又偏金融科技的公司,前端笔试题反而不是纯粹考背书的,它更看重你能不能把手上的JS和CSS用…

2026/8/29 22:40:50 阅读更多 →

最新新闻

HTML5实战测验:10道题覆盖语义化、Canvas、存储与路由

HTML5实战测验:10道题覆盖语义化、Canvas、存储与路由

这已经是第六套HTML5测验题了。前五套我都出得很“温柔”,重点放在标签记忆、属性对照和API名词上,读者反馈也相当统一:看了答案觉得全会,一关页面就忘,进了真实项目还是靠CtrlC、CtrlV。所以这一套我决定换个玩法&…

2026/8/29 23:25:31 阅读更多 →
Java校友管理系统实战:Spring Boot+MyBatis架构设计与核心模块实现

Java校友管理系统实战:Spring Boot+MyBatis架构设计与核心模块实现

简介:信息管理系统是现代企业级应用开发的核心领域,其本质是通过软件技术对业务数据进行高效、安全的增删改查(CRUD)与流程化管理。其技术原理通常基于经典的三层架构(表现层、业务逻辑层、数据访问层)&…

2026/8/29 23:25:31 阅读更多 →
单二进制离线编码代理:内网环境下的AI编程助手落地指南

单二进制离线编码代理:内网环境下的AI编程助手落地指南

最近在梳理本地 AI 辅助开发工具链时,注意到一个很有意思的方向:coding agent(编码代理)开始从“云端 API 厚重运行时”走向“单文件二进制 离线运行”。如果你所在团队有涉密内网、隔离网络或代码不出库的合规要求,…

2026/8/29 23:25:31 阅读更多 →
AI生产力工具落地指南:模型选型、本地部署与API接入

AI生产力工具落地指南:模型选型、本地部署与API接入

最近 Meta CTO Andrew Bosworth 关于“员工应该把 AI 带来的效率提升投入到更多工作中”的说法,在技术社区里引起了不少讨论。如果先放下职场的部分,把这句话翻译成研发场景的动作,其实就是:AI 工具到底能不能让我更早交付、批量处…

2026/8/29 23:25:31 阅读更多 →
MiniMax H3 本地部署全指南:显卡配置与显存优化实战

MiniMax H3 本地部署全指南:显卡配置与显存优化实战

如果你想判断一家 AI 公司有没有真粉丝,最简单的方式是:看它发布开源模型之后,社区里是安静地转发新闻稿,还是立刻有人开始讨论“怎么跑起来”“我的显卡行不行”“显存爆了怎么解决”。最近围绕 MiniMax 展开的讨论,明…

2026/8/29 23:25:31 阅读更多 →
2019用友前端笔试题解析:基础能力与工程素养考察要点

2019用友前端笔试题解析:基础能力与工程素养考察要点

2019年那会儿,前端校招的笔试题目已经相当有区分度了。用友这套题我印象里不算偏怪,但覆盖面很扎实,属于那种“基础不牢就露馅”的类型。今天不聊空泛的面经,直接拿这套笔试题当切片,拆一拆它背后到底在考什么、为什么…

2026/8/29 23:24:29 阅读更多 →

日新闻

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

etc目录下的profile.d文件目录设置环境变量和全局脚本shell

一、设置环境变量etc目录下的profile.d文件目录 /etc/profile.d1、编写 vi test.sh文件内容# jdk变量 export ZHK_HOME/root export PATH$PATH:$ZHK_HOME/test # 可以取出来ZHK_HOME变量给ZZZ_HOME赋值 export ZZZ_HOME${ZHK_HOME}/test2、刷新 执行source /etc/profile 命令使…

2026/8/29 0:00:24 阅读更多 →
【JavaScript】内存管理-垃圾回收机制-内存泄露

【JavaScript】内存管理-垃圾回收机制-内存泄露

内存管理 C 语言这样的底层语言一般都有底层的内存管理接口,比如 malloc()和free()。 而 JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。 整…

2026/8/29 0:00:24 阅读更多 →
Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP:为嵌入式硬件实验室接入AI Agent操控能力

Labgrid-MCP 的目标是把 MCP(Model Context Protocol)能力延伸到真实嵌入式硬件实验室:AI Agent 通过一个标准化的 MCP Server,就能查看目标板状态、控制上电断电、复位开发板、读取串口日志,甚至执行镜像刷写。对于经…

2026/8/29 0:00:24 阅读更多 →

周新闻

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

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

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

2026/8/29 18:08:35 阅读更多 →
SIP通话转接原理与REFER方法实战解析

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

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

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

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

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

2026/8/28 19:47:53 阅读更多 →

月新闻

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

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

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

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

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

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

2026/8/28 17:43:04 阅读更多 →
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/29 2:05:18 阅读更多 →