23 #define OSC_CLKSW_TIMEOUT 50000
64 volatile int16_t fres = 0;
65 volatile struct OSC_CONFIG_s osc;
67 osc.osc_type = OSCCON_xOSC_FRCPLL;
68 osc.N1 = CLKDIV_PLLDIV_N1_1;
72 case CPU_SPEED_20_MIPS:
73 osc.M = PLLFBD_PLLFBDIV_M_20;
75 case CPU_SPEED_30_MIPS:
76 osc.M = PLLFBD_PLLFBDIV_M_30;
78 case CPU_SPEED_40_MIPS:
79 osc.M = PLLFBD_PLLFBDIV_M_40;
81 case CPU_SPEED_50_MIPS:
82 osc.M = PLLFBD_PLLFBDIV_M_50;
84 case CPU_SPEED_60_MIPS:
85 osc.M = PLLFBD_PLLFBDIV_M_60;
87 case CPU_SPEED_70_MIPS:
88 osc.M = PLLFBD_PLLFBDIV_M_70;
90 case CPU_SPEED_80_MIPS:
91 osc.M = PLLFBD_PLLFBDIV_M_80;
93 case CPU_SPEED_90_MIPS:
94 osc.M = PLLFBD_PLLFBDIV_M_90;
96 case CPU_SPEED_100_MIPS:
97 osc.M = PLLFBD_PLLFBDIV_M_100;
103 osc.N2 = PLLDIV_POST2DIV_N2N3_2;
104 osc.N3 = PLLDIV_POST2DIV_N2N3_1;
106 fres = p33c_Osc_Initialize(osc);
140 #if defined (__P33SMPS_CH_MSTR__) || defined (__P33SMPS_CK__)
144 volatile uint16_t err=0;
149 OSCTUNbits.TUN = frc_tune;
152 CLKDIVbits.FRCDIV = frc_div;
193 volatile uint16_t p33c_Osc_Initialize(
volatile struct OSC_CONFIG_s osc_config)
196 volatile uint16_t _n=0;
197 volatile uint16_t err=0;
205 if(OSCCONbits.COSC != 0b000)
208 __builtin_write_OSCCONH(OSCCON_xOSC_FRC);
210 __builtin_write_OSCCONL((OSCCON & 0x7E) | 0x01);
217 if ((OSCCONbits.COSC != osc_config.osc_type) && (OSCCONbits.CLKLOCK == 0))
221 #if defined (__P33SMPS_CH__) || defined (__P33SMPS_CK__)
226 PLLDIVbits.VCODIV = osc_config.VCODIV;
227 CLKDIVbits.PLLPRE = osc_config.N1;
228 PLLFBDbits.PLLFBDIV = osc_config.M;
229 PLLDIVbits.POST1DIV = osc_config.N2;
230 PLLDIVbits.POST2DIV = osc_config.N3;
232 #elif defined (__P33SMPS_FJ__) || defined (__P33SMPS_FJA__) || defined (__P33SMPS_FJC__) || \
233 defined (__P33SMPS_EP__)
235 CLKDIVbits.PLLPRE = osc_config.N1;
236 PLLFBD = (osc_config.M - 2);
237 CLKDIVbits.PLLPOST = osc_config.N2;
242 __builtin_write_OSCCONH(osc_config.osc_type);
243 if(OSCCONbits.COSC != OSCCONbits.NOSC)
246 __builtin_write_OSCCONL((OSCCON & 0x7F) | 0x01);
250 { err = OSCERR_CSF; }
254 else if ((OSCCONbits.COSC != osc_config.osc_type) && (OSCCONbits.CLKLOCK == 1))
261 OSCCONbits.CLKLOCK = 1;
265 { err = OSCERR_PLL_LCK; }
270 return((1 - OSCCONbits.CF));
305 APLLDIV1bits.AVCODIV = aux_clock_config.AVCODIV;
308 ACLKCON1bits.APLLPRE = aux_clock_config.N1;
309 APLLFBD1bits.APLLFBDIV = aux_clock_config.M;
310 APLLDIV1bits.APOST1DIV = aux_clock_config.N2;
311 APLLDIV1bits.APOST2DIV = aux_clock_config.N3;
314 ACLKCON1bits.FRCSEL = aux_clock_config.FRCSEL;
317 ACLKCON1bits.APLLEN = aux_clock_config.APLLEN;
320 if(!aux_clock_config.APLLEN)
323 return(ACLKCON1bits.APLLEN);
355 volatile uint16_t fres = 1;
356 volatile struct AUXOSC_CONFIG_s aux_clock_config;
359 aux_clock_config.FRCSEL = PLLDIV_ACLKCON_FRCSEL_FRC;
362 aux_clock_config.AVCODIV = APLLDIV_AVCODIV_FVCO_DIV_BY_4;
365 if(afpllo_frequency <= 800) {
366 aux_clock_config.N1 = ACLKCON_APLLDIV_N1_1;
367 aux_clock_config.M = (afpllo_frequency >> 2);
368 aux_clock_config.N2 = APLLDIV_POST2DIV_N2N3_2;
369 aux_clock_config.N3 = APLLDIV_POST2DIV_N2N3_1;
377 aux_clock_config.APLLEN = ACLKCON_APLLEN_ENABLED;
422 volatile int32_t freq=0;
423 volatile uint16_t vbuf=0;
424 volatile OSCCON_xOSC_TYPE_e otype;
427 freq = (
volatile int32_t)main_osc_frequency;
430 if (main_osc_frequency > 0) {
435 otype = OSCCONbits.COSC;
443 if ((otype == OSCCON_xOSC_FRC) || (otype == OSCCON_xOSC_BFRC) || (otype == OSCCON_xOSC_FRCPLL) || (otype == OSCCON_xOSC_FRCDIVN)) {
445 freq = (
volatile int32_t)OSC_FRC_FREQ;
447 #if defined (__P33SMPS_CK__) || defined (__P33SMPS_CH_MSTR__)
449 if(otype != OSCCON_xOSC_BFRC) {
450 freq += OSC_TUN_STEP_FREQUENCY * (
volatile int32_t)(OSCTUNbits.TUN);
456 if (otype == OSCCON_xOSC_FRCDIVN) {
457 vbuf = (CLKDIVbits.FRCDIV & 0x0003);
464 else if (otype == OSCCON_xOSC_LPRC) {
465 freq = (
volatile int32_t)32000;
470 if (freq == 0)
return(0);
477 if ( (otype == OSCCON_xOSC_FRCPLL) || (otype == OSCCON_xOSC_PRIPLL) ) {
480 if (!OSCCONbits.LOCK)
return(0);
483 vbuf = (CLKDIVbits.PLLPRE & 0x000F);
484 if((vbuf > 8) || (vbuf == 0))
return (0);
488 vbuf = (PLLFBDbits.PLLFBDIV & 0x00FF);
489 if((vbuf > 200) || (vbuf < 3))
return (0);
493 vbuf = (PLLDIVbits.VCODIV & 0x0003);
494 if(vbuf > 3)
return (0);
499 vbuf = (PLLDIVbits.POST1DIV & 0x0007);
500 if((vbuf > 8) || (vbuf == 0))
return (0);
504 vbuf = (PLLDIVbits.POST2DIV & 0x0007);
505 if((vbuf > 8) || (vbuf == 0))
return (0);
522 if (CLKDIVbits.DOZEN) {
523 vbuf = (CLKDIVbits.DOZE & 0x0003);
538 if (ACLKCON1bits.APLLEN) {
545 vbuf = (ACLKCON1bits.APLLPRE & 0x000F);
546 if((vbuf > 8) || (vbuf == 0))
return (0);
550 vbuf = (APLLFBD1bits.APLLFBDIV & 0x00FF);
551 if((vbuf > 200) || (vbuf < 3))
return (0);
555 vbuf = (APLLDIV1bits.AVCODIV & 0x0003);
556 if(vbuf > 3)
return (0);
561 vbuf = (APLLDIV1bits.APOST1DIV & 0x0007);
562 if((vbuf > 8) || (vbuf == 0))
return (0);
566 vbuf = (APLLDIV1bits.APOST2DIV & 0x0007);
567 if((vbuf > 8) || (vbuf == 0))
return (0);