3、MCU最小系统验证:晶振起振测试、复位信号时序测量、Boot模式配置检查、JTAG/SWD连接稳定性测试
各位工程师朋友,大家好。今天我们来聊聊MCU最小系统验证。这步要是没做好,后面所有调试都是白搭。我见过太多人,焊好板子就急着写代码,结果程序死活跑不起来,最后发现是晶振没起振——这种低级错误,咱们完全可以避免。
3.1 晶振起振测试
晶振是MCU的心脏。它不跳,芯片就不工作。我个人习惯,上电第一件事就是测晶振。
怎么测?用示波器,探头打到10×档,直接点晶振引脚。注意,探头寄生电容会影响振荡频率,所以尽量用低电容探头。我一般会先测主晶振(通常是8MHz或16MHz),再测RTC用的32.768kHz。
起振波形长什么样?正常情况是正弦波,幅度大概在0.5V到3.3V之间(取决于供电电压)。如果看到的是直流电平,或者波形畸变严重,那就有问题了。
常见问题排查:
- 波形幅度太小:检查负载电容是否匹配
- 波形有毛刺:可能是PCB走线太长,或者地线没处理好
- 完全没波形:先查供电,再查晶振是否损坏
3.2 复位信号时序测量
复位信号,说白了就是让MCU从头开始跑。但这里有个坑:复位信号必须满足芯片手册要求的时序,否则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 |
3.4 JTAG/SWD连接稳定性测试
JTAG和SWD是我们调试的命脉。连接不稳定,调试器动不动就断开,那真是要命。
怎么测稳定性?我的做法是:用调试器连续读取MCU的IDCODE寄存器100次,看有没有失败。如果失败率超过1%,那连接就有问题。
常见问题:
- 线太长:SWD的时钟线超过20cm就容易出问题
- 地线没接好:调试器和目标板之间一定要共地
- 信号干扰:SWDIO和SWCLK不要靠近高频信号线
测试脚本示例(伪代码):
for i = 1 to 100:
result = read_idcode()
if result == FAIL:
error_count++
delay(10ms)
if error_count > 1:
print("连接不稳定,请检查硬件")
else:
print("连接稳定")
嗯,这里要注意,如果测试失败,先检查接线,再检查调试器驱动。我遇到过好几次,其实是电脑USB口供电不足导致的。
好了,MCU最小系统验证就讲到这里。这四步走完,你的板子至少能保证基本功能正常。下一章我们聊聊电源树验证,那又是另一番天地了。