3、MCU最小系统验证:晶振起振测试、复位信号时序测量、Boot模式配置检查、JTAG/SWD连接稳定性测试

各位工程师朋友,大家好。今天我们来聊聊MCU最小系统验证。这步要是没做好,后面所有调试都是白搭。我见过太多人,焊好板子就急着写代码,结果程序死活跑不起来,最后发现是晶振没起振——这种低级错误,咱们完全可以避免。

3.1 晶振起振测试

晶振是MCU的心脏。它不跳,芯片就不工作。我个人习惯,上电第一件事就是测晶振。

怎么测?用示波器,探头打到10×档,直接点晶振引脚。注意,探头寄生电容会影响振荡频率,所以尽量用低电容探头。我一般会先测主晶振(通常是8MHz或16MHz),再测RTC用的32.768kHz。

我的经验:有一次调试一块STM32F4板子,晶振就是不起振。查了半天,发现是负载电容焊错了。原本该用18pF,结果焊了22pF。换回来就好了。所以,晶振旁边的两个小电容,千万别马虎。

起振波形长什么样?正常情况是正弦波,幅度大概在0.5V到3.3V之间(取决于供电电压)。如果看到的是直流电平,或者波形畸变严重,那就有问题了。

常见问题排查:

  • 波形幅度太小:检查负载电容是否匹配
  • 波形有毛刺:可能是PCB走线太长,或者地线没处理好
  • 完全没波形:先查供电,再查晶振是否损坏

3.2 复位信号时序测量

复位信号,说白了就是让MCU从头开始跑。但这里有个坑:复位信号必须满足芯片手册要求的时序,否则MCU可能处于不确定状态。

测什么?主要测两个参数:

  1. 复位脉冲宽度:从复位引脚拉低到拉高的时间
  2. 复位释放后的稳定时间:复位释放后,到晶振起振、系统稳定的时间

我一般用示波器的单次触发模式,抓复位引脚的电平变化。你看,正常复位脉冲宽度至少需要几个毫秒(具体看芯片手册)。如果太短,MCU可能没完全复位。

注意:我曾经遇到一个案例,复位引脚上有个电容,用来做上电延时。结果电容漏电,导致复位信号一直拉低,MCU永远在复位状态。排查了整整一天,最后换了个电容就好了。所以,复位电路上的电容,一定要选质量好的。

时序测量步骤:

  • 示波器通道1接复位引脚
  • 触发方式设为下降沿触发
  • 按一下复位按键,抓取波形
  • 测量脉冲宽度,对比手册要求

3.3 Boot模式配置检查

Boot模式,就是告诉MCU从哪启动。常见的有三种:从Flash启动、从系统存储器启动(用于ISP下载)、从SRAM启动。

我见过最搞笑的事:有个同事焊好板子,程序死活烧不进去。检查了所有硬件,都没问题。最后发现,Boot0和Boot1引脚的电平配置反了。芯片一直从Flash启动,而Flash里是空的,当然跑不起来。

怎么检查?用万用表测Boot引脚的电平。注意,有些芯片内部有上拉或下拉电阻,所以测量时要考虑这个因素。

Boot模式 Boot0 Boot1 启动位置
主Flash启动 0 任意 0x08000000
系统存储器启动 1 0 0x1FFF0000
SRAM启动 1 1 0x20000000
避坑指南:我曾经调试一块板子,Boot0引脚通过10k电阻接地,理论上应该是低电平。但实际测量发现是1.2V——既不是高也不是低。后来发现是PCB漏电,清洗一下就好了。所以,如果Boot电平不对,先别急着怀疑芯片,检查一下PCB清洁度。

3.4 JTAG/SWD连接稳定性测试

JTAG和SWD是我们调试的命脉。连接不稳定,调试器动不动就断开,那真是要命。

怎么测稳定性?我的做法是:用调试器连续读取MCU的IDCODE寄存器100次,看有没有失败。如果失败率超过1%,那连接就有问题。

常见问题:

  • 线太长:SWD的时钟线超过20cm就容易出问题
  • 地线没接好:调试器和目标板之间一定要共地
  • 信号干扰:SWDIO和SWCLK不要靠近高频信号线
我的习惯:在SWD接口上加10k上拉电阻到3.3V,可以有效提高抗干扰能力。另外,调试器的线缆尽量用屏蔽线,尤其是工业现场,干扰源多。

测试脚本示例(伪代码):

for i = 1 to 100:
    result = read_idcode()
    if result == FAIL:
        error_count++
    delay(10ms)

if error_count > 1:
    print("连接不稳定,请检查硬件")
else:
    print("连接稳定")

嗯,这里要注意,如果测试失败,先检查接线,再检查调试器驱动。我遇到过好几次,其实是电脑USB口供电不足导致的。

好了,MCU最小系统验证就讲到这里。这四步走完,你的板子至少能保证基本功能正常。下一章我们聊聊电源树验证,那又是另一番天地了。