Shield Code 6.0
Loading...
Searching...
No Matches
modded_system_sam3xa.c
Go to the documentation of this file.
1#include "cmsis_include/sam3xa.h"
2
10/* @cond 0 */
12#ifdef __cplusplus
13extern "C" {
14#endif
16/* @endcond */
17
18/* Clock settings (84MHz) */
19#define SYS_BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8))
20#define SYS_BOARD_PLLAR (CKGR_PLLAR_ONE | CKGR_PLLAR_MULA(0xdUL) | CKGR_PLLAR_PLLACOUNT(0x3fUL) | CKGR_PLLAR_DIVA(0x1UL))
21#define SYS_BOARD_MCKR (PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK)
22
23uint32_t SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
24
29void SystemInit( void )
30{
31 /* Set FWS according to SYS_BOARD_MCKR configuration */
32 EFC0->EEFC_FMR = EEFC_FMR_FWS(4);
33 EFC1->EEFC_FMR = EEFC_FMR_FWS(4);
34
35 /* Initialize main oscillator */
36 if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )
37 {
38 //317 LAB - the last flag here bypasses the internal RC oscillator
39 PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY;
40 while ( !(PMC->PMC_SR & PMC_SR_MOSCXTS) )
41 {
42 }
43 }
44 //317 LAB - I don't fully understand why this flag is necessary, but selecting the crystal oscillator with the bypass flag still routes through the external oscillator.
45 /* Switch to 3-20MHz Xtal oscillator */
46 PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTBY | CKGR_MOR_MOSCSEL;
47
48 while ( !(PMC->PMC_SR & PMC_SR_MOSCSELS) )
49 {
50 }
51 PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
52 while (!(PMC->PMC_SR & PMC_SR_MCKRDY))
53 {
54 }
55
56 /* Initialize PLLA */
57 PMC->CKGR_PLLAR = SYS_BOARD_PLLAR;
58 while ( !(PMC->PMC_SR & PMC_SR_LOCKA) )
59 {
60 }
61
62 /* Switch to main clock */
63 PMC->PMC_MCKR = (SYS_BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
64 while ( !(PMC->PMC_SR & PMC_SR_MCKRDY) )
65 {
66 }
67
68 /* Switch to PLLA */
69 PMC->PMC_MCKR = SYS_BOARD_MCKR;
70 while ( !(PMC->PMC_SR & PMC_SR_MCKRDY) )
71 {
72 }
73
74 SystemCoreClock = CHIP_FREQ_CPU_MAX;
75}
76
77//317 LAB - we did not modify this function.
79{
80 /* Determine clock frequency according to clock register values */
81 switch ( PMC->PMC_MCKR & PMC_MCKR_CSS_Msk )
82 {
83 case PMC_MCKR_CSS_SLOW_CLK: /* Slow clock */
84 if (SUPC->SUPC_SR & SUPC_SR_OSCSEL)
85 {
86 SystemCoreClock = CHIP_FREQ_XTAL_32K;
87 }
88 else
89 {
90 SystemCoreClock = CHIP_FREQ_SLCK_RC;
91 }
92 break;
93
94 case PMC_MCKR_CSS_MAIN_CLK: /* Main clock */
95 if (PMC->CKGR_MOR & CKGR_MOR_MOSCSEL)
96 {
97 SystemCoreClock = CHIP_FREQ_XTAL_12M;
98 }
99 else
100 {
101 SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
102
103 switch (PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk)
104 {
105 case CKGR_MOR_MOSCRCF_4_MHz:
106 break;
107
108 case CKGR_MOR_MOSCRCF_8_MHz:
109 SystemCoreClock *= 2U;
110 break;
111
112 case CKGR_MOR_MOSCRCF_12_MHz:
113 SystemCoreClock *= 3U;
114 break;
115
116 default:
117 break;
118 }
119 }
120 break;
121
122 case PMC_MCKR_CSS_PLLA_CLK: /* PLLA clock */
123 case PMC_MCKR_CSS_UPLL_CLK: /* UPLL clock */
124 if ( PMC->CKGR_MOR & CKGR_MOR_MOSCSEL )
125 {
126 SystemCoreClock = CHIP_FREQ_XTAL_12M;
127 }
128 else
129 {
130 SystemCoreClock = CHIP_FREQ_MAINCK_RC_4MHZ;
131
132 switch ( PMC->CKGR_MOR & CKGR_MOR_MOSCRCF_Msk )
133 {
134 case CKGR_MOR_MOSCRCF_4_MHz:
135 break;
136
137 case CKGR_MOR_MOSCRCF_8_MHz:
138 SystemCoreClock *= 2U;
139 break;
140
141 case CKGR_MOR_MOSCRCF_12_MHz:
142 SystemCoreClock *= 3U;
143 break;
144
145 default:
146 break;
147 }
148 }
149 if ( (PMC->PMC_MCKR & PMC_MCKR_CSS_Msk) == PMC_MCKR_CSS_PLLA_CLK )
150 {
151 SystemCoreClock *= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_MULA_Msk) >> CKGR_PLLAR_MULA_Pos) + 1U);
152 SystemCoreClock /= ((((PMC->CKGR_PLLAR) & CKGR_PLLAR_DIVA_Msk) >> CKGR_PLLAR_DIVA_Pos));
153 }
154 else
155 {
156 SystemCoreClock = CHIP_FREQ_UTMIPLL / 2U;
157 }
158 break;
159 }
160
161 if ( (PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) == PMC_MCKR_PRES_CLK_3 )
162 {
163 SystemCoreClock /= 3U;
164 }
165 else
166 {
167 SystemCoreClock >>= ((PMC->PMC_MCKR & PMC_MCKR_PRES_Msk) >> PMC_MCKR_PRES_Pos);
168 }
169}
170
174void system_init_flash( uint32_t dw_clk )
175{
176 /* Set FWS for embedded Flash access according to operating frequency */
177 if ( dw_clk < CHIP_FREQ_FWS_0 )
178 {
179 EFC0->EEFC_FMR = EEFC_FMR_FWS(0);
180 EFC1->EEFC_FMR = EEFC_FMR_FWS(0);
181 }
182 else
183 {
184 if ( dw_clk < CHIP_FREQ_FWS_1 )
185 {
186 EFC0->EEFC_FMR = EEFC_FMR_FWS(1);
187 EFC1->EEFC_FMR = EEFC_FMR_FWS(1);
188 }
189 else
190 {
191 if ( dw_clk < CHIP_FREQ_FWS_2 )
192 {
193 EFC0->EEFC_FMR = EEFC_FMR_FWS(2);
194 EFC1->EEFC_FMR = EEFC_FMR_FWS(2);
195 }
196 else
197 {
198 if ( dw_clk < CHIP_FREQ_FWS_3 )
199 {
200 EFC0->EEFC_FMR = EEFC_FMR_FWS(3);
201 EFC1->EEFC_FMR = EEFC_FMR_FWS(3);
202 }
203 else
204 {
205 EFC0->EEFC_FMR = EEFC_FMR_FWS(4);
206 EFC1->EEFC_FMR = EEFC_FMR_FWS(4);
207 }
208 }
209 }
210 }
211}
212
213/* @cond 0 */
215#ifdef __cplusplus
216}
217#endif
219/* @endcond */
#define SYS_BOARD_OSCOUNT
void system_init_flash(uint32_t dw_clk)
#define SYS_BOARD_MCKR
void SystemInit(void)
Setup the microcontroller system. Initialize the System and update the SystemFrequency variable.
uint32_t SystemCoreClock
void SystemCoreClockUpdate(void)
#define SYS_BOARD_PLLAR