尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
PIC16FDevKit开发套件:877A与18877双芯片差异解析与代码迁移指南
简介PIC16FDevKit 是一套面向 PIC16F877A/18877 系列设计的开源开发套件板型与引脚兼容 Arduino Uno非常适合想快速上手的嵌入式开发者和电子爱好者。套件集成拖放式下载、USB 转串口桥接、内存仿真、大容量闪存、温度传感器和实时时钟日历覆盖固件编写到在线调试的主要环节可减少外围工具成本适用于低功耗控制、信号采集与教学实验。压缩包共 135 个文件、6.3MB主体为 42 个 C 头文件和 23 个 C 源文件另有电路板制造文件、15 张示意图、构建脚本、配置文件和电子版数据手册兼顾源码阅读、制板打样与烧录调试。已有 325 人浏览/学习适合底层驱动、板级二次开发与教学演示。下载后可得完整工程树包含 USB 描述符、串行外设接口驱动、烧录脚本与三维结构文件便于直接参考或移植。1. PIC16FDevKit在解决什么问题一块板子同时喂饱两代PIC16FPIC16FDevKit这个开发套件核心是把两代完全不兼容的PIC16F芯片放到了同一块板上一边是教科书和存量产品里最常见的PIC16F877A另一边是带着增强型中端内核、一堆核心独立外设的PIC16F18877。很多实验室的实训板只押其中一颗结果学生学完877A再接触新芯片寄存器模型、配置位、外设控制方式几乎全变等于重学一遍而直接上18877又少了老芯片的海量示例和调试经验沉淀。这块套件的价值在于两套独立最小系统、一个可切换的烧录与调试通道、共享的串口和扩展IO让同一块板子同时服务经典维护和项目迭代两种需求。适合正在从老PIC16F往新PIC16F迁移的开发者、带嵌入式实训课的教师以及想低成本验证两代芯片差异的选型人员。本文会按“两芯片差异 → 最小系统跑通 → 外设实验 → 踩坑 → 迁移”的顺序把套件从头到尾拆给你看。2. 877A与18877的核心差异为什么一套开发板要覆盖两代芯片2.1 内核同源但寄存器模型隔了一代从固定外设到可配置外设PIC16F877A属于传统中端核心指令集是35条寄存器布局非常老派想用哪个外设就去操作那个外设分配好的固定寄存器地址和位的含义几十年不变。PIC16F18877属于增强型中端核心指令数量更多而且引入了大量CIP核心独立外设像CWG互补波形发生器、CLC可配置逻辑单元、NCO数控振荡器、FVR固定参考电压这类模块在877A上根本没有对应寄存器。更关键的是寄存器模型本身变了877A的模拟/数字引脚切换是靠ADCON1寄存器里PCFG位一次性整组配置18877则用ANSELA、ANSELB这样的独立寄存器逐引脚控制877A的串口波特率寄存器叫SPBRG18877上叫SPBRGL/SPBRGH组合中断控制也从877A的INTCON单寄存器拆成了18877的INTCON0/INTCON1。这些不是改名而已是寻址模型和控制流程整体重写。所以套件同时放两颗芯片真正要解决的不是“多一块芯片多一个功能”而是让使用者在同一个调试环境下直观看到两套寄存器模型的差异。877A的代码不是改个型号就能在18877上跑反过来也不行。开发者需要知道的是哪些寄存器是等价的、哪些配置位的默认值变了、哪些外设是新增的这些信息在迁移时比任何API文档都值钱。2.2 板载资源与两代芯片选型对照最小系统各自独立、扩展资源共享PIC16FDevKit这类板子的常见做法是两套独立最小系统877A这边通常放一颗外部晶振8MHz或16MHz和独立复位电路因为877A的内部振荡器只有固定4MHz且不带频率分频很多实验要跑高速串口或精确时基离了外部晶振比较难受18877那边则把内部振荡器作为默认时钟源板子上留出外部晶振的排针位置但默认用HFINTOSC就能覆盖31kHz到32MHz的频率范围。两套最小系统共用电源、USB转串口和LED/按键/电位器扩展区通过跳线切换目标芯片避免两套板子同时接线造成混乱。下表是两颗芯片在选型时最常对比的参数具体数值以数据手册为准这里给的是开发套件选型时最实用的量级认知。对比项PIC16F877APIC16F18877程序空间8K words级别32K words级别数据RAM368字节级别4K字节级别EEPROM256字节256字节I/O端口5个端口33个IO40个以上IO64脚封装内部振荡器固定4MHz可调31kHz~32MHzADC10位8通道量级10位30通道量级定时器TMR0/TMR1/TMR2TMR0/TMR1/TMR2/TMR4/TMR6/TMR8等串口1个USART1个以上EUSART带自动波特率检测CIP外设无CWG/CLC/NCO/FVR等工作电压2.0V~5.5V1.8V~5.5V从这个表能看出两代产品的设计取向。877A的定位是稳定、简单、抗造5V供电直接怼IO驱动能力强外围电路设计几十年没有变化教材和网上的示例代码铺天盖地出问题随便搜就有答案。18877的定位是低功耗、高集成、把原来要CPU介入的活交给硬件外设去干内部振荡器精度经过校准后足以支撑大部分串口应用在电池供电和传感器采集场景里优势明显。2.3 选型判断什么项目继续用877A什么项目该切到18877做选型前先看手里是什么类型的项目。如果是在维护存量产品比如一台用877A做了十年的控制器那继续用877A是对的因为重新验证一颗新芯片的成本远高于芯片本身的价差。如果是从零开始的新项目尤其是涉及低功耗、模拟前端、复杂时序输出18877那边新增的FVR、多定时器、CLC这些外设能省掉大量CPU空转内部振荡器也省了晶振的BOM成本。教学场景更特殊一点很多高校和培训机构的课纲还按877A写但企业招聘和实际项目已经开始往增强型中端迁移一块双芯片套件恰好能两头兼顾。另外一个容易忽略的点是编译器和调试工具的发展方向。芯片厂商的新版开发环境和代码配置器对新系列的支持更完整MCC图形化配置对18877这类芯片能直接生成初始化代码对877A虽然也支持但老芯片不少功能还是要手写寄存器。这意味着新项目的开发速度会快很多前提是你愿意花一两天适应MCC的生成风格。套件把两代芯片放在一起本质上就是在降低这个切换门槛。3. 从拿到板子到点亮LED工具链、最小工程与烧录3.1 工具链选择官方IDE与XC8编译器免费模式足够跑通全部实验PIC16FDevKit的软件开发以芯片厂商官方IDE搭配XC8编译器为主流方案。IDE负责编辑、编译、烧录、调试XC8负责把C代码编译成8位PIC的机器码。XC8有免费模式只是优化级别受限对学习和调试来说完全够用不要一上来就找破解版或第三方工具链。下载安装后需要确认XC8编译器被IDE正确识别新建项目时选择芯片型号IDE会自动匹配编译器版本。这里有一个实操习惯装好IDE后先手动建立“空白项目点灯程序”跑通全流程不要直接上串口和ADC。因为烧录器和IDE之间的连接、驱动、配置位默认值这些环境问题只有在最简工程下才容易定位。第一次跑通点灯后面所有实验都只是往工程里加文件这个套路能让你省掉大量“编译报错却不懂是环境问题还是代码问题”的纠结。3.2 点灯工程对比877A和18877的初始化差异在两个寄存器点灯是最小验证手段也是对比两代芯片初始化差异最直观的实验。先看877A版本假设LED接在RB0上使用外部8MHz晶振// PIC16F877A 点亮RB0 // 配置字外部HS晶振关闭看门狗关闭低压编程 #pragma config FOSC HS #pragma config WDTE OFF #pragma config PWRTE ON #pragma config LVP OFF #include xc.h #define _XTAL_FREQ 8000000UL void main(void) { ADCON1 0xA7; // PCFG0111所有引脚设为数字模式 TRISBbits.TRISB0 0; // RB0 设为输出 while (1) { PORTBbits.RB0 1; __delay_ms(500); PORTBbits.RB0 0; __delay_ms(500); } }877A必须先把ADCON1的PCFG位设置好否则RB0虽然被配成输出但内部模拟输入通路还开着电平读回来不对LED表现就是亮度异常或者干脆不响应。_XTAL_FREQ这个宏是给__delay_ms用的它并不自动改变芯片时钟只是告诉编译器延时公式里按多少频率计算所以宏的值必须和实际振荡频率一致这是很多人点灯正常但延时时间不对的原因。再看18877版本同一个LED接RB0使用内部振荡器默认频率// PIC16F18877 点亮RB0 // 配置字用IDE的Configuration Bits面板生成最稳这里列出关键项 // 关闭外部振荡器内部HFINTOSC启动关闭看门狗 #pragma config FEXTOSC OFF #pragma config RSTOSC HFINTOSC_4MHZ #pragma config WDTE OFF #pragma config LVP OFF #include xc.h #define _XTAL_FREQ 4000000UL void main(void) { ANSELBbits.ANSB0 0; // RB0 强制为数字功能 TRISBbits.TRISB0 0; // RB0 设为输出 while (1) { LATBbits.LATB0 1; __delay_ms(500); LATBbits.LATB0 0; __delay_ms(500); } }18877比877A多了一个关键动作把ANSELB里对应的位清0。877A用ADCON1一次配整组端口18877则是每个模拟引脚独立控制RB0如果不同时把ANSB0置0LED会是似亮非亮的状态示波器看波形会发现引脚电压被拉得很奇怪。另外这里写LED用了LATB而不是PORTB这是新一代PIC16F系列的推荐做法读PORTB反映引脚电平写LATB才是真正锁定输出锁存器避免读改写冲突。877A没有LAT寄存器只能写PORTB这也是两代芯片的差异之一。如果你拿到手的套件自带例程建议对比一下两个例程的main函数差异基本就能看懂这颗板子设计时想让你注意什么不是教你点灯是让你体会“模拟引脚关闭”和“输出锁存”这两件事在旧芯片和新芯片上的处理方式完全不同。3.3 ICSP烧录接线与供电方式PICkit 3/4的接线清单和失败排查套件上两代芯片共用烧录通道一般通过跳线选择当前要烧录的目标。烧录器常见的是PICkit 3或PICkit 4接口定义如下接线时务必对着丝印确认ICSP引脚功能说明1MCLR/VPP编程高压或复位接芯片MCLR2VDD目标板电源由板载LDO提供3GND必须与烧录器共地4PGD数据线对应芯片RB75PGC时钟线对应芯片RB66NC/其他部分烧录器用于低压编程一般悬空供电方式是新手最容易弄反的地方。套件通常有两个供电来源USB转串口模块给整个板子供电或者烧录器通过ICSP的VDD给目标板供电。使用前要看清板上的电源跳线帽。常见错误是跳线帽同时选择了两个供电源结果VDD上电压叠加或者烧录器报电源异常更隐蔽的是跳线帽选了烧录器供电但USB没有插板子没电烧录器报“Target Device is not found”。烧录失败的排查顺序我一般固定为先看IDE右下角是否识别到设备ID识别不到就量一下ICSP座上的VDD和GND确认电压后看MCLR引脚有没有被外部电容或复位芯片拉低最后检查配置位里是否把MCLR引脚改成了普通IO。877A和18877的MCLR都可以被配置为数字IO一旦程序烧进去把MCLR复用掉了下一次烧录时烧录器可能无法进入编程模式。这时不要慌按住目标板的复位键不放让MCLR保持在复位状态再点烧录多数情况下烧录器能抢在程序运行前进入编程模式。4. 串口、定时器与ADC三个必跑实验的代码和参数4.1 串口UART同一个例子在两个芯片上波特率配置差在哪串口是调试时最重要的输出通道也是两代芯片差异最典型的外设。877A使用USART模块控制寄存器是TXSTA和RCSTA波特率寄存器是SPBRG搭配SPBRGH可以组合16位。常见配置为异步高速模式波特率计算公式是 Fosc / (16 × (SPBRG 1))。以外部8MHz晶振跑9600bps为例SPBRG 8000000 / 16 / 9600 - 1 ≈ 51.08取51后实际波特率约9615误差约0.16%完全可用。// PIC16F877A 串口初始化8MHz晶振9600/8N1 void uart_init(void) { TRISCbits.TRISC6 0; // RC6/TX 设为输出 TRISCbits.TRISC7 1; // RC7/RX 设为输入 SPBRG 51; // 9600bps 8MHzBRGH1 TXSTAbits.BRGH 1; // 高速波特率模式 TXSTAbits.SYNC 0; // 异步模式 TXSTAbits.TXEN 1; // 使能发送 RCSTAbits.SPEN 1; // 串口使能接管RC6/RC7 RCSTAbits.CREN 1; // 使能接收 } void uart_send(unsigned char c) { while (!PIR1bits.TXIF) { // 等待发送缓冲空闲 } TXREG c; }TXIF标志表示TXREG可以写入新数据不是表示数据已经发完。如果要求发送多个字节之间不能断开还需要等待TRMT位变成1来确认移位寄存器已经清空这个细节在低速中断发送时很容易丢字节。18877的EUSART把这块改得更细了。波特率寄存器变成SPBRGL和SPBRGH组合BRG16位决定是8位还是16位波特率计算如果BRG161公式变成 Fosc / (4 × (SPBRGH:SPBRGL 1))需要注意这里的分母从16变成了4因为16位模式下可以用更小的分频挡。另外EUSART增加自动波特率检测功能接收方可以通过接收特定字符来校准波特率这在两设备主频不一致时是救命的特性。// PIC16F18877 串口初始化内部振荡器32MHz115200 // 先确认OSCCON已把内部振荡器切到32MHz void uart_init(void) { // 计算SPBRGL 32000000/(16*115200)-1 ≈ 16.36取16 BRG16 1; // 16位波特率发生 SPBRGL 16; SPBRGH 0; TXSTAbits.BRGH 1; // 高速模式 TXSTAbits.SYNC 0; TXSTAbits.TXEN 1; RCSTAbits.SPEN 1; RCSTAbits.CREN 1; }如果编译时发现BRG16不在TXSTA里不要硬猜去数据手册查EUSART寄存器块它可能挂在BAUDCON或独立波特率控制寄存器里。两代芯片这部分寄存器布局差异很大迁移代码时最稳妥的办法是参照MCC生成的初始化函数而不是手动平移877A的寄存器操作。4.2 定时器TMR1从查询到中断注意中断向量差异定时器是学习中断机制最好的外设。这里选TMR1而不是TMR0因为877A的TMR0只有8位做长延时要频繁重载TMR1是16位预分频可配适合做周期中断演示。先看877A版本。TMR1计数时钟来自指令时钟Fosc/4如果Fosc8MHz指令周期就是2MHz预分频设1:8后计数频率变成250kHz计数周期4微秒。要产生10毫秒中断需要计数2500个脉冲初值 65536 - 2500 63036。// PIC16F877A TMR1初始化产生10ms周期中断 void tmr1_init(void) { T1CONbits.TMR1ON 0; // 先关闭定时器 T1CONbits.T1CKPS 0b11; // 预分频1:8 TMR1H (65536 - 2500) 8; // 初值高8位 TMR1L (65536 - 2500) 0xFF; PIR1bits.TMR1IF 0; // 清中断标志 PIE1bits.TMR1IE 1; // 使能TMR1中断 INTCONbits.PEIE 1; // 外设中端总开关 INTCONbits.GIE 1; // 全局中断 T1CONbits.TMR1ON 1; } void __interrupt() isr(void) { if (PIR1bits.TMR1IF) { PIR1bits.TMR1IF 0; TMR1H (65536 - 2500) 8; TMR1L (65536 - 2500) 0xFF; // 这里翻转LED或做周期性任务 } }877A只有一个中断向量入口0x0004XC8中写一个__interrupt函数统一判断各个中断标志。TMR1初值重载放在中断里是为了避免下个周期因为软件延迟而漂移但如果重载代码本身执行时间不稳定累积误差还是会在长时间运行后出现所以要求高精度的场合建议用自动重载功能的定时器或者用TMR2这种带周期寄存器的8位定时器。18877的TMR1控制方式大体相同但中断控制和优先级体系变了。增强型中端核心把全局中断和外设中断使能位分散到了不同的寄存器有些型号支持高/低双优先级中断向量编译器生成的中断服务函数要按新规则写。迁移时最直接的办法是打开MCC在定时器配置界面里设好周期让它生成初始化代码然后对比MCC输出和877A手写代码的差异。你能看到MCU厂商已经默认开发者不手写这类底层初始化了。// 示意MCC生成的18877 TMR1初始化核心逻辑 void TMR1_Initialize(void) { T1CON 0x30; // 预分频和相关配置按MCC生成 TMR1H 0x36; TMR1L 0x7C; // 初值由MCC根据目标中断周期计算 PIR1bits.TMR1IF 0; PIE1bits.TMR1IE 1; // 中断使能还需配置INTCON0/INTCON1对应位 }注意这里的T1CON0x30是为了说明MCC会直接给整个寄存器赋值实际代码里它会用位操作但初值计算逻辑是相同的。18877的中断标志可能在PIR1也可能在PIR4等寄存器以数据手册中断表为准不要想当然按877A的PIR1硬套。4.3 ADC采集877A的PCFG与18877的ADPCH参考电压怎么选ADC实验用板载电位器分压接到AN0通道转动电位器串口打印数值。877A的ADC配置核心是ADCON0和ADCON1两个寄存器AN0是RA0。要让RA0作为模拟输入ADCON1的PCFG位不能配成“全数字”要选只保留AN0模拟的模式。// PIC16F877A ADC初始化与读取AN0通道 void adc_init(void) { ADCON1 0x8E; // ADFM1右对齐PCFG1110仅AN0为模拟 ADCON0 0x01; // 选择AN0通道使能ADC模块 } unsigned int adc_read(void) { ADCON0bits.GO 1; // 启动转换 while (ADCON0bits.GO_DONE) { // 等待转换完成GO_DONE会硬件自动清0 } return ((unsigned int)ADRESH 8) | ADRESL; }这里的0x8E是新手最容易抄错的点想读模拟电压却把ADCON1设成0xA7把所有引脚都变成数字模式结果AN0读出来恒为0。PCFG的低四位每一位都对应一组模拟引脚的开关组合选模式时先查数据手册的PCFG表别凭感觉写。采样时间不足也会导致读数偏低或跳动877A在切换通道后建议软件加一小段延时让内部采样保持电容有足够时间充电。18877的ADC控制寄存器扩展到ADCON0、ADCON1、ADCON2、ADCON3通道选择独立到ADPCH寄存器参考电压有单独的寄存器选择。它新增的FVR固定参考电压模块可以输出1.024V、2.048V、4.096V三档配合ADC可以做不依赖电源电压的测量比如测电池电压时用FVR做参考源能抵消VDD波动。对于套件上的电位器实验默认用VDD做正参考即可代码差异不大但你要知道这个能力的存在否则做产品时只能额外加基准芯片。// PIC16F18877 ADC初始化与读取AN0通道 void adc_init(void) { ANSELAbits.ANSA0 1; // RA0设为模拟输入 ADPCH 0x00; // 正输入通道选择AN0 ADCON1bits.ADFM 1; // 右对齐 ADCON1bits.ADCS 0b100; // 转换时钟选择具体值看时钟树 ADCON0bits.ADON 1; // 使能ADC模块 } unsigned int adc_read(void) { ADCON0bits.GO 1; while (ADCON0bits.GO_DONE); return ((unsigned int)ADRESH 8) | ADRESL; }18877还有一个容易忽略的坑如果原理图上AN0和数字外设复用了同一个引脚而你在MCC里同时启用了UART和ADCMCC会在引脚管理器里报警让你手动选择哪个功能优先。这类引脚冲突在877A上不明显因为老芯片引脚功能简单到了18877上一堆外设抢同一条引脚PCB设计阶段就要先做功能分配。5. 套件调试避坑指南四个反复出现的硬件与软件问题5.1 烧录报“Target Device is not found”多半不是板子坏了现象IDE点烧录后弹出“Target Device is not found”或“Invalid Device ID”设备ID显示0x0000。很多新手第一反应是芯片烧了换上备件依然报错。原因这个报错最常出现在三个地方。一是套件电源跳线帽选错了供电源目标芯片根本没上电ICSP的VDD上量不到电压二是MCLR引脚被复位电路里的电容过度下拉烧录器进入编程模式需要的上升沿被吃掉三是上一份程序把MCLR配置成了普通IO芯片一上电就运行用户代码烧录器无法抢占控制权。解决按ICSP引脚顺序逐个量电压先确认VDD和GND再确认MCLR电压是否接近VDD。如果MCLR被配置成IO导致无法烧录按住板上复位键让芯片停在复位状态然后点烧录在编程器握手完成前不要松开。如果仍然不行把ICSP引线缩短到15厘米以内去掉MCLR上的外部上拉/下拉电阻再试。5.2 点灯不亮877A的RA4是开漏输出这个坑迟早踩一次现象把LED从RB0换到RA4程序明明配置了输出高电平LED却不亮量RA4引脚电压只有0.3V左右像被什么东西拉住了。原因PIC16F877A的RA4引脚是开漏输出结构它只能拉低不能主动输出高电平。877A的数据手册里这个引脚标注为RA4/T0CKI开漏输出是它的硬件属性不是配置项能改变的。解决给RA4外接一个上拉电阻到VDD阻值1k到10k之间都可以以后如果做I2C类总线这个开漏特性反而用得上。如果不想加电阻把LED换到RC0、RD0这些推挽输出的引脚。18877的引脚不存在这个问题但它的复用关系更复杂比如有些引脚在低引脚数封装上是ICSP的专用脚点灯前先翻开数据手册的引脚功能表。5.3 串口乱码时钟源和BRG16位不一致的连锁反应现象877A的例程改成18877后串口能收到数据但全是乱码或者波特率差一截。用示波器量TX引脚发现位宽和预期完全对不上。原因乱码背后往往是时钟源错了。877A的例程按外部晶振8MHz计算SPBRG但18877的板子默认跑内部振荡器4MHz同一个SPBRG值在两个时钟下产生的波特率完全不同。还有一个隐蔽点877A的SPBRG默认按8位模式算18877如果开了BRG16但没改公式波特率会再翻一倍。解决先把目标芯片的实际时钟频率确认下来最简单的方法是用延时点灯用手机秒表数一分钟闪几次反推延时是否准确。确认时钟后再按数据手册的波特率公式重算SPBRG。18877的EUSART带有自动波特率检测功能做通信协议时可以让对端先发一个特定字符本地用硬件完成波特率校准省去手算。5.4 ADC读数全是0模拟引脚没有切回数字功能现象电位器转到任何位置串口打印的ADC值都是0或者都是1023。用万用表量电位器输出端电压正常但芯片就是读不到。原因ADC读数异常分成两种。读出恒为0常见于877A的PCFG设置把所有引脚都设成了数字模式模拟信号根本没进ADC模块读出恒为满量程1023常见于18877的ANSEL寄存器没有把对应引脚设为模拟模式引脚还按数字输入处理浮空电平直接拉满。还有一个次因是采样时间不足内部分布式电容没充够但那个现象通常是读数小范围跳动而不是恒为0。解决877A检查ADCON1的PCFG想读AN0就用0x8E而不是0xA718877检查ANSELAx位是否置1。切换ADC通道不要连续读第一次切换后至少加10微秒采样延时或者熟读数据手册里采样时间计算公式。如果两块板子都调过还没数用示波器量一下ADC引脚输入波形确认电位器供电和地线没虚接。6. 把877A程序移植到18877一个可复用的迁移框架移植的最优策略不是“平移寄存器”而是“用MCC重建外设初始化保留业务逻辑”。下表是两代芯片在外设初始化上的对照关系照着这个表逐项确认就能避免漏改。功能877A关键寄存器18877关键寄存器端口数字/模拟切换ADCON1的PCFGANSELA/ANSELB等串口波特率SPBRG/SPBRGHSPBRGL/SPBRGH BRG16串口控制TXSTA/RCSTATXSTA/RCSTA位定义不同ADC通道选择ADCON0的CHSADPCH寄存器ADC参考电压ADCON0的VCFGADREF相关寄存器 FVR模块中断使能INTCON的GIE/PEIEINTCON0/INTCON1对应位迁移步骤我习惯固定为四步。第一步新建18877工程用MCC把所有外设重新初始化一遍不要再把877A的初始化代码搬过来。第二步把业务代码里的引脚宏和寄存器直接操作替换为MCC生成的外设API。第三步检查中断服务函数里的标志位清0确认中断矢量入口和优先级符合新芯片的规则。第四步验证三个基本点点灯时间要准确串口回环要稳定ADC电压表要线性。移植最容易翻车的地方其实不在外设而在配置字。877A的配置位就那么几项18877的配置位多了不少其中复位后的时钟源选择一项稍不注意就会让芯片以错误的时钟启动程序跑飞但编译完全正常。某开发者曾经直接把877A工程改了型号编译烧进去之后上电毫无反应查了半天才发现是新配置字里时钟源选错了内部振荡器没按预期启用。后来再移植第一件事永远是打开Configuration Bits面板逐项核对十分钟就能发现大部分问题。这个习惯一直保留到现在希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

Flume监控实战:用Ganglia搭建实时数据链路可视化平台

Flume监控实战:用Ganglia搭建实时数据链路可视化平台

做 Flume 的监控,十有八九是被线上问题逼出来的。我所在的团队维护过一套基于 Flume 的日志采集链路,高峰期每天要处理几十亿条消息,Flume 本身用起来确实省心:写几个 source、channel、sink 配置,进程一拉就能跑。但真…

📅 2026/10/16 20:17:14
OpenCV图像处理常用算法全梳理:从预处理到轮廓检测

OpenCV图像处理常用算法全梳理:从预处理到轮廓检测

做图像处理也有几年时间了,我至今还记得第一次接触OpenCV时的感受:函数多、参数多、资料也杂,想处理一张图都不知道该从哪个函数入手。OpenCV作为老牌开源计算机视觉库,覆盖了图像处理领域的绝大部分基础操作,从像素操…

📅 2026/10/16 20:17:14
SNMP 网络管理协议入门:MIB、SMI 与核心工作原理详解

SNMP 网络管理协议入门:MIB、SMI 与核心工作原理详解

简介:这份SNMP协议学习资料以docx文档形式呈现,面向网络运维初学者与备考网络工程师的读者,系统梳理简单网络管理协议的核心概念与运行机制。内容围绕MIB管理信息库与SMI管理信息结构展开,说明管理对象的数据类型定义与命名规范&a…

📅 2026/10/16 20:17:14
MORE NEWS

更多资讯

📰

表达退化:从原理诊断到白化与对比学习解决方案

1. 表达退化到底是什么:从一次模型翻车说起如果你做过一段时间的自然语言处理,大概率遇到过这种诡异现象:模型在训练集上表现得好好的,loss 曲线也漂亮,但一放到真实场景里,生成的句子就开始“车轱辘话来回…

📰

AI Agent产品推荐系统开发实战:从需求拆解到上线踩坑

1. 为什么“AI Agent 产品推荐”值得做:从用户痛点说起先讲一个我真实遇到过的场景。某次给一个做内容社区的产品做咨询,对方说推荐位点击率连续三个月下滑,算法团队调参调到头秃也没救回来。我看了一眼他们的推荐系统,典型的“老…

📰

SuperMap-Cesium-3D加载倾斜摄影模型:OSGB转3D Tiles与性能调优实战

简介:本资源面向GIS开发与三维可视化方向的开发者,提供一套将SuperMap与Cesium结合的3D地图展示方案,重点解决倾斜摄影测量数据在Web端的三维加载与交互问题。项目以Vue.js为前端框架,借助Babel完成语法转换,并通过Sup…

📰

CEF4Delphi 86集成指南:Delphi嵌入Chromium的工程化实践

简介:本资源是面向Delphi及Lazarus/FPC开发者的一站式CEF4嵌入式浏览器开发套件,专为需要在原生Windows桌面应用中集成Chromium内核功能的中高级开发者设计。它解决了传统WebBrowser控件功能受限、兼容性差的问题,支持现代HTML5、JavaScript、…

📰

ADS131A02/A04上电初始化失败排查:SPI读0xFF的硬件时序根源

简介:本资源为TI公司ADS131A02/ADS131A04高精度Δ-Σ型24位ADC芯片的标准化初始化代码实现,面向嵌入式硬件工程师、工业数据采集系统开发者及高校电子类课程实践者,解决多通道同步采样场景下寄存器配置复杂、时序易出错等典型开发痛点。压缩包…

📰

0.96寸OLED IIC驱动电路设计:原理图与PCB实战全解析

简介:面向嵌入式与物联网开发者的0.96寸OLED屏IIC驱动电路设计资源,包含完整原理图与PCB工程,聚焦微型显示模块的硬件驱动方案。资源共19个文件,涵盖SchDoc原理图、PcbDoc PCB设计、PcbLib/SchLib元件库、PrjPcb项目文件及设计日志…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬