前言由于原理图设计和PCB打板出现些许问题预定准备的字库存储芯片和蓝牙模块没有用上在该背景下我将仅使用最小系统板2个独立按键以及2块8*32的ws2812灯带实现的效果仅是内置好汉字和英文效果。有需要的自行优化。一、项目背景本项目使用 STM32F103C8T6 最小系统板作为控制器驱动两块8×32 WS2812B点阵屏。两块灯板左右级联后共有512颗LED逻辑显示区域为16列×32行。项目最终需要实现显示16×16汉字预设中文内容向上滚动显示英文“hello world”PA11切换中英文内容PA12切换滚动、静止和闪烁模式使用USB-TTL完成程序下载和串口调试从功能上看这只是一个文字滚动灯牌但实现过程中同时涉及WS2812B时序、定时器PWM、DMA、坐标映射、字模、供电、信号完整性和硬件装配等问题。二、项目需求面包板用于后续5v和GND共地外部电源8*32的ws2812灯带在满负载的情况下电流可以达到15.36A而灯带需要的电压至少5V最小系统板一般只能提供3.3Vstm32f103c8t6最小系统板直插式独立按键2个三、项目效果由于学校发的只是2个8*32的灯带如果是8*8取字模的话基本看不清所以用2个灯带拼接在一起。四、项目难点1.WS2812B并不适合只依赖Proteus验证Proteus比较适合验证普通GPIO、按键、串口、定时器和LCD等常规外围电路但WS2812B属于对波形时间要求比较严格的数字器件。它的每个数据位周期大约只有1.25 μs逻辑0和逻辑1并不是通过普通高低电平区分而是通过高电平持续时间区分。因此仿真模型必须准确处理800 kbit/s单总线数据T0H和T1H高电平时间24位GRB颜色顺序多颗灯珠的数据截取和转发帧末尾的复位低电平数百颗灯珠的连续级联。2.WS2812B不是普通LED普通LED只需要输出高低电平而WS2812B内部带有控制芯片每颗灯珠需要接收24位颜色数据顺序通常为G7...G0 → R7...R0 → B7...B0第一颗灯珠保留前24位再把后面的数据转发给下一颗。发送完全部数据后数据线需要保持足够长的低电平让所有灯珠同时锁存颜色。因此驱动程序必须同时保证位周期正确0码和1码高电平宽度正确GRB顺序正确灯珠数量正确发送数据不能中断帧尾复位时间足够。任何一项错误都可能表现为随机颜色、局部点亮或整板爆闪。3. PWM与DMA方案系统时钟为64 MHz一个时钟计数约为1 ÷ 64 MHz 15.625 nsWS2812B每个数据位周期约为1.25 μs因此设置80个定时器计数80 × 15.625 ns 1.25 μs项目采用的PWM比较值为逻辑0CCR 22高电平约0.344 μs 逻辑1CCR 45高电平约0.703 μs程序先把每个数据位转换为22或45再由DMA连续写入TIM1的CCR1寄存器。这样每一个脉冲都由硬件产生稳定性高于软件延时。4.灯板级联与坐标映射1. 物理连接方式容易理解错误最初对灯板内部级联方向的理解有误以为灯珠按照逐列方式连接。实际灯板采用逐行蛇形连接第0行从左到右 第1行从右到左 第2行从左到右 第3行从右到左 ……如果仍然按照普通二维数组计算序号显示出来的文字就会左右翻转、笔画断裂甚至出现左右亮、中间不亮的固定图案。2. 两块灯板级联后的映射两块8×32灯板左右放置左侧灯板物理序号0255 右侧灯板物理序号256511逻辑屏幕尺寸为16×32。坐标转换可以写成panel x / 8; local_x x % 8; base panel * 256; if ((y % 2) 0) index base y * 8 local_x; else index base y * 8 (7 - local_x);这样字模程序只处理普通的x、y坐标底层映射函数负责处理左右灯板和蛇形方向。5.WS2812B的电源电流不能忽略理论上一颗WS2812B全白高亮时电流可能达到约60 mA。512颗全部全白的理论电流可能非常大512 × 60 mA 30.72 A实际项目使用低亮度单色显示电流远低于这个数值但PCB和接线仍不能按照普通小信号电路处理。打板时应考虑5V电源使用较宽铜线或大面积铺铜两块灯板分别注入电源避免让全部电流经过最小系统板灯板入口增加大容量电解电容每个模块附近增加0.1 μF去耦数据地和电源地可靠连接电源接口需要留有足够电流余量。6. 下载接口必须提前考虑因为项目只有USB-TTL没有ST-Link所以需要使用STM32内部Bootloader下载USB-TTL TX → PA10 USB-TTL RX → PA9 USB-TTL GND → STM32 GND打板时应预留PA9PA10GNDBOOT0跳帽或按键RESET按键。五、项目总结在初期准备上没有准备好原理图PA9和PA10引脚没有引出来导致下载插拔困难。在遇到ws2812的各种问题并解决在有限的情况下尽量做出来的半成品。