b. 임베디드/dsPIC33CK128MP506

[dsPIC33CK] Clock 설정 (FRC 사용)

로봇쟁이 2021. 9. 29. 14:40

dsPIC33CK128MP506을 사용해보려 합니다.

 

먼저 클럭을 설정하는 부분입니다. 

자세하게 다루려면 너무 광범위해져서 필요한 부분을 위주로 사용하려 합니다.

 

일단 저는 FRC(8MHz)를 사용해서 사용할 예정입니다.

 

 

 

보니 FRC를 TUN을 이용해서 조금 수정도 가능하나 저는 Nominal(default)로 사용합니다.

기본은 8MHz입니다.

// FOSCSEL
#pragma config FNOSC = FRC              // Oscillator Source Selection (Internal Fast RC (FRC) Oscillator with postscaler)
#pragma config IESO = OFF               // Two-speed Oscillator Start-up Enable bit (Start up device with FRC, then switch to user-selected oscillator source)

// FOSC
#pragma config POSCMD = NONE            // Primary Oscillator Mode Select bits (Primary Oscillator disabled)
#pragma config OSCIOFNC = OFF           // OSC2 Pin Function bit (OSC2 is clock output)
#pragma config FCKSM = CSECMD           // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are disabled)
#pragma config PLLKEN = ON              // PLL Lock Status Control (PLL lock signal will be used to disable PLL clock output if lock is lost)
#pragma config XTCFG = G3               // XT Config (24-32 MHz crystals)
#pragma config XTBST = ENABLE           // XT Boost (Boost the kick-start)

 

 

 

2번째로 기본 delay 함수를 사용하기 위해서는 Fcy가 필요합니다.

저의 경우에는 FRCCLK를 PLL을 통해 FPLLO를 만들어 사용할 예정입니다.

 

 

 

설정은 다음과 같습니다.

void OSC_Init(void) {
/*
    FRC = 8MHz (Internal Clock)
//  FVCO  = Fin X (M / N1)
    FPLLO = Fin X (M / (N1 X N2 X N3))
    FOSC  = FPLLO / 2
    FCY   = (FPLLO / 2) / 2 (DOZE disabled)
 */
    CLKDIVbits.FRCDIV = 0;          // FRC divided by 1 (Default)
    CLKDIVbits.PLLPRE = 1;          // N1 = 1
    PLLFBDbits.PLLFBDIV = 100;      // M = 100
    PLLDIVbits.POST1DIV = 2;        // N2 = 2
    PLLDIVbits.POST2DIV = 1;        // N3 = 1
    
    // Init Clock Switch to FRC with PLL (NOSC = 0b001)
    __builtin_write_OSCCONH(0x01);
    __builtin_write_OSCCONL(OSCCON | 0x01);
    while(OSCCONbits.OSWEN != 0);
}

 

 

해당 계산식을 계산하면

FPLLO = 8MHz X (100 / 2) = 400MHz

FOSC = 400MHz / 2 = 200MHz

FCY = FOSC / 2 = 100MHz

 

즉, FCY 100MHz가 완성되었습니다 ^^;

 

정상적으로 동작하는지 확인하기 위해서 LED 토글용 코드를 작성합니다

 

#include <xc.h>
#include <libpic30.h>

#define FCY         100000000UL

void OSC_Init(void) {
/*
    FRC = 8MHz (Internal Clock)
//  FVCO  = Fin X (M / N1)
    FPLLO = Fin X (M / (N1 X N2 X N3))
    FOSC  = FPLLO / 2
    FCY   = (FPLLO / 2) / 2 (DOZE disabled)
 */
    CLKDIVbits.FRCDIV = 0;          // FRC divided by 1 (Default)
    CLKDIVbits.PLLPRE = 1;          // N1 = 1
    PLLFBDbits.PLLFBDIV = 100;      // M = 100
    PLLDIVbits.POST1DIV = 2;        // N2 = 2
    PLLDIVbits.POST2DIV = 1;        // N3 = 1
    
    // Init Clock Switch to FRC with PLL (NOSC = 0b001)
    __builtin_write_OSCCONH(0x01);
    __builtin_write_OSCCONL(OSCCON | 0x01);
    while(OSCCONbits.OSWEN != 0);
}

void PORT_Init(void) {
	TRISDbits.TRISD4  = OUTPUT;
}

void App_Init(void) {
    OSC_Init();
    PORT_Init();
}

void App_Run(void) {
    App_Init();
    
    while(1) {
        LATDbits.LATD4 = ~LATDbits.LATD4;
        __delay_ms(100);
    }
}

 

 

이상 확인 작업 끝!

반응형