64字节RAM怎么驱动300颗LED?应广PMS150C硬核玩法全解析
花3美分能买到什么?一颗泡泡糖?半颗螺丝钉?还是一个能驱动300颗RGB LED的微控制器?
📑 目录
一、缘起:一枚"一次性"芯片的意外走红
2019年,一个叫 Anders Nielsen 的丹麦嵌入式工程师在EEVBlog论坛上闲逛时,注意到了一个奇怪的小东西——应广PMS150C。
这颗SOT23-6封装的小芯片,批量价格只要 3美分(约人民币2毛钱)。但代价很大:
在众多台系 MCU 厂商中,应广的知名度不算最高,但 PMS150C 凭借全球最便宜 MCU 这个标签,硬是在全球极客圈里杀出了一条血路。
二、硬核操作:64字节RAM驱动300颗WS2812B
2.1 不可能的数学题
WS2812B(NeoPixel)每颗灯珠需要 3 个字节。按常规思路:300 颗灯珠需要 900 字节。而 PMS150C 只有 64 字节 RAM。
Anders 的思路:不用 RAM 存数据。WS2812B 的时序窗口误差 ±150ns,每发送完一个灯珠的 24 位数据后,有空闲周期去计算下一个灯珠的颜色值。现算现发,不存储,直接算!
2.2 完整源码
以下是 PMS150C-rainbow 项目的核心代码(应广 Mini-C 语言,混合 C 语法、汇编指令和宏定义):
/* abnielsen.com 2019 */
#include "extern.h"
.WRITER package 8, 1, 7, 5, 6, 4, 3, 2, 8, 0x3F, 0x3F, 4
byte red, green, blue;
byte mode, hueinc, firstinc;
EWORD rgb;
word pixels, firstPixelHue;
#define definedPIXELS 300
bit LED : pa.6;
bit BTN : pa.4;
send1 MACRO
SET1 LED;
.DELAY 5;
$ LED low;
ENDM
send0 MACRO
SET1 LED;
.DELAY 2;
$ LED low;
.DELAY 2;
ENDM
void SendRGB (void) {
DISGINT;
.FOR bitno, 23,22,...,0
if (rgb.bitno == 0) { send0; }
else { send1; }
.ENDM
ENGINT;
}
void show (void) {
rgb0 = blue;
rgb1 = red;
rgb2 = green;
SendRGB();
}
void clearLED (void) {
rgb = 0;
pixels = 300;
do { SendRGB(); } while (--pixels);
.delay 2000;
}
2.3 数据类型陷阱
应广 Mini-C 的数据类型和标准 C 差异很大:
| 类型 | 大小 | 说明 |
|---|---|---|
| bit | 1 bit | 位变量,可单独寻址 |
| byte | 8 bit | 等同于 unsigned char |
| int | 8 bit | ⚠️ 注意!int 是 8 位,不是 16 位! |
| word | 16 bit | 无符号16位 |
| EWORD | 24 bit | 扩展字 |
| DWORD | 32 bit | 32位无符号 |
⚠️ 巨坑: 标准 C 中 int 是 16/32 位,但在应广 Mini-C 中 int 是 8 位。建议始终用 word 或 byte 明确表达意图。
三、深度进化:Jay Carlson 的 SPI 桥接器与自行车灯
Anders的WS2812B项目让极客圈对应广MCU刮目相看。但真正把这个生态推向高潮的,是嵌入式大神Jay Carlson。
Jay在2019年发表了那篇著名的超深度评测《What is up with these 3-cent microcontrollers?》,对应广MCU的架构、性能、功耗和选型做了迄今最全面的分析。文章光是芯片选型表就有几十行对比数据,从PMS150C到PFS173一网打尽。
但他不满足于只写文章——他亲手做了两个项目来验证这颗芯片的真实能力。
3.1 WS2812-SPI 桥接器
Jay 想了一个巧妙方法:利用 SPI 硬件外设来模拟 WS2812B 协议。SPI 的 MOSI 输出是一串移位数据,设置 SPI 时钟后,发送 0xF0("1"码)和 0x00("0"码),用硬件 SPI 驱动 LED 灯带,几乎不占用 CPU。
3.2 自行车尾灯(产品级 Demo)
Jay 用 PMT251(多核心 FPPA 芯片)做了带多种灯光模式、低功耗待机、振动感应的智能自行车尾灯控制器。
- FPPA0 核心:检测振动、切换模式、管理休眠
- FPPA1 核心:PWM 呼吸灯、快闪、SOS 模式
- 待机功耗:仅 0.5μA,唤醒仅需微秒级
"用了应广的芯片后,我在设计电路时再也不需要心疼 MCU 的预算了。它不工作了?扔了换一颗就是。"
—— Jay Carlson
四、为什么这两个项目如此重要?
- 打破偏见:3 美分芯片驱动 RGB 灯带,没有不好的芯片只有不合适的方案
- 催生开源生态:推动 Free PDK 工具链,SDCC 支持 PDK14/PDK15
- 产品线一览:
| 型号 | ROM | RAM | IO | 特色 | 参考价 |
|---|---|---|---|---|---|
| PMS150C | 1K Word | 64B | 6 | 最便宜 OTP | $0.03 |
| PMS152 | 1.25K Word | 80B | 14 | 多 IO | $0.04 |
| PMS154C | 2K Word | 128B | 14 | 性价比之选 | $0.05 |
| PFS154 | 2K Word | 128B | 14 | Flash 可重复烧录 | $0.07 |
| PFS173 | 3K Word | 256B | 14 | ADC + Flash | $0.10 |
| PMT251 | 2K Word | 128B | 14 | 双核心 FPPA | $0.12 |
五、从零开始入门
5.1 开发环境
- 下载 PADAUK IDE(30MB,应广官网)
- 安装 Device File
- 购买烧录器 PDK5S-P-003 或 Free PDK 开源烧录器
- 强烈建议买 ICE 仿真器(开发 OTP 芯片必备)
5.2 点灯 Demo
#include "extern.h"
void FPPA0(void) {
.ADJUST_IC SYSCLK=IHRC/2
$ PA4 out, low;
while (1) {
$ PA4 high;
.DELAY 10000;
$ PA4 low;
.DELAY 10000;
}
}
5.3 OTP 开发流程
- 先在 ICE 仿真器 上跑通代码
- 确认无误后再烧录 OTP
- 烧坏只能换新芯片
- 量产用自动烧录机
5.4 常见错误排查
| 现象 | 可能原因 | 解决 |
|---|---|---|
| 编译内存不足 | RAM/ROM 超限 | 减少全局变量 |
| 烧录芯片未连接 | CLK/DATA 接反 | 检查接线 |
| PWM 无输出 | 时钟源错误 | 确认定时器时钟 |
| ADC 采样跳动 | 参考电压不稳 | 加 RC 滤波 |
| 中断不触发 | INTE 未使能 | 检查中断寄存器 |
| 芯片发热 | IO 短路 | IO 驱动约 5-20mA |
5.5 学习路线
| 阶段 | 项目 | 要点 |
|---|---|---|
| 入门 | LED 闪烁 + 按键 | IO 配置、延时 |
| 进阶 | PWM 调光 | 定时器、寄存器 |
| 中级 | WS2812B 驱动 | 精确时序、宏 |
| 中高级 | 电池供电设备 | 低功耗 STOPSYS |
| 高级 | 多核心 FPPA | 并行处理 |
| 量产 | OTP 方案 | 烧录流程、BOM |
六、给你的启示
Anders Nielsen和Jay Carlson用两颗3美分的芯片,给整个嵌入式社区上了一课。回到我们自己身上,能带走什么?
很多项目选型的第一步就是"先上个STM32",默认把20块钱的芯片当起点。但你的产品真的需要那么多资源吗?3美分能做好的事,为什么要花100倍的成本?BOM砍掉5毛钱,量产100万片就是50万的利润差距。
64字节RAM驱动300颗LED——这告诉我们:硬件资源是固定的,但方案是活的。遇到看似不可能的约束,先别放弃,换个思路也许就通了。问题的答案不在芯片手册里,在你的脑子里。
OTP只能烧一次、没有硬件SPI、RAM小得可怜——这些限制在高手眼里不是缺陷,是挑战。应广的芯片让你回归到"用最少的资源做最多的事"这种硬核思维。这恰恰是很多ARM工程师正在丢失的能力。
Cortex-M系列确实是主流,但不是唯一答案。台系的OTP MCU、国产的RISC-V、甚至8位的8051——每个架构都有它最适合的战场。工程师的价值不在于"会用最贵的芯片",而在于"用最合适的芯片解决问题"。
具体建议
如果你正在设计一款消费电子产品:
- 先把功能需求列清楚,算一下你到底需要多少IO、多少RAM、多少运算能力
- 然后再去看芯片选型——不要反过来
- 如果一个8毛钱的应广就能搞定,就别上20块的ARM
如果你是嵌入式新手:
- 去玩一玩应广的芯片。OTP的"一次烧录"会让你养成先想清楚再动手的习惯
- 64字节RAM会逼你写出更高效的代码——这种能力在ARM上练不出来
- 当你再回到STM32时,你会发现自己的代码质量上了一个台阶
如果你是产品经理或创业者:
- 下次算BOM的时候,把MCU那一栏的价格除以10,看看能做些什么
- 很多"智能硬件"其实不需要"智能",只需要"控制"——而控制,3美分就够了
- 把省下来的钱花在传感器、外壳、用户体验上,可能更有竞争力
💡 最后一句话:
Jay Carlson在文章里写过一句话,我把它放在这里作为收尾——
"一个8位的PIC要20倍的价格,而应广做得一样好。用了应广的芯片后,我在设计电路时再也不需要心疼MCU的预算了。"
限制你的从来不是芯片本身,而是你的想象力。
七、参考资料与延伸阅读
本文内容基于以下公开资料整理,感谢各位开发者和社区贡献者的工作:
- Jay Carlson, "What is up with these 3-cent microcontrollers?", 2019
- Anders Nielsen, "3 cent PMS150C MCU driving 300 WS2812B LEDs", 2019
- West Side Electronics, "Padauk Microcontrollers: Exploration and Usage", 2019
- Free PDK 官方文档, free-pdk.github.io
- 逐高电子, zicoic.com
- EEVBlog 论坛, eevblog.com
