
讲个真事。我第一次拿到PIC16F15355开发板顺手抄起一根PICkit3就插上去烧录结果MPLAB X直接甩给我一个“Target Device ID mismatch”——预期值0x1140读回来却是0x0000。当时第一反应就是“芯片刚上电就坏了”差点跟卖家理论。冷静下来排查半天发现哪是什么芯片故障纯粹是PGC和PGD两根线接反了。后来换了PICkit4流程顺了不少但该踩的坑一个没少踩供电模式设错、设备包没装、配置位里的LVP被关掉导致二次烧录失败……零零碎碎折腾下来我发现PIC开发板烧录这件事其实九成的新手问题都出在接线和IDE配置上而不是程序本身。这篇文章就顺着我实际操作的顺序把PICkit4给PIC16F15355开发板烧录的完整链路讲清楚从ICSP接线图到MPLAB X环境准备再到烧录执行和排错最后附上几个“程序烧进去了却跑不起来”的典型原因。适合刚入手PIC16F15355、或者准备从PICkit3换到PICkit4的朋友照着我这个流程来可以少走很多弯路。1. 开工前算一笔账为什么这对组合值得折腾1.1 PICkit4和PIC16F15355各自什么来头PIC16F15355是Microchip增强型中档Enhanced Mid-Range8位单片机家族里的主力型号20引脚封装14KB Flash、1KB SRAM和128B EEPROM。它在家电控制、传感器采集、电机驱动、通信网关这些场景里特别常见原因主要有几点工作电压范围宽2.3V到5.5V3.3V和5V系统都能直接接内部外设比较全EUSART串口、I2C/SPI、多个PWM通道、互补波形发生器CWG、数控振荡器NCO都有价格也压得比较低Microchip现在新设计8位产品线时1535x系列基本属于默认推荐的选项之一。PICkit4则是Microchip官方当前的入门级调试烧录器替代老款PICkit3。两者的差距不是一点半点PICkit4的USB接口是Full Speed实际烧录速度比PICkit3快很多支持的芯片范围也更广连AVR系列都能覆盖目标电压支持从2.0V到5.5V还附带了一个简易的串行分析仪功能调试串口协议的时候能省一个逻辑分析仪。早期我用PICkit3烧录稍大一点的固件擦除加写入加校验三分钟起步换成PICkit4之后同样大小的镜像基本几秒搞定体验完全是两个时代。1.2 准备工作除了烧录器和板子还要哪些东西烧录这件事硬件清单其实很简单PICkit4编程器一台PIC16F15355开发板一块或者你自己打的板子杜邦线若干母对母、母对公都备一点建议长度在10到15厘米以内给开发板供电的USB线或电源建议准备原因后面讲PICkit4连电脑的USB线尽量用原装或者短线好线很多人在线材上不讲究其实线材对烧录稳定性的影响远比想象中大。我遇到过用一根劣质USB延长线连接PICkit4结果MPLAB X识别烧录器时断时续换短线后一切正常。杜邦线也是同样的道理越长越细线上的压降和干扰越大编程瞬间VDD一旦跌落芯片就会进入欠压复位烧录中断。所以我的习惯是杜邦线超过20厘米的直接不用于编程宁可多插几根短线转接也别硬凑长度。1.3 ICSP烧录的基本原理这几根线到底在干什么ICSPIn-Circuit Serial Programming是Microchip的在线串行编程协议本质上是烧录器通过特定引脚按照固定时序把编程电压加到MCLR上然后在PGC编程时钟的节拍下通过PGD编程数据线把指令和数据逐位写入芯片内部的Flash存储器。为什么要先理解这个原理因为烧录器报错的九成情况都跟线序、电压、连接质量有关。你如果连“PICkit4的PGD应该接芯片哪个引脚”都靠猜那出了错就只能瞎试。反过来脑子里有ICSP的模型之后看到“Target Device ID mismatch”这种报错你第一反应就应该是“芯片没回应”然后顺着“供电、地线、时钟数据线、MCLR”这条链路去查效率会高很多。另外提一句ICSP和调试模式Debug不是一回事。PICkit4在编程模式下只是把固件写进去如果要做在线调试MPLAB X会额外占用芯片的调试接口资源。本文主要讲烧录所以后面所有步骤都以纯编程模式为例。2. 接线图六根线一根都不能错2.1 PICkit4 ICSP接口引脚定义与接法PICkit4的ICSP接口一般是6个引脚开发板上通常也会留一个对应的6脚烧录座丝印会标出引脚名称。以PIC16F15355为例完整的接线对应关系整理成下面这个表PICkit4引脚信号名对应PIC16F15355引脚说明1VPP/MCLRMCLRRE3编程高压引入脚也是复位脚2VDDVDD电源正极3.3V或5V3VSSVSS电源地4PGDICSPDATRA0编程数据线5PGCICSPCLKRA1编程时钟线6AUX / LVP视模式而定低压编程辅助一般可不接用文字示意一下就是下面这样的关系PICkit4端 PIC16F15355开发板端 1. VPP/MCLR ---- MCLR / RE3 2. VDD ---- VDD电源正 3. VSS ---- GND 4. PGD/ICSPDAT ---- RA0 5. PGC/ICSPCLK ---- RA1 6. AUX/LVP ---- 可选通常悬空这六根线里前五根是必须接好的。第六根AUX在常规烧录场景下基本用不到除非你用了某些特殊调试模式。很多开发板上的烧录座会把VPP和VDD放在一侧GND和PGC/PGD放在另一侧但不同厂家布局可能不一样必须以板子丝印为准。接之前拿万用表蜂鸣档量一下确认引脚编号和丝印对应别直接靠“看起来像”就往上插。2.2 供电模式怎么选目标板供电还是PICkit4供电PICkit4支持两种供电方式这个选择直接影响烧录稳定性。第一种是目标板自己供电Target Powered。开发板用自己的USB口、电源适配器或者电池供电PICkit4只负责传输编程数据和控制时序不充当电源。这是我最推荐的方式因为芯片在真实的运行电压下编程烧录完成后的启动行为更接近实际工作状态。而且目标板上的外设多、电流需求大的时候不用担心烧录器供电能力不够。第二种是PICkit4给目标板供电Power from PICkit4。在MPLAB X的工程属性里勾选“Power target circuit from PICkit4”然后选择3.25V或5V输出烧录器通过VDD线给板子供电。这种方式适合你手头只有一块裸芯片、没有独立电源的场合但也容易翻车目标板上如果接了LED、传感器、模块这类额外负载总电流超过PICkit4的输出能力VDD就会被拉低然后烧录器要么进入过流保护要么输出电压跌落导致烧录过程中芯片突然复位报出各种莫名其妙的错误。我的建议很直接只要目标板有独立供电的条件就绝不给PICkit4开供电模式。哪怕多插一根USB线给板子都不会少块肉但烧录稳定性提升是实打实的。2.3 接线最容易犯的三类错误我统计了一下在自己的项目群和论坛里见过的烧录失败案例接线问题占了相当大比例而且几乎集中在下面三个点上。第一PGC和PGD接反。这事也太常见了。很多从Arduino转过来的人习惯性地把数据线放前面、时钟线放后面可是PIC这边ICSP接口的顺序不是这个逻辑PGD是数据PGC是时钟接反之后MPLAB读设备ID会读到0x0000或者一个完全对不上的值。PIC16F15355上PGC对应RA1PGD对应RA0接之前最好对着开发板原理图看清楚别只凭烧录器上的丝印猜。第二忘记共地。VSS不接整个编程回路就是断开的芯片根本不可能响应。有些开发板的烧录座把GND画在角落位置不起眼但接线时漏掉这一根后面所有排查都白做。我自己的习惯是先把VSS接了再量VDD最后接信号线。第三连接阻抗过大。杜邦线插进去一半、插孔氧化、线芯太细都会让编程信号失真。尤其在时钟频率比较高的时候接触不良会导致烧录器发出信号但芯片收不到完整指令表现为“能识别设备ID但烧录到一半就断”。处理办法很简单换线重插或者用排线直接焊在烧录座上基本能根治。提示如果你用的是自己画的PCB板要注意MCLR引脚上不要并接大电容。MCLR上挂一个100nF的滤波电容看似无害实际上会拖慢编程高压的建立速度导致烧录器连不上芯片。这个坑我亲眼见过摘掉电容以后立马正常。3. 烧录前的环境准备MPLAB X IDE、设备包、XC8一个都不能少3.1 装齐三件套IDE、DFP、XC8很多人以为装好MPLAB X IDE就能烧录其实不然。要让MPLAB X认识PIC16F15355并且能编译出可烧录的hex文件需要三样东西配合IDE本体、设备家族包Device Family Pack简称DFP、以及XC8编译器。IDE去Microchip官网下载MPLAB X IDE版本选当前稳定版就好6.x及以上都行。安装过程就是常规的下一步下一步没什么需要特别注意的。DFP本质上是芯片的描述文件集合里面包含了PIC16F15355的器件信息、寄存器定义、编程算法等。没有它你在新建工程时可能连PIC16F15355都搜不到或者在MPLAB X里找不到正确的烧录算法。通常在新建工程选择Device时IDE会自动提示下载对应DFP按提示装好即可。如果没提示也可以打开Tools Plugins或者Window Pack Manager手动安装搜索PIC16F153xx系列设备包。XC8是Microchip的8位C编译器PIC16F15355必须用它。注意不要装成XC16或者XC32后两者分别面向16位和32位芯片虽然能在Machine上共存但新建工程选择编译器那一步只有XC8会出现在“Supported Compilers”列表里。安装XC8的时候建议把路径记录一下MPLAB X首次使用会让你手动指定编译器位置。3.2 新建烧录工程Device、Tool、Compiler三步选择打开MPLAB X IDE按下面的路径新建工程菜单 File New Project选择 Microchip Embedded Standalone Project点Next在Device栏输入PIC16F15355下拉列表里选中它Select Tool 选择PICkit4Select Compiler 选择XC8如果下拉框里没有先取消向导装好XC8再进填工程名称和保存路径Finish这里值得多说一句的是第三步。如果你输入PIC16F15355根本搜不到优先检查DFP装没装。DFP版本太旧也会有问题表现为设备列表能搜到但编译或者接线后识别异常。另外工程名尽量别用中文和空格PIC的旧工具链对这类路径偶尔会有兼容性毛病用纯英文路径最稳。新建工程完成之后MPLAB X会自动生成一个main.c里面是空的main函数。从烧录本身的角度来说这一步已经“万事俱备”只差程序了。3.3 配置位Configuration Bits里的两个常见坑配置位是PIC系列芯片特有的一组非易失性设置位于芯片的配置字区域独立于Flash程序空间决定了芯片上电后怎么启动。PIC16F15355的配置位在MPLAB X里可以通过Window Target Memory Views Configuration Bits打开可视化设置界面也可以在代码里用#pragma config来写。开发阶段最需要关心的配置位有两个。第一个是LVPLow-Voltage Programming。LVP开启时芯片允许在VDD电压下直接用PGD/PGC两根线进入编程模式LVP关闭时会释放一个引脚用于普通IO但之后芯片只响应高压编程模式也就是MCLR必须被拉到VPP才能进入编程。问题来了如果你在代码里写了#pragma config LVP OFF烧录完成后芯片的LVP功能就被关了。下次你把PICkit4以默认的低压编程模式插上去很可能会发现芯片完全不响应。这种情况倒不是芯片坏了而是需要切换编程方式或者先用全片擦除把芯片恢复到出厂状态再重新烧录。我的建议很简单开发调试阶段LVP保持默认的ON不要去动它等做最终量产固件时再根据实际需求调整。第二个是看门狗WDTWatchdog Timer。很多PIC芯片出厂默认看门狗是开启的如果你在代码里没有及时喂狗芯片运行一段时间后就会自动复位。表现就是“烧录成功了程序也能跑但不停重启”。开发阶段直接在配置位里把WDT设为OFF能省掉很多不必要的排查时间。等产品化阶段需要做抗死机设计时再认真调看门狗逻辑。还有个FEXTOSC振荡器配置也要留意。PIC16F15355可以用内部高频振荡器HFINTOSC也可以用外部晶体。如果你的代码设置成了外部晶体而开发板上根本没焊晶振芯片上电后就跑不起来。一般开发板出厂默认电路都支持内部振荡器所以最稳妥的做法是配置成HFINTOSC频率按你需要设比如4MHz或8MHz。4. 烧录全流程从点击Make and Program到看到绿色日志4.1 项目属性里需要核对的几项关键设置烧录前右键工程名选Properties进入项目属性对话框重点检查以下几项硬件工具Hardware Tool必须选中PICkit4Device必须显示PIC16F15355Compiler Toolchain要选到XC8。这三个是最基本的任何一个不对后面的烧录流程都走不下去。接着展开左边的Categories列表找到PICkit4那一项在Option categories下拉框里切换到Power。这里就是前面讲过的供电模式设置。如果你不想让PICkit4给目标板供电就不要勾选“Power target circuit from PICkit4”。再切换到Programming分类检查这几个选项Erase策略默认选“Entire chip”即可也就是全片擦除生产时可能需要改确认“Verify after programming”处于勾选状态这样每次烧录完成后会自动再回读一遍Flash内容做校验能发现写入错误如果你的程序里有需要保留的引导加载程序段可以勾选“Preserve Program Memory”并设置保留地址范围不过普通开发用不到。最后看一眼Operating mode确保是Programming而不是Debug。有些情况下IDE会默认进入调试工具配置烧录时反而会多出一些不必要的调试握手流程。4.2 执行烧录并读懂Output窗口的输出设置没问题之后点击工具栏上的“Make and Program Device”按钮或者菜单Run Make and Program。这时IDE会先编译工程生成hex文件然后通过PICkit4向芯片写入固件。正常流程下Output窗口会打印类似下面的内容Connecting to PICkit4... Currently loaded versions: Firmware Version: 1.85 Boot Version: 1.02 Device Erased... Programming... Verify complete Programming/Verify complete看到“BUILD SUCCESSFUL”和绿色的“Programming complete”字样基本就可以确认烧录成功了。这里要注意一点编译成功的提示和烧录成功的提示是独立的。有时候代码编译过了但烧录环节因为接线问题卡住IDE会停在“Connecting to PICkit4...”或者“Device not found”的提示上并不是什么诡异故障顺着输出日志去排查就好。我自己习惯在烧录时开着Output窗口看实时日志而不是只用眼睛盯着进度条。因为很多失败其实是瞬间发生的进度条还没反应过来日志早就把原因打出来了。看懂这些日志比单纯看GUI提示有用得多。4.3 烧录完成后的验证不要急着拔线烧录完成不代表万事大吉至少还要做两件事。第一确认校验Verify真的通过了。如果前面勾选了“Verify after programming”日志里会出现“Verify complete”这一行。校验的作用是把Flash里的内容和hex文件逐字节比对确保写入过程中没有丢数据。没有这一行的烧录哪怕显示成功了也可能是“虚成功”芯片运行起来仍然可能是错的。第二给板子断电重新上电看程序是否真的在跑。有些芯片烧录后如果处于复位状态或者复位开关被按住看起来就像“没烧进去”。所以断电重启这个动作能排除烧录器在编程时把MCLR拉低后没有正确释放的少见情况。如果你想更彻底地验证可以用MPLAB X的菜单Window Target Memory Views Program Memory点击读取按钮把芯片Flash内容读出来跟工程生成的hex对照一下。这个方法比较冗余正常情况下不需要但如果你怀疑编程时序或者线材有问题它是最让人放心的确认手段。5. 烧录失败排查手册三个最常见的故障链路5.1 “PICkit4 not found”电脑连不上烧录器报错特征是连接烧录器阶段直接失败输出窗口显示“PICkit4 not found.”之类的话。这说明电脑根本没有枚举到PICkit4跟目标芯片还没扯上关系。优先排查链路是PICkit4的LED灯亮不亮不亮说明烧录器本身没收到电换一根USB线或者换一个USB口试试。灯亮了但还是连不上多半是驱动或者USB枚举问题。Windows下打开设备管理器看看有没有识别到Microchip Tools设备Linux下可以执行lsusb搜一下Microchip的VID和PID。识别到了但MPLAB X连不上就关掉IDE拔掉PICkit4再重新插入然后再打开IDE。USB枚举有时会卡死这个简单粗暴的方法能解决一半问题。还有一点经验之谈前置USB口和USB Hub是PICkit4不稳定的一大原因。USB Hub分线器供电不足时PICkit4会反复掉线更离谱的是有时候能连上但烧录速度极慢。尽量插在电脑后置原生USB口上。5.2 “Target Device ID mismatch”芯片没回应这是PIC烧录里最有代表性的报错之一。日志大概长这样Target Device ID mismatch Expected: 0x1140 (PIC16F15355) Computed: 0x0000如果你的“Expected”确实显示0x1140但“Computed”是0说明烧录器已经跟PICkit4通信正常但跟芯片之间的ICSP链路没有打通。按下面顺序排查量一下VDD有没有实际送到芯片电源脚。用万用表量烧录器端VDD和目标板VDD之间是否导通很多时候是杜邦线插错了孔。确认VSS共地。前面说过了地不接就是0x0000。检查PGC和PGD是否接反。对PIC16F15355来说PGD对应RA0PGC对应RA1两个接反设备ID会读成0或错值。检查MCLR引脚有没有被外部器件拉低。MCLR上如果接了外部复位按钮且被按住或者接了太大的下拉电阻/电容芯片就无法进入编程模式。如果Computed不是0而是一个像0x0FF0一样的非零值多半是接线接触不良或者时钟线数据线之间串扰。重新插一遍线确保每根线都到底并且让PGC和PGD两根线尽量分开走不要绞在一起。5.3 烧录中途断开或一直停留在Erasing第三种常见故障是烧录过程走了一半卡在“Erasing...”或者“Programming...”阶段最后报错“The target device is not ready for programming.”或者干脆超时。这种问题的原因通常有三个。一是接触不良。比如杜邦线没插到位或者线芯断裂但外表皮看不出来。判断方法是用手轻轻拨动一下线缆如果IDE状态立刻变化那基本就是接触问题。处理办法是换一根新的杜邦线或者把烧录线重新压一遍。二是目标板供电能力不足。前面说过PICkit4给目标板供电时外设电流一大就把VDD拉垮。解决方式简单粗暴给目标板接独立电源同时把PICkit4的电源输出关掉。三是芯片Flash被代码保护锁住。量产固件里如果启用了代码保护CP配置位普通编程模式是无法擦除和重写的。遇到这种情况需要在烧录器配置里尝试全片擦除Bulk Erase把配置位一起擦掉让芯片回到出厂状态。如果全片擦除也做不了那就要查看芯片手册里关于保护机制恢复的章节了。6. 烧录成功不等于完事程序不跑的常见原因6.1 振荡器配置和实际硬件对不上烧录成功、Verify也过了但板子上一上电程序就是不动这种情况比烧录失败还让人头疼。最常见的首因是振荡器配置和硬件不符。PIC16F15355的时钟源可以是内部HFINTOSC也可以是外部晶体。如果你在配置位里选了外部晶体比如EXTOSC但开发板上的晶振没焊或者焊错频率芯片就没有时钟CPU完全无法执行指令。反过来如果你在代码里用内部振荡器但配置位里设成了外部同样跑不起来。这个问题怎么排查在MPLAB X的Configuration Bits界面里把振荡器相关选项明确设置为“HFINTOSC”然后在代码里用OSCCON1寄存器确认系统时钟源选择主频按你希望的工作频率设置。PIC16F15355的FEXTOSC配置位默认值在某些封装或者出厂选项下可能是外部晶体模式所以不要想当然地认为“默认就能跑”。6.2 看门狗和低电压检测的干扰另一个常见坑是WDT看门狗。就像3.3节说的如果芯片出厂配置或者你的代码把WDT置为开启而主程序没有及时清看门狗芯片跑几百毫秒就会复位一次。现象是程序好像“偶尔能跑一下然后又停”不是完全死机。还有一个容易被忽略的是欠压检测BORBrown-Out Reset。开发板电源如果不太稳在启动瞬间电压跌落触发了BOR芯片会反复复位看起来就是“程序没烧进去”。解决方式是先检查供电是否稳定再把BOR电压阈值设低一点或者开发阶段直接关掉BOR具体取决于你能否接受这个配置确认问题是否消失。这类问题都有一个共同特点烧录器没有任何报错芯片也正常校验通过但运行表现异常。所以你只能在配置位层面做二分法排查——先全关掉WDT和BOR确认程序能跑再逐个打开验证。6.3 串口乱码从烧录视角看波特率与电压匹配很多人烧录完第一件事就是测试串口打印结果收到的全是乱码。PIC16F15355的EUSART波特率由时钟源和波特率寄存器共同决定。如果时钟源实际频率跟你预期不一样波特率自然是错的。比如你代码里配置的是用内部8MHz时钟、波特率9600但实际芯片工作在4MHz那串口数据就会错得离谱。基于前面振荡器配置的重要性这里要再次强调烧录成功只是第一步CPU的时钟树、外设时钟分频、串口波特率这些都必须跟实际硬件一致程序才能“跑得对”。另外还要确认逻辑电平和你的串口工具匹配。PIC16F15355工作在3.3V时TTL电平是3.3V如果你的串口模块是5V电平直接接上去可能不会损坏芯片但信号判定会出问题。稳妥的做法是都用3.3V供电或者给串口模块加电平转换。我个人用PICkit4烧录PIC16F15355这段时间最大体会是这板子和烧录器本身都很皮实真正坑人的往往是看起来不起眼的线序和配置位。每次遇到“芯片连不上”或者“程序不跑”先别急着怀疑硬件老老实实按“接线-供电-配置位-时钟”这个顺序排查一遍基本都能找到答案。最后再说一个懒人技巧我把PIC16F15355开发板做了一块专用的ICSP转接小板把PGC、PGD、VDD、GND、MCLR五根线按固定颜色压好之后烧录只需要对口插一下就完事。你要是经常折腾几块板子也可以照这个方法做一套固定烧录线能省下大量重复接线的时间。