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分频系数不符合预期,进一步加剧时钟偏差。
修正步骤
- 修改VREGEN配置位,使能片上电压调节器:
#pragma config VREGEN = ON // 使能片上稳压器,PLL工作必须开启
- 将
_XTAL_FREQ宏修改为PLL锁定后的实际系统时钟频率:
#define _XTAL_FREQ 48000000
- 所有配置位使用XC8提供的标准宏赋值,不要直接写裸数字,避免位宽截断错误,例如PLLDIV配置改为:
#pragma config PLLDIV = PLLDIV_10 // PLL预分频:40MHz输入/10=4MHz,符合PLL输入要求
- 确认硬件上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
相关产品推荐
相关产品推荐

