做小家电、玩具、灯控这类成本敏感的MCU项目,应广PMS150C是个绕不开的选项。一颗OTP单片机做到几毛钱的价位,还把功耗压得很低,这让它在大批量的消费电子产品里非常吃香。但便宜有便宜的代价——PMS150C是OTP芯片,程序烧进去就出不来了,烧错一颗废一颗,不像Flash单片机那样能反复擦写。更麻烦的是,它的仿真器、烧录流程和常见的STM32、51那套玩法完全不同,很多从ARM转过来的工程师第一次上手就翻车。这篇文章我会从OTP芯片自身的特性讲起,把仿真器怎么用、烧录流程怎么走、烧录前后有哪些坑,一条条梳理清楚。
1. 先搞清楚PMS150C到底是个什么样的芯片
1.1 "OTP"这三个字母背后的代价
OTP是One-Time Programmable的缩写,也就是一次性可编程。对单片机来说,最直接的影响就是程序存储器只能写一次,写完就永久固化,不能擦除重写。这个特性决定了整个开发流程都不能照搬Flash MCU的习惯。很多人第一次拿到PMS150C,还是会下意识地"先烧一版看看效果",结果烧完发现IO初始化顺序写反了,只能扔掉芯片,重新拿一颗新的再来。
PMS150C是应广PMS150系列里的一款低成本8位单片机,定位非常明确:引脚少、程序空间小、价格极低、功耗低。常见封装也就是SOP8、SOT23-6这类很小体积,板上占不了多大地方。它的OTP空间一般在K级别,RAM也只有几十个字节,放在今天这个动辄几十K Flash、几十K RAM的单片机圈子里,确实显得很寒酸。但实际产品里,像LED灯控、小夜灯、电子玩具、电动牙刷的简单控制、小家电的定时逻辑,根本用不了那么多资源。相反,几毛钱的成本、足够低的待机电流、上电就跑的启动速度,才是这类项目的核心诉求。
我见过不少工程师第一次评估PMS150C,第一反应是"这玩意儿能干啥"。其实换个角度想,一颗芯片用在几十块钱的产品里和用在几块钱的产品里,对成本的要求完全不是一个量级。PMS150C要解决的就是"功能简单、成本敏感、出货量巨大"那一类场景,它的存在本身就是为了让BOM成本能再压下去几毛钱。搞清楚这个定位,你就明白为什么这么多人一边骂它不顺手,一边又离不开它。
1.2 为什么这么抠门的芯片还一堆人用
抛开技术情结,纯粹从产品角度讲,PMS150C能成为爆款是有原因的,至少有这么几点是实打实的:
- 成本优势。单价够低,量产几千片、几万片的时候,每颗省下来的钱会直接反映在利润上。这也是OTP芯片最大的生存空间。
- 功耗优势。小家电和电池供电设备非常看重待机电流,PMS150C这类芯片可以把睡眠功耗做得很低,同时内部RC振荡器可以直接跑,省掉一颗外部晶振,又省了一笔元件费。
- 启动速度快。上电之后几乎没有等待,代码很快就能跑起来,这对一些需要快速响应的交互逻辑很重要。大系统还在等时钟稳定,它已经把LED点亮了。
- 供应链和生态成熟。应广这颗料用了很多年,市面上烧录座、仿真器、技术资料都相对好找,就算你是第一次用,也能搜到不少前辈踩坑的帖子。
但这不代表它好用。OTP属性会放大每一个开发阶段的失误,仿真器使用方式又和JLink烧STM32那种"插上就干"的体验完全不同。我见过有人仿真跑得好好的,烧录到真机却当场翻车,还有人一次性烧录一百颗,结果一大半芯片上电没反应,最后发现是烧录软件的配置选了默认值,把代码保护位和校准字处理错了。这些问题都不是芯片本身复杂,而是你还没意识到OTP流程的每一步都不可逆。
2. 开发环境与仿真器:想少烧废芯片,先在这里下功夫
2.1 应广的IDE和mini-c语言
应广的开发工具链是自家一套,IDE、编译器、烧录软件都有专门的工具,不能拿Keil直接编译PMS150C的工程。开发语言支持汇编,也支持一种类C的mini-c。mini-c不是完整的C语言,它为了适配小存储空间的单片机,砍掉了很多标准C特性,比如动态内存分配、递归、浮点运算这些,基本上都不建议在代码里出现。写代码的时候一定要克制,能用查表解决的问题就别写一堆数组,能用一个字节解决的标志位就没必要定义成int。
下面是一个简单到不能再简单的点灯示意代码,方便你理解工程大概长什么样。注意,不同版本的IDE、不同芯片型号,头文件和寄存器名字可能有差异,别直接抄进你的工程,我只是用来演示流程。
// PMS150C 点灯示意代码(具体寄存器以官方头文件为准) #include "extern.h" void main(void) { PAC |= 0x01; // PA0设置成输出 while (1) { PA0 = 1; // 亮 _delay(1000); PA0 = 0; // 灭 _delay(1000); } }这里的PAC是端口方向控制寄存器,PA是端口数据寄存器,_delay是应广工具链提供的延时写法。你在实际工程里会用到一个官方提供的头文件,里面把各个寄存器和位操作都定义好了。刚开始不建议自己硬记寄存器地址,打开头文件对着看比什么都强。
2.2 先分清"仿真器"和"烧录器"
很多人的第一个坑就是把仿真器和烧录器当成一回事。在STM32的世界里,JLink既能仿真又能烧录,所以大家形成了惯性思维。但PMS150C这类OTP芯片的生态里,仿真和烧录通常是两个设备,或者至少是两种完全不同的操作模式。
仿真器连的是PC和目标板,中间会有一颗仿真专用的芯片。这颗芯片不是量产的OTP版本,而是可以被反复烧写、支持调试功能的芯片。你在仿真器上可以单步、打断点、看变量、观察IO变化,开发阶段的绝大部分调试都靠它。烧录器则完全不同,它是用来把代码写进真实的OTP芯片里的,靠烧录座或者夹具接触到芯片引脚,烧录完成之后,这颗芯片就是产品的一部分,再也不能改。
这两个环节为什么要分得这么清楚?因为仿真器里跑得好的程序,换到真机上不一定表现一致。仿真芯片和真机OTP芯片在电气特性、上电时序、引脚驱动能力上都有细微差别,仿真器本身还可能引入额外的电容和上拉。所以说白了,仿真只是帮你验证逻辑思路,烧录才是决定产品生死的一步,两者千万别混着理解。
顺便提醒一句接线的事:接到目标板之前,先确认仿真接口的电平和电源方向。PMS150C这类小芯片供电范围耐受力有限,接反了轻则仿真器锁死,重则直接把芯片打穿,那就不是废一颗芯片的问题了。
注意:仿真器和烧录器是两个概念,开发调试用仿真,量产编程用烧录,千万不要用烧录器强行连接目标板反复调试,OTP芯片经不起这么折腾。
2.3 仿真时的几个操作习惯
既然仿真可以反复来,那就把能调的都放在仿真阶段解决。我的习惯是,任何代码改动,先在仿真器上把逻辑跑通,确认IO状态和时序都符合预期,才会考虑烧录到真机。仿真阶段的几个细节值得注意:
第一,时钟配置尽量和真机保持一致。PMS150C可以用内部RC振荡器,也可以用外部晶振,仿真器默认的时钟未必和你产品上实际用的时钟一致。如果你最后用的是内部RC,仿真时也把时钟源切到内部RC,避免出现"仿真时串口波特率是对的,烧录到真机就乱码"这种尴尬事。
第二,仿真的时候要模拟接近真机的负载条件。很多IO口直接驱动LED、三极管、蜂鸣器,仿真芯片的驱动能力和真机不完全一样,如果仿真器上带了大电阻上拉,某些下拉不足的IO问题就暴露不出来。所以目标板上的电阻、电容、外部电路尽量都贴上去,仿真才能更接近现实。
第三,仿真通过不代表真机通过,特别是涉及上电复位、低压复位、休眠唤醒这类场景。仿真器是被调试的一方,它的上电过程和你产品实际的上电过程差别很大,很多复位毛刺问题只会在真机上复现,仿真阶段根本看不到。这个后面我会专门展开讲。
3. OTP烧录全流程实战:烧废一片芯片以后,我总结出来的步骤
3.1 烧录前必须检查的几项
有一次我心急,编译完直接打开Writer烧录,结果芯片放进去烧完,上电测试完全没反应。查了半天发现工程里用的是PMS150C,烧录软件里选的却是另外一款型号,程序写入的配置完全不匹配。那次之后我给自己定了个规矩,烧录之前必须把下面几项逐个过一遍:
- 芯片型号和封装。烧录软件里选型一定要和实物一致,烧录座的规格也要匹配。封装不同,引脚间距、1脚位置都不一样,硬塞进去很容易烧错位置。
- 程序空间占用。编译报告会显示OTP占用比例,烧录文件大小一定要小于芯片的OTP容量。有人以为编译器会拦截超容量的代码,实际上有些配置下它只是警告,生成的文件却是截断的,烧进去就是一段残缺程序。
- 代码保护位。PMS150C这类芯片一般都有代码保护选项,量产时一定要打开,防止程序被读走。但要明白,开启保护之后,芯片里就读不出原始代码了,这个不是故障,是正常现象。
- 校准字设置。内部RC振荡器在不同芯片之间存在频率偏差,如果产品里用了串口、PWM这类对时间精度有要求的逻辑,就得在烧录流程里写入校准字。有些烧录软件会自动读取并写入校准值,有些需要手动指定,具体看界面提示。
- 文件版本管理。烧录软件里加载的文件名一定要包含版本号或日期,比如app_v1.2_20250101.bin,千万不要用那种普普通通的build.bin,不然隔两天你自己都分不清烧的是哪一版。
3.2 Writer软件烧录的完整流程
应广的烧录软件一般叫Writer,界面不会太复杂,但操作顺序很有讲究。下面是一套比较稳妥的流程:
- 安装好烧录器驱动,把烧录器通过USB连到电脑,确认设备能被识别。
- 打开Writer,在芯片型号里选PMS150C,这一步不要凭记忆,对着芯片丝印确认一遍。
- 加载编译生成的烧录文件。留意软件提示的文件大小和芯片容量,报错就别继续。
- 配置烧录选项。打开代码保护,打开烧录后校验,校准字按需设置。
- 把芯片放进烧录座,1脚对准烧录座上的标记,轻轻压下压杆,确保芯片引脚和触点完全贴合。
- 点击烧录按钮,观察进度。烧录过程可能几秒,也可能十几秒,取决于文件大小和烧录器速度。
- 烧录完成之后看日志。正常会显示PASS或者校验通过,如果出现FAIL就停下来,别急着取片,先看错误代码。
- 取片,戴好防静电手环,把烧录好的芯片放进标记为"已烧录"的容器里。
这套流程看起来简单,但每一步都有用意。比如"打开烧录后校验",OTP芯片不支持擦除重写,烧完读一遍,确认写入内容和源文件一致,是最后一道防线。再比如"1脚对准",很多烧录座上有明显的圆点或缺口标记,但作业人员一忙起来就容易忽略,最好的办法是在烧录座旁边贴一个方向指示图。
3.3 烧录完成后别急着贴板,先验证
烧录软件提示PASS,只是说明写入和校验没问题,不代表这颗芯片在你的电路板上一定能正常工作。我见过烧录校验全过、上电后完全没反应的案例,原因是芯片的某个IO口默认状态和外部电路冲突,代码一启动就把自己拉死了。这种问题在烧录座上是发现不了的,因为烧录座没有连接你的目标电路。
所以,批量烧录之前,至少要抽出一颗烧录好的芯片,装到实际PCB上做一轮完整测试。测试内容不用多复杂,但一定要覆盖这几个方向:
- 上电后测量整板电流,确认程序跑起来,没有异常短路;
- 用示波器看关键信号波形,比如LED驱动脚、PWM输出脚、蜂鸣器驱动脚,确认频率和占空比正常;
- 测试供电电压边界。把电源从标称电压往下拉,看看芯片在低压时是否出现复位或不稳定的情况;
- 做几次快速通断电测试,确认每次上电都能正常启动,没有偶发死机。
OTP芯片一旦烧录,就无法回到裸片状态,所以"烧录成功后测试"不是可选项,是必选项。你可以在开发阶段省掉很多不必要的流程,但这个环节绝对不能跳。
4. 仿真正常但一烧录就翻车:常见问题排查实录
4.1 为什么仿真和真机是两回事
这是OTP开发最折磨人的地方。你辛辛苦苦在仿真器上把逻辑调到完美,烧录到真机却出现各种奇怪现象,这时候要做的第一件事不是怀疑芯片坏了,而是列出"仿真环境和真机环境之间的差异"。
最核心的差异就是存储介质。仿真时程序跑在仿真器的RAM里,或者仿真专用芯片里,而真机程序是从OTP里读出来的。OTP的读取时序、供电需求和仿真环境是不一样的,某些只在OTP读取时才会出现的边界问题,仿真根本复现不了。其次是电气环境差异,仿真器连在目标板上,本身就是一个额外的电气节点,它可能掩盖信号的毛刺、改变IO的上升沿速率、甚至给IO口提供了一个意外的上拉路径。这些差异在低频逻辑电路里问题不大,但一旦涉及串口通信、PWM调光、触摸检测这类对时序敏感的模块,就可能放大成肉眼可见的故障。
所以我的态度是:仿真解决"逻辑对不对"的问题,真机解决"物理上行不行"的问题。仿真通过之后,第一次烧录真机一定要当成一次正式测试来做,别抱着"肯定没问题"的心态。
4.2 烧录过程报错的排查表
烧录失败是最常见的翻车现场,而且往往不是芯片坏了,是操作或环境问题。我整理了一个排查表,按这个思路去查,大部分问题几分钟内就能定位。
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 芯片识别不到 | 芯片方向放反、引脚接触不良、驱动未安装 | 检查1脚方向,清洁烧录座触点,重新安装驱动 |
| 烧录中途失败 | 供电电压不稳、USB线接触不良、烧录器线材老化 | 换一根质量好一点的USB线,检查电源,换烧录座试 |
| 校验失败 | 接触电阻过大、芯片已烧录过、代码保护已开启 | 清洁触点重新烧录,换一颗新芯片确认 |
| 芯片能烧录但不启动 | 复位脚悬空、电源没有去耦电容、校准字缺失 | 检查硬件电路,检查烧录选项中校准字配置 |
| 同一批芯片部分失败 | 烧录座弹片磨损、芯片来料批次问题 | 清洁烧录座,抽样测量芯片VDD/GND阻值 |
这里面最容易忽略的是烧录座弹片磨损。烧录座本质上是一个反复使用的机械夹具,压了几百次之后,弹片接触力和接触面积都会下降。接触电阻一大,烧录信号就会衰减,现象可能是"时而成功时而失败",或者"同一颗芯片第一次校验失败,重新压一次又成功了"。遇到这种飘忽不定的问题,先换一个烧录座排除机械因素,不要死磕芯片。
4.3 烧录后芯片上电就复位的坑
还有一个很隐蔽的坑和低压复位有关。PMS150C内部有LVR电路,用来检测电源电压,电压低到阈值以下就触发复位。这个阈值一般可以通过烧录选项配置,但如果配置和你的实际供电环境不匹配,就会出现"上电正常,一跑起来就复位"的问题。
举个例子,电池供电的产品,新电池电压可能4.2V,用到一半降到3.6V,接近LVR阈值时,芯片可能会因为电压抖动反复复位,表现为LED闪烁异常或者程序逻辑混乱。如果你把LVR阈值配得太低,电压跌到很低的时候芯片可能已经处于不确定状态,同样有风险。正确的做法是根据产品的实际供电范围,在仿真阶段就把几种LVR档位都测一遍,烧录时选择最稳定的一档。
这个坑在仿真器上极难发现,因为仿真器有稳定的供电,不会模拟出电池电压缓慢下降的场景。必须拿真机实测,把电源从高到低慢慢拉,观察芯片是否存在没到设定电压就复位的现象。
4.4 校准字缺失导致的功能异常
内部RC振荡器有着天生的频率离散性,同一批芯片,有些内部时钟偏快,有些偏慢,PMS150C也一样。芯片出厂时一般会带一个校准值,烧录软件可以在烧录过程中把校准值写入芯片指定位置,程序启动后读到这个值,用它来修正内部RC频率。
如果你没用串口、没用PWM,只是简单点灯,校准字缺不缺失可能看不出来。但一旦涉及通信波特率或者精确延时,问题就暴露了:一颗芯片串口收发正常,另一颗同型号芯片却乱码,拿示波器一看,时钟频率差了百分之几。这种问题排查起来特别费劲,因为代码、硬件看起来都没有问题,换一颗芯片又好了。
解决办法是在烧录流程里明确加上校准字操作。不同版本的Writer界面不一样,有的在烧录配置项里勾选"自动校准",有的需要单独执行一次"读取校准值再烧录"的操作。批量生产之前,建议随机抽几颗芯片,烧录后实测输出频率,确认校准字真正生效了再放量。
5. 批量烧录与生产环节的实战经验
5.1 先做"烧录验证程序"
很多人量产时直接烧正式程序,发现一批芯片有问题,又说不清是芯片问题还是烧录问题。我自己的做法是,进入批量生产之前,先准备一个非常简单、功能极其明确的"烧录验证程序"。
这个程序不需要实现产品功能,只要做到三件事:上电后点亮一颗LED、按照固定频率闪烁、把程序版本号通过IO口脉冲输出出来。烧录完验证程序之后,拿示波器确认LED闪烁频率符合预期,基本上就能判断芯片、烧录座、烧录参数这三者有没有问题。确认没问题,再批量烧录正式程序。整个过程也就几分钟,但能帮你把"芯片来料坏"和"烧录设置错"这两类问题快速区分开。
有一次我发现某一批芯片烧验证程序时,有大约5%的芯片没有正常闪烁。换了一个烧录座之后,坏片率直接降到零。如果没有验证程序这一步,我大概会以为是正式程序的问题,然后陷入无休止的调试循环。
5.2 生产流程里的防呆设计
批量烧录最怕两个问题:混料和漏烧。OTP芯片不能擦除重写,一旦烧错版本,整批芯片可能全部报废,这个损失比Flash芯片严重得多。所以生产现场一定要有防呆设计。
我建议至少做到以下几点:一是烧录软件固定参数后,把配置界面截图贴在工位上,作业员每换一个型号都要对照确认;二是未烧录芯片和已烧录芯片分区域存放,用不同颜色物料盒区分,避免拿错;三是烧录座旁边画一个1脚方向图,越直观越好;四是大批量生产时,安排首件确认环节,烧录完首件先做功能测试,再放量继续。另外防静电措施不能省,OTP芯片引脚很细,静电打一下很可能造成隐性损伤,表面上看烧录正常,实际到客户端用一阵子就出问题。
5.3 烧录座和线材维护
烧录座属于易损件,这个很多人一开始没概念。它的弹片结构决定了它会在一次次压接中逐渐磨损,接触电阻会变大,最后表现为烧录成功率下降。我一般建议一个烧录座压接几千次之后就定期更换,不要等烧录大量失败才去怀疑它。
平时维护也很简单:定期用无水酒精清洁烧录座触点,去除氧化层和灰尘;不使用时用盖子或防尘罩盖住;不要把烧录座放在潮湿或粉尘大的环境里。另外烧录器到电脑之间的USB线、目标板到烧录器之间的线材也会老化,遇到"烧录速度突然变慢""烧录经常失败"这类问题,换一根线试试,成本最低但经常能解决问题。
最后分享一个我自己的真实经历。第一次用PMS150C做项目时,我图快跳过了仿真,直接拿真机烧录测试,结果在IO口初始化顺序上连续废掉了四颗芯片。从那时候起我养成了一个非常死板的习惯:任何代码改动,先仿真,再烧录,烧录之前把烧录软件里的每一项配置通读一遍,量产之前再做十片小批验证。OTP开发的难度不在于技术复杂,而在于它要求你每一步都不能犯低级错误。这个习惯后来帮我省下了非常多的时间和芯片,也希望你看完这篇文章之后,能少走我当年走过的弯路。