1. 为什么我选择死磕STM32H723最小系统
第一次拿到STM32H723ZGT6这颗芯片的时候,我盯着那个144脚的LQFP封装愣了好一会儿。550MHz的Cortex-M7内核,1MB的SRAM,还有那让人又爱又恨的供电架构——这玩意儿跟以前玩惯了的F103完全不是一个量级的东西。市面上大部分教程都在教你用F103C8T6搭最小系统,那块蓝板子确实是经典,但当你需要跑LWIP协议栈、做高速数据采集或者驱动RGB屏幕的时候,F103那72MHz的主频和20KB的RAM就完全不够看了。
STM32H723属于H7系列里的性价比选手,主频比H743略低但价格友好不少,关键是它保留了H7系列的核心架构:双精度浮点单元、L1缓存、大容量SRAM,还有那个让人又爱又恨的SMPS+LDO混合供电设计。我这次搭最小系统的目标很明确——能稳定跑起来,能通过SWD调试,能外扩SDRAM,最好还能把以太网PHY也预留上,为后面跑LWIP做准备。
最小系统这个词听起来简单,但H723的最小系统跟F103的最小系统完全是两码事。F103你只要把电源、晶振、复位、BOOT引脚搞定就能跑,H723你还得考虑内核供电、DCDC模式配置、VCAP电容、VDDLDO这些细节。一个地方搞错,芯片要么不启动,要么跑着跑着就死机,而且这种问题特别难查,因为万用表量电压都是对的,但芯片就是不干活。
这篇文章适合谁看?如果你已经玩过F103或者F407的最小系统,想往H7系列进阶,那这篇内容就是为你准备的。如果你是完全的新手,我建议先拿F103C8T6练手,那块板子的原理图网上到处都是,踩坑成本也低。H723这颗芯片,光是电源部分就够你喝一壶的。
2. 核心设计思路与方案选型
2.1 供电架构的取舍:SMPS还是LDO
STM32H723的供电设计是整个最小系统里最让人头疼的部分。芯片手册里给了三种供电方案:纯LDO模式、SMPS直接供电模式、SMPS+LDO混合模式。我一开始想偷懒用纯LDO,毕竟简单,但算了一下功耗就放弃了。
H723在550MHz全速运行的时候,内核电流能到300mA以上。如果用LDO从5V降到1.2V,压差3.8V乘以0.3A,光LDO上就要消耗1.14W的功率。这热量在小板子上根本散不出去,芯片还没跑起来,LDO先烫手了。所以SMPS方案是必须的,效率能到85%以上,发热量小很多。
但SMPS模式有个坑:它需要外接电感和电容,而且对布局要求很高。我选的是2.2μH的屏蔽电感,饱和电流至少1A,DCR要小于100mΩ。电容用22μF的陶瓷电容,ESR要低。这些参数不是随便选的,电感值太小会导致纹波大,太大则响应慢;电容ESR高的话,SMPS的输出纹波会直接影响内核稳定性。
混合模式是我最终的选择。SMPS负责把5V降到1.2V左右,然后LDO再稳压到1.1V给内核。这样既保证了效率,又保证了电压精度。VCAP电容我用了两个2.2μF的陶瓷电容,靠近芯片引脚放置,这个电容的作用是稳定内核电压,少了或者容值不对,芯片直接不启动。
2.2 晶振选型:为什么我用了25MHz而不是8MHz
F103最小系统上最常见的是8MHz晶振,但H723我选了25MHz。原因很简单:H723的PLL配置需要较高的输入频率才能跑到550MHz。用8MHz的话,PLL倍频系数要设得很大,抖动会累积,时钟精度下降。25MHz晶振配合PLL,倍频到550MHz只需要22倍,抖动小很多。
晶振的负载电容也要注意。我用的25MHz晶振规格书要求负载电容12pF,那么两个匹配电容大概用18pF左右。这个值不是精确计算出来的,因为PCB走线的寄生电容大概有3-5pF,所以实际匹配电容要比理论值小一点。我试过用22pF,起振没问题但频率偏了大概200Hz,换成18pF之后就准了。
高速外部晶振(HSE)的走线要尽量短,最好在10mm以内,而且下面要铺地屏蔽。我见过有人把晶振放在板子边缘,走线拉了20多毫米,结果起振时间要好几秒,有时候干脆不起振。这种问题特别隐蔽,因为换一块板子可能就好了,你会以为是芯片问题。
2.3 调试接口:SWD还是JTAG
SWD接口是必须的,我留了一个标准的2x5 1.27mm排针。为什么不用JTAG?因为SWD只需要两根线(SWCLK和SWDIO),加上电源和地一共四根线就够了,省空间。而且SWD的速度完全够用,H723的SWD时钟可以跑到50MHz以上,下载程序几秒钟的事。
但SWD有个细节要注意:SWDIO和SWCLK上最好各串一个22Ω的电阻,靠近芯片放置。这个电阻的作用是阻抗匹配,减少信号反射。我一开始没加,下载程序时好时坏,加了之后就很稳定了。另外,NRST引脚上要接一个100nF电容到地,这个电容不能省,否则复位信号会有毛刺。
BOOT0引脚我通过一个10k电阻下拉到地,同时留了一个跳线帽可以拉到3.3V。这样正常运行时从Flash启动,需要进Bootloader的时候把跳线帽插上就行。BOOT1在H723上跟F103不太一样,它跟其他功能复用,我直接通过电阻下拉到地,不折腾了。
3. 硬件电路设计细节与实操要点
3.1 电源部分的完整设计
电源部分我分了三级:第一级是5V输入,通过一个Type-C接口进来,加一个SS34二极管做防反接,然后接一个220μF的电解电容做储能。第二级是SMPS电路,用MP2145这颗DCDC芯片,把5V降到1.2V。第三级是LDO,用TLV755P把1.2V稳到1.1V给内核。
MP2145的外围电路很关键。输入电容我用了一个10μF和一个100nF并联,输出电容用了两个22μF并联。电感是2.2μH的,SW引脚到电感的走线要短而粗,至少20mil宽。反馈电阻的分压比要算准,MP2145的基准电压是0.6V,我要输出1.2V,所以上电阻10k,下电阻10k,刚好分压一半。
TLV755P的输入输出电容各用1μF就够了,但输出端我额外加了一个100nF的小电容,滤高频噪声。LDO的使能引脚直接接到5V上,这样上电就工作。VCAP引脚上的两个2.2μF电容一定要用X7R或者X5R的陶瓷电容,不能用Y5V,因为Y5V的容值随电压变化太大,实际容值可能只有标称的一半。
注意:SMPS的电感一定要用屏蔽电感,否则辐射干扰会影响晶振和SWD信号。我试过用非屏蔽电感,结果SWD下载经常失败,换了屏蔽电感就好了。
3.2 晶振与复位电路
25MHz晶振我选的是5032封装的贴片晶振,负载电容12pF,精度±10ppm。两个匹配电容用18pF的NPO电容,这个材质温度稳定性好。晶振下面铺地,四周用接地过孔围起来,减少干扰。
复位电路很简单,一个10k上拉电阻到3.3V,一个100nF电容到地,再加一个复位按键。但有个细节:复位按键要并联一个0.1μF电容做消抖,否则按一下可能触发多次复位。我一开始没加这个电容,调试的时候按复位键,芯片有时候启动有时候不启动,后来加了电容就稳定了。
NRST引脚内部有上拉电阻,但阻值比较大,大概40k左右,所以外部还是要加一个10k的上拉,保证复位信号的上升沿够快。复位信号的走线也要短,最好在10mm以内,而且不要跟SWD信号线平行走,避免串扰。
3.3 外扩SDRAM的预留设计
虽然最小系统不一定要外扩SDRAM,但我还是预留了FMC接口。H723的FMC支持SDRAM,我选的是W9825G6KH这颗16MB的SDRAM芯片。地址线、数据线、控制线都引出来了,但没焊芯片,等需要的时候再焊。
FMC的走线要注意等长。数据线D0-D15要尽量等长,误差控制在5mm以内。地址线和控制线也要等长,但要求没那么严格,10mm以内就行。时钟线要单独走,远离其他信号线,最好包地处理。这些走线规则在画PCB的时候就要注意,不然后面调SDRAM的时候会各种报错。
SDRAM的电源也要单独处理,用磁珠跟数字电源隔开,减少噪声。去耦电容每颗芯片放一个100nF,再加一个10μF的钽电容做储能。这些细节在最小系统阶段可能看不出差别,但等你跑高速数据的时候,差别就出来了。
3.4 PCB布局与走线要点
PCB我画的是四层板:顶层信号,第二层地,第三层电源,底层信号。四层板比两层板贵不了多少,但信号完整性好太多。H723的SWD信号、晶振信号、SMPS的SW节点,这些都要参考完整的地平面。
SMPS的布局特别重要。输入电容要靠近MP2145的VIN引脚,输出电容要靠近电感,反馈电阻要靠近FB引脚。SW节点的铜皮面积要小,减少辐射。电感下面不要走任何信号线,尤其是晶振和SWD信号。
晶振的布局前面说过了,这里再强调一下:晶振要靠近芯片的OSC_IN和OSC_OUT引脚,走线要短,下面铺地,四周包地。晶振的匹配电容要靠近晶振放置,不要放在芯片那边。
SWD接口的布局也有讲究。SWCLK和SWDIO要尽量等长,走线要短,最好在50mm以内。如果走线太长,下载速度要降下来,否则容易出错。我一般把SWD接口放在板子边缘,方便插拔,但走线要控制好。
4. 实操过程与核心环节实现
4.1 焊接顺序与注意事项
焊接这块板子我用了热风枪和烙铁配合。先焊电源部分,因为电源不正常的话,后面都白搭。MP2145是QFN封装,底部有散热焊盘,要用热风枪焊,焊之前先在焊盘上涂一层薄薄的锡膏,然后放芯片,热风枪320度吹30秒左右。
焊完电源后,先不焊芯片,上电测电压。5V输入正常,1.2V输出正常,1.1V输出正常,这三个电压都对了我才焊芯片。这个步骤很重要,我见过有人直接全焊完再上电,结果电源有问题,芯片直接烧了。
H723是LQFP144封装,引脚间距0.5mm,焊接难度不小。我的做法是先对齐引脚,固定对角两个脚,然后拖焊。拖焊的时候烙铁头要干净,锡量要少,用0.3mm的细焊锡丝。焊完之后用放大镜检查有没有连锡,特别是电源引脚和地引脚之间。
实操心得:焊LQFP封装的时候,可以在焊盘上先涂一层助焊剂,这样拖焊的时候锡会自动分开,不容易连锡。焊完之后用洗板水清洗,不然残留的助焊剂会导致漏电。
4.2 上电测试与电压测量
全部焊完之后,先不插电,用万用表测一下电源和地之间的电阻,确认没有短路。正常的话电阻应该在几百欧以上,如果只有几欧或者几十欧,那肯定有短路,要查。
上电之后,先测5V输入,再测1.2V和1.1V。1.2V的误差要在±5%以内,也就是1.14V到1.26V之间。1.1V的误差要在±3%以内,也就是1.067V到1.133V之间。如果电压不对,先查反馈电阻,再查电感和电容。
然后测VCAP引脚的电压,应该在1.1V左右。如果VCAP电压不对,芯片肯定不启动。VCAP电压不对一般是电容问题,要么容值不对,要么焊接不良。我遇到过VCAP电容虚焊的情况,电压只有0.3V,芯片完全不工作。
晶振的起振也要测。用示波器探头(10x档)碰OSC_OUT引脚,应该能看到25MHz的正弦波,峰峰值大概1V左右。如果不起振,先查匹配电容,再查晶振本身。示波器探头的寄生电容会影响起振,所以测的时候如果不起振,拔掉探头再试。
4.3 SWD连接与程序下载
SWD连接我用的是ST-Link V3,速度设到4MHz。第一次连接的时候,如果芯片是空的,ST-Link会提示找不到设备,这时候按住复位键,点连接,然后松开复位键,就能连上了。这个技巧在芯片刚焊好还没烧程序的时候特别有用。
连接成功之后,先读一下芯片ID,确认是H723。然后烧一个最简单的LED闪烁程序,验证芯片能正常运行。LED我接在PA5上,串一个1k电阻到地。程序里配置PA5为推挽输出,然后循环翻转。
烧录的时候要注意,H723的Flash编程算法跟F103不一样,Keil里要选对算法。我一开始选错了算法,烧录一直失败,后来换成STM32H7x_2048.FLM就好了。这个算法文件在Keil的安装目录里,如果没有的话要去官网下载。
4.4 时钟配置与性能测试
时钟配置我用CubeMX生成初始化代码。HSE选25MHz,PLL配置成550MHz。具体参数是:M=5,N=110,P=1,Q=2。这样VCO频率是25/5*110=550MHz,系统时钟就是550MHz。AHB分频设成1,APB1和APB2分频设成2,这样APB时钟是275MHz。
配置完之后跑一个CoreMark测试,得分大概在3000分左右,跟官方数据差不多。这个测试能验证时钟配置是否正确,如果得分明显偏低,说明时钟没跑满。我一开始PLL配置错了,得分只有1500分,查了半天才发现是分频系数设错了。
注意:H723在550MHz下运行的时候,Flash需要配置等待周期。我设的是4个等待周期,如果设少了会死机,设多了性能下降。这个值要根据电压和频率查手册确定,不能随便设。
5. 常见问题与排查技巧实录
5.1 芯片不启动的排查思路
芯片不启动是最常见的问题,排查思路要清晰。先测电压:5V、3.3V、1.2V、1.1V、VCAP,这五个电压都要对。如果哪个不对,先修电源。电压都对了,再查复位信号,NRST应该是高电平,按复位键应该拉低再拉高。
复位信号正常的话,查BOOT0引脚,应该是低电平。BOOT0高电平的话芯片会进Bootloader,不跑用户程序。BOOT0正常的话,查晶振,用示波器看OSC_OUT有没有波形。晶振正常的话,查SWD能不能连上,能连上的话说明芯片基本正常,问题可能在程序里。
如果SWD连不上,先检查SWDIO和SWCLK有没有接反,再检查有没有串电阻。都没问题的话,可能是芯片焊接不良,用热风枪重新吹一下芯片,或者补焊一下电源引脚。
5.2 SWD连接失败的常见原因
SWD连接失败我遇到过好几次,原因各不相同。第一次是SWDIO和SWCLK接反了,调换之后就好了。第二次是没串22Ω电阻,信号反射导致连接不稳定,加了电阻就好了。第三次是复位电容太大,用了1μF,导致复位信号上升沿太慢,换成100nF就好了。
还有一种情况是芯片进入了低功耗模式,SWD被关闭了。这时候要按住复位键,点连接,然后松开复位键,在芯片启动之前连上。这个技巧在调试低功耗程序的时候特别有用。
如果以上都试过了还是连不上,可能是芯片坏了。我遇到过一颗芯片,电源电压都正常,但SWD就是连不上,换了颗芯片就好了。这种概率不高,但如果实在查不出问题,换芯片试试。
5.3 晶振不起振的处理方法
晶振不起振的原因主要有三个:匹配电容不对、晶振本身坏了、PCB走线太长。匹配电容不对是最常见的,我一般先用18pF试,不起振就换15pF或者22pF。晶振本身坏了的话,换一颗新的试试。PCB走线太长的话,只能改板子,没别的办法。
还有一种情况是晶振的负载电容跟规格书不符。有些晶振标称负载电容是12pF,但实际用18pF才起振。这个没有定论,只能试。我一般会准备几种容值的电容,15pF、18pF、22pF,挨个试。
示波器测晶振的时候要注意,探头的寄生电容会影响起振。如果探头一碰就不起振了,说明匹配电容偏大,换小一点的试试。或者用高阻抗的探头,减少影响。
5.4 程序跑飞与死机的排查
程序跑飞一般是时钟配置或者电源问题。先查时钟配置,用CubeMX生成的代码一般没问题,但如果你手动改了PLL参数,要仔细检查。Flash等待周期也要设对,设少了会跑飞。
电源问题也会导致跑飞。SMPS的输出纹波太大的话,内核电压不稳,程序就会跑飞。用示波器测1.2V和1.1V的纹波,应该在50mV以内。如果纹波太大,检查电感和电容,或者增加输出电容。
还有一种情况是堆栈溢出。H723的默认堆栈大小是0x400,如果程序里用了大数组或者递归,堆栈会溢出,导致程序跑飞。可以在启动文件里把堆栈改大一点,比如0x1000。
5.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 芯片不启动 | 电源电压不对 | 测5V、3.3V、1.2V、1.1V、VCAP | 修电源电路 |
| 芯片不启动 | 复位信号异常 | 测NRST电压 | 检查复位电路 |
| 芯片不启动 | BOOT0电平错误 | 测BOOT0电压 | 检查BOOT0电阻 |
| SWD连不上 | SWDIO/SWCLK接反 | 检查接线 | 调换接线 |
| SWD连不上 | 缺少匹配电阻 | 检查电路 | 串22Ω电阻 |
| 晶振不起振 | 匹配电容不对 | 换不同容值电容 | 试15pF/18pF/22pF |
| 晶振不起振 | 走线太长 | 检查PCB | 改板子 |
| 程序跑飞 | 时钟配置错误 | 检查PLL参数 | 重新配置 |
| 程序跑飞 | 电源纹波大 | 测纹波 | 增加输出电容 |
| 程序跑飞 | 堆栈溢出 | 检查堆栈大小 | 改启动文件 |
6. 调试实战中的经验总结
6.1 示波器与万用表的使用技巧
调试硬件的时候,示波器比万用表有用得多。万用表只能测平均值,示波器能看到纹波和毛刺。测电源纹波的时候,要用AC耦合,带宽限制设到20MHz,探头要用弹簧地线,不能用鳄鱼夹,否则会引入干扰。
测晶振的时候,要用10x探头,1x探头的寄生电容太大,会影响起振。如果示波器有高阻抗探头更好,没有的话就用10x探头凑合。测SWD信号的时候,要用高带宽探头,至少100MHz,否则看不到信号的上升沿。
万用表主要用来测通断和电压。测通断的时候,要确保板子没电,否则测不准。测电压的时候,要用好的表笔,劣质表笔的接触电阻大,测出来的电压偏低。
6.2 焊接工具与材料的选择
烙铁我用的是936焊台,配刀头,适合拖焊。热风枪用的是858D,温度可调,风量可调。焊锡丝用0.3mm的含铅锡丝,含铅的比无铅的好焊,熔点低,流动性好。助焊剂用松香或者免洗助焊剂,松香便宜但残留多,免洗的贵但干净。
焊LQFP封装的时候,刀头比尖头好用。刀头可以同时接触多个引脚,拖焊效率高。焊QFN封装的时候,要用热风枪,烙铁焊不了底部的散热焊盘。热风枪的温度设到320度左右,风量设到最小,避免吹跑小元件。
洗板水要用无水的,含水的洗板水会腐蚀元件。洗完之后要用热风枪吹干,或者自然晾干。残留的洗板水会导致漏电,特别是晶振电路和高阻抗电路。
6.3 元件采购与替代方案
H723ZGT6这颗芯片我在立创商城买的,价格大概40多块钱。STM32的芯片假货不多,但翻新片不少,买的时候要选靠谱的渠道。我一般选立创或者得捷,贵一点但放心。
MP2145这颗DCDC芯片比较贵,大概5块钱一颗。替代方案是MP2315,便宜一半,但电流小一点,只有3A。H723的内核电流最大300mA,3A完全够用。TLV755P的替代方案是RT9013,也是1.1V输出,便宜不少。
晶振我用的是京华的25MHz贴片晶振,1块钱一颗。替代方案是爱普生的,贵一点但精度更高。电容电阻用国巨的就行,便宜量又足。电感用顺络的屏蔽电感,2块钱一颗。
6.4 后续扩展方向
这个最小系统跑起来之后,可以扩展很多功能。我下一步打算把以太网PHY焊上,跑LWIP协议栈。H723自带以太网MAC,外接一个LAN8720A PHY就行。CubeMX里配置LWIP,生成代码,然后调通ping就行。
还可以扩展USB接口,H723自带USB OTG,可以做成USB设备或者USB主机。USB设备的例子很多,USB主机的少一点,但也不难。还可以扩展SD卡接口,用SDMMC外设,跑FatFS文件系统。
如果要做高速数据采集,可以扩展ADC和DMA。H723的ADC是16位的,采样率能到3.6MSPS,配合DMA可以连续采集。还可以扩展SPI接口的ADC,比如AD7606,8通道同步采样,适合做电力监测。
这个板子我画了四次才稳定下来,前三次都有各种问题。第一次是电源纹波太大,第二次是晶振不起振,第三次是SWD连接不稳定。每次改板子都要重新焊接、重新调试,挺折腾的。但每次解决问题之后,对H723的理解就更深一层。现在这块板子跑550MHz很稳,CoreMark得分3100多分,跑LWIP也能ping通,算是达到预期目标了。