简介一套面向STM32F103C8T6与WS2812B RGB灯蓝牙键盘的硬件设计参考文件基于Altium Designer 09绘制采用两层板结构板卡尺寸139×97mm属于中小尺寸紧凑型键盘方案。资源共14个文件压缩包约9.08MB包含原理图、PCB、原理图库、PCB封装库及工程文件并附有预览文件方便快速查看整体设计。目前已有770人学习下载。其中原理图与PCB文件展示了STM32F103C8T6最小系统、WS2812B RGB灯驱动电路及蓝牙通信模块的电路连接和PCB布局原理图库和PCB封装库则提供可直接调用的元件封装便于复用与二次修改。工程文件可由Altium Designer直接打开方便按需调整板级设计。整体工程组织清晰适合嵌入式入门者、键盘DIY玩家以及需要参考蓝牙键盘硬件方案的工程师可用作课程设计、毕业设计或产品原型开发的学习样板。1. 一套STM32F103C8T6LQFP48WS2812B蓝牙键盘AD设计文件先读懂器件的脾气拿到“STM32F103C8T6LQFP48WS2812B RGB灯蓝牙键盘AD设计硬件原理图PCB器件封装库文件”这类压缩包很多人第一反应是打开Altium Designer照着原理图抄一遍。我会反着来先不碰AD也不看封装库先把三样东西在电路里的角色盘清楚。C8T6是主控但对键盘这种外设来说它一点都不忙真正决定这块板子成败的是灯、蓝牙和供电。WS2812B单颗全亮能达到60mA几十颗灯串起来就是几安培这是电源和地线布局的第一约束蓝牙是走SPP还是HID又直接决定了原理图上串口模块的选型。这篇就按“选型边界—AD建库与原理图—PCB布线—固件配合—发板前检查”这条链路往下走适合已经画过最小系统板、但第一次把大电流灯串和无线模块塞进键盘布局的工程师。2. 原理图上先定边界C8T6管脚、WS2812B电流、蓝牙协议栈三条硬约束原理图不是从MCU开始画的而是从“谁最难伺候”开始画。在STM32F103C8T6LQFP48WS2812B RGB灯的键盘里最难伺候的显然是灯珠的电流和蓝牙的协议主控反而是最好说话的那个。2.1 主控用LQFP48而不是更大封装管脚账要先算清STM32F103C8T6是LQFP48封装本体14x14mm脚距0.5mm去掉电源和地脚之后还能拿出37个GPIO。对一个以按键矩阵为主的外设37个脚不算少但要一层层扣着用84键键盘常用8行x13列矩阵需要21个IOWS2812B灯串数据脚1个蓝牙模块串口收发各1个SWD调试固定占用PA13/PA14复位和BOOT0再占2个想加轴灯、编码器或屏幕的话IO立刻紧张。把8行降到6行、列扩到14列IO的腾挪空间会更大但扫描间隔和消抖逻辑也要跟着改这是原理图阶段就该定的trade-off。C8T6只有64KB Flash和20KB SRAM做蓝牙键盘加灯效完全够但别顺手把字库、大量音频采样塞进去否则后面优化固件的时间比画板子还长。注意LQFP48脚距只有0.5mm手工焊接建议先涂助焊剂再热风枪吹焊再用拖焊清理桥连。封装库里焊盘长度建议做到1.4mm以上留出足够的吃锡空间。2.2 WS2812B的电流账与逻辑电平是PCB Layout的输入WS2812B是单线协议数据速率800kHz每个灯珠24bit数据发送顺序是G、R、B。单颗灯珠全白光时电流最大接近60mA这是灯串设计的天花板。灯珠数量按全白60mA估算总电流按动态图案约1/3亮度估算电源方案建议160.96A0.32AUSB口直供要留意线阻613.66A1.22A必须外接5V电源或升压电路1086.48A2.16A独立供电PCB要开铜皮实际动态图案平均电流没有全白那么高但原理图和PCB必须按最坏情况设计。灯串的5V电源线不能和USB口的VBUS用同一根细走线建议直接铺铜并且让灯珠的GND就近打过孔回到主控地平面避免大电流在地线上叠加出噪声干扰后面的WS2812B数据信号。另一个坑是逻辑电平。WS2812B的数据输入是按5V设计的而STM32F103C8T6的GPIO输出是3.3V。短距离单颗灯珠时3.3V高电平勉强能被识别但灯串一长、走线一远波形振铃和衰减就会造成偶发闪灯。稳妥做法是数据线上串一个33Ω到100Ω电阻并在灯珠侧对5V加一个10kΩ上拉或者直接加74HCT245做电平转换这是入门设计里最值得花的几毛钱。2.3 蓝牙键盘的“键盘”两个字决定了必须走HID协议这是整张原理图最容易走错的一步。很多人习惯性地选HC-05因为资料多、串口透传简单、手机端装个APP就能收到数据。但HC-05这类模块做的是SPP串口透传它只负责把串口数据搬到蓝牙链路上电脑系统不会把它识别成键盘。你从串口发出去0x04Windows收到的只是一个串口字节不是键盘的按键码。要做成真正的“蓝牙键盘”选型上有三条路一是带BLE HID功能的串口模块这类模块在内部把串口收到的按键值包装成HID Report电脑端直接识别为键盘二是nRF52832这类BLE SoC自己写协议栈三是经典蓝牙HID模块。对入门复刻来说第一种最省事原理图上就是UART接口加几个状态脚。提示最近常看到有人问“HC-05蓝牙模块连接不上”其实问题不在波特率或AT指令而是SPP模块本身不具备HID上报能力连上手机也不会弹出键盘配对。选型时先看模块资料里有没有“BLE HID Keyboard”字样比排查半天连线有用得多。3. 从AD建库到最小系统原理图与PCB四个环节决定能否交付把边界条件定完才可以打开Altium Designer。AD这个叫法行业里就是指Altium Designer别和模数转换器的ADC搞混。这一章的思路是封装库先验收最小系统四件套按参数填布线时把电流和净空当成硬约束。3.1 器件封装库LQFP48和WS2812B的封装不能只核对名字压缩包里给的器件封装库文件我一般不会直接拿来用而是先做三个检查单位是mil还是mm、引脚编号和原理图符号是否一致、封装本体尺寸是否和数据手册机械图对得上。LQFP48的封装注意四点本体边长14x14mm脚距0.5mm焊盘建议长1.4mm宽0.3mm焊盘外侧留出0.3mm以上的丝印余量。手焊时第1脚和芯片圆点必须在丝印上有明确标识极性反了整片板子都废。WS2812B是5.0x5.0mm的5050封装6个引脚底部还有一个大散热焊盘。底部焊盘必须开窗方便过波峰焊时散热也能帮助灯珠把热量导到PCB铜皮上如果灯珠密度高底部焊盘还应该通过多个过孔连接到背面覆铜。还要留意WS2812B这类国产灯珠不同批次机械尺寸有细微差别。画封装时建议以你实际采购那批灯珠的数据手册为准不要拿网上随便下的封装库盲用。封装验收通过之后再导入原理图库配套的3D模型只用来检查干涉不要影响电气规则。3.2 原理图最小系统四件套参数照着填也别填错STM32F103C8T6的最小系统在原理图上就是复位、外部晶振、BOOT、SWD四块但每一块都有常见的抄错点。电路常用参数说明复位电路10kΩ上拉 100nF到GNDNRST内部已有上拉电阻可省但电容不能省8MHz晶振22pF负载电容x2具体容值按晶振CL值调整15~22pF常见BOOT010kΩ下拉运行时保持低电平进入ISP才拉高VDDA/VREF10Ω电阻 1uF和100nF电容保证ADC和内部复位参考干净SWD接口2x5排针引出PA13/PA14PA13/PA14线上不要接大电容会影响调试时钟外部晶振这里多说一句C8T6内部有HSI振荡器但精度对蓝牙键盘这种需要稳定串口通信的场景不够WS2812B的时序和串口波特率都依赖HSE。原理图上晶振要靠近MCU摆放两个负载电容的地端分别就近过孔到地平面而不是绕远汇聚到一点。画完最小系统后把USART1留给蓝牙模块把定时器通道引脚留给WS2812B数据线矩阵扫描的行列引脚集中放在相邻引脚组方便固件里用端口寄存器一次性读写。这一条决定了后面PCB布线的顺利程度。3.3 PCB布线规则与层叠设置电流决定线宽无线决定净空3.3.1 电源走线宽度对照PCB上的走线宽度不是随意定的。信号线0.25mm够用但灯串的5V电源线必须按电流选宽度1oz铜厚、外层走线、温升控制在10°C以内时可以参考下面这组经验值工作电流最小线宽布线做法1A0.76mm30mil单独走线并加宽过孔至少2个2A1.27mm50mil建议整片铺铜或走线并联3A以上2mm以上直接覆铜过孔阵列连接如果键盘有61颗灯最坏情况接近3.7A这时候靠一条走线根本扛不住。常见做法是在PCB上单独划出一块5V覆铜区域灯珠的VDD直接通过过孔接到这片铜皮上而不是一棵灯一棵灯串线。地线也一样灯珠的GND过孔要密集每颗灯至少一个必要时用两个过孔并联降低回流阻抗。注意双层板建议顶层走信号底层保持完整地平面。灯串的高频翻转会把噪声耦合到地平面如果底层地被矩阵走线切碎WS2812B的数据信号就很容易受干扰。3.3.2 晶振、蓝牙天线和矩阵走线的避让顺序C8T6的晶振要靠近MCU走线短直晶振底下不要走其他信号线最好两侧包地。蓝牙模块的天线区域是另一条硬约束天线正下方和周围3~5mm范围内不能有覆铜、不能有过孔、更不能走时钟线否则天线辐射被地plane吸收蓝牙距离直接缩水到两三米。矩阵键盘的走线是长直线行线和列线交叉处有寄生电容线间距建议不小于0.3mm避免高速扫描时串扰。WS2812B的数据线要和灯串5V电源线并行一小段没有关系但不要和晶振、蓝牙天线靠太近数据线上的振铃会干扰无线接收灵敏度。AD20里跑PCB DRC时除了默认的Short Circuit、Un-Routed Net、Clearance还要额外检查丝印是否压在焊盘上以及过孔是否落在灯珠底部散热焊盘的开窗区域内。LED_COUNT 61 current_per_led 60e-3 # 全白单颗电流上限单位A total_current LED_COUNT * current_per_led print(f最坏情况总电流 {total_current:.2f} A) print(f建议5V铜皮宽度按2mm以上规划)逻辑说明灯串电流按全白光上限计算实际动态图案平均会低一些但供电设计必须按这个最坏值预留。参数上60e-3是WS2812B全白光公版典型上限如果你用的灯珠额定电流不同直接替换这个值重新估算算出来的电流决定前面表格里5V电源走线的档位。4. WS2812B驱动与键盘扫描固件硬件必须给固件留出的接口这章从固件视角反推硬件因为很多板子画出来能通电但一到写WS2812B驱动就发现定时器通道选错了、串口复用冲突了。硬件原理图定稿前至少要把下面这张GPIO分配表过一遍。4.1 GPIO分配表先给硬件别让矩阵和定时器抢脚位功能引脚说明WS2812B数据PA8TIM1_CH1输出可做PWMDMA蓝牙模块UART_TXPA9USART1发送蓝牙模块UART_RXPA10USART1接收矩阵行0~7PB0~PB7输出行选矩阵列0~7PA0~PA7输入列读SWDIO / SWCLKPA13 / PA14调试下载这里WS2812B数据选PA8因为PA8映射TIM1_CH1可以用PWMDMA方式产生精确时序而不占用CPU。串口选USART1而不是USART2是因为PA9/PA10和SWD的PA13/PA14不冲突而且和蓝牙模块邮票孔放在同一边时走线最短。矩阵用了8行x8列只覆盖64键做60%配列够用。如果你要84键就把列扩展到13列PA0~PA7不够用时可以把PB8~PB12加进来但要注意PB12~PB15是SPI2的引脚原理图上别和灯珠的SPI方案混用。4.2 用TIMPWMDMA输出WS2812B时序WS2812B要求800kHz的比特率每个bit由一个高电平和低电平组成高电平时长不同区分0和1。用定时器PWMDMA的方式是把每个bit的高电平宽度预计算成定时器比较值放在DMA缓冲区里由定时器逐个输出不占用CPU。#define WS_LED_NUM 61 #define WS_TIM_CLK 72000000UL #define WS_TIM_PERIOD 90 // 72MHz / 90 800kHz #define WS_T1H_CMP 50 // 约700ns高电平 #define WS_T0H_CMP 25 // 约350ns高电平 static uint16_t dma_buf[WS_LED_NUM * 24]; static uint32_t ws_grb[WS_LED_NUM]; // 用户层按0x00RRGGBB填充 void ws2812b_send(TIM_HandleTypeDef *htim) { for (int i 0; i WS_LED_NUM; i) { uint32_t r (ws_grb[i] 16) 0xFF; uint32_t g (ws_grb[i] 8) 0xFF; uint32_t b ws_grb[i] 0xFF; uint32_t grb (g 16) | (r 8) | b; // WS2812B发送顺序是GRB for (int bit 0; bit 24; bit) { uint32_t mask 1UL (23 - bit); dma_buf[i * 24 bit] (grb mask) ? WS_T1H_CMP : WS_T0H_CMP; } } HAL_TIM_PWM_Start_DMA(htim, TIM_CHANNEL_1, (uint32_t *)dma_buf, WS_LED_NUM * 24); }逻辑说明外层循环把用户颜色拆成R、G、B三个字节再重组成WS2812B要求的GRB顺序内层循环从bit23往bit0发送每个bit对应一个PWM比较值比较值大就输出高电平时间长形成1码比较值小就形成0码。DMA把整块比较值数组按顺序搬运给定时器比较寄存器一次调用就能刷完整串灯。参数说明WS_TIM_PERIOD设90配合72MHz定时器时钟正好是800kHz这是WS2812B的数据速率WS_T1H_CMP50对应约700ns高电平WS_T0H_CMP25对应约350ns高电平。不同型号灯珠的时序窗口略有差异改这两个宏重新编译即可校准如果你不用HAL库寄存器写法同样是把ARR设成90CCR按宏填入DMA方向从内存到TIM的CCR寄存器。还要注意一点WS2812B是有复位时序的。数据线上低电平超过50us时灯珠会认为一帧传输结束所以灯串之间不要一直拉高数据线。DMA传输结束后建议把数据脚拉低至少80us再开始下一帧刷新。4.3 蓝牙HID上报串口协议和状态引脚决定固件复杂度蓝牙键盘的固件本质上比WS2812B驱动简单扫描矩阵得到键码加工成键盘报文通过串口发给蓝牙模块模块负责把它包装成HID Report上传给电脑。原理图上要把蓝牙模块的串口引脚、状态输出引脚和使能引脚都引出来状态输出引脚可以接一个LED指示连接状态固件层轮询这个引脚判断是否需要重新配对。串口波特率按模块资料设置常见的有9600和115200两种。这里有个经验原理图上在串口线路上预留两个0Ω电阻位方便固件调试时断开蓝牙、把USART1转给其他设备用板子不用改版就能换调试方案。矩阵扫描用定时器中断做2ms周期扫描按键去抖判断放在主循环里不要用阻塞延时否则WS2812B的DMA刷新和蓝牙上报会被拖住。固件架构上裸机状态机就够用没必要为这个项目移植FreeRTOS键盘逻辑简单反而裸机更容易控制时序。5. 打样前给原理图和PCB做的5个检查项比DRC更先做PCB文件发板厂之前除了AD20里的电气规则检查我还会按下面5个顺序过一遍。这5项都不依赖复杂仪器但能拦住九成的基础错误。电源对地打阻值。用万用表二极管档测5V对GND、3.3V对GND正常应该在几百欧以上。接近0Ω说明有短路重点查WS2812B的VDD和GND有没有在封装里连错以及C8T6的VDDA和VSSA网络是否合并到正确的电源域。如果买的是二手拆机C8T6还要注意芯片内部可能已有短路或加密锁死SWD连不上时先查这个。晶振电路单独验证。先焊主控、电阻电容和晶振不焊灯珠不焊蓝牙用示波器看晶振引脚有没有起振波形。没示波器的话把PA8复用为MCO输出配置PLL后测量PA8频率能读到稳定方波就说明HSE和PLL链路正常。晶振不起振时重点查负载电容容值和接地。SWD下载链路。原理图上PA13/PA14只接调试排针不要并接大电容。板子回来后用ST-Link连接能读到芯片ID就通过。C8T6如果之前被开过读保护连接会失败需要先用ST-Link的connect under reset模式尝试。WS2812B数据线信号完整性。先只焊第一颗灯珠把灯串其余部分断开用逻辑分析仪抓数据脚波形确认0码和1码的高电平宽度在参数窗口内。没有逻辑分析仪就刷一个单灯常亮固件灯能亮且颜色正常也说明时序基本正确。Gerber和钻孔文件检查。出Gerber时钻孔文件很容易漏选板厂收到的文件缺钻会导致所有过孔丢失。AD20里跑完DRC后在PCB编辑界面打开Manufacturing下的Gerber Setup确认包含钻孔文件再检查层叠设置里顶层和底层的铜厚是否和电源线宽计算一致。还要在3D视图里旋转检查一遍丝印有没有压在灯珠焊盘上丝印压焊盘在打样时不会报错但贴片时会影响定位。本文还有配套的精品资源点击获取
