clock_config.c


1
void board_init ( void )
2
{
3
    RTC_init();
4
    CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc ) ;
5
    Clock_init();
6
    exClock_init();
7
    PLL_init();
8
9
    sei();
10
    PMIC.CTRL |= PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm;
11
    PMIC.INTPRI=0x00;
12
}
13
14
void RTC_init ( void )
15
{
16
    OSC.CTRL |= OSC_RC32KEN_bm ;
17
    while ( ( OSC.STATUS & OSC_RC32KRDY_bm ) == 0) ;
18
    CLK.RTCCTRL = CLK_RTCSRC_RCOSC_gc | CLK_RTCEN_bm ;
19
}
20
void Clock_init ( void )
21
{
22
    //OSC.CTRL |= OSC_RC32MEN_bm;
23
    //while(!(OSC.STATUS & OSC_RC32MRDY_bm));
24
    //CCP = CCP_IOREG_gc;
25
    //CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
26
27
        // Configure clock to 32MHz
28
    OSC.CTRL |= OSC_RC32MEN_bm | OSC_RC32KEN_bm;  /* Enable the internal 32MHz & 32KHz oscillators */
29
    while(!(OSC.STATUS & OSC_RC32KRDY_bm));       /* Wait for 32Khz oscillator to stabilize */
30
    while(!(OSC.STATUS & OSC_RC32MRDY_bm));       /* Wait for 32MHz oscillator to stabilize */
31
    DFLLRC32M.CTRL = DFLL_ENABLE_bm ;             /* Enable DFLL - defaults to calibrate against internal 32Khz clock */
32
    CCP = CCP_IOREG_gc;                           /* Disable register security for clock update */
33
    CLK.CTRL = CLK_SCLKSEL_RC32M_gc;              /* Switch to 32MHz clock */
34
    OSC.CTRL &= ~OSC_RC2MEN_bm;                   /* Disable 2Mhz oscillator */
35
}
36
void exClock_init ( void )
37
{
38
    /*
39
    OSC_XOSCCTRL = OSC_XOSCSEL_XTAL_16KCLK_gc |
40
                   OSC_FRQRANGE_12TO16_gc;
41
    OSC.CTRL |= OSC_XOSCEN_bm;
42
    while(!(OSC.STATUS & OSC_XOSCRDY_bm));
43
    CCP = CCP_IOREG_gc;
44
    CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
45
    */
46
47
    OSC.XOSCCTRL = OSC_FRQRANGE_12TO16_gc | OSC_XOSCSEL_XTAL_256CLK_gc;
48
    OSC.CTRL |= OSC_XOSCEN_bm;
49
    while( (OSC.STATUS & OSC_XOSCRDY_bm) == 0){
50
        //PORTF.OUTTGL = (1<<6);
51
        //PORTK.OUTTGL = (1<<0); //toggle led   //toggle led
52
    }
53
    OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (2 << OSC_PLLFAC_gp);
54
    CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc ) ;
55
    OSC.CTRL |= OSC_PLLEN_bm;
56
    while( (OSC.STATUS & OSC_PLLRDY_bm) == 0){
57
        //nop
58
    }
59
    CLK.CTRL = CLK_SCLKSEL_PLL_gc;
60
61
    CLKSYS_Disable(OSC_RC2MEN_bm);
62
    CLKSYS_Disable(OSC_RC32MEN_bm);
63
}
64
65
void PLL_init ( void )
66
{
67
    //OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 0x06;
68
    OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | 0x04;
69
    OSC.CTRL |= OSC_PLLEN_bm;
70
    while (!(OSC.STATUS & OSC_PLLRDY_bm));
71
    CCP = CCP_IOREG_gc;
72
    CLK.CTRL = CLK_SCLKSEL_PLL_gc;
73
}