You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIC18F4550外接40MHz晶振时LED闪烁延时与设定值不符

问题根因

你的延时偏差是三个配置错误共同导致的:

  • VREGEN配置错误:PIC18F4550的96MHz PLL供电完全依赖片上USB电压调节器,不管你是否使用USB功能,只要开启PLL为系统提供时钟,就必须将VREGEN置1。你当前配置为OFF,PLL完全没有供电,永远无法锁定,系统不会切换到预期的PLL时钟。
  • _XTAL_FREQ宏定义与实际系统时钟不匹配:当你使用HSPLL_HS模式、PLL正常锁定时,外部40MHz晶振经PLLDIV=10分频得到4MHz输入PLL,PLL固定24倍频输出96MHz,再经固定2分频得到48MHz系统时钟(Fosc)。你当前将_XTAL_FREQ定义为40000000,和实际时钟频率不符,__delay_ms()函数基于该宏计算循环次数,必然出现偏差。
  • 配置位直接写数值存在截断风险:XC8编译器的配置位有固定位宽,直接写十进制数10给仅3位宽度的PLLDIV配置位时,部分编译器版本会自动截断数值或替换为默认值,导致PLL分频系数不符合预期,进一步加剧时钟偏差。
修正步骤
  1. 修改VREGEN配置位,使能片上电压调节器:
#pragma config VREGEN = ON     // 使能片上稳压器,PLL工作必须开启
  1. 将_XTAL_FREQ宏修改为PLL锁定后的实际系统时钟频率:
#define _XTAL_FREQ 48000000
  1. 所有配置位使用XC8提供的标准宏赋值,不要直接写裸数字,避免位宽截断错误,例如PLLDIV配置改为:
#pragma config PLLDIV = PLLDIV_10      // PLL预分频:40MHz输入/10=4MHz,符合PLL输入要求
  1. 确认硬件上40MHz晶振的负载电容符合晶振规格书要求(通常为15-22pF),保证晶振稳定起振。
修正后完整代码
#pragma config PLLDIV = PLLDIV_10
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config BOR = ON
#pragma config BORV = 3
#pragma config VREGEN = ON
#pragma config WDT = OFF
#pragma config WDTPS = 32768
#pragma config CCP2MX = ON
#pragma config PBADEN = OFF
#pragma config LPT1OSC = OFF
#pragma config MCLRE = ON
#pragma config STVREN = ON
#pragma config LVP = ON
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config CP0 = OFF
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTC = OFF
#pragma config WRTB = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

#include <xc.h>

#define _XTAL_FREQ 48000000

void main(void) {
    TRISB = 0x00;
    while(1)
    {
        PORTBbits.RB0 = 1;
        __delay_ms(5000);
        PORTBbits.RB0 = 0;
        __delay_ms(5000);
    }
    return;
}

补充说明:如果不需要48MHz的高系统时钟,也可以直接将FOSC配置为普通HS模式旁路PLL,此时_XTAL_FREQ设置为40000000即可,但注意PIC18F4550的HS模式标称支持最高25MHz晶振,40MHz晶振需严格匹配负载电容才能稳定工作。

内容的提问来源于stack exchange,提问作者VkkiPink24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:30:53