在 Manus 中运行任何 Skill
一键导入
一键导入
一键在 Manus 中运行任何 Skill
开始使用hardware-debug
星标5
分支0
更新时间2026年5月31日 13:43
硬件调试专家——串口监听、波形分析、故障定位与寄存器级调试
安装
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
SKILL.md
readonly菜单
硬件调试专家——串口监听、波形分析、故障定位与寄存器级调试
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
设备交互智能体——扫描、连接、操纵物理开发板与嵌入式Linux板卡
板卡管理器——管理板卡配置、端口别名、外设清单与踩坑记录
嵌入式全流程开发助手——从MCU选型到固件烧录的全链路支持
知识库检索引擎——查询芯片手册、通信协议、传感器参数与错误码诊断
技能提炼器——从调试会话中提取可复用技能,整合记忆并自我优化
基于 SOC 职业分类
| name | hardware-debug |
| description | 硬件调试专家——串口监听、波形分析、故障定位与寄存器级调试 |
| metadata | {"type":"skill"} |
用户报告以下任一现象时触发:
操作规范(有界约束):
监听命令:
# 普通监听(带时间戳)
picocom -b 115200 /dev/ttyUSB0 --logfile serial.log --echo
# 原始二进制采集(用于调试非 ASCII 协议)
stty -F /dev/ttyUSB0 115200 raw -echo
dd if=/dev/ttyUSB0 of=dump.bin bs=1 count=65536 status=progress
数据诊断清单:
| 症状 | 可能原因 | 排查方法 |
|---|---|---|
| 乱码 | 波特率不匹配 | 逐档测试 9600/19200/38400/57600/115200/230400/460800/921600 |
| 乱码(波特率正确) | 时钟精度偏差 | 检查 HSE 是否起振,HSI 校准值偏差,SYSCLK 分频链 |
| 丢帧 | 接收缓冲区溢出 | 检查 UART RX 中断优先级,增加 FIFO 深度或启用 DMA |
| 多出 0x00 字节 | 线路空闲电平异常 | 检查上拉/下拉电阻,确认 RS232/RS485/TTL 电平匹配 |
| 间歇性故障 | 电源噪声干扰 | 示波器查看电源纹波,串口线与功率线是否走在一起 |
| 收发不匹配 | TX/RX 交叉、GND 未共地 | 用万用表蜂鸣档确认线路通断 |
CRC 校验错误诊断:
工作模式:用户提供 GPIO 电平的描述性信息(文本、时间序列或截图文字描述),司南进行时序分析。
分析流程:
常见协议时序基准:
| 协议 | 关键时序参数 |
|---|---|
| I2C (Standard) | SCL 100kHz,t_HD;STA 4.0μs,t_SU;STO 4.0μs |
| I2C (Fast) | SCL 400kHz,t_HD;STA 0.6μs,t_SU;STO 0.6μs |
| SPI Mode 0 | CPOL=0 CPHA=0,数据在 SCK 上升沿采样,下降沿切换 |
| SPI Mode 3 | CPOL=1 CPHA=1,数据在 SCK 下降沿采样,上升沿切换 |
| UART 8N1 | 1 起始位(低) + 8 数据位(LSB 在前) + 1 停止位(高) |
| WS2812B | T0H=0.4μs T0L=0.85μs, T1H=0.8μs T1L=0.45μs, RESET>50μs |
| DHT11 | 起始信号 18ms 低 + 20-40μs 高 + 80μs 低 + 50μs 高,40bit 数据 |
直流测量解读:
| 测量项 | 正常范围 | 异常提示 |
|---|---|---|
| VDD (3.3V 轨) | 3.3V ± 5% (3.135-3.465V) | 低于 3.0V: LDO 可能过载或输入不足;高于 3.5V: LDO 可能损坏 |
| VDD (5V 轨) | 5.0V ± 5% (4.75-5.25V) | USB VBUS 5V±5% 若来自适配器可放宽至 ±10% |
| VDDA (模拟供电) | VDD ± 30mV | VDDA 纹波 > 10mV 且与数字负载相关建议加 LC 滤波 |
| GPIO 高电平 (V_IH) | ≥ 0.7 × VDD | 低于阈值检查上拉强度和外设驱动能力 |
| GPIO 低电平 (V_OL) | ≤ 0.3 × VDD (通常 < 0.4V) | 检查灌电流是否超过 GPIO 最大额定值 (通常 8-20mA) |
| MCU 运行电流 | 手册典型值 ± 30% | 异常偏高:检查未配置引脚是否为浮空输入(改为模拟输入或上下拉) |
示波器波形解读:
电源系统故障决策树:
现象:系统复位/死机
├─ MCU 核电压是否稳定?
│ ├─ 万用表测量 VDD,纹波用示波器 AC 耦合查看
│ └─ 若 VDD 周期性跌落 → LDO 过流保护触发 → 检查后端短路或负载过大
├─ BOD (Brown-Out Detector) 是否误触发?
│ ├─ 检查 BOD 阈值寄存器(PWR_CR1 或等效)
│ ├─ 瞬态大电流负载(电机启动/WiFi 发射)可能导致 VDD 瞬间跌穿 BOD 阈值
│ └─ 解决:增大电容(220μF 钽+100nF MLCC),或降低 BOD 阈值
├─ 晶振是否停振?
│ ├─ 检查 HSE 是否起振(OSC_IN/OSC_OUT 波形)
│ ├─ 负载电容匹配检查:C_L = (C_L1 × C_L2) / (C_L1 + C_L2) + C_stray
│ ├─ 晶振两端正常应为同频反相正弦波(~1Vpp)
│ └─ 若不起振:换低 ESR 晶振、增加负阻裕量、降低并联电阻
└─ 温度是否超限?
├─ 手指触摸 MCU 判断是否烫手(> 60°C 异常)
├─ I/O 口短路到地可能导致局部发热(单个引脚灌电流过大)
└─ 红外热像或点温计辅助定位发热源
I2C 总线异常诊断:
现象:I2C 通信失败
├─ 物理层检查
│ ├─ 上拉电阻是否存在且阻值正确?(标准模式 4.7kΩ,快速模式 2.2kΩ)
│ ├─ SDA/SCL 静态电平是否为高?(两个都应该被上拉到 VDD)
│ ├─ 总线电容是否超限?(标准模式 < 400pF,需考虑所有设备的引脚电容+PCB走线电容)
│ └─ 5V / 3.3V 混合电平有无电平转换器?
├─ SCL 锁死恢复
│ ├─ 表现:SCL 被从设备拉低不放(clock stretching 超时)
│ ├─ 软件恢复:主设备发送 9 个 SCL 脉冲 + STOP 条件强制释放总线
│ └─ 硬件恢复:I2C_CR1 中 SWRST 位复位 I2C 外设
├─ ACK 异常
│ ├─ 全 NACK:从设备地址错误或设备未上电
│ ├─ 寄存器地址后 NACK:寄存器地址超出范围或写保护使能
│ ├─ 读操作第一个字节后 NACK:从设备无数据可读
│ └─ 随机 NACK:电源噪声导致从设备状态机跑飞
└─ 数据异常
├─ 读取值全 0xFF:SDA 被锁高,从设备未响应(上拉电阻正常但从设备未驱动总线)
├─ 读取值全 0x00:SDA 被锁低,总线死锁
└─ 读取值漂移:电源波动影响传感器模拟前端
SPI 总线异常诊断:
现象:SPI 读数异常
├─ 读数全 0x00
│ ├─ MISO 脚是否有物理连接?
│ ├─ CS 片选信号是否正确(低有效)?
│ ├─ CPOL/CPHA 模式是否与设备匹配?
│ └─ MISO 是否需要外部上拉(部分设备为开漏输出)?
├─ 读数全 0xFF
│ ├─ MISO 被锁定为高(检查是否有上拉)
│ ├─ CS 是否一直为高(设备未被选中)
│ └─ 从设备 SPI 接口未初始化(需先写配置寄存器)
├─ 读数位移/错位
│ ├─ 时钟极性问题(CPOL 配置反了)
│ ├─ 第一个 SCK 边沿比 CS 下降沿提前(需要 CS 先行几个 SCK 周期)
│ └─ 数据位宽不匹配(发送 8-bit 但设备期望 16-bit 帧)
└─ 间歇性数据错误
└─ 信号完整性:SCK 频率接近极限时在 MISO 上看到振铃→降频或加端接
read-modify-write 模式分析:
当用户怀疑寄存器写入失败时,按以下流程排查:
通用寄存器调试命令片段:
// 调试辅助宏——打印寄存器值
#define DBG_REG(periph, reg) \
printf("[DBG] %s->%s = 0x%08lX\r\n", #periph, #reg, (uint32_t)(periph)->reg)
// 示例:排查 GPIO 输出异常
DBG_REG(GPIOA, MODER); // 检查模式是否被意外改为模拟/复用
DBG_REG(GPIOA, OTYPER); // 检查推挽/开漏配置
DBG_REG(GPIOA, OSPEEDR); // 检查驱动速度
DBG_REG(GPIOA, PUPDR); // 检查上下拉
DBG_REG(GPIOA, ODR); // 检查输出数据
DBG_REG(GPIOA, IDR); // 检查输入数据(如有回读需求)
常见寄存器 bug 模式:
| 模式 | 示例 | 根因 |
|---|---|---|
| 寄存器写不进去 | GPIO MODER 写 01 读出是 00 | GPIO 时钟未使能 (RCC_AHBENR) |
| 部分 bit 写不进去 | CR1 低 16 位正常,高 16 位异常 | 未使用 BSRR/BRR 操作 GPIO(用 ODR &= ~pin 可能因编译器优化先读 ODR 再回写,引入竞争) |
| 读出值一直为 0 | 定时器 CNT 读到恒为 0 | 定时器未使能 CEN,或时钟源未配置 |
| 中断标志不触发 | UART RXNE 一直为 0 | RX 引脚 GPIO 模式、AF 选择和 USART 使能未全配置 |
| 写操作后外设无反应 | I2C START 位一直显示忙 | 上次传输未正确 STOP,需 SWRST 复位 I2C 外设 |
独立看门狗 (IWDG):
DBGMCU_CR |= DBGMCU_CR_DBG_IWDG_STOP; → 调试时暂停 IWDG窗口看门狗 (WWDG):
看门狗复位诊断步骤:
RCC_CSR 寄存器中的复位标志位:IWDGRSTF、WWDGRSTF、PORRSTF、PINRSTF对多轨上电系统,逐轨确认:
picocom 或 minicom 或 screen,用于实时查看设备输出stty + dd 或 xxd,用于原始二进制数据采集## 故障现象确认
[复述症状,确认理解一致]
## 分层排查
### 1. 电源层
- [测量项 + 期望值 + 实际值]
### 2. 时钟层
- [测量项 + 期望值 + 实际值]
### 3. 外设层
- [配置检查项 + 寄存器 dump]
### 4. 应用层
- [逻辑流程检查]
## 根因定位
[明确的故障原因描述]
## 修复方案
### 方案A(推荐)
[具体操作步骤]
### 方案B(备选)
[备选步骤]
## 验证清单
- [ ] 项1
- [ ] 项2