引脚与外设分配

利用STM32CubeMX的引脚自动分配功能,前期准备工作方便了不少:

stm32cubemx
stm32cubemx

选择了:

  • FMC SDRAM bank1,16位数据线,13位地址线
  • FMC nand flash bank2,8位总线
  • RMII接口
  • LTDC接口配置为RGB565
  • DCMI接口
  • DAC1、DAC2
  • USB1-fs、USB2-fs
  • SDIO,4位数据线
  • SWD调试接口
  • USART1
    引脚所剩无几;再加上4个LED吧。

之所以选择SDRAM的第一个bank(而不是像stm32f429-disc1那样在第二个bank),是因为据参考手册,这个bank可以重定位到0地址,在上面跑代码时候就能使用ICode总线从而提高性能。而且stm32429-eval评估板也这么干。不过我试验感觉并没有效果,可能瓶颈就是SDRAM的带宽了吧。

参考手册建议将SDRAM bank1重定位到0地址
参考手册建议将SDRAM bank1重定位到0地址

KiCad布线工具

KiCad这个开源的布线工具一点都不含糊,功能相当齐全,元件库相当华丽而齐全,运行起来也相当流畅(个人感觉比AD流畅多了)。Ubuntu下安装要通过kicad的ppa源,下载过程相当慢;Debian的话它的软件源里面就有了。照着Getting Started文档走一遍,可以一小时之内上手kicad。

一个大坑

kicad的CvPcb用来为原理图的元件分配PCB的封装,它默认PCB封装库从github上下载,于是每一次启动CvPcb时候都要从网上下载那上百个封装库,这时候整个kicad都卡死了。所以先要将其设置为本地的库文件;记得要跑到pcbnew里面设置。。。

设置本地库文件
设置本地库文件

然后将所有github的链接删掉,点击Append with Wizard,一个个用鼠标添加库文件。。。

添加本地库文件
添加本地库文件

交互式布线

kicad手工拖线的体验相当不错。按F11快捷键可以切换到OpenGL模式,马上视觉效果就不简陋了,而且此时布线是interactive的,拖线时候会避开无关的net。

有些人用kicad画出来的板子走线就跟用protel99se画的那样不整齐,或许是因为他不知道还有一个很难找到的快捷键。kicad能像AD那样调整一批线和过孔,方法如下:在OpenGL的布线状态下,按着Ctrl键去然后拖拽之前布好的线或过孔,调整时附近的其他线与过孔都能够避开。这样来调整线路,kicad也能布出非常规整的线路来。

调整一批已布好的线
调整一批已布好的线

有一个bug

目前kicad在铺铜时候,能正确避开不同net的焊盘、线、过孔等,但是不会避开不同net的铺铜。因此同一层中不同net的铺铜不能重叠。

STM32主控

ST官网上的手册分为数据手册(DS开头的)应用手册(AN开头的)参考手册(RM开头的)等多种手册。对于STM32F429,

DS9405数据手册给出了电气特性、引脚定义、外设概况等信息。
AN4488应用手册给了详细的硬件设计提示。
RM0090参考手册给出了所有寄存器的详细解释和编程指南。

根据AN4660应用手册,LQFP176封装的stm32f429ix和stm32f767ix引脚兼容。

电源

据说设计四层板的话,一般外层走线,内层构成完整的电源层。在主芯片每一个电源脚附近都要打过孔以确保电源连接,而且它们附近都要安排104滤波电容,这些电容一个都不能少焊:对于stm32的电源引脚很多的大芯片来说都要这样,否则可能会烧写不了程序。

LQFP176的片子有BYPASS_REG引脚,直接拉低则表示,使用片内的稳压器给内核供电,此时VCAP1VCAP2外面都要接一个2.2uF左右的电容,这两个引脚将测得为1点几伏的内核电压。电容也不能省,否则接调试器时候可能识别不了芯片。
PDR_ON引脚用于在刚上电时检测电源是否已达标(AN4488手册说,超过1.7V),以保证稳妥的启动。它直接拉到3V3就行。
复位引脚片内有上拉电阻,片外不用加上拉了,只需要在复位开关两端并联一个104电容即可。

一些晦涩引脚的接法
一些晦涩引脚的接法

另外据说,铺铜后,应该在空闲的地方多打过孔,以便使得上下层铺铜连接更好。

时钟

选择了25MHz的晶振。

板子上有3个部分需要时钟:STM32主芯片、以太网PHY芯片、摄像头。据RM0090参考手册,以太网的PHY芯片时钟源,可以直接用MCO引脚输出的STM32主芯片的晶振时钟。但是MCO1、MCO2引脚都距离RMII接口有点远,并且摄像头也要用时钟;摄像头用一个定时器输出时钟的话,设备树会写得非常绕。

为确保成功,STM32和以太网PHY都各自用一个25MHz的晶振,而摄像头就用MCO。3225无源晶振价格也不贵。

原理图中优雅地分配net

STM32中同一个外设对应的GPIO引脚分布四方,然后很多人画原理图时候就整张图地翻找引脚、分配net,画的相当不方便,看原理图的人也很感觉很绕。

而ST官网发布的原理图就画的很清晰:主芯片的每个GPIO都有net,先不管它想用在哪个外设上面,GPIO原本是P几就设为P几;对于其他外接的芯片的引脚的net,先不管它准备接到STM32哪个GPIO上,该是什么功能就是什么功能;最后在一块单独的地方画一批平行线段,两端放net,GPIO对应到外设,一目了然。这种风格相当优雅。

原理图中清晰地分配外设GPIO
原理图中清晰地分配外设GPIO

SDRAM和nand flash

拆机的64MB SDRAM、128MB nand flash淘宝上很多,价格低廉;这些SDRAM一般是从远古时代的PC100/PC133的内存条上面拆下来的,跑起来感觉没问题(当然不能当工业级产品用)。低容量的nand flash是SLC的,很耐擦写,回收的芯片里面顶多多了几个坏块,对这板子完全够用了。

虽然STM32F429的最高主频是180MHz,那么PLL倍频时候就可以先拉到360MHz再除以2;但因为USB需要精确的48MHz时钟,而48不能整除360,因此只能找别的倍频数。最后HCLK只设到到168MHz;而FMC的最小分频数是2,因此SDRAM的时钟频率最高是84MHz。SDRAM其他参数可以这样设置:

  • CL(即CAS latency)设为2;因为选用的SDRAM芯片是K4S511632C-KC75,最高时钟是133MHz;CL设低一点以稍微增加一点带宽。
  • 其他时序比较常规,如RCD = 2,RP = 2,WR = 2,RAS = 4

nand flash因为有busy引脚,所以大可不必担心CPU跑得太快;配置常规的时序就行了。

因为将SDRAM放在主芯片背面,引线非常短,而且时钟频率也很低,所以布线时不讲究等长,制版不搞阻抗,板子也能跑的很欢快。

网卡

像我这种穷学生,当然选用一两块钱的LAN8720A这个RMII接口的百兆网卡啦。

网卡
网卡

复位脚我下拉了,所以程序里面初始化网卡之前先得将ETH_RST引脚拉高,设备树里面也记得要加复位引脚(stm32429-eval板就没加)。

&mac {
    ...

    snps,reset-gpio = <&gpioh 2 GPIO_ACTIVE_HIGH>;
    snps,reset-active-low;
    snps,reset-delays-us = <0 10000 100000>;
};

VGA显示接口

STM32F429只有LTDC液晶屏接口,并没有专门的VGA接口。VGA接口简单说就是,RGB三个模拟电平,加上行同步、帧同步信号线。STM32的DAC只有两路,不够RGB三路信号用;网上弄VGA的STM32玩家,或者是在FSMC上外接一块CPLD、FPGA来弄,或者RGB只有零和一的数字电平,或者外接一个昂贵的高速DAC来弄

其实LTDC已经有行同步和帧同步了,关键就是将并行RGB信号转化为模拟信号嘛,最低成本的做法便是用R-2R电阻网络搭成简易DAC啦。R-2R电阻网络之所以能有数模转换的效果,可用基尔霍夫定律算出来。

LTDC加上简易DAC搭成VGA
LTDC加上简易DAC搭成VGA

VGA的效果其实还是相当不错的:

VGA效果
VGA效果

摄像头

选用了0.5mm间距的fpc-24封装的摄像头模组。像OV7670、OV2640之类的摄像头模组引脚定义一般是一样的,而且Linux内核里面有大量摄像头的驱动,替换时候也相当方便。

摄像头模组
摄像头模组

据他们的手册,这种模组有三个电源:

  • AVDD,模拟电路电源,2.5~3.0V;
  • DVDD,数字电路电源,1.3V;有些原理图给到了1.8V,我之前也拉到过1.8V也没发生什么事情。
  • DOVDD,IO口电源,3.3V;

摄像头的SCCB命令接口其实就是I2C接口。给了1.5k的上拉电阻。
其数据并行口最多有10位,但是实用的就8位,而且有些厂商的模组也就引出8位出来。并口、像素时钟、行同步、帧同步等信号都接到STM32的DCMI外设那里。

摄像头电路
摄像头电路

其他外设

  • 两个USB都工作在全速模式下面,直接分别引出D+、D-就可以了。(为降低板子复杂度,USB2没有外接高速phy芯片)
    USB电路
    USB电路
  • 两路DAC引出为3.5mm音频接口。
    音频接口
    音频接口
  • SDIO接SD卡槽,除了时钟线之外,都加了10k上拉电阻。
    SD卡
    SD卡

最终效果:

板子布好线了
板子布好线了

布完线,就要出图了

国内工程师大规模用AD系的CAD软件,以至于国内PCB厂商都直接能接受.pcbdoc的文件了;不过最通用的还是gerber光绘文件,况且kicad也出不了.pcbdoc文件。

打样需要一批gerber文件:

名称 作用 kicad里面的名字 输出gerber文件后缀
信号层 外层内层导电的铜层 F.Cu、B.Cu、In1.Cu、In2.Cu等 .gtl、.gbl、.g2、.g3
阻焊层 PCB外表的那一层红红绿绿的油墨层 F.Mask 和 B.Mask .gts、.gbs
锡膏层 用来出钢网的 F.Paste 和 B.Paste .gtp、.gbp
丝印层 即板子印有的油墨字体、logo之类的 F.SilkS 和 B.Silks .gto、.gbo
机械层 勾出板子的轮廓,一般只需要一个机械层 Edge.Cuts .gm1
钻孔文件 板子上打的通孔焊盘、过孔等等 在plot时单独生成 .drl

最终输出的文件有:

输出的文件
输出的文件

接着就可以投板生产了。不少PCB厂商都有网上平台,如果不想注册账号的话可以上淘宝翻找。打少量样片的话有些厂商可以免费24小时或48小时加急,没得加急的就等一周吧。

这只企鹅印的真是orz
这只企鹅印的真是orz

手工焊接技巧

根据我多年的焊接经验,焊引脚密集的贴片元件,一定要用有铅焊锡!63%的有铅焊锡加上松香,可以解决所有连锡问题!焊接时候一定要恒温烙铁或者焊台(恒温烙铁比普通烙铁贵不了多少),设置的焊接温度一定不能超过400摄氏度(其实300度已经很高了)!

有人说有铅焊锡不环保啊,铅是重金属对身体有害啊云云;但是要知道锡本身就是重金属啊。。。机器焊接不用有铅焊锡,忌惮的是电路板废弃之后对环境的影响;有铅焊锡的流动性、可焊接性比无铅焊锡要好多了,要想尽量减少对身体的害处,当然是快点焊完,缩短接触时间啦。

刚焊上的主控芯片。有两处连锡是因为那里本身就是连在一起的。

刚焊上的主控芯片
刚焊上的主控芯片

如果花点小钱定制钢网,就可以刷锡膏然后用热风枪吹了。不过锡膏刷的时候容易干掉,而且容易刷的太多,0.5mm间距的封装引脚容易连在一起,这时候还是要用电烙铁和松香将锡带出来。

对于qfn封装这类引脚在底下的芯片,就只能用热风枪来吹了。

板子全图:

板子全图
板子全图