NO.003:dsPIC33EP系列振荡器配置

振荡器是单片机的心脏,其配置的不同决定了单片机运行速率的快慢。

NO.003:dsPIC33EP系列振荡器配置

1、先来数据手册中的一张**振荡器系统框图
NO.003:dsPIC33EP系列振荡器配置_第1张图片
2、再来一张
PLL框图
NO.003:dsPIC33EP系列振荡器配置_第2张图片
3、再来几个公式:
(1)
器件工作频率:FCY = Fosc/2**
(2)输入频率(FIN)与输出频率(FPLLO)之间的关系:
NO.003:dsPIC33EP系列振荡器配置_第3张图片
在时钟模式S1和S3下(见第一张图),当选择PLL输出时, Fosc = FPLLO。因为我的最小系统上的晶振是4MHz的,并且在配置位处设置了PLL输出,所以此处正好满足这个等式。
PLLPRE取值范围:00000-11111(2-33);
PLLDIV取值范围:000000000-111111111(2-513);
PLLPOST取值范围:00-11(2-8);

说了那么多,最后上一段程序吧:

//振荡器配置
void System_Colck(void)
{
    //产生Fosc = 200MHz 70MIPS
    //Fosc = Fin*M/(N1*N2)=Fin*(PLLDIV+2)/((PLLPRE+2)*2(PLLPOST+1))
    //其中:N1 = PLLPRE+2;  N2 = 2(PLLPOST+1);  M = PLLDIV+2;
    //PLLPRE取值范围:00000-11111(2-33);  PLLDIV取值范围:000000000-111111111(2-513);    
    //PLLPOST取值范围:00-11(2-8)
    CLKDIVbits.PLLPRE = 0;//N1 = 2  4MHz/2= 2MHz
    PLLFBDbits.PLLDIV = 198;//M = 200  2*200 = 400MHz
    CLKDIVbits.PLLPOST = 0;//N2 = 2 400/2 = 200MHz
    
    //COSC=011,表示选择为带PLL的主振荡器(XT\HS和EC)
    //只要COSC!=011和LOCK!=1,程序就会一直死循环在这里,除非while的表达式为假时跳出循环
    while (OSCCONbits.COSC!= 0b011)//0b表示二进制,0x表示16进制;
    while (OSCCONbits.LOCK!= 1) {};//PLL 处于锁定状态
}

本文参考文献:dsPIC33EP系列数据手册—9.0 振荡器配置

你可能感兴趣的:(NO.003:dsPIC33EP系列振荡器配置)