简介:一套基于STM32F103C8T6(LQFP48)主控与WS2812B RGB灯珠的蓝牙键盘硬件设计工程,主要面向嵌入式硬件工程师、电子设计竞赛参赛者及DIY爱好者,可用于学习STM32最小系统设计、低功耗蓝牙通信、RGB灯效驱动等综合硬件知识。压缩包共含14个文件,涵盖Altium Designer 09设计环境的原理图SchDoc、PCB PcbDoc、器件封装库PcbLib/SchLib、工程结构PrjPcb、BOM表格CSV以及高亮预览文档,完整记录了一块139×97mm双层键盘板卡的元器件布局、走线与引脚分配。原理图部分可对照学习MCU外围电路、蓝牙模块连接及WS2812B灯珠排布,PCB部分则展示2层板下的射频区处理与RGB阵列走线策略,对理解紧凑型无线外设设计很有帮助。资源包大小约9.08MB,目录结构直观,下载解压后可直接打开工程查看整体设计。目前已有770人浏览学习,既适合初学者临摹参考,也适合有经验的开发者在此基础上快速衍生出带自定义RGB背光效果的蓝牙键盘方案。
1. 从 LQFP48 键盘板看 STM32F103C8T6、WS2812B 与蓝牙键盘的硬件关系
打开这个压缩包时,多数人第一眼会去找 PDF 格式的原理图,但我更建议先把文件名当需求文档读一遍:STM32F103C8T6(LQFP48)是主控芯片和封装形式,WS2812B 是板载可编程 RGB 灯珠的型号,蓝牙键盘是产品形态,而 AD 设计、PCB 与器件封装库文件是这份工程要交付的内容本身。换句话说,这是一份从原理图到生产文件全流程的完整硬件设计包,适合正在从开发板原型往量产方向收尾的工程师,也适合第一次尝试“主控 + 灯带 + 无线”三合一的硬件新人。
这类板子的难点不在某一个模块,而在于三套系统共用一块 PCB:STM32 最小系统的电源和时钟要稳,WS2812B 的 5V 供电和数据时序要准,蓝牙射频部分要留出干净的净空和天线区域。三者之间还会互相干扰,灯带大电流会把 3.3V 拉垮,数据线走线太长会把灯效信号搞花,天线底下铺铜过多会让蓝牙键盘连不上。把这三条线理清楚,再去看这份工程里的原理图和封装库,基本就能读懂每一处设计选择。
2. STM32F103C8T6 最小系统原理图:晶振、复位、BOOT 和 SWD 一个都不能少
2.1 板载最小系统板的常规画法:六个模块凑齐“能跑”条件
STM32F103C8T6 本身是 LQFP48 封装,48 个引脚不算紧张,但真要在一块键盘 PCB 上跑起来,核心不是 MCU 本身,而是外围最小系统是否完整。一份合格的最小系统原理图一定包含六个部分:3.3V 电源网络、VDDA/VSSA 模拟供电滤波、8MHz 外部晶振、NRST 复位电路、BOOT0 启动选择和 SWD 下载接口。缺了任何一个,板子要么不启动,要么调试器连不上,要么烧录后跑飞。
我一般会把 VDDA 单独用磁珠从 3.3V 主干分出来,再接一个 1uF 和一个 100nF 电容,这是 STM32 数据手册里明确要求的做法。NRST 引脚用 10k 电阻上拉到 3.3V,再并一个 100nF 电容到地,能有效防止上电瞬间和静电干扰造成的异常复位。BOOT0 直接用一个 10k 电阻下拉到地,保证芯片从 Flash 启动,不要像开发板那样留三针跳线,量产键盘上没有用户会去拨它。
2.2 8MHz 晶振的负载电容选择:不是随便焊两个 20pF
晶振部分最容易照抄开发板但抄错参数。STM32F103C8T6 的 HSE 引脚是 PD0(OSC_IN)和 PD1(OSC_OUT),外部晶振选 8MHz,配合两个负载电容接地。负载电容的计算公式是 CL = (C1 × C2) / (C1 + C2) + Cs,其中 Cs 是引脚寄生电容和走线寄生电容,约 3 到 5pF。很多晶振规格书上标的是 18pF 或 20pF 负载,如果你直接用两个 20pF 电容,实际负载约 12pF 左右,偏差不大但频率精度会受影响,对蓝牙键盘这种需要串口通信定时的场景不够稳妥。
RCC_OscInitTypeDef osc = {0}; osc.OscillatorType = RCC_OSCILLATORTYPE_HSE; osc.HSEState = RCC_HSE_ON; osc.PLL.PLLState = RCC_PLL_ON; osc.PLL.PLLSource = RCC_PLLSOURCE_HSE; osc.PLL.PLLMUL = RCC_PLL_MUL9; // 8MHz * 9 = 72MHz HAL_RCC_OscConfig(&osc);这段配置里最关键的是 PLLMUL 参数。外部 8MHz 晶振经过 PLL 倍频到 72MHz,这是 STM32F103C8T6 的标称最高主频。如果外部晶振换成 12MHz,PLLMUL 就要相应调整,否则串口波特率和 WS2812B 的时序都会跟着跑偏。原理图上晶振的两个引脚各接一个 18pF 电容到地,电容值不必过分精确,但耐压和温度稳定性要选 C0G 或 NP0 材质,不要用高容量的 X5R/X7R。
2.3 SWD 下载口留四根线,串口调试口单独分一路
LQFP48 封装的 STM32F103C8T6 支持 SWD 和 JTAG,但键盘 PCB 上空间有限,一般只留 SWD。SWD 只需要 SWDIO、SWCLK、GND 和 3.3V 四根线,即使板子已经贴好外壳,也能用四根飞线完成程序烧录。注意 SWCLK 引脚上不要加过长走线或大电容,否则高频时钟会衰减得厉害,调试器识别不到芯片。
同时建议把 USART1(PA9/PA10)引出一组 3.3V TTL 串口作为调试口,不要直接接 RS232 电平转换芯片,键盘内部没有空间放这些老家伙。串口在这里的作用是打印蓝牙模块的 AT 返回值和 WS2812B 的灯效调试信息,这在排查“蓝牙连不上”“灯色不对”这类问题时效率极高。我通常会把 USART1 固定为调试串口,把蓝牙模块挂到 USART3(PB10/PB11),两块串口互不干扰。
2.4 键盘矩阵的引脚功能分配:列输出、行输入、灯数据、蓝牙串口
| 功能模块 | 引脚 | 说明 |
|---|---|---|
| 列扫描输出(8 列) | PA0 到 PA7 | 推挽输出,默认输出低电平 |
| 行扫描输入(6 行) | PB0 到 PB5 | 上拉输入,检测列线拉低状态 |
| WS2812B 数据线 | PB6 或 PA8 | 优先选择定时器通道输出引脚 |
| USART1 调试串口 | PA9 / PA10 | 3.3V TTL 电平 |
| USART3 蓝牙连接 | PB10 / PB11 | 与蓝牙模块串口对接 |
| USB 备用接口 | PA11 / PA12 | 留作有线模式扩展,布线时按差分线处理 |
机械键盘的矩阵扫描核心思路是:列线由 MCU 推挽输出,行线配置为上拉输入。扫描时逐列拉低,再读取行线电平,就能判断哪个按键被按下。为了防止多个按键同时按下时出现鬼键现象,原理图上每个按键开关都会串联一个 1N4148 二极管,方向从行线指向列线,这是键盘矩阵设计的行业标准做法,原理图库里要给二极管单独做封装,不要和 LED 封装混用。
PA11/PA12 是 USB D-/D+,如果产品规划里没有有线模式,这两个引脚可以挪作他用,但一旦要加有线键盘功能,这两个引脚的走线就得按 USB 差分线要求来,线宽保持一致、等长误差控制在 5mil 以内。建议原理图阶段就把这两个引脚预留成 2 针焊盘,后续改版不用动矩阵扫描的固件逻辑。
3. WS2812B 灯板供电计算与数据链布线:60mA 一颗灯不只是算着玩
3.1 WS2812B 中文资料里最容易误读的两个参数:电压阈值和位周期
WS2812B 的中文资料很多,但有两个参数经常被看错。第一个是数据输入引脚的电压阈值,数据手册里给出的 VIH 大约在 0.7 × VDD,即 3.5V 左右,这让很多人以为 3.3V 的 STM32 肯定驱动不了。实际上 WS2812B 内部有整形电路,实际触发阈值会低一些,大量量产项目直接用 3.3V 单板驱动也能工作,但余量不够稳定。最可靠的做法是加一颗 74AHCT1G125 单路缓冲器,把 3.3V 数据信号升到 5V,顺便带来更强的扇出能力和更陡的信号边沿。
第二个参数是位周期。WS2812B 采用单线归零码,数据率是 800Kbps,每一位的时长固定为 1.25us。0 码的高电平时间约 0.35us,1 码的高电平时间约 0.85us。用 STM32 的 GPIO 模拟这个时序不是不行,但一颗灯 24bit,几十颗灯的数据帧会长时间阻塞 CPU,所以实用方案都是用定时器 PWM 加 DMA 输出。
3.2 供电设计:每颗灯全白 60mA,一排灯的电流要把电源线当主干道
| 灯珠数量 | 全白电流 | 1oz 铜厚最小线宽 | 实际建议线宽 |
|---|---|---|---|
| 10 颗 | 0.6A | 0.5mm | 1.0mm |
| 20 颗 | 1.2A | 1.0mm | 1.5mm |
| 30 颗 | 1.8A | 1.5mm | 2.0mm |
| 40 颗 | 2.4A | 2.0mm | 2.5mm 并开窗镀锡 |
这里的电流是每颗灯珠 RGB 全亮时的极限值,黑色键盘日常灯效不会持续满电流,但电源设计必须按极限算。USB 口的 5V 供电能力通常只有 500mA,直连电脑时根本带不动 20 颗以上的灯全亮,所以原理图上一定要加外部 5V 供电接口,比如 USB Type-C 的 PD 诱骗取电,或者板载 DC 座,PCB 上从供电入口到第一颗灯珠的主干道单独走一根宽线,不要把灯带电流绕到 MCU 的 3.3V 电源网络里。
3.3 用定时器 PWM 加 DMA 发一帧灯色数据的最小代码
#include "main.h" #define WS2812B_NUM 30 // 灯珠数量,按 PCB 上串联灯实际数量改 #define WS_TIM_PERIOD 89 // 72MHz 下 90 个计数周期约 1.25us uint32_t ccBuf[WS2812B_NUM * 24]; // 每 bit 对应一个 CCR 比较值 void ws2812b_set_bit(uint8_t data, uint32_t idx) { uint8_t mask = 0x80; while (mask) { ccBuf[idx++] = (data & mask) ? 55 : 18; // 1 码高电平约 0.76us,0 码约 0.25us mask >>= 1; } } void ws2812b_fire(TIM_HandleTypeDef *htim, uint32_t channel) { HAL_TIM_PWM_Start_DMA(htim, channel, ccBuf, WS2812B_NUM * 24); }逻辑上,先把每一颗灯珠的 24bit 颜色数据拆成单个 bit,每个 bit 对应定时器一个完整周期的 CCR 值。DMA 会在每个周期自动更新定时器的比较寄存器,从而在 GPIO 上生成连续的单线协议波形,整个过程不占用 CPU 中断。发送完一帧后记得关闭 DMA 或把数据线拉低,否则最后一个周期的电平状态会残留,导致下一帧的第一个 bit 被误判。
htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = WS_TIM_PERIOD; // 89,周期约 1.25us htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim2);参数说明:预分频设为 0,意味着定时器直接以 72MHz 时钟计数;周期 89 则一个完整周期是 90 个计数,约 1.25us。CCR 值 18 对应 0.25us 高电平,55 对应 0.76us 高电平,这两个值要在示波器上实测微调,因为 PCB 走线寄生电容会改变边沿速度。另外颜色顺序是 GRB 而不是 RGB,打样回来点灯时发现红绿互换不要怀疑硬件,先查固件里颜色排列。
3.4 数据线走线与地回流:包地后还要远离射频天线
WS2812B 数据线属于高速数字信号,虽然单线协议只有 800Kbps,但边沿非常陡,谐波成分能到几十兆赫兹,处理不好会成为板上的噪声源。数据线从 MCU 的定时器通道输出后,尽量走短走直线,两侧包地,下方保持完整的地平面,不要跨分割。灯珠之间的数据线长度不需要严格等长,只要控制在 10cm 以内,波形畸变都还在容差范围内。
灯带供电回流的路径同样重要。如果 5V 从板子一端进、灯珠一路铺过去,但地线没有同步跟随,电流会在 PCB 上绕大圈回流,产生压降和地弹,轻则灯色偏暗,重则数据信号被干扰导致整条灯带闪烁。所以在原理图和 PCB 阶段,就要把 5V 主干和 GND 主干像一对平行线一样敷设,灯珠密集区域的地孔每两三颗灯打一组过孔连接到背面地平面,这些细节在 AD 的 PCB 工程里都要落实到位。
4. 蓝牙键盘的无线链路:透传模块选型、天线净空与 HID 上报
4.1 STM32F103C8T6 没有蓝牙,外挂一条 HID 链路
STM32F103C8T6 内部没有射频收发器,所以蓝牙键盘必须在主控之外挂一颗蓝牙模块。常见做法有两种:一种是直接用自带蓝牙协议栈的 SoC 做主控,比如 nRF52832,但会绕开本文标题里的 STM32F103C8T6;另一种是保持 STM32 做主控,外挂一颗支持 HID 服务的低功耗蓝牙模块,通过串口或 SPI 通信。后者更符合这份工程文件的结构,也是客制化键盘里最常见的主控加透传方案。
需要注意的是,入行时很多人拿 HC05 这类经典蓝牙透传模块做键盘,最常见的现象是连接不上或频繁断连。根因有两个:一是 HC05 的配对窗口时间短,灯带大电流启动时把模块供电拉低,广播就断了;二是 HC05 本身不是为 HID 键盘设计的,要经过额外的协议转换才能上报键值。键盘这类人机交互设备,直接选支持蓝牙 HID Profile 的模块,让模块内部处理主机配对和上报,STM32 只负责矩阵扫描。
4.2 选模块看四个参数,而不是只盯蓝牙版本
| 参数 | 关注点 | 说明 |
|---|---|---|
| 休眠电流 | 越低越好,最好小于 20uA | 键盘待机时间由它决定 |
| 连接事件间隔 | 7.5ms 到 30ms 可配置 | 间隔越短延迟越低,耗电越高 |
| 广播间隔 | 30ms 到 100ms | 影响手机搜索到键盘的速度 |
| HID 服务 | 是否内置键盘/多媒体报告 | 决定主控要不要自己组 HID 报文 |
蓝牙版本 4.2 和 5.0 对键盘这类低速 HID 设备来说没有本质差异,BLE 的广播和连接机制才是关键。键盘对延迟敏感,连接事件间隔设得太大,按键按下到屏幕上显示会有可感知的延迟;设得太小,模块和主机都在高频唤醒,耗电会翻倍。量产键盘通常把连接事件间隔定在 7.5ms 到 15ms 之间,配合 STM32 的 STOP 模式睡眠,整机待机电流能控制在 100uA 上下,一节锂电池用一两个月不充电。
4.3 拿到模块先做串口回环,再看广播和配对
AT+VERSION? # 确认串口参数正确,返回信息里一般带模块固件版本 AT+ADDR? # 读取模块蓝牙地址,烧录前记下来,方便主机端白名单配对 AT+NAME=KBD-RGB # 广播名尽量用纯 ASCII 字符,某些主机对 UTF-8 名称兼容不好 AT+SLEEP=1 # 没有这条指令时,改用 MCU 的 GPIO 控制模块 EN 脚拿到蓝牙模块后,先不要直接焊到键盘板上。把模块接到 USB 转 TTL 小板,用上述指令一条条测。AT+VERSION 用来确认模块串口波特率和固件状态;AT+ADDR 记录的蓝牙地址在调试阶段很有用,可以预先把地址加进手机端的白名单,避免同时搜到附近其他同型号模块;改广播名时要避免中文和特殊符号,某些手机系统对非 ASCII 广播名会显示乱码甚至拒绝连接。AT+SLEEP 这条指令不是所有模块都支持,遇到不支持的情况,就在原理图上把模块的 EN 引脚接一根线到 MCU 的 GPIO,由主控控制模块上下电,这也是更彻底的省电方式。
底层原理是:BLE 模块上电后会进入广播状态,手机扫描到广播包后发起连接请求,连接建立后数据走 GATT 通道。如果模块支持 HID Profile,它会自己创建 HID Service,把串口收到的键值直接封装成 HID Report 发送给主机。此时 STM32 做的事情就是把矩阵扫描结果换算成标准的键盘键码,比如按键 A 对应 0x04,按键 B 对应 0x05,通过 UART 发给蓝牙模块,这部分逻辑和有线键盘完全一致。
4.4 天线净空区的 PCB 布线规则:和蓝牙测距的关联
蓝牙天线对 PCB 布局非常敏感。使用陶瓷天线时,天线下方所有层的铜皮都要挖空,净空区至少保持天线本体向外扩展 5mm 无覆铜、无走线、无过孔;使用 PCB 板载天线时,天线走线周围同样要禁铜,并且天线末端不能对着金属外壳或电池。常见错误是为了省空间把蓝牙模块放到键盘右下角,旁边就是锂电池和 USB 座,结果辐射效率被拉低,手机在 3 米外就搜不到信号。
很多人用 RSSI 做距离估计,但蓝牙测距的稳定性恰恰依赖天线的方向性和一致性。同一块板子,天线净空区完整时,测得的 RSSI 在 1 米距离大约在 -50dBm 上下;净空区被铜皮挡住后,数值可能跌到 -70dBm 以下,而且随板子转动方向波动 10dBm 以上。键盘这种贴桌面的近场设备,更要关注 10cm 到 50cm 这个范围的信号一致性,保证主机在各个摆放角度下都能稳定连接,而不是只追求空旷环境下的极限距离。
5. AD 工程里的三套库与四组规则:原理图库、PCB 封装和集成库的整理套路
5.1 SchLib、PcbLib 和 IntLib:库文件在 AD 工程里的组织方式
Altium Designer(下称 AD)工程里,器件库通常有三种形态:原理图符号库(.SchLib)、PCB 封装库(.PcbLib)和集成库(.IntLib)。原理图库只负责在图纸上表达电气连接关系和引脚序号,PCB 封装库负责把引脚映射到真实的焊盘尺寸和丝印形状,而集成库是把两者绑定在一起的编译产物。
| 库类型 | 文件后缀 | 用途 | 修改方式 |
|---|---|---|---|
| 原理图库 | .SchLib | 画原理图时放置的符号 | 直接打开编辑 |
| PCB 封装库 | .PcbLib | 画 PCB 时对应的实体封装 | 直接打开编辑 |
| 集成库 | .IntLib | 封装好便于复用的成品库 | 用 LibPkg 工程重编译 |
打开这份工程文件时,优先看有没有 LibPkg 工程文件。如果有,说明原作者做了集成库的源工程,这比直接给一个编译好的 IntLib 更友好,因为你可以修改封装后重新编译,而不是拆不开的黑盒库。如果没有,只有散落独立的 SchLib 和 PcbLib,建新项目时记住保持两者引脚编号一致,否则原理图里明明连对了网络,导入 PCB 后引脚却对不上。
5.2 集成库编译与封装绑定的标准步骤
在 AD 里维护器件库的标准操作是新建一个 LibPkg 工程,把 SchLib 和 PcbLib 加进去,然后在 SchLib 的元件属性里指定 PCB 封装。每一条引脚在原理图库里的 Designator 必须和焊盘编号一一对应。编译成功后生成 IntLib,之后在新工程里使用 Library 面板直接放置器件,原理图符号和 PCB 封装就自动绑定,不需要每画一个工程重新指定一次封装。
编译集成库时注意两个坑。第一,原理图库的引脚编号不能有重名,LQFP48 的 48 个引脚里数字编号唯一,但功能名 PA0 和 PA1 容易在复制粘贴时错位,编译前用报告功能跑一遍引脚一致性检查;第二,封装库里的位号丝印不要和焊盘重叠,否则装配后丝印被焊盘盖住,板厂丝印工序会把字符削掉,板子上看不清器件标号。名称命名建议统一加前缀:MCU_STM32F103C8T6_LQFP48、LED_WS2812B_5050、SW_MX1 这类,一眼能从封装文件名看出器件用途。
5.3 LQFP48 与 WS2812B 封装参数对照
| 项目 | STM32F103C8T6(LQFP48) | WS2812B(5050) |
|---|---|---|
| 本体尺寸 | 7mm × 7mm | 5.0mm × 5.0mm |
| 引脚间距 | 0.5mm | 约 1.0mm |
| 焊盘尺寸参考 | 宽 0.30mm、长 1.0mm | 宽 1.2mm、长 0.9mm |
| 底部散热焊盘 | 无 | 有,建议整片接地并开窗镀锡 |
LQFP48 的引脚间距只有 0.5mm,封装库里的焊盘阻焊桥至少要留 0.1mm 以上,生产才不至于连锡。画封装时不要直接用厂商图纸上的脚位尺寸照抄,要留出焊接工艺余量,焊盘长度比引脚长 0.4mm 左右,才能形成可靠的焊点。WS2812B 的 5050 封装有六个脚,其中电源和地各两个,设计时把 VDD 和 GND 的焊盘适当加宽,能有效降低灯珠到大面积覆铜之间的热阻。
键盘轴体封装则是另一个重点。机械键盘常用的 MX 兼容轴体,引脚孔直径约 2.8mm,另有两个定位柱孔,孔径约 1.2mm,安装孔径要做得比轴体引脚略大但不超过 3mm,否则轴体插上去摇晃。定位柱孔是给轴体卡扣定位用的,不能铺铜,否则卡扣对不准。这部分封装细节在普通元器件库找不到,必须手工建,也是这份工程里封装库文件价值最高的地方之一。
5.4 双层板的层叠设计与走线规则:电源 1.5mm,信号 6mil
这块键盘 PCB 用双层板就能完成,层叠结构从上到下依次是:顶层信号与器件层、FR4 介质层、底层信号与地平面层。双层板虽然没有完整内电层,但可以在底层大面积铺地,将所有地过孔连接成网格,信号回流就有连续路径。板厚通常选 1.6mm,做蓝牙键盘如果想要轻薄外壳,可以改成 1.0mm,但 LQFP48 的焊盘在薄板上焊接时更容易热变形,需要和板厂确认铜厚和层压工艺。
# 1oz 铜厚的铜箔截面积,辅助评估供电走线载流能力 thickness_mm = 1 * 0.035 # 1oz 铜厚约 35 微米 width_mm = 1.5 # PCB 上实际设计的主干线宽 area = thickness_mm * width_mm print(f"截面积 {area:.3f} mm^2,常温短走线约可承载 3A 量级")供电走线建议直接拉 1.5mm 到 2.0mm 宽,信号线最小控制在 6mil,间距不小于 6mil。键盘矩阵的列线和行线都是低速信号,走线要求不高,但 WS2812B 的数据线和蓝牙模块的串口线要走短路径。晶振下方不要走任何信号线,避免振铃干扰 HSE 波形;复位信号线也要尽量短,远离 5V 电源走线和灯带数据线。
5.5 打开 DRC 跑完整检查,重点看这几条
PCB 布局布线完成后,在 AD 的 PCB 界面里打开 Design 菜单下的 Rules 规则设置,确认线宽、间距、过孔尺寸都按上述参数配置好,然后运行 Design Rule Check。DRC 报告里以下几类问题必须清零:未连接的网络、短路、安全间距违规、丝印压焊盘。常见的丝印压焊盘问题,是在放置位号和器件标注时忘了把字体调整到 1.0mm 以下,字符刚好压在 LQFP48 的引脚焊盘上,工厂生产时丝印和焊盘冲突,直接削掉字符或者漏印。
提示:DRC 里的“Un-Routed Net”检查要格外认真。原理图网络表里如果有悬空引脚,PCB 上表现为飞线未清除,DRC 一定会报错。有些工程师为了消除飞线,在规则里把 Un-Routed Net 检查关掉,这是最危险的操作,打样回来板子废了才发现有几根线根本没连上。
另外一个容易被忽略的是过孔盖油设置。键盘 PCB 上大量地过孔如果做开窗,贴片时焊锡会被吸进过孔,造成虚焊。AD 的规则里把过孔 Solder Mask Expansion 设为负值并勾选 Force complete tenting on top/bottom,工厂就会做盖油处理,这个设置在出 Gerber 前要确认好。
6. 出 Gerber 前最后一遍检查:极性、丝印和钻孔文件
6.1 导出 274X 格式与钻孔文件的关键设置
在 AD 里导出生产文件时,选择 File 菜单下的 Fabrication Outputs,Gerber 格式选 RS-274X,坐标精度设成 2:5,输出层勾选 Top Layer、Bottom Layer、Top Overlay、Bottom Overlay、Top Solder、Bottom Solder、Top Paste、Bottom Paste 和 Keep-Out Layer。钻孔文件单独导出 Excellon 格式,孔径单位用毫米。板厂会先用钻孔文件生成钻带,再按孔径表换钻头顺序,所以钻孔文件里孔径数量越少越好,0.3mm 以下的激光孔在常规工艺里要加钱,设计阶段尽量把过孔统一成 0.3mm/0.6mm 的组合。
6.2 灯极性与丝印检查:一颗灯方向错了整条链报废
WS2812B 是单线级联,数据从 DIN 进、DOUT 出,方向接反一颗,后面所有灯珠都不会亮,而且很难排查。PCB 封装里一定要在顶层丝印上加一个“DIN”方向箭头,放在灯珠第一脚旁边,位置不要被灯珠本体盖住。贴片回来后用万用表二极管档量每颗灯珠的 VDD 和 GND 是否短路,确认没有被反贴。丝印字体建议选 TrueType 字体或标准矢量字体,线宽不要小于 0.15mm,字高不小于 1.2mm,否则打样回来的丝印发虚模糊,装配产线根本看不清位号。
6.3 从贴片到跑通:先点灯、再回环、后扫键的调试顺序
板子贴好回来,先不要急着烧键盘固件,按三条链路依次验证。第一步,只焊主控和电源部分,用 SWD 烧一个空白工程,确认 HSE 起振、串口能打印、STM32F103C8T6 的 USE_HAL_DRIVER 宏已勾选,HAL_TIM_PWM_Start_DMA 这类接口才会被编进固件。第二步,接上 WS2812B,用示波器看数据线波形,确认 0 码和 1 码的占空比满足数据手册要求,再点一颗灯验证 GRB 颜色顺序。第三步,接蓝牙模块,跑 AT 回环,确认串口波特率和模块固件版本,再让 STM32 通过中断接收 USB 转 TTL 发来的数据,最后才挂矩阵扫描代码。如果主控未来换成国产替代型号,优先对比 BOOT0 上电时序和 VDDA 电压范围,这两处在部分兼容芯片上复位行为不一样。
本文还有配套的精品资源,点击获取