source: asp_wio_terminal/trunk/target/samd51_gcc/lib/plib_clock.c

Last change on this file was 460, checked in by msugi, 3 years ago

ファイル一式の追加

File size: 8.4 KB
Line 
1/*******************************************************************************
2 CLOCK PLIB
3
4 Company:
5 Microchip Technology Inc.
6
7 File Name:
8 plib_clock.c
9
10 Summary:
11 CLOCK PLIB Implementation File.
12
13 Description:
14 None
15
16*******************************************************************************/
17
18/*******************************************************************************
19* Copyright (C) 2018 Microchip Technology Inc. and its subsidiaries.
20*
21* Subject to your compliance with these terms, you may use Microchip software
22* and any derivatives exclusively with Microchip products. It is your
23* responsibility to comply with third party license terms applicable to your
24* use of third party software (including open source software) that may
25* accompany Microchip software.
26*
27* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES, WHETHER
28* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED
29* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A
30* PARTICULAR PURPOSE.
31*
32* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
33* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND
34* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS
35* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE
36* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN
37* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
38* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
39*******************************************************************************/
40
41#include "plib_clock.h"
42#include "atsamd51p19a.h"
43
44static void OSCCTRL_Initialize(void)
45{
46
47 /****************** XOSC1 Initialization ********************************/
48
49 /* Configure External Oscillator */
50 OSCCTRL_REGS->OSCCTRL_XOSCCTRL[1] = OSCCTRL_XOSCCTRL_STARTUP(0) | OSCCTRL_XOSCCTRL_IMULT(6) | OSCCTRL_XOSCCTRL_IPTAT(3) | OSCCTRL_XOSCCTRL_XTALEN_Msk | OSCCTRL_XOSCCTRL_ENABLE_Msk;
51
52 while((OSCCTRL_REGS->OSCCTRL_STATUS & OSCCTRL_STATUS_XOSCRDY1_Msk) != OSCCTRL_STATUS_XOSCRDY1_Msk)
53 {
54 /* Waiting for the XOSC Ready state */
55 }
56}
57
58static void OSC32KCTRL_Initialize(void)
59{
60 /****************** XOSC32K initialization ******************************/
61
62 /* Configure 32K External Oscillator */
63 OSC32KCTRL_REGS->OSC32KCTRL_XOSC32K = OSC32KCTRL_XOSC32K_STARTUP(2) | OSC32KCTRL_XOSC32K_ENABLE_Msk | OSC32KCTRL_XOSC32K_CGM(1) | OSC32KCTRL_XOSC32K_EN32K_Msk | OSC32KCTRL_XOSC32K_XTALEN_Msk;
64
65
66 while(!((OSC32KCTRL_REGS->OSC32KCTRL_STATUS & OSC32KCTRL_STATUS_XOSC32KRDY_Msk) == OSC32KCTRL_STATUS_XOSC32KRDY_Msk))
67 {
68 /* Waiting for the XOSC32K Ready state */
69 }
70
71 OSC32KCTRL_REGS->OSC32KCTRL_RTCCTRL = OSC32KCTRL_RTCCTRL_RTCSEL(0);
72}
73
74static void FDPLL0_Initialize(void)
75{
76 GCLK_REGS->GCLK_PCHCTRL[1] = GCLK_PCHCTRL_GEN(0x2) | GCLK_PCHCTRL_CHEN_Msk;
77 while ((GCLK_REGS->GCLK_PCHCTRL[1] & GCLK_PCHCTRL_CHEN_Msk) != GCLK_PCHCTRL_CHEN_Msk)
78 {
79 /* Wait for synchronization */
80 }
81
82 /****************** DPLL0 Initialization *********************************/
83
84 /* Configure DPLL */
85 OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLCTRLB = OSCCTRL_DPLLCTRLB_FILTER(0) | OSCCTRL_DPLLCTRLB_LTIME(0x0)| OSCCTRL_DPLLCTRLB_REFCLK(0) ;
86
87
88 OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLRATIO = OSCCTRL_DPLLRATIO_LDRFRAC(0) | OSCCTRL_DPLLRATIO_LDR(199);
89
90 while((OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLSYNCBUSY & OSCCTRL_DPLLSYNCBUSY_DPLLRATIO_Msk) == OSCCTRL_DPLLSYNCBUSY_DPLLRATIO_Msk)
91 {
92 /* Waiting for the synchronization */
93 }
94
95 /* Enable DPLL */
96 OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLCTRLA = OSCCTRL_DPLLCTRLA_ENABLE_Msk ;
97
98 while((OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLSYNCBUSY & OSCCTRL_DPLLSYNCBUSY_ENABLE_Msk) == OSCCTRL_DPLLSYNCBUSY_ENABLE_Msk )
99 {
100 /* Waiting for the DPLL enable synchronization */
101 }
102
103 while((OSCCTRL_REGS->DPLL[0].OSCCTRL_DPLLSTATUS & (OSCCTRL_DPLLSTATUS_LOCK_Msk | OSCCTRL_DPLLSTATUS_CLKRDY_Msk)) !=
104 (OSCCTRL_DPLLSTATUS_LOCK_Msk | OSCCTRL_DPLLSTATUS_CLKRDY_Msk))
105 {
106 /* Waiting for the Ready state */
107 }
108}
109
110static void FDPLL1_Initialize(void)
111{
112 GCLK_REGS->GCLK_PCHCTRL[2] = GCLK_PCHCTRL_GEN(0x2) | GCLK_PCHCTRL_CHEN_Msk;
113 while ((GCLK_REGS->GCLK_PCHCTRL[1] & GCLK_PCHCTRL_CHEN_Msk) != GCLK_PCHCTRL_CHEN_Msk)
114 {
115 /* Wait for synchronization */
116 }
117
118 /****************** DPLL1 Initialization *********************************/
119
120 /* Configure DPLL */
121 OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLCTRLB = OSCCTRL_DPLLCTRLB_FILTER(0) | OSCCTRL_DPLLCTRLB_LTIME(0x0)| OSCCTRL_DPLLCTRLB_REFCLK(0) ;
122
123
124 OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLRATIO = OSCCTRL_DPLLRATIO_LDRFRAC(0) | OSCCTRL_DPLLRATIO_LDR(159);
125
126 while((OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLSYNCBUSY & OSCCTRL_DPLLSYNCBUSY_DPLLRATIO_Msk) == OSCCTRL_DPLLSYNCBUSY_DPLLRATIO_Msk)
127 {
128 /* Waiting for the synchronization */
129 }
130
131 /* Enable DPLL */
132 OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLCTRLA = OSCCTRL_DPLLCTRLA_ENABLE_Msk ;
133
134 while((OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLSYNCBUSY & OSCCTRL_DPLLSYNCBUSY_ENABLE_Msk) == OSCCTRL_DPLLSYNCBUSY_ENABLE_Msk )
135 {
136 /* Waiting for the DPLL enable synchronization */
137 }
138
139 while((OSCCTRL_REGS->DPLL[1].OSCCTRL_DPLLSTATUS & (OSCCTRL_DPLLSTATUS_LOCK_Msk | OSCCTRL_DPLLSTATUS_CLKRDY_Msk)) !=
140 (OSCCTRL_DPLLSTATUS_LOCK_Msk | OSCCTRL_DPLLSTATUS_CLKRDY_Msk))
141 {
142 /* Waiting for the Ready state */
143 }
144}
145
146static void DFLL_Initialize(void)
147{
148}
149
150
151static void GCLK0_Initialize(void)
152{
153
154 /* selection of the CPU clock Division */
155 MCLK_REGS->MCLK_CPUDIV = MCLK_CPUDIV_DIV(0x01);
156
157 while((MCLK_REGS->MCLK_INTFLAG & MCLK_INTFLAG_CKRDY_Msk) != MCLK_INTFLAG_CKRDY_Msk)
158 {
159 /* Wait for the Main Clock to be Ready */
160 }
161 GCLK_REGS->GCLK_GENCTRL[0] = GCLK_GENCTRL_DIV(1) | GCLK_GENCTRL_SRC(7) | GCLK_GENCTRL_GENEN_Msk;
162
163 while((GCLK_REGS->GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL_GCLK0) == GCLK_SYNCBUSY_GENCTRL_GCLK0)
164 {
165 /* wait for the Generator 0 synchronization */
166 }
167}
168
169static void GCLK1_Initialize(void)
170{
171 GCLK_REGS->GCLK_GENCTRL[1] = GCLK_GENCTRL_DIV(2) | GCLK_GENCTRL_SRC(7) | GCLK_GENCTRL_GENEN_Msk;
172
173 while((GCLK_REGS->GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL_GCLK1) == GCLK_SYNCBUSY_GENCTRL_GCLK1)
174 {
175 /* wait for the Generator 1 synchronization */
176 }
177}
178
179static void GCLK2_Initialize(void)
180{
181 GCLK_REGS->GCLK_GENCTRL[2] = GCLK_GENCTRL_DIV(32) | GCLK_GENCTRL_SRC(1) | GCLK_GENCTRL_GENEN_Msk;
182
183 while((GCLK_REGS->GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL_GCLK2) == GCLK_SYNCBUSY_GENCTRL_GCLK2)
184 {
185 /* wait for the Generator 2 synchronization */
186 }
187}
188
189static void GCLK3_Initialize(void)
190{
191 GCLK_REGS->GCLK_GENCTRL[3] = GCLK_GENCTRL_DIV(1) | GCLK_GENCTRL_SRC(8) | GCLK_GENCTRL_GENEN_Msk;
192
193 while((GCLK_REGS->GCLK_SYNCBUSY & GCLK_SYNCBUSY_GENCTRL_GCLK3) == GCLK_SYNCBUSY_GENCTRL_GCLK3)
194 {
195 /* wait for the Generator 3 synchronization */
196 }
197}
198
199void CLOCK_Initialize (void)
200{
201 /* Function to Initialize the Oscillators */
202 OSCCTRL_Initialize();
203
204 /* Function to Initialize the 32KHz Oscillators */
205 OSC32KCTRL_Initialize();
206
207 DFLL_Initialize();
208 GCLK2_Initialize();
209 FDPLL0_Initialize();
210 FDPLL1_Initialize();
211 GCLK0_Initialize();
212 GCLK1_Initialize();
213 GCLK3_Initialize();
214
215
216
217 /* Selection of the Generator and write Lock for SERCOM2_CORE */
218 GCLK_REGS->GCLK_PCHCTRL[23] = GCLK_PCHCTRL_GEN(0x1) | GCLK_PCHCTRL_CHEN_Msk;
219
220 while ((GCLK_REGS->GCLK_PCHCTRL[23] & GCLK_PCHCTRL_CHEN_Msk) != GCLK_PCHCTRL_CHEN_Msk)
221 {
222 /* Wait for synchronization */
223 }
224 /* Selection of the Generator and write Lock for SERCOM7_CORE */
225 GCLK_REGS->GCLK_PCHCTRL[37] = GCLK_PCHCTRL_GEN(0x3) | GCLK_PCHCTRL_CHEN_Msk;
226
227 while ((GCLK_REGS->GCLK_PCHCTRL[37] & GCLK_PCHCTRL_CHEN_Msk) != GCLK_PCHCTRL_CHEN_Msk)
228 {
229 /* Wait for synchronization */
230 }
231
232 /* Configure the AHB Bridge Clocks */
233 MCLK_REGS->MCLK_AHBMASK = 0xffffff;
234
235 /* Configure the APBA Bridge Clocks */
236 MCLK_REGS->MCLK_APBAMASK = 0x7ff;
237
238 /* Configure the APBB Bridge Clocks */
239 MCLK_REGS->MCLK_APBBMASK = 0x18256;
240
241 /* Configure the APBD Bridge Clocks */
242 MCLK_REGS->MCLK_APBDMASK = 0x8;
243
244
245}
Note: See TracBrowser for help on using the repository browser.