ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

STM32F103RCT6最小系统板全流程:原理图、PCB布局、焊接与调试

STM32F103RCT6最小系统板全流程:原理图、PCB布局、焊接与调试 前阵子给一台直流无刷电机控制器做改版原来的方案直接用了现成的开发板功能倒是齐全但体积、成本、功耗全都不达标而且板上三分之二的外设我压根用不上。咬咬牙决定自己做一块 STM32F103RCT6 最小系统板从原理图开始一直做到调试完成整个链路走下来踩了不少坑也积累了不少经验。这篇就以这块板子的设计过程为主线把最小系统板的原理图设计、PCB 布局、焊接、固件库准备和调试方法完整复盘一遍。如果你正准备自己画一块 STM32 控制板或者刚刚从“买开发板”过渡到“画板子”的阶段这篇内容应该能帮你省掉不少弯路。我会把每一步设计选择背后的理由也讲清楚而不是只丢给你一份能抄的原理图。1. 为什么选 RCT6资源账算清楚再动手很多人画最小系统板的第一步翻开引脚图就开始连线这是典型的顺序反了。先想清楚“这块板子到底要跑什么”再回头选芯片最后才谈得上原理图设计。1.1 Flash、RAM 和引脚数决定了项目上限STM32F103RCT6 属于增强型系列Cortex-M3 内核主频最高 72MHzFlash 256KBSRAM 48KB封装是 LQFP64可用 GPIO 数量在 51 个左右。这个资源量放在今天看起来不算夸张但在 F103 这个价位段里非常均衡。我这次的项目要同时做电机控制、编码器读取、串口通信和几路开关量检测。电机控制代码加 FOC 基础库固件体积很容易冲到 100KB 以上C8T6 的 64KB Flash 必然不够。而 48KB SRAM 做无刷电机的电流环、速度环运算和通信缓冲余量还算舒服。如果你只是想点个灯、读几个传感器C8T6 甚至 C6T6 都绰绰有余没必要上 RCT6。1.2 C8T6 与 RCT6 的差异不只是 Flash 翻倍这两颗芯片经常被放在一起比较因为引脚定义和绝大多数外设完全兼容。但注意封装不同C8T6 是 LQFP48RCT6 是 LQFP64多了 16 个引脚这意味着多了一组 GPIO 端口、更多的 ADC 通道和定时器通道引出机会。从开发角度讲从 C8T6 迁移到 RCT6 的成本很低固件基本不用改改的是原理图封装和 PCB 封装。我个人的习惯是只要项目里有“以后可能加功能”的打算就直接上 RCT6省得板子画好了才发现引脚不够用又得重新改版。量产阶段再根据实际资源评估降级到 C8T6。1.3 外设资源与本项目的匹配度对电机控制场景F103 的两个高级定时器 TIM1 和 TIM8 可以直接产生带死区的互补 PWM这是驱动三相全桥的基础四路通用定时器里拿一路做编码器正交解码拿一路做速度环定时中断。再加三路 ADC 采样相电流硬件资源刚好分配完不会太紧张。如果是做纯通信类项目RCT6 有 3 路 USART、2 路 SPI、2 路 I2C一个控制器同时挂显示屏、传感器和上位机通信都足够。选型阶段把这笔账写下来比翻数据手册感觉“好像够用”要可靠得多。2. 原理图每根线的来路最小系统的五大组成最小系统板听起来简单但每一部分都有讲究。电源、时钟、复位、BOOT、下载接口这五块哪一块设计草率调试阶段都会让你付出成倍的时间。2.1 电源拓扑5V 进、3.3V 出LDO 的前后级电容不能乱省最常用的方案是 USB 的 5V 输入经过一颗 LDO 转成 3.3V。AMS1117-3.3 是最常见的选择价格便宜、输出纹波可以接受但它的静态电流偏大电池供电场景要慎重。我这次是用 USB 供电所以选它没毛病。LDO 前后的电容配置我建议这样输入端 10uF 钽电容或电解电容加 100nF 陶瓷电容输出端也是 10uF 加 100nF。有些参考设计为了省成本把输出端大电容去掉板上负载一波动电压就容易掉下去特别是电机启动瞬间。如果板子上有电机驱动这类大电流负载建议在电机电源入口单独加大容量电解电容不要和 MCU 的 3.3V 混在一起用。另外最小系统板的电源入口我习惯加一个自恢复保险丝和防反接二极管。之前一块板子调试时电源接反直接把 LDO 烧了从那以后防反接电路不再省。2.2 时钟电路两个 20pF 电容不是随便选的F103 的主时钟我用了 8MHz 无源晶振并联两个 20pF 电容到地。这个电容值的来源是晶振的负载电容 CL 与杂散电容的匹配关系。典型情况下CL 为 12pF 的晶振配上两个 20pF 电容加上 PCB 走线和引脚约 4到6pF 的杂散电容实际负载接近 12pF 左右。32.768kHz 的 RTC 晶振同样需要除非你的系统完全不需要日历或低功耗唤醒功能。次要晶振的负载电容一般取 6pF 到 12pF具体看晶振规格书。为了保险起见两路晶振在 Layout 时都要尽量贴近芯片引脚这点后面 PCB 章节细讲。2.3 复位、BOOT 和 SWD 下载接口复位电路没有必要搞得太复杂一个 10k 上拉电阻加一个 100nF 电容并联一个复位按键按下去拉低 NRST 即可。100nF 电容的作用是给复位引脚提供一个干净的下降沿同时滤掉高频干扰。F103 的 NRST 引脚内部自带弱上拉但外部再加一个 10k 上拉是为了更强地抵抗噪声。BOOT0 和 BOOT1 是新手最容易忽略的地方。BOOT0 我通过一个 10k 电阻下拉到地这是正常的 Flash 启动模式如果想在不接调试器的情况下用串口下载程序把 BOOT0 跳线接到 3.3V 就能进入 ISP 模式。BOOT1 直接接地即可。很多成品开发板用两个跳线帽切换方便是方便但最小系统板我建议用焊盘或 0 欧电阻免得体积变大。下载调试接口我强烈推荐只留 SWD四根线搞定SWDIOPA13、SWCLKPA14、3.3V、GND。JTAG 占用的引脚太多正常项目根本用不上。板子上把这四根线做成 2.54mm 排针或 1.27mm 的 J-Link 标准接口都行我个人喜欢用 4Pin 间距 2.54mm手工杜邦线就能连。2.4 串口、LED 和按键最小系统板上最值得预留的外设既然是调试板串口必须引出。USART1 的 TX 是 PA9、RX 是 PA10这两根线我单独拉出来方便外接 USB 转 TTL 模块或者板载 CH340。如果你打算板载一个 CH340就需要在原理图里增加 USB 座子、CH340 晶振和相应去耦电容复杂度会上去但是用一根 Type-C 线就能同时下载和看日志调试体验确实好很多。LED 我接了三个分别放在 PB0、PB1 和 PC13 上串 330 欧电阻到地这样每组 I/O 测试都有现成的指示。按键只需要一个复位键再加一个用户按键接到 PA0做程序输入测试时用得上。下面是这块板子最小系统部分常用的引脚速查表画原理图时可以对着写功能引脚说明主晶振输入OSC_INPD08MHz 无源晶振主晶振输出OSC_OUTPD18MHz 无源晶振RTC 晶振PC14 / PC1532.768kHz复位NRST10k 上拉 100nF 按键BOOT0启动模式选择10k 下拉SWDIOPA13SWD 数据SWCLKPA14SWD 时钟USART1_TXPA9串口发送USART1_RXPA10串口接收用户 LEDPB0 / PB1 / PC13330 欧限流用户按键PA0下拉输入3. PCB 布局布线晶振和地才是最难的考点原理图画完接下来是 PCB。很多人觉得最小系统板的 PCB 随便布一布就行信号频率又不高。但实际做下来晶振起振不稳定、串口通信误码、ADC 采样跳变这些问题十有八九都是 Layout 埋下的雷。3.1 栅格设置与板框规划在 Altium Designer 里画原理图的时候我就建议把栅格设好。AD 的 Snap Grid 和 Visible Grid 都设成 10mil 或 100mil 这种规则值原理图导线才能对齐后续做 ERC 时也少一些无谓的告警。PCB 布线栅格通常设 5mil 或 10mil走线对不齐的话后期改板非常痛苦。板框根据外壳来定我这次没有外壳约束直接画了 5cm × 8cm 的双面板。双面板做最小系统完全够用没必要上四层。四层板确实在信号完整性上有优势但成本翻倍而且这种低速板子体会不到差距。3.2 晶振、去耦电容的摆放顺序布局顺序是这样的先固定主控芯片作为基准然后把 8MHz 晶振放在 OSC_IN 和 OSC_OUT 附近距离控制在 5mm 以内晶振下方不要走任何数字信号线晶振外壳如果接地就通过铺铜连接不要单独拉一根长地线。两个负载电容要尽量靠近晶振的引脚而不是靠近 MCU 引脚这样才能保证谐振回路最小。去耦电容的摆放原则是“靠近电源引脚”。每个 VDD 引脚旁边放一颗 100nF走线先到电容再进芯片引脚过孔直接打到地平面。电源入口处放 10uF 大电容给整个芯片提供一个低频蓄水池。我见过很多第一次画板的人把去耦电容放在芯片背面连了一根很长的过孔到正面电源脚这种做法虽然也能工作但去耦效果大打折扣尤其是电机启动、大电流跳变的时候复位和 ADC 容易出问题。3.3 布线顺序先电源地再时钟最后信号我的布线顺序固定是电源网络 → 地平面 → 晶振网络 → 模拟信号 → 数字信号。电源线根据电流大小决定宽度3.3V 主干我走了 30mil地网络最后通过覆铜连接成完整平面。如果空间允许双面板的底层尽量全部铺 GND这样每个信号的回流路径都最短环路面积最小对 EMC 和信号质量都有好处。还有一个细节是微控制器的灰度引脚和外部中断引脚不要放得太远。像 BOOT0 这种启动配置脚如果走线绕了大半个板子调试器连接时的干扰可能会导致启动模式不稳定。SWD 的 SWDIO 和 SWCLK 两根线最好并行走上下拉电阻靠近 MCU 端。串口 TX/RX 线如果穿过电机驱动区域要远离 PWM 输出线避免串扰。4. 焊接、上电与第一份固件库工程板子打样回来焊接和上电这步是真正考验耐心的时刻。很多问题不是设计错误而是焊接和检查环节马虎造成的。4.1 LQFP64 的焊接与检查心得STM32F103RCT6 的 LQFP64 封装引脚间距 0.5mm手工焊接难度适中。我的经验是先固定四个角然后在引脚上多涂焊锡用烙铁头带焊锡从一侧慢慢拖过去最后用吸锡带把多余的焊锡清理干净。焊完用放大镜或手机微距镜头逐个检查有没有引脚短路特别是相邻引脚之间有锡桥的情况。检查电源对地阻抗是上电前最重要的步骤。用万用表蜂鸣挡量 3.3V 网络和 GND 之间是否有短路正常情况应该只有几百欧到几千欧的阻抗如果接近 0 欧先不要上电回去找短路点。还有一种情况是阻抗过低低于 10 欧可能是某个电容焊反或芯片内部损坏也要查清楚再接电。4.2 第一次上电限流供电和电压确认上电时我强烈建议用可调电源把电流限制在 100mA 左右电压先设到 5V 再接 USB 输入。如果电流瞬间冲到限制值说明板子还有问题立刻断电检查。正常情况下最小系统板空载电流在 30mA 到 50mA 之间如果电流过大大概率是晶振电路或 LDO 部分出了问题。用万用表确认 LDO 输出电压在 3.28V 到 3.32V 之间再用示波器看 3.3V 的纹波纹波峰峰值最好控制在 50mV 以内。示波器探头的地夹要尽量短地连接如果纹波很大先看 LDO 输入输出电容是否焊好再检查地回路。4.3 固件库与标准库的选择F103 系列的开发库无外乎标准外设库Standard Peripheral Library和 HAL 库两种。标准库目前已经停止更新但网上资料最多寄存器级的封装也更直接很适合理解底层原理。HAL 库代码臃肿一些但好在 ST 官方还在维护配合 CubeMX 可以快速生成工程。我做这个项目用的是标准库 3.5 版本。很多人在网上搜“stm32f103rct6 标准库”时容易下错包其实标准库对 F103 全系列是通用的只要器件头文件里定义了 STM32F10X_HDRCT6 属于高密度器件。工程模板里把宏定义改成 STM32F10X_HD再把启动文件换成 startup_stm32f10x_hd.s 就可以了。4.4 点灯验证最小代码确认硬件链路第一次烧写程序不一定要跑自己的业务逻辑先点灯。下面这段代码就是把 PB0 配置成推挽输出然后翻转电平确认最小系统的 GPIO 链路没问题#include stm32f10x.h void Delay(void) { unsigned int i; for (i 0; i 500000; i); } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); while (1) { GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); Delay(); GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); Delay(); } }如果这个程序能跑说明电源、晶振、复位、SWD 下载链路全是通的。这一步的价值在于把“硬件问题”和“软件问题”的边界划开后面调试复杂逻辑时就不会再怀疑板子本身。5. 串口、Watch 窗口与硬件排障调试三板斧最小系统板跑通之后真正的战斗才刚刚开始。嵌入式调试手段就那几样串口日志、调试器 Watch 窗口、示波器逻辑分析仪。把这几个工具用熟了大多数问题都能定位。5.1 printf 重定向与串口调试助手的配合串口日志是最直观的调试手段。标准库下要把 printf 重定向到 USART1需要实现 fputc 函数int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }然后在主程序里调用 printf 打印运行信息。注意 Keil MDK 的 MicroLIB 要勾选否则 fputc 不会被自动调用。串口调试助手方面我习惯用 SSCOM 或者 XCOM 这种轻量工具波特率 1152008 位数据、1 位停止位、无校验。打印内容不要一股脑全打调试信息要有分级ERROR、WARN、INFO。电机启动时每 10ms 打印一次速度环的目标值和实际值出现异常时看日志基本一眼就能找到问题。5.2 Keil 调试模式Watch 窗口里怎么看结构体变量最近有朋友问我 Keil 调试助手里面的 Debug 模式如何显示结构体变量这个确实值得一提。在 Keil 里进入 Debug 模拟器或连接仿真器后打开 View → Watch Window → Watch 1然后把结构体变量名拖进窗口就可以展开看每一个成员的值。如果是数组或指针要注意基地址和长度设置否则只能看到第一个元素。还有一个更实用的方式是 Command 窗口里输入Watch Add MyStructure或者直接双击变量MDK 会把它加到 Watch 标签页。调试电机控制这类包含大量 float 运算的代码时我一般会同时看电流环的 q 轴反馈电压、编码器角度和速度值三个变量摆在一起很快就能判断是算法问题还是硬件采样问题。5.3 硬件排障定位不复位、不运行、串口无数据的通用流程如果程序烧进去板子没反应我的排查顺序是先确认 SWD 连接正常J-Link 或 ST-Link 能识别到芯片再用复位按键触发一次复位同时用示波器抓 NRST 引脚波形复位时应有一个干净的低电平脉冲接着量 8MHz 晶振的 OSC_OUT 引脚正常情况下能看到频率稳定在 8MHz 左右的正弦波如果晶振没起振检查负载电容和晶振虚焊。晶振起振了但程序还是跑飞就要检查 BOOT0 引脚电平。BOOT0 被拉高且不是预想模式时芯片会进入 ISP 模式用户程序完全不执行。这块板子 BOOT0 我设计成 10k 下拉如果之前跳线接错过重新焊回默认状态就恢复了。还有一种隐蔽问题是 LDO 输出能力不足。接上调试器后调试器通过 SWD 给目标板供电的情况可能出现电流叠加导致 3.3V 跌到 3.0V 以下芯片工作异常。所以我做调试时习惯给目标板单独供电调试器只保留 SWD 三根线不接 VCC。6. 从最小系统板扩展成完整控制器编码器与 FOC 的硬件基础最小系统板只是底层骨架真正让它发挥价值的是外设扩展。最近挺多人搜“stm32f103rct6 无刷电机 FOC 驱动代码”说明大家都在用这颗芯片做电机控制。这里顺便把最小系统板怎么为 FOC 和其他扩展做好准备讲一下。6.1 编码器接口为什么要外部上拉和滤波增量式编码器输出通常是开漏或推挽信号接到 MCU 的定时器正交解码引脚之前先用 10k 电阻上拉到 3.3V。开漏输出的编码器如果没有上拉电平会悬浮不定定时器计数值会乱跳。电机运行环境里干扰不少A/B/Z 信号线上我还会串一个 100 欧电阻并在 MCU 引脚对地加 1nF 电容构成简单的低通滤波滤掉高频毛刺。F103 的正交解码一般用 TIM2 到 TIM4 的 CH1 和 CH2。RCT6 有足够多的定时器通道我习惯把编码器接口放在 TIM4专门给速度环用TIM1 用来输出 PWM 给电机驱动。这样编码器反馈和 PWM 驱动互相独立不容易占通道。6.2 FOC 驱动对最小系统板的硬性要求FOC 算法在 F103RCT6 上完全可以跑72MHz 主频配合硬件乘除法指令勉强够用但前提是板子要提前把关键外设引出来。三相逆变器的六路 PWM 要用 TIM1 的高级通道 CH1、CH2、CH3 以及对应的互补通道这些引脚必须在板边排出清晰的插针ADC 采三相电流至少需要 3 个模拟输入通道PA0 到 PA7 这些有 ADC 输入的引脚尽量不要全部占用为普通 GPIO。另外FOC 调试最怕地弹和噪声。电流采样电阻的地和 MCU 的模拟地要单点连接PCB 上模拟信号走线要远离 PWM 输出。这个要求在设计最小系统板时就要留出空间不要等算法跑起来才回头改板。6.3 预留测试点与扩展排针的思路一块好的最小系统板不会把所有引脚都堆成 2.54mm 排针就算完。我会在板上留几颗测试点专门引 3.3V、GND、PWM 输出和 ADC 采样信号调试时示波器探头直接夹上去就行不用再去数排针编号。如果要接 CAN 总线或 RS485建议把 USART2 和 USART3 的 RX/TX 引到指定区域外部差分芯片小板可以直接插上验证不用改主板的原理图。这样最小系统板实际上就成了一个可以不断扩展的“底板”后续每个新项目只需要画一个小扩展板挂上去。我手头这个电机控制器就是这么迭代出来的第一版只做了最小系统第二版加了编码器接口和驱动接口第三版才固化成量产板。自己做板子的乐趣就在这里从原理图到 PCB从焊接再到调通每一条信号链路每一步都能看到问题、理解问题、最终解决问题。如果你现在正准备画自己的第一块最小系统板建议不要直接抄别人的图按上面这几个模块逐个推敲一遍把每个元件的存在理由都弄清楚踩坑的时候心里会更有底。
返回列表